Wie würdet ihr das angehen?
So muss man immer aufpassen, bei der Erstellung der enumeration den
richtigen Stringfortlauf einzuhalten, und wenn da was vertauscht wird,
sieht es nicht mehr gut aus.
Fängt ihr mit der enumeration an, und dann die Stringliste
oder ganz anders?
Falls C: Vielleicht helfen dir die "designated array initializers"
weiter. In diesem Beispiel liegen die Strings im Array in der gleichen
Reihenfolge wie die Werte im Enum, auch wenn es optisch anders aussieht:
1
enumevent_id_code{
2
TORAUF,
3
TORZU,
4
FENSTERAUF,
5
FENSTERZU,
6
TUEREAUF,
7
TUEREZU
8
};
9
10
char*event_id_string[]={
11
[TORZU]="Tor zu",
12
[TUEREZU]="Türe zu",
13
[TORAUF]="Tor auf",
14
[FENSTERZU]="Fenster zu",
15
[TUEREAUF]="Türe auf",
16
[FENSTERAUF]="Fenster auf"
17
};
Der Ausdruck
1
event_id_string[FENSTERAUF]
liefert also immer "Fenster auf", egal wie sehr du die Zeilen in
event_id_code oder event_id_code durcheinanderwürfelst.
Natürlich müssen bei der Array-Initialisierung die Indizes in den
eckigen Klammern mit dem Text jeweils rechts daneben korrespondieren.
Das aber beim Einfügen neuer Elemente die einzelnen Zeilen i.Allg. nicht
geändert werden, besteht hier kaum die Gefahr von Fehlern. Falls doch
ein Fehler gemacht wurde, kann dieser schnell gefunden werden, da die
korrespondierenden Dinge ja direkt nebeneinander stehen.
Yalu X. schrieb:> "designated array initializers"
Es sei darauf hingewiesen, daß auch 2016 noch C-Compiler existieren, die
nichts neueres als C90 kennen, und da gibt es so etwas leider nicht.
Ein "berühmtes" Beispiel ist der Compiler, der zu Microsofts "Visual
C++" gehört.
Der unterstützt C++11 (oder neuer), aber nichts neueres als C90:
https://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
Rufus Τ. F. schrieb:> Der unterstützt C++11 (oder neuer), aber nichts neueres als C90:>> https://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
Der Artikel ist ja auch schon ein paar Tage alt :)
Seit der 2013er-Version soll es die designated Initializers wohl geben
und mittlerweile auch ein paar diesbezügliche Bugs gefixt worden sein.
Ich habe allerdings keinen MS-Compiler hier, wo ich das auf die Schnelle
mal ausprobieren könnte.
Außerdem: Wer programmiert auf einem PC unter Windows in C? ;-)
Microsoft hat die Priorität für den C-Modus ihres Compilers aus gutem
Grund herabgesetzt (scheint es sich jetzt aber doch wieder anders zu
überlegen).
Yalu X. schrieb:> Außerdem: Wer programmiert auf einem PC unter Windows in C? ;-)
Wer beispielsweise Konsolenanwendungen schreiben möchte (wie z.B.
Kommandozeilencompiler) oder Systemdienste etc.
Windows-GUI-Anwendungen in C zu schreiben à la Petzoldt ist definitiv
außerhalb der Genfer Konvention.
Auf jeden Fall mal das case
switch (event_id_code) {
case TORAUF : printf(event_id_string[TORAUF]); break:
case TORZU : printf(event_id_string[TORZU]); break;
case FENSTERAUF: printf(event_id_string[FENSTERAUF]); break;
case FENSTERZU : printf(event_id_string[FENSTERZU); break;
case TUEREAUF : printf(event_id_string[TUEREAUF]); break;
case TUEREZU : printf(event_id_string[TUEREZU]); break;
}
durch
printf(event_id_string[event_id_code]);
ersetzen