Go Down

Topic: Funktion optimieren - geht's kürzer/kompakter? (Read 1 time) previous topic - next topic

DE8MSH

Aug 14, 2011, 11:57 am Last Edit: Aug 14, 2011, 12:06 pm by DE8MSH Reason: 1
Moin,

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

Code: [Select]
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: [Select]
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:

Look at
http://de8msh.blogspot.com/
and
http://www.youtube.com/user/de8msharduino

Udo Klein

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"
Check out my experiments http://blog.blinkenlight.net

Joghurt

Vielleicht was in der Gegend?
Code: [Select]
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));
}


Udo Klein

Ja, allerdings war meine Idee, daß er das selber merkt.
Check out my experiments http://blog.blinkenlight.net


uwefed

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

Udo Klein

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.
Check out my experiments http://blog.blinkenlight.net

uwefed

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

sui

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: [Select]

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


Code: [Select]

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: [Select]

(bedingung) ? mach etwas : mach etwas anderes;



Udo Klein

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.
Check out my experiments http://blog.blinkenlight.net

Go Up