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
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
Je nachdem, was du unter MC verstehst, kann man natürlich auch noch eine C++-std::map verwenden.
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.
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.
Variante 3) und zwar über eine Excel-Tabelle.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.