Forum: Compiler & IDEs Array als define definiert


von gast (Gast)


Lesenswert?

Hallo zusammen,
wie kann man eine Array als define definiert?

dehine.h

#define ERROR_NO[8]  { 18, 19, 20, 21, 22, 23, 24, 25}

danke

von Johannes M. (johnny-m)


Lesenswert?

gast wrote:
> Hallo zusammen,
> wie kann man eine Array als define definiert?
Gar nicht.

> #define ERROR_NO[8]  { 18, 19, 20, 21, 22, 23, 24, 25}
Das geht nicht. Wenn Du ein Array mit konstanten Werten brauchst, dann 
als const definieren und ggf. noch explizit in den nichtflüchtigen 
Speicherbereich setzen. #define macht nur eine reine Textersetzung.

von mono (Gast)


Lesenswert?

nicht schön, aber selten...
1
#define ERROR_NO_ARRAY_SIZE  8
2
#define ERROR_NO_ARRAY       const char ERROR_NO[ERROR_NO_ARRAY_SIZE] = { 18, 19, 20, 21, 22, 23, 24, 25};

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
#define ERROR_NO_ARRAY const char ERROR_NO[] = { 18, 19, 20, 21, 22, 23, 24, 25};
2
#define ERROR_NO_ARRAY_SIZE (sizeof ERROR_NO / sizeof ERROR_NO[0])

von gast (Gast)


Lesenswert?

stimmt weils du das [ERROR_NO_ARRAY_SIZE] nicht brauchst!

const char ERROR_NO[] = { 18, 19, 20, 21, 22, 23, 24, 25};

muss genauso funktionioeren und du ärgerst dich nich wenn du mal 
vergistt das obige defin zu ändern!

übrigens MAX_CNT kannst noch so machen

#define MAX_ERROR_NO sizeof(ERROR_NO)
bg

von mono (Gast)


Lesenswert?

> übrigens MAX_CNT kannst noch so machen
>
> #define MAX_ERROR_NO sizeof(ERROR_NO)
Aber nur bei chars... ansonsten hat Jörg Wunsch (dl8dtl) schon Recht...
abgesehen davon, dass die Array-Größe bei Fehlercodes eher nicht
gebraucht wird. ;-)

von gast (Gast)


Lesenswert?

danke an alle
ich probiere gleich

von Oliver (Gast)


Lesenswert?

>wie kann man eine Array als define definiert?
...
>ich probiere gleich

Trotzdem frage ich mal nach: WARUM willst du ein Array als define 
definieren?

Oliver

von mono (Gast)


Lesenswert?

>> wie kann man eine Array als define definiert?
>> ...
>> ich probiere gleich
>
> Trotzdem frage ich mal nach: WARUM willst du ein Array als define
> definieren?
Vor solchen Fragen habe ich Angst... ;-)

von Karl H. (kbuchegg)


Lesenswert?

mono wrote:
>>> wie kann man eine Array als define definiert?
>>> ...
>>> ich probiere gleich
>>
>> Trotzdem frage ich mal nach: WARUM willst du ein Array als define
>> definieren?
> Vor solchen Fragen habe ich Angst... ;-)

Vor der Frage weniger. Eher vor der Antwort :-)

Aber um den TO auch mal weiter zu bringen:
Was willst du eigentlich machen? Normalerweise ist es höchst 
ungewöhnlich ein Array mit Fehlercodes anzulegen. Sowas braucht man 
eigentlich so gut wie nie.

Was man aber brauchen kann, sind ein paar sprechende Namen für die 
Fehlercodes:
1
#define ERROR_INVALID    18
2
#define ERROR_FRAMING    19
3
#define ERROR_HARDWARE   20
4
#define ERROR_TO_LOW     21
5
#define ERROR_TO_HIGH    22
6
...

und wenn man will, kann man die dann immer noch in ein Array 
zusammenfassen (wozu auch immer das gut sein soll)
1
const uint8_t Errors[] = { ERROR_INVALID,
2
                           ERROR_FRAMING,
3
                           ERROR_HARDWARE,
4
                           ERROR_TO_LOW,
5
                           ERROR_TO_HIGH );
