Größe eines arrays innerhalb einer Struktur bestimmen ?

Gast #177811
Tach!

Habe folgendes Problem: Ich möchte wissen wie groß das Element data der
Struktur ist, welches ein array ist:

typedef struct
{
  unsigned char width;
  unsigned char height;
  unsigned char data[];
} t_bitmap;

t_bitmap testmap PROGMEM =
{
  10, 16,
  {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
    2, 4, 8, 16, 32, 64, 128, 8, 9, 10
  }
};

sizeof(testmap.data) bringt die fehlermeldung
"main.c:57: error: invalid application of `sizeof' to an incomplete
type"

sizeof(testmap.height) geht dagegen.
Am Progmem liegts nicht, ohne progmem gibts den gleichen fehler.

Weiß jemand Rat ?

MfG
Stefan
Gast
Du hast durch die Deklaration als »[]« halt einen unvollständigen
Typen definiert, von dem kannst Du kein `sizeof' bestimmen, da der
Typ
selbst dadurch eine undefinierte Größe hat.  Eine definierte Größe
(und damit überhaupt erstmal benutzbar) bekommt der Typ erst durch die
Instanzierung (also durch eine initialisierte Variable -- Du kannst
von diesem Typen auch keine nichtinitialisierten Variablen benutzen).
Von einer solchen Instanz kannst Du dann auch `sizeof' bestimmen,
also
»sizeof(testmap)« sollte sehr wohl funktionieren.

Wenn Du genau drüber nachdenkst, welche Information der Compiler zur
Compilezeit von Deinem Code überhaupt besitzt, sollte das auch alles
sehr logisch sein.
Gast
So geht das nicht!

unsigned char data[];

Ist kein array, sondern ein Pointer auf ein array. Du könntest
genausogut:

unsigned char *data;

schreiben.
Du musst dann zur Laufzeit genügend Speicher für Dein array reservieren
und die Adresse des Pointers "updaten".
Gast
Alles klar, habe glaub ich verstanden...
SizeOf wird praktisch direkt vom Compiler "gewandelt".

Naja, dann fällt mir nur noch ein von SizeOf(testmap) die 2 Bytes für
die anderen beiden Felder abzuziehen, dann hab ich ja die größe des
data feldes...

Vielen Dank für die Tips !!

MfG
Stefan
Gast
...dann erhälst Du die größe des Pointers, denke ich. Nicht die des
Datenfeldes...

Und immer dran denken: C ist case-sensitive, soll heissen SizeOf !=
sizeof!
Gast
Hi Stefan,

wenn du sizeof benutzt, bekommst du die Größe des Datentyps geliefert.
Wenn du die Länge eines Strings wissen möchtest, d.h. die Anzahl der
Zeichen bis zur '\0'-Terminierung, kannst du mit strlen arbeiten.
Die Größe deines Arrays sollte nicht dynamisch sein, da dein Programm
sonst nicht mehr den aktuellen Standards entspricht und je nach
verwendetem Compiler nicht mehr übersetzt werden kann.

Also, entweder "char* data" in die Struktur und später auf ein
Element eines Arrays deiner Wahl zeigen lassen, oder "char
data[Größe]" benutzen.

Viele Grüße
Rolf

PS: Ich kann nicht erkennen, was dein Programm können soll, aber wenn
du nur ganze Zahlen speichern möchtest, wäre "int data[Größe]"
vielleicht besser!?
Gast
Ich vermute, daß Du Windows benutzt!?

Evtl. hilft Dir ja der Anhang weiter, Du benötigst nur einen gcc, der
auf Windows lauffähig ist (MinGW oder Cygwin). Falls Du irgend ein
Unix/Linux verwenden solltest, dann nenn das Outputfile einfach nicht
.exe... :)

Viel Spaß beim rumspielen...
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.