Code vereinfachen (mal wieder)

Hallo,

kann man folgenden Codefetzen noch kürzer schreiben, oder habe ich bereits alle Möglichkeiten ausgereizt und falls ja, wie?

void testpattern_sw_IPHD()
{
  if(testpattern_LED_st[5])
  {
    if(taster_st == B10000000) Serial3.print("OTPM 4 1\r");
    if(taster_st == B01000000) Serial3.print("OTPM 6 1\r");
    if(taster_st == B00100000) Serial3.print("OTPM 7 1\r");
    if(taster_st == B00010000) Serial3.print("OTPM 9 1\r");
    if(taster_st == B00001000) Serial3.print("OTPM 10 1\r");
  }
  else if(!testpattern_LED_st[5])
  {
    if(taster_st == B10000000) Serial3.print("OTPM 4 0\r");
    if(taster_st == B01000000) Serial3.print("OTPM 6 0\r");
    if(taster_st == B00100000) Serial3.print("OTPM 7 0\r");
    if(taster_st == B00010000) Serial3.print("OTPM 9 0\r");
    if(taster_st == B00001000) Serial3.print("OTPM 10 0\r");
  }
  if(taster_st == B10000000)
  {
    testpattern_5_sw_conv(B01111000);
    real_testpattern_nr = 4;
  }
  if(taster_st == B01000000)
  {
    testpattern_5_sw_conv(B10111000);
    real_testpattern_nr = 6;
  }
  if(taster_st == B00100000)
  {
    testpattern_5_sw_conv(B11011000);
    real_testpattern_nr = 7;
  }
  if(taster_st == B00010000)
  {
    testpattern_5_sw_conv(B11101000);
    real_testpattern_nr = 9;
  }
  if(taster_st == B00001000)
  {
    testpattern_5_sw_conv(B11110000);
    real_testpattern_nr = 10;
  }
}

Gruß Chris

Hallo,

warum?

Gruß,
Jürgen

In erster Linie damit es übersichtlicher wird. Weniger Speicherbedarf kommt an zweiter, leichtere Adaptierbarkeit an dritter Stelle.

Gruß Chris

Gebe Jürgen da recht. Warum soll der weiter eingekürzt werden? Ist doch eine kleine Funktion. Was du aber machen kannst,

if(taster_st == B10000000)
  {
    testpattern_5_sw_conv(B01111000);
    real_testpattern_nr = 4;
  }
  if(taster_st == B01000000)
  {
    testpattern_5_sw_conv(B10111000);
    real_testpattern_nr = 6;
  }
[...]

Das solltest du aber aus performancetechnischen Gründen (auch wenn kaum messbar bis garnicht) ändern durch ein elsif oder switch. Hier wird die Variable mehrere Male abgefragt, auch wenn eines der Ereignisse bereits wahr war.

elsif bricht mit der Überprüfung ab, sobald eine wahr ist. Switch ruft auch nur die Zeile auf, die für die Variable zutrifft.

Edit: Speicherbedarf hat sogut wie michts mit Codezeilen zu tun.

Jürgen hat doch gar nichts gesagt, lediglich was gefragt. Bei was gibst Du ihm denn recht? :stuck_out_tongue:

Dein Codebeispiel berücksichtigt testpattern_LED_st[5] nicht.

Trotzdem danke. 8)

Gruß Chris

Du solltest bei der Serial Ausgabe das F()-Makro verwenden:

Serial3.print(F("OTPM 4 1\r"));

Sonst landet der String im RAM. Das ist ein Byte pro Zeichen + Terminator. Da kommt schnell einiges zusammen

Chris72622:
kann man folgenden Codefetzen noch kürzer schreiben, oder habe ich bereits alle Möglichkeiten ausgereizt und falls ja, wie?

Die ellenlangen if-Abfragen sehen für mich aus, als wenn man die Zuordnungen auch in eine Datenstruktur packen und in einer Schleife abarbeiten kann.

Irgendwie so (oder ähnlich):

void testpattern_sw_IPHD()
{
  byte zuordnung[5][3]={
    {B10000000,4,B01111000},
    {B01000000,6,B10111000},
    {B00100000,7,B11011000},
    {B00010000,9,B11101000},
    {B00001000,10,B11110000},
  };
  byte b01;
  if(testpattern_LED_st[5]) b01=1; else b01=0;
  for (int i=0;i<5;i++)
  {
    if (taster_st == zuordnung[i][0])
    {
      Serial3.print("OTPM ");
      Serial.print(zuordnung[i][1]);
      Serial.print(" ");
      Serial.print(b01);
      Serial.print("\r");
      testpattern_5_sw_conv(zuordnung[i][2]);
      real_testpattern_nr = zuordnung[i][1];
    }
  }
}

Dankeschön!

Was ist ein F()-Makro?

Gruß Chris

Die Strings werden im Flash anstatt im RAM abgelegt. Anwendung hat Serenfly doch bereits geschrieben.

Der AVR hat eine Harvard Architektur. Das heißt Flash und RAM haben getrennte Adress-Räume. Eine Funktion kann also nicht so einfach ins Flash greifen und dort Daten auslesen. Deshalb werden beim Start alle Strings aus dem Flash ins RAM kopiert.

Der Compiler hat aber eine ganze Reihe von Makros und Hilfs-Funktionen um auch Strings im Flash zu bearbeiten

F() ist ein zusätzliches Makro der Arduino IDE das mit print() funktioniert

Ich finde, Lesbarkeit und Kürze sind verschiedene Optimierungen.
Jurs' Lösung ist sicher kürzer, aber vorher war es eventuell lesbarer. Geschmackssache
Der F - Makro hat den großen Vorteil, dass alles noch fast genauso gut lesbar ist ....

In einer tief vergrabenen Library ist Kürze besser, in einem Sketch meist Lesbarkeit.

Ein Änderungsvorschlag vielleicht:

 else if(!testpattern_LED_st[5])

ist das gleiche wie

 else

da vorher if (testpattern_LED_st[5]) abgefragt wurde.

Evtl. kannst du eine Funktion

void OTPM(byte b, boolean t);

definieren und 5 mal verwenden:

    boolean t = testpattern_LED_st[5];
    if(taster_st == B10000000)   OTPM(4, t);
    if(taster_st == B01000000)   OTPM(6 ,t);
    if(taster_st == B00100000)   OTPM (7, t);
    if(taster_st == B00010000)   OTPM (9, t );
    if(taster_st == B00001000)   OTPM (10, t);