www.mikrocontroller.net

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


Autor: Stefan Seegel (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: Stefan Seegel (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

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

Autor: Rolf Theisinger (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:
Angehängte Dateien:

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

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.