Forum: Compiler & IDEs Frage zum Programmierstil (von Funktionen)


von Theo (Gast)


Lesenswert?

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?

von Frank B. (foobar)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.