Struktur Array in Header deklarieren
-
so wie es jetzt ist funktioniert es ja.
wenn ich im Headerconst struct func_vek_struct func_vek[];
schreibe und in der main des Jeweiligen Projekts
const struct func_vek_struct func_vek[] = { {"convert","Char --> int",convert}, {"lcd","Etwas auf derm LCD Anzeigen.\n\t-i lcd init",lcd} };
bekomme ich die Fehlermeldung:
../m32/console.c|61|error: invalid application of ‘sizeof’ to incomplete type ‘const struct func_vek_struct[]’
und
../m32/console.h|56|warning: array ‘func_vek’ assumed to have one element
-
Variablendefinitionen haben im Header nichts zu suchen.
Da gehört das extern hin.
extern const struct func_vek_struct func_vek[];
Die Definition ist dann in einer .c
-
ok, im Header console.h
extern const struct func_vek_struct func_vek[];
und in der main.c
const struct func_vek_struct func_vek[] = { {"convert","Char --> int",convert}, {"lcd","Etwas auf derm LCD Anzeigen.\n\t-i lcd init",lcd} };
da bekomme ich aber immer noch den Fehler:
../m32/console.c|61|error: invalid application of ‘sizeof’ to incomplete type ‘const struct func_vek_struct[]’
-
Wie sieht denn die Fehlerzeile aus (Zeile 61) ?
-
for(count1=0;count1<=sizeof(func_vek)/62;count1++) { ...
-
Ich bin mir nicht sicher, ob das C89 Standard ist. Wohl eher nicht, wenn der Compiler damit ein Problem hat.
Hast Du jetzt eigentlich noch ein Problem?
-
console.c kennt die größe von func_vek nicht, da diese nicht im Header steht.
Du kannst ein Makro nehmen und dass über die Projekteigenschaften vorgeben, oder das Abbruchkriterium ändern.Möglich wäre ein letzter Eintag in deiner func_vek mit nicht sinnvollen Werte:
{"convert","Char --> int",convert}, ... "", "", NULL}; // Kennzeichen für das Ende des Arrays
Dann kannst du in console.h schreiben
for(count1=0;func_vek[count1];count1++) { ...
Das ist eigentlich die Flexibelste Lösung.
Was soll eigentlich die 62 da? Meinst du damit
sizeof(struct func_vek_struct)
?Wenn du sowieso nur Stringlatere einträgst, kannst du eigentlich deine struct auch abspecken auf:
struct func_vek_struct { char *name; char *man; int (*func) (char[10][50]); };
Dann kann die Endekennung auch 3 mal NULL enthalten.
-
ja das Funktioniert. ich glaub damit kann ich leben danke für die Hilfe
Was soll eigentlich die 62 da? Meinst du damit sizeof(struct func_vek_struct) ?
ja sonst erhalte ich ja die Größe in Byte und nicht die Anzahl der Einträge.
-
Felidae_TWC schrieb:
ja sonst erhalte ich ja die Größe in Byte und nicht die Anzahl der Einträge.
Dann schreib beim nächsten mal auch
sizeof(struct func_vek_struct)
hin, wenn du das meinst.
Das geht auch in der console.h, da die struct ja bekannt ist.
Dafür ist sizeof ja gedacht, dass man das nicht selber ausrechnen muss.Was in console.c unbekannt ist, ist die Arraygröße.
Felidae_TWC schrieb:
ja das Funktioniert. ich glaub damit kann ich leben danke für die Hilfe
Welche Version denn?
Bei der Version mit den Zeigern brauchst du noch nicht einmal auf die Länge der Strings achten.
-
Die 62 hatte ich gar nicht bemerkt.
Puh, gruselig und auch falsch:
10 Bytes char
+ 2 Bytes allignment (eventuell zumindest)
+50 Bytes char
+ 2 Bytes (oder 4 oder auch nicht)
+ 4 Bytes Funktionspointer oder 8 unter 64Bit?
-----------------------------------------------
irgendwas zwischen 64 und 88 Bytes und selbst das ist nur geratenDer Compiler kann in eine struct Lücken einbauen, wenn er Lust hat, und die Größe eines Zeigers ist nicht einheitlich.
Also IMMER mit sizeof arbeiten!
-
dibada schrieb:
Die 62 hatte ich gar nicht bemerkt.
Puh, gruselig und auch falsch:
10 Bytes char
+ 2 Bytes allignment (eventuell zumindest)
+50 Bytes char
+ 2 Bytes (oder 4 oder auch nicht)
+ 4 Bytes Funktionspointer oder 8 unter 64Bit?
-----------------------------------------------
irgendwas zwischen 64 und 88 Bytes und selbst das ist nur geratenIm Code von Felidae_TWC steht etwas von UART. Daher bin ich davon ausgegangen, dass es sich um einen Mikrocontroller handelt.
Und da wird/kann die 62 wieder stimmen.
Zudem konnt er sich das ja auch ausrechnen, indem ersizeof(array)/Anzahl_Elemente_im_Array
rechnet.dibada schrieb:
Der Compiler kann in eine struct Lücken einbauen, wenn er Lust hat, und die Größe eines Zeigers ist nicht einheitlich.
Und deswegen auch nochmal von mir: IMMER mit sizeof arbeiten!