Forum: Mikrocontroller und Digitale Elektronik Array mit Längen von verschiedenen Strukturen


von Daniel S. (daniel_s)


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?

von Yalu X. (yalu) (Moderator)


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.

von Daniel S. (daniel_s)


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.

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.