Forum: Compiler & IDEs sizeof geht nicht


von Jens-Erwin (Gast)


Lesenswert?



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




von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

Ist der Typ "uint8_t" in Projekt.c bekannt?

von ABu (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von ABu (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jens-Erwin (Gast)


Lesenswert?

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 ....

von Karl H. (kbuchegg)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.