"Große Arrays" initialisieren in C, 'Good Practice'

Gast #1935905
Lesenswert?

Hallo zusammen.
Ich implementiere gerade eine Applikation auf einem uc bei dem ich sehr 
viele "Objekte" (structs) in einem Array verwalte will. Die Größe des 
Arrays (und die Anzahl der Objekte) ändert sich zur LAufzeit nicht.
Somit kann ich theoretisch das Array mit allen Struct-Member bereits bei 
der Deklaration initialisiseren und zur Laufzeit mit dem bekannten Index 
schnell darauf zugreifen.
Nun frage ich mich aber, ob diese Vorgehensweise schon in Bezug auf 
Wartbarkeit und Zuverlässigkeit eine Gute Idee ist. Wenn ich feste 
Indizes in der Applikation benutzte und später ein neues Objekt 
hinzugefügt werden muss, dann muss höllisch aufgepasst werden, dass 
nicht auf ein falsches Objekt zugegriffen wird.

Grundsätzlich sehe ich 3 Möglichkeiten:

1. Statische Implementierung, Initialisierung bei Deklarataion (wie oben 
beschrieben)

2. Initialisierung jedes Objektes über eine Funktion (Setze Objekt an 
Index x..). Somit könnte sichergestellt werden, dass die in der 
Applikation verwendeten Indizes tatsächlich mit dem Array übeinstimmt. 
Wahrscheinlich aber nicht gerade performant...

3. Implementierung eines Scriptes, welches ein C/H-File generiert. Das 
C-File einhält die Array-Deklaration (und Inititialisierung) und das 
H-File die Indizes welche ich dann in der Applikaion verwenden kann. 
Durch das Script sollte immer eine Datenkonsistenz gewährleistet sein.

So ich hoffe ich habe mich verständlich ausgedrückt. Welche dieser 
Möglickeiten würdet ihr als "Good Practice" ansehen?

Danke und Gruß
Heiko
#1935915
Lesenswert?

1) gefällt dir ja nicht (mir würde es in manchen Fällen auch nicht
gefallen),
2) ist doof weil es tatsächlich viel Platz frisst,
3) finde ich je nach Umstände durchaus vernünftig (aber wahrscheinlich
nicht mehrheitsfähig; ich mache auch egrne Skripte oder Programme,
um Quelltext zu genereieren, aber bin damit meistens alleine)

und dann gibt es beim gcc noch Möglichkeit
4), vielleicht ist das eine Hilfe:
http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Designated-Inits.html#Designated-Inits
#1937413
Lesenswert?

A. K. schrieb:
> Klaus Wachtler schrieb:
>
>> 3) finde ich je nach Umstände durchaus vernünftig (aber wahrscheinlich
>> nicht mehrheitsfähig; ich mache auch egrne Skripte oder Programme,
>> um Quelltext zu genereieren, aber bin damit meistens alleine)
>
> Kann dich beruhigen: Du bist es nicht.

Dann sind wir schon zu dritt.
Und ich würde sagen: Der Erfolg gibt uns recht.
#1939094
Lesenswert?

Ich würde die statische Initialisierung beibehalten, aber für die 
Indizierung des Arrays Konstanten (nur C++), Defines oder ein Enum 
definieren und die Objekte im Programm nur über den entsprechenden 
Bezeichner (oder bei einer Folge von mehreren gleichartigen Objekten 
zumindest Name für Offset + laufende Nummer) ansprechen. Und bei 
mehreren Quellcode-Dateien peinlich darauf achten, daß die 
Abhängigkeiten richtig im Makefile stehen!
Ausnahme C++: Wenn die Initialisierung der Objekte im Konstruktor 
Operationen ausführt, die eine Exception werfen können, dann würde ich 
das dringend lassen, weil man dann keine Chance zur Fehlerbehandlung 
hat.

Das mit dem Code generieren kann sinnvoll sein, aber u. U. die Wartung 
erschweren, darum muß man sich das überlegen, es möglichst 
"bombensicher" ins Makefile einbinden, ...
Es kann auch dem Firmenstandard widersprechen oder, falls dieser 
momentan noch nichts darüber aussagt, später Änderungen erforderlich 
machen.
Auf jeden Fall ungefährlich ist es, wenn man es nur benutzt, um sich 
Tipparbeit zu sparen und den generierten Code manuell in den Source 
einfügt. Das mache ich öfters, ansonsten würde ich den Kunden um 
Erlaubnis fragen, wenn sich die Notwendigkeit ergeben sollte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren