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
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.
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};
|
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])
|
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
> ü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. ;-)
>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
>> 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... ;-)
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])
|
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
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...
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 };
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
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.
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; }
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.