Pages: [1]   Go Down
Author Topic: Funktion optimieren - geht's kürzer/kompakter?  (Read 854 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin,

für mein Temperaturlogger Projekt benutze ich eine Funktion um Balken auf einem LCD darzustellen. Die Funktion sieht bei mir so aus:

Code:
byte setBar(byte xvalue,byte value) {
  if (value>=0 && value<2) {
    lcd.setCursor(xvalue, 1); 
    lcd.print(" ");   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=2 && value<4) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(0);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=4 && value<6) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(1);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=6 && value<8) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(2);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=8 && value<10) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(3);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=10 && value<12) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(4);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=12 && value<14) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(5);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=14 && value<16) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(6);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=16 && value<18) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.print(" ");
  }

  if (value>=18 && value<20) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(0);   
  }

  if (value>=20 && value<22) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(1);   
  }

  if (value>=22 && value<24) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(2);   
  }

  if (value>=24 && value<26) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(3);   
  }

  if (value>=26 && value<28) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(4);   
  } 

  if (value>=28 && value<30) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(5);   
  } 

  if (value>=30 && value<32) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(6);   
  } 

  if (value>=32 && value<50) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(7);   
  } 
}

Wie könnte ich die Blöcke

Code:
if (value>=32 && value<50) {
    lcd.setCursor(xvalue, 1); 
    lcd.write(7);   
    lcd.setCursor(xvalue, 0); 
    lcd.write(7);   
  } 

optimieren/kürzen? Ich danke Euch für einen Tipp. Die Funktion erzeugt diese Balken rechts im LCD:

« Last Edit: August 14, 2011, 05:06:40 am by DE8MSH » Logged


0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn Du die Blöcke kürzen willst, dann pack sie in ein Unterprogramm. Besser wäre es jedoch nur einen solchen Block zu haben und die Vergleiche / Wertzuordnungen vorher abzufackeln. Wenn Du scharf hinkuckst, dann merkst Du vieleicht sogar, daß Du die Werte auch einfach ausrechnen kannst statt mit vielen IFs zu arbeiten. Ansonsten: "Table Lookup"
Logged

Check out my experiments http://blog.blinkenlight.net

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielleicht was in der Gegend?
Code:
byte setBar(byte xvalue,byte value) {
    lcd.setCursor(xvalue, 1);  
    lcd.print(value<2 ? " " : min(7, value/2-1));
    lcd.setCursor(xvalue, 0);  
    lcd.print(value<18 ? " " : min(7, value/2-9));
}
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, allerdings war meine Idee, daß er das selber merkt.
Logged

Check out my experiments http://blog.blinkenlight.net

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 770
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Öhm...  smiley-mr-green
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Außerdem die Kurzfassung der IF-ELSE Anweisung sollte auch erklährt werden.

Bedingung ? funktion wenn wahr : else Funktion wenn falsch
entspricht:
if (Bedingung) funktion wenn wahr else Funktion wenn falsch

Grüße Uwe
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Hauptunterschied zwischen "IF / ELSE" und "?" ist, daß "?" ein Operator ist und keine Anweisung ist. Insbesondere liefert (a? b: c) einen Wert zurück was "IF ELSE" nicht tut. Soll heissen: "?" ist keine  Kurzform für "IF ELSE" obwohl man es dazu benutzen kann.
Logged

Check out my experiments http://blog.blinkenlight.net

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Udo, kannst Du das dann mal genauer erklähren wie das mit dem ? funktioniert?
Danke, Grüße Uwe
Logged

Hamburg, Germany
Offline Offline
Full Member
***
Karma: 2
Posts: 191
Hello world!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

If-Then-Else ist ein Programmierkonstrukt, der ternäre Operator ist wie Plus oder Minus eine Operation (also mehr oder weniger im mathematischen Sinne) welche letzendlich einen Wert ergibt, was die If-Anweisung eben nicht tut.
Man spricht daher beim If auch von "bedingter Anweisung" und beim ? von "bedingter Zuweisung".

Veranschaulicht:

Code:
if (bedingung) {
  mach etwas;
} else {
  mach etwas anderes;
}

Code:
ergebnis = (wenn bedingung) ? wert1 : sonst wert2;

Man kann den ternären Operator zwar auch in den meisten Sprachen als IF-Anweisung missbrauchen, ich würde das aber durchaus als schlechten Stil bezeichnen:
Code:
(bedingung) ? mach etwas : mach etwas anderes;

Logged


0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Genau so ist es. Falls alle Operanden Integers sind hat das zur Folge, daß ? eine Integeroperation ist. Falls die Operanden zur Compilezeit bekannt sind kann der gcc deshalb ? zur Compilezeit ggf. auflösen. Bei IF ist das völlig unmöglich.
Weiterhin kann ? in Ausdrücken verwendet werden. IF nicht.

Auf jeden Fall wird ? vom Compiler anders als IF behandelt.
Logged

Check out my experiments http://blog.blinkenlight.net

Pages: [1]   Go Up
Jump to: