mikrocontroller.net

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


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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/Design...

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: StinkyWinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variante 3) und zwar über eine Excel-Tabelle.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias H. (experimentator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.