Beispiel: Habe eine Main.h auf die alle Dateien verweisen, auch die Main.C in Main.h. steht extern uint8_t TestArray[]; void Test(void); in Main.c steht (vor der Mainfunktion ....) uint8_t TestArray[] PROGMEM = {1,5,4,6}; in Projekt.c (die auch auf Main.h verweist) steht: void Test(void) { uint8_t a; a = sizeof(TestArray); } und dann das: invalid application of 'sizeof' to incomplete type 'uint8_t[]' kann man mir helfen??? wenn alle in der Main.c steht geht es, aber eben nicht ausgelagert
Da wird nur in der Main der Typ 'uint8_t' definiert sein, der wird bestimmt in irgend einer standard Includefile definiert sein, die in den anderen Files nicht eingebunden ist.
Jens-Erwin wrote: > invalid application of 'sizeof' to incomplete type 'uint8_t[]' > > kann man mir helfen??? Das kannst du selbst auch. Spiel einfach mal Compiler. Gegeben folgender Code
1 | extern uint8_t TestArray[]; |
2 | |
3 | void Test(void) |
4 | {
|
5 | uint8_t a; |
6 | a = sizeof(TestArray); |
7 | }
|
Und jetzt, nur mit diesem Code, beantworte bitte die Frage: Wie gross ist den TestArray? Und die einzig mögliche Antwort darauf lautet: Keine Ahnung, da ich nicht weiss aus wievielen Elementen das Array besteht. Und jetzt überleg noch mal was das incomplete in 'incomplete type 'uint8_t[]' wohl heissen könnte.
Die größe des Array wird doch durch die Initialisierung festgelegt, uint8_t TestArray[] PROGMEM = {1,5,4,6}; beim "Bekanntgeben" durch extern braucht man die größe auch nicht angeben
Der Compiler kennt die größe aber nicht, wenn er projekt.c übersetzt. Er kennt sie nur innerhalb von main.c. Zusammenfügen tuts ja erst der Linker. Aber der interssiert sich für ein sizeof nicht mehr.
ABu wrote: > Die größe des Array wird doch durch die Initialisierung festgelegt, > > uint8_t TestArray[] PROGMEM = {1,5,4,6}; > in ** main.c ** Der Compiler kompiliert aber nicht main.c Er kompiliert Projekt.c und dort ist diese Initialisierung nicht sichtbar.
Total richtig - vor allem das mit dem "selbst helfen" -- leuchtet absolut ein und das mit dem Linker auch in Main.c funktioniert auch alles ... ich habe jetzt folgendes gemacht eine Variable definiert vor der Mainfunktion uint8_t GroesseTestArray dann fülle ich diese nach dem Main Aufruf vor der Whileschleife als Initialisierung sozusagen GroesseTestArray = sizeof(TestArray); dann kann ich diese benutzen -- es ist ja nur eine Erleichterung für das Projekt. Es gibt Tabellen, die werden verändert und ich möchte, das die Zeiger nicht aus den Arrays raus springen, wenn die Tabelle mal nur 5 anstatt vorher 10 Elemente hat .... es sind aber alles Konstanten ....
> Ihr macht immer wieder den gleichen Fehler: > Einzelne *.c Dateien werden unabhängig voneinander compiliert. > Wenn der Compiler Projekt.c compiliert weis er nichts, > aber auch gar nichts von einer andern *.c Wenn Projekt.c compiliert wird, hat der Compiler nur diesen Code (den include hab ich händisch aufgelöst)
1 | extern uint8_t TestArray[]; |
2 | |
3 | void Test(void) |
4 | {
|
5 | uint8_t a; |
6 | a = sizeof(TestArray); |
7 | }
|
und daraus muss der Compiler was machen. Kann er aber nicht, weil nicht bekannt ist, wie gross den das Array tatsächlich ist. Lösung: Wie du siehst sind globale Variablen nicht der Weisheit letzter Schluss. Entweder du spendierst eine 2te globale Variable in die von main.c (dort ist ja die Größe bekannt) die Größe hineingeschrieben wird oder aber (und das ist von der Theorie her die bessere Lösung) du pfeifst auf die globale Variable und übergibst ganz einfach das Array an die Funktion, gemeinsam mit der Größenangabe.
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.