www.mikrocontroller.net

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


Autor: Theo (Gast)
Datum:

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

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht 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:
enum Type {
  Int,
  Double
};

typedef struct Value {
  const char* name;
  Type type;
  double value;
  const char* einheit;
  double minValue;
  double maxValue;
  double schrittweite;
};

Value g_menuValues[] = {
  { "Spannung", Double, 0.5, "Volt", 0, 1, 0.1 },
  { "Helligkeit", Int, 5, "Prozent", 0, 10, 1 }
};

void showValues()
{
  int anzahl = sizeof(g_menuValues) / sizeof(Value);
  int i;
  for (i = 0; i < anzahl; i++) {
    Value* value = &g_menuValues[i];
    switch (value->type) {
      case Int:
        printf("%s: %i %s\n", value->name, (int) value->value, value->einheit);
        break;
      case Double:
        printf("%s: %f %s\n", value->name, value->value, value->einheit);
        break;
    }
  }
}

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.

Autor: Oliver (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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
int Minute;
int Stunde;
int Sekunde;
und Funktionen geschrieben
void konvertiere_Minute();
void konvertiere_Stunde();
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
void konvertiere_Int( int Wert )
{
  ...
}
und benutzt die dann, um bei Bedarf den Wert in der Variablen Minute
    konvertiere_Int( Minute );
oder den Wert in der Variablen Stunde
    konvertiere_Int( Stunde );
oder eben den Wert in der Variablen Sekunde
    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.

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.