Hallo, ich habe mal eine grundsätzliche Fragen: Gegeben sind 8 Variablen (3 Integer, 5 Double), diese werden in einem Menü am Display angezeigt und können alle nach dem gleichen Schema geändert werden. Jede Variable besitzt einen anderen Wertebereich, eine andere Stelle, an der sie angezeigt wird und eine andere Einheit. Nun habe ich für jede Variable folgende Funktionen deklariert: -konvertiere_Var1() //wandelt den Wert von int bzw. double in char für die Ausgabe um -zeige_aktiv_an_Var1() //Zeigt den aktuellen Wert zum Ändern bereit an -zeige_inaktiv_an_Var1() //Zeigt den aktuellen Wert deaktiviert an -setze_Var1() //Wertet den Zähler aus und Ändert den Wert der Variablen1 Nun meine Frage; Ist es schlimm, wenn ich diese Funktionen für jede Variable extra programmiert habe, oder optimiert das sowieso der Compiler? Für mich ist es einzeln übersichtlicher und die einzelnen Funktionen sind ja auch schön kurz, aber ich weiß nicht ob es nicht professioneller wäre, allgemeine Funktionen zu schreiben und als Übergabeparameter den Variablentyp anzugeben. Obwohl in diesem Falle müsste ich in den einzelnen Funktionen ja doch wieder mit einer Switch-Case-Anweisung (o.ä.) im Endeffekt (fast) den gleichen Code schreiben und würde mir nur ein paar Konvertierungen einsparen. Wie seht ihr das?
Ja, das ist schlimm, dafür einzelne Funktionen zu schreiben. Besser einfach alle einstellbaren Werte deklarativ definieren, da das auch die Wartung später vereinfacht:
1 | enum Type { |
2 | Int, |
3 | Double
|
4 | };
|
5 | |
6 | typedef struct Value { |
7 | const char* name; |
8 | Type type; |
9 | double value; |
10 | const char* einheit; |
11 | double minValue; |
12 | double maxValue; |
13 | double schrittweite; |
14 | };
|
15 | |
16 | Value g_menuValues[] = { |
17 | { "Spannung", Double, 0.5, "Volt", 0, 1, 0.1 }, |
18 | { "Helligkeit", Int, 5, "Prozent", 0, 10, 1 } |
19 | };
|
20 | |
21 | void showValues() |
22 | {
|
23 | int anzahl = sizeof(g_menuValues) / sizeof(Value); |
24 | int i; |
25 | for (i = 0; i < anzahl; i++) { |
26 | Value* value = &g_menuValues[i]; |
27 | switch (value->type) { |
28 | case Int: |
29 | printf("%s: %i %s\n", value->name, (int) value->value, value->einheit); |
30 | break; |
31 | case Double: |
32 | printf("%s: %f %s\n", value->name, value->value, value->einheit); |
33 | break; |
34 | }
|
35 | }
|
36 | }
|
Man könnte für "value" auch noch ein union verwenden, um tatsächlich "int" und "double" als Wert zu verwenden, aber das macht dann die Initialisierung nicht so einfach. Und der Compiler müsste dann "designated initializer list" unterstützten, was leider nicht alle können.
Theo schrieb: > Ist es schlimm, wenn ich diese Funktionen für jede Variable extra > programmiert habe, "Schlimm" gibt es dabei gar nicht. Es ist alles eine Frage der Sichtweise, und wie du dein Programm strukturierst. Wichtig ist nur, daß du es strukturierst. Du kannst deine Anzeige"objekte" als eben solche Objekte sehen, und diese haben dann alle ihre eigenen Funktionen zur Darstellung und Umrechnung. Man kann aber auch, wie Frrank Buss, sich gedanklich ein "Anzeigeobjekt" erstellen, welches dann alle Funktionen für die Anzeige bereitstellt. Was jetzt besser oder schlechter ist, ist zum Teil Geschmackssache. Falls du ein grafisches Display benutzt, und da auch noch Icons oder "analoge" Anzeigen verwenden willst, hat dein Ansatz seine Vorteile, bei reinem Text der von Frank. Theo schrieb: > oder optimiert das sowieso der Compiler? Eher nicht. Oliver
Theo schrieb: > Gegeben sind 8 Variablen (3 Integer, 5 Double), > Ist es schlimm, wenn ich diese Funktionen für jede Variable extra > programmiert habe, Wenn ich dich richtig verstanden habe, dann hast du zb
1 | int Minute; |
2 | int Stunde; |
3 | int Sekunde; |
und Funktionen geschrieben
1 | void konvertiere_Minute(); |
2 | void konvertiere_Stunde(); |
3 | void konvertiere_Sekunde(); |
Ja, das ist in der Tat schlimm, denn es zeigt, dass du noch nicht verstanden hast, dass Funktionen nicht konzeptionell auf Variablen losgelassen werden, sondern auf Werte. In Minute, in Stunde, in Sekunde steht jeweils ein Wert drinnen. Und dieser Wert ist immer gleich zu behandeln - er muss konvertiert werden. Dazu schreibt man sich 1 Funktion, die weiß, wie man mit Werten dieses Typs umgeht
1 | void konvertiere_Int( int Wert ) |
2 | {
|
3 | ...
|
4 | }
|
und benutzt die dann, um bei Bedarf den Wert in der Variablen Minute
1 | konvertiere_Int( Minute ); |
oder den Wert in der Variablen Stunde
1 | konvertiere_Int( Stunde ); |
oder eben den Wert in der Variablen Sekunde
1 | konvertiere_Int( Sekunde ); |
bearbeiten zu lassen. Mir scheint, du bist in deinen Studien bei Funktionen angelangt, aber den Schritt hin zu allemeinen Funktionen, die über Argumente die Werte bekommen mit denen sie operieren sollen, den hast du noch nicht vollzogen. Wobei ich zugeben muss, dass die übliche Programmierweise auf einem µC mit vielen globalen Variablen diesen Schritt auch nicht gerade fördert.
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.