if then else Schleife möglich mit goto zu verlassen?
Hallo und nen netten Abend!
Ich habe ein Problem im meinem Code, mal wieder :)
Ich benutze in meiner Schaltung ein LCD welches über TWI angesprochen wird. Dieses zeigt mir bis zu einem Punkt immer alles folge richtig an, nur wenn ein bestimmter Codeteil angesprungen wird entsteht wirres Zeug auf dem Display. Aber nicht gleich.... es vergehen einige Minuten Stunden?...
Ich lasse in dem Programmteil ein Case-Anweisung durchspielen und in der steht folgendes:
Code:
Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then 'Tastenverrieglung
Toggle Rel_bad_auf 'umschalten von Port zwischen 0&1
Fenster_bad_zu = 0 ' nach fenster vollständig runter, erst wieder möglich runter zu fahren nach dem es wieder rauffuhr
Else
Twi_daten = 0
Goto Ende
End If
Locate 2 , 3
Lcd Rel_bad_auf
If Rel_bad_auf = 1 And Flag_bad_auf_2 = 0 And Flag_bad_zu_2 = 0 Then 'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
Flag_bad_auf_1 = Rolltime + Timecount ' flag mit der Laufzeit für Fenster kompl. auf plus Sekundenzähler
Elseif Rel_bad_auf = 1 And Flag_bad_zu_2 > 0 Then
Flag_bad_auf_2 = Rolltime - Flag_bad_zu_2 'nach dem das Fenster runtergefahren wurde, wurde der Laufzeitwert im Flag_bad_zu_2 gespeichert, jetzt wird bei
Flag_bad_auf_1 = Timecount + Flag_bad_auf_2 ' erneutem auffahren die restliche Zeit, für komplett auf, neu in Flag_bad_auf_1 geschrieben
Flag_bad_zu_2 = 0 ' löschen der der Zeit die schon zugefahren ist
End If
If Rel_bad_auf = 0 And Flag_bad_auf_2 > 0 Then 'if Abfrage jedesmal wenn case1 ist und somit der Port getoggle wird
Elseif Rel_bad_auf = 1 And Flag_bad_auf_2 > 0 Then '
Flag_bad_auf_1 = Timecount + Flag_bad_auf_2
Flag_bad_auf_2 = 0
End If
If Rel_bad_auf = 0 And Flag_bad_auf_1 > 0 Then
Flag_bad_auf_2 = Timecount
Flag_bad_auf_2 = Flag_bad_auf_1 - Flag_bad_auf_2
End If
Twi_daten = 0
Nun meine Frage:
=> kann ich in einer If/Then/Elseschleife diese nach der else-Anweisung mit goto verlassen?
like this:
Code:
Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then 'Tastenverrieglung
Toggle Rel_bad_auf 'umschalten von Port zwischen 0&1
Fenster_bad_zu = 0 ' nach fenster vollständig runter, erst wieder möglich runter zu fahren nach dem es wieder rauf fuhr
Else
Twi_daten = 0
Goto Ende
End If
Locate 2 , 3
Lcd Rel_bad_auf
Ich denke das mein Problem sein kann.... oder doch nicht?
Danke und Gruß MAT
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jungs!
Danke für die vielen konstruktiven :) Anregungen!
@vitis
Zitat:
"Es bleibt eine Verzweigung.
Wenn man im Forum die richtigen Termini
verwendet hilft das den Lesern die Fragen
auch zu verstehen und die Chance auf qualitative
Hinweise erhöht sich. "
=> da gebe ich Dir Recht und das war mein Fehler!
in welchen Teilen siehst Du bei mir einen schlechten "Programmierstil"? => Bsp's. bitte
Hier noch einmal ein etwas bessere Form meines Codes:
Code:
Case 2 : If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If
If Rel_kue_zu = 1 And Flag_kue_zu_2 = 0 And Flag_kue_auf_2 = 0 Then
Flag_kue_zu_1 = Rolltime + Timecount
Elseif Rel_kue_zu = 1 And Flag_kue_auf_2 > 0 Then
Flag_kue_zu_2 = Rolltime - Flag_kue_auf_2
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_auf_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_2 > 0 Then
Elseif Rel_kue_zu = 1 And Flag_kue_zu_2 > 0 Then
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_zu_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_1 > 0 Then
Flag_kue_zu_2 = Timecount
Flag_kue_zu_2 = Flag_kue_zu_1 - Flag_kue_zu_2
End If
Twi_daten = 0
Case 22 : If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If
If Rel_kue_zu = 1 And Flag_kue_zu_2 = 0 And Flag_kue_auf_2 = 0 Then
Flag_kue_zu_1 = Rolltime + Timecount
Elseif Rel_kue_zu = 1 And Flag_kue_auf_2 > 0 Then
Flag_kue_zu_2 = Rolltime - Flag_kue_auf_2
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_auf_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_2 > 0 Then
Elseif Rel_kue_zu = 1 And Flag_kue_zu_2 > 0 Then
Flag_kue_zu_1 = Timecount + Flag_kue_zu_2
Flag_kue_zu_2 = 0
End If
If Rel_kue_zu = 0 And Flag_kue_zu_1 > 0 Then
Flag_kue_zu_2 = Timecount
Flag_kue_zu_2 = Flag_kue_zu_1 - Flag_kue_zu_2
End If
Twi_daten = 0
Ende: <<<==== hier ist das ende
end select
Was wollte ich damit bezwecken?:
tritt eine Case-Fall ein:
case 22: If Rel_kue_auf = 0 And Fenster_kue_zu = 0 Then
Toggle Rel_kue_zu
Fenster_kue_auf = 0
Else
Twi_daten = 0
Goto Ende
End If
und die If-Anweisung ist nicht wahr dann sollen Daten in "Twi_daten " gelöscht werden und es soll aus der Case-Verzweigung gesprungen werden. Somit müssen die weiteren Cases nicht durch gegangen werden.
Wie kann ich nun das besser programmieren, besser wie komme ich aus der Case-Verzweigung heraus?
Vielleicht habe ich die Struktur und/oder den Ablauf eines Programms noch nicht verstanden!
Laut Simulation werden alle Schritte, die man proggt, doch hintereinander abgearbeitet. Was passiert nun in einer Case-Verzweigung?
@ for_ro
Danke für die tröstenden Worte :)
Zitat:
wieso ist ein einzelnes Goto schlechter Programmierstil? Du weißt doch gar nicht, ob sein Programm aus Spaghetti-Code besteht, oder dies eine Notbremse zum Verlassen eines Programmteils ist.
und genau darum geht es!!!!
Wenn die Case-Verzweigung angesprungen wird und die Bedingungen darin nicht erfüllt werden, soll einfach aus der Verzweigung gesprungen werden und die weiteren Programmteile abgearbeitet werden!
Ich hänge noch das gesamte Prog an und bitte!!!! sagt was ich am Stil ändern sollte!
Danke für Eure Hilfen, denn nur so lerne ich es besser und schneller!!!