6
7
#define ERROR_NO_ARRAY_SIZE (sizeof Errors / sizeof Errors[0])

von gast (Gast)


Lesenswert?

Hallo zusammen,
ich möchte den Bereich von einigen Variablen überprüfen unter diese 
Variablen habe ich ein uint16_t Data[8] definiert um die Wiederholung 
bei Überprüfung zu vermeiden, habe ich an eine for Schleife 
gedacht.Deswegen will ich die Define in einer array speichern und 
einfach bearbeiten.
Was der karl vorgeschlagen hat gut geklappt.
Aber ich habe wieder ein Problen. Jede Fehler Nummer ist mit der 
Beschreibung verbunden. Der Textbeschreibung besteht aus maximun 25 
Zeichen.
#define ERROR_D   "Invalid typ of data"
#define ERROR_L   "Invalid typ of length"
usw..
Wie kann ich jetzt die define in einem Array definiert?
Ich hahe so gemacht, aber ich bekomme folgende Fehler.

const char serial_error[]={ ERROR_D,ERROR_L };

error: excess elements in char array initializer
error: (near initialization for 'serial_error')

Danke

von Johannes M. (johnny-m)


Lesenswert?

Erstens kennt C keinen Datentyp "string", weshalb man auch in C keinen 
String als Ganzes zuweisen kann. Das ist aber genau das, was Du da 
versuchst. Und wenn die Strings in einem Array abgelgt werden sollen, 
dann wird das ein 2-d-Array und die Strings müssen alle gleich lang 
sein. Abhilfe: Die Strings als Konstanten anlegen und mit einem Array of 
Pointers darauf zugreifen. Das Array wird dann einfach mit den Zeigern 
auf die Strings initialisiert und Du kannst auf die Elemente einzeln 
zugreifen.

Zweitens schreibt man "type" im englischen mit nem 'e' hinten...

von Karl H. (kbuchegg)


Lesenswert?

gast wrote:

> ich möchte den Bereich von einigen Variablen überprüfen unter
> diese Variablen habe ich ein uint16_t Data[8] definiert um die
> Wiederholung bei Überprüfung zu vermeiden, habe ich an eine for
> Schleife gedacht.Deswegen will ich die Define in einer array
> speichern und einfach bearbeiten.

Ich versteh zwar noch nicht ganz, wie da das Array ins Spiel kommt. Aber 
die ganze Beschreibung klingt für mich nach: Du hast irgendeinen 
Design-Fehler und bügelst jetzt gerade die Auswirkungen dieses Fehlers 
nieder, anstatt das eigentliche Problem zu beseitigen.

>
> const char serial_error[]={ ERROR_D,ERROR_L };

Das hier sagt, dass serial_error ein Array aus einzelnen Buchstaben ist.
Ein Text ist in C aber kein einzelner Buchstabe! Was du tun kannst: Du 
kannst Pointer auf die eigentlichen Texte in einem Array sammeln.

const char * serial_error[]={ ERROR_D,ERROR_L };

von gast (Gast)


Lesenswert?

Hallo Karl,

1)
ich bekomme ein string aus serielle Schnittstelle z.B. "COMD 7FF 0 1 8"
2) Ich zerlege den String mit strtok_r, und dann jedes Block an einer 
Variable zuweisen
Parameter[0]=COMD
Parameter[1]=7FF
Parameter[2]= 0
usw..
3)Mit einer definierten Struktur übermittele ich die Wert von Parameter 
an die Element der Struktur
ptr_uartStruct->Uart_Message_ID = (uint32_t) strtoul(Parameter[1], 
&ptr_setParameter[1],16);
4)Jetzt überprüfe ich den erlaubten Bereich von jedem Parameter
z.B  diese Code und bis jetzt war S_ERROR1 und S_ERROR1_NO als define 
definiert.
und mit uint16_t Uart_Data[8] als Element der Struktur soll ich so 8 mal 
schreiben, ich will nur es vermeiden.

