mikrocontroller.net

Forum: Compiler & IDEs sizeof geht nicht


Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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




Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist der Typ "uint8_t" in Projekt.c bekannt?

Autor: ABu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
 extern uint8_t TestArray[];

 void Test(void)
 {
   uint8_t a;
   a = sizeof(TestArray);
 }

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.

Autor: ABu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens-Erwin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)
 extern uint8_t TestArray[];

 void Test(void)
 {
   uint8_t a;
   a = sizeof(TestArray);
 }

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.