Forum: Compiler & IDEs Größe eines arrays innerhalb einer Struktur bestimmen ?


von Stefan Seegel (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


Lesenswert?

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.

von OldBug (Gast)


Lesenswert?

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

von Stefan Seegel (Gast)


Lesenswert?

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

von OldBug (Gast)


Lesenswert?

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

von Rolf Theisinger (Gast)


Lesenswert?

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!?

von OldBug (Gast)


Angehängte Dateien:

Lesenswert?

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

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.