Forum: Compiler & IDEs "Große Arrays" initialisieren in C, 'Good Practice'


von Heiko (Gast)


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

von Klaus W. (mfgkw)


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

von Klaus W. (mfgkw)


Lesenswert?

Je nachdem, was du unter MC verstehst, kann man natürlich auch
noch eine C++-std::map verwenden.

von Heiko (Gast)


Lesenswert?

Hallo Klaus.
Die Initialisiermöglichkeit nach C99 war mir bisher nicht bekannt; muss 
ich mir mal genau anschauen. Ansonsten bin ich leider an C gebunden. 
Gruß und Danke.

von Klaus W. (mfgkw)


Lesenswert?

C99 ist C, also mit dem gcc sieht das sinnvoll aus.
Mit MS-VC++ sehe ich da aber ziemlich schwarz, d.h. man legt sich auf 
nicht-MS fest.

von StinkyWinky (Gast)


Lesenswert?

Variante 3) und zwar über eine Excel-Tabelle.

von (prx) A. K. (prx)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Matthias H. (experimentator)


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.

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.