Funktion optimieren - geht's kürzer/kompakter?

Moin,

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

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

 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:

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"

Vielleicht was in der Gegend?

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));
}

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

Öhm... :grin:

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

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.

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

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:

if (bedingung) {
  mach etwas;
} else {
  mach etwas anderes;
}
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:

(bedingung) ? mach etwas : mach etwas anderes;

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.