sizeof geht nicht

Gast #581204
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



#581216
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.
Gast #581236
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.
Gast #581243
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 ....
#581248
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.