Zwei Variablen für eine neue Variable zusammenfassen (goto)

Hi,

sitze hier gerade an einer For-Schleife, mit welcher ich später auf andere Codeteile verweisen möchte.

for(int Pin=6; Pin <= 13; Pin = Pin +1)
  {
   Tasterzustand = digitalRead(Pin); 
   if(Tasterzustand == 1)
   {
     goto Taster+Pin;
   }
  }
  
  Taster6:
    //Codeblock

  Taster7:
    //Codeblock

  //bis Taster13...

Angenommen, der Taster an Pin 9 wird gedrückt.
Dann wurde dies über die if-Schleife abgefragt und dann möchte ich, dass ich mithilfe von einem goto-Verweise direkt zu dem entsprechenden Codeblock kommt, welchen ich speziell für Taster 9 geschrieben habe.

Wie es danach weitergeht, ist unwichtig.
Mir geht es nur darum, wie ich das mit dem goto-Verweis am besten mache?

Letztendlich muss ja ein Sektionsname entstehen, damit ich verweisen kann.
Dieser sollte wie bereits geschrieben im Format "Taster+Pin" - also später zum Beispiel Taster9 - entstehen.

goto Taster+Pin;

code:33: error: expected ';' before '+' token

Das erhalte ich allerdings als Fehler.

Wie soll ich das am besten lösen?

Gruß

Defentiv nicht mit SpaghettiCode -> "GOTO"

Mir gefällt die for-Schleife jetzt auch nicht wirklich, aber es dürfte aber so gehen.

Anstatt goto Taster+Pin machste ein SwitchCase

switch(Pin) {
case 6:
do6();
break;
case 7:
//....
}

Hast du die Taster überhaupt entprellt?

Verzichte auf goto generell. Es gibt zwei, drei legitime Verwendung dafür (z.B. um aus verschachtelten for-Schleifen zu kommen und für Fehlerbehandlung). Aber abgesehen davon hat das in modernen Programmen nichts verloren.

Setzten in der for-Schleife eine Variable. Verlasse die for-Schleife mit break:
http://arduino.cc/de/Reference/Break

Und verwende dann switch/case auf die Variable:
http://arduino.cc/de/Reference/SwitchCase

Alternativ kann das switch/case auch gleich innerhalb des if-Blocks stehen

@sschultewolter

Jup, die Signale kommen einwandfrei an.
Und was genau gefällt dir an der Schleife nicht?

Und - klar, mit SwitchCase!
Vielen dank euch beiden, denn das lässt sich hier ideal einbauen! :slight_smile:

Und über goto habe ich schon einiges, nicht gerade positives gelesen...war aber hier die mir einzige bekannte Lösung ^^

Estehtische Gründe :wink:

Schleifen versuche ich immer mit 0 zu beginnen, hier jedoch nicht direkt möglich. Man könnte die Pins auch zu einem Array zusammenfassen

...

#define NUMBER_OF_PINS 3
int Pins[NUMBER_OF_PINS] = {1, 5, 7};

setup();

loop() {
for (int pin = 0; pin < NUMBER_OF_PINS; pin++) {
boolean value =digitalRead(pins[pin]);
}

..war aber hier die mir einzige bekannte Lösung

Nur leider ist

goto Taster+Pin;

überhaupt keine Lösung, da das Sprungziel
** **Taster1:** **

durch keine solche Addition ermittelt werden kann.
Das heisst, es gibt keine Lösung für dein Compilerproblem bei dem ein goto drin vorkommt. :wink:

Ein sehr schönes Beispiel für die These "goto baucht man nicht". Danke, Ganthi

"Zwei Variablen für eine neue Variable zusammenfassen" geht übrigens auch nie so wie du das vermutlich im Kopf hast.
Die drei Variablen
** ** a, b, ab** **
haben nichts gemeinsames. Wenn du die Variable
** ** ab** **
in [b] x [/b]umbenennst, ändert sich das Programm dadurch überhaupt nicht. Der Name einer Variable ist nur dafür da, dass es für dich als Mensch verständlich bleibt.