if((0x7FFFFFF) < ptr_uartStruct->Uart_Message_ID)
{

 uart_errorCode=Uart_Communication_Error(S_ERROR1,S_ERROR1_NO);
       Parameter[1][0] = '\0';
       *ptr_Parameter[1] = 0;
}
Deswegen möchte ich das Array im Spiel mitbringen, vielleicht hast Du 
eine bessere Idee.
Danke

von Karl H. (kbuchegg)


Lesenswert?

gast wrote:
> Hallo Karl,
>
> 1)
> ich bekomme ein string aus serielle Schnittstelle z.B. "COMD 7FF 0 1 8"

OK

> 2) Ich zerlege den String mit strtok_r, und dann jedes Block an einer
> Variable zuweisen
> Parameter[0]=COMD
> Parameter[1]=7FF
> Parameter[2]= 0
> usw..

ok

> 3)Mit einer definierten Struktur übermittele ich die Wert von Parameter
> an die Element der Struktur

von einer Struktur war bisher überhaupt noch nicht die Rede
Aber ok.

> ptr_uartStruct->Uart_Message_ID = (uint32_t) strtoul(Parameter[1],
> &ptr_setParameter[1],16);

gut, sei so

> 4)Jetzt überprüfe ich den erlaubten Bereich von jedem Parameter

ok.

> z.B  diese Code und bis jetzt war S_ERROR1 und S_ERROR1_NO als define
> definiert.

ok

> und mit uint16_t Uart_Data[8] als Element der Struktur

wo komme plötzlich die Uart_Data her?
Welche Struktur?

> soll ich so 8 mal
> schreiben, ich will nur es vermeiden.
>
> if((0x7FFFFFF) < ptr_uartStruct->Uart_Message_ID)
> {
>
>  uart_errorCode=Uart_Communication_Error(S_ERROR1,S_ERROR1_NO);
>        Parameter[1][0] = '\0';
>        *ptr_Parameter[1] = 0;
> }
> Deswegen möchte ich das Array im Spiel mitbringen, vielleicht hast Du
> eine bessere Idee.

Ich seh immer noch nicht, wie da ein Array mit konstanten Fehlercodes 
hilfreich sein kann.

Es sind ja deine Werte in Uart_Data, die überprüft werden sollen, und 
die sinnvollerweise in einem Array untergebracht werden.

Aber egal.

von gast (Gast)


Lesenswert?

hallo Karl,
bitte es ist nicht egal vielleicht mache ich Fehler
die struktur habe ich so definiert
struct uartStruct
{
  char    *Name;
  uint32_t Uart_Message_ID;
  uint8_t  Uart_Length;
  uint16_t Uart_Data[8];

} ;
Beispiel: ich bekomme den string: "COMD 7FF 8 AA AA AA AA AA AA AA AA"
wie willst Du die 8 folgende Daten am besten überprüfen?
Die Fehler melden, wenn ein Data falsch ist und die Position der 
Data.Bis jetz habe ich die code 8 mal geschrieben für Data von 0 bis 7

 if((0XFF) < ptr_uartStruct->Uart_Data[0])
 {
  uart_errorCode = Uart_Communication_Error( S_ERROR50,S_ERROR50_NO);
  ptr_uartStruct->Uart_Data[0] = 0;
  Parameter[5][0] = '\0';
  *ptr_Parameter[5] = 0;
     }

von Karl H. (kbuchegg)


Lesenswert?

gast wrote:

> Beispiel: ich bekomme den string: "COMD 7FF 8 AA AA AA AA AA AA AA AA"
> wie willst Du die 8 folgende Daten am besten überprüfen?
> Die Fehler melden, wenn ein Data falsch ist und die Position der
> Data.Bis jetz habe ich die code 8 mal geschrieben für Data von 0 bis 7

Das ist ja ok.

Ich seh nur immer noch nicht, wie da

#define ERROR_NO[8]  { 18, 19, 20, 21, 22, 23, 24, 25}

aus deinem Ursprungsposting ins Spiel kommen könnte.
Die Daten in einem Array zu sammeln ist ja ok. Das passt doch.

von gast (Gast)


Lesenswert?

hallo,
das war falsch aber mit deinem Ansatz habe ich den Weg gefunden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.