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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy