Array mit Längen von verschiedenen Strukturen

OP #2888133
Lesenswert?
• ▲
▼
Hallo,

ich habe ein kleines C-Problem:

Ich habe viele Arrays mit einer zu ermittelnden Anzahl gleicher 
Strukturen drin. So hat z.B. Array1 2 structs Array2 3 structs usw.

Nun möchte ich mir eine Liste mit Anzahl der Strukturen jedes Arrays 
anlegen lassen. Also in etwa so
1
uint8_t ArrayLength[] = { sizeof(Array1)/sizeof(struct x),sizeof(Array2)/sizeof(struct x), ...

Das funktioniert aber nur, wenn ich die Liste im gleichen c-file 
generiere in dem die Arrays definiert sind. Sind die Arrays über 
verschiedene Files verteilt geht das nicht, da der Compiler jedes C-file 
getrennt übersetzt. Der Linker könnte das aber, da dieser ja die Infos 
über die Längen hat.

Hat jemand eine Idee wie ich das machen könnte?
Moderator #2888294
Lesenswert?
• ▲
▼
Daniel S. schrieb:
> Das funktioniert aber nur, wenn ich die Liste im gleichen c-file
> generiere in dem die Arrays definiert sind.

Lege einfach ein Header-File (oder auch mehrere davon) an, in dem die
Array deklariert sind, also bspw.
1
extern struct x Array1[13];
2
extern struct x Array2[47];
3
...

Diese Header-File wird insbesondere auch dort includet, wo Array2 und
Array2 definiert sind.

Wichtig ist, dass die Größer der Arrays (im Beispiel 13 bzw. 47) nicht
nur in der Definition, sondern auch in der extern-Deklaration steht,
sonst kann man den sizeof-Operator nicht auf die Arrays anwenden. Der
Compiler vergleicht die Deklarationen in den Header-Files mit den
Definitionen in deen .c-Files. Stimmt die Array-Größe (die bei dieser
Methode ja zweimal — also redundant — angegeben werden muss) nicht
überein, gibt's Mecker. Damit kannst du sicher sein, dass
1
sizeof Array2

immer dir richtige Größe liefert, egal ob im betreffenden Programmab-
schnitt nur die Deklaration oder auch die Definition des Arrays bekannt
ist.
OP #2888436
Lesenswert?
• ▲
▼
genau das ist ja mein Problem. Die Länge kann sich immer ändern. Es sind 
parametersätze wo man immer wieder was ändert bzw verschiedene Versionen 
haben verschiedene Anzahl Parametersätze.

Die Arrays sind
1
uint8_t Array1[] = {1,2,3,4...

definiert. Im Header dann nur
1
extern uint8_t Array1[];

Eine Lösung ist in jedes file wo ein Array definiert ist die Länge zu 
berechnen und eine static variable damit zu initialisieren. Zu 
Programmstart werden dann diese variablen in ein Array kopiert. So kann 
man wieder per Zeigerarithmetik darauf zugreifen. Ist aber nicht wirlich 
schön.

Eine andere Variante wäre die c files in ein übergeordnetes File zu 
includieren. Dort könnte man dann alle längen mit sizeof berechnen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.