"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

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.

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.