- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: if then else Schleife möglich mit goto zu verlassen?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    if then else Schleife möglich mit goto zu verlassen?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Mat,
    man kann deinem Code nicht entnehmen, wohin Goto Ende springt.
    Solange du nicht aus einem Unterprogramm/Funktion/ISR rausspringst, ist das kein Problem.
    Wenn du das nicht machst, sollte das wirre Zeugs auf deinem LCD einen anderen Grund haben.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    GOTO .... brrrrrrrrrr

    schlechter Programmierstil, kann
    mächtig nach hinten los gehen von
    wegen Stack Überlauf und andere Phänomene

    außerdem, if then ist keine Schleife, sondern ne Programmverzweigung

    Schleifen sind

    do loop, for next, while wend ...
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Codekrampf was ich oben lese.

    Code:
    Sub Rs232_datenuebertragung()
      Code
      code
      code
      if ergebniss=Blöde then Exit Sub
      code
      code
      code
    End Sub
    Schont Nerven ,Augen and Stack.

    lg gento

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Vitis
    GOTO .... brrrrrrrrrr

    schlechter Programmierstil, kann
    mächtig nach hinten los gehen von
    wegen Stack Überlauf und andere Phänomene

    außerdem, if then ist keine Schleife, sondern ne Programmverzweigung

    Schleifen sind

    do loop, for next, while wend ...
    Hallo Vitis,
    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 den besserwisserischen Hinweis auf die Schleife habe ich auch schon zig-mal gelesen.
    Erklär ihm doch lieber, wie er es anders machen könnte. Oder wieso der Stacküberlauf sehrwohl einen Einfluss auf seine wirren Zeichen haben kann.


    Zitat Zitat von Gento
    Codekrampf was ich oben lese.

    Code:
    Sub Rs232_datenuebertragung()
      Code
      code
      code
      if ergebniss=Blöde then Exit Sub
      code
      code
      code
    End Sub
    Schont Nerven ,Augen and Stack.

    lg gento
    Hallo gento,
    was willst du denn damit sagen? Dass Exit Sub sauberer ist als Goto Ende?
    Und wo bitteschön ist der Codekrampf in seinem Schnipsel? Weil jede Zeile so lang ist wegen des ausführlichen Kommentars, den er gegeben hat?

    Leute, Leute seid ihr wirklich solche Überflieger?

    Musste ich mal loswerden.

    Gruß

    Rolf

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    weil ein einzelnes Goto irgendwo tief im
    Code versteckt einen Stunden von
    Debugging kosten kann.
    Man nehme eine Subroutine, die mit Goto
    irgendwo zwischendrin verlassen wird,
    lagere sie aus und include sie wieder
    und baue 2000 Programmzeilen drumherum.
    Dann lasse man die Anwendung
    2 Stunden laufen und wundere sich,
    warum nicht nachvollziehbar Variablen
    überschrieben werden und seltsame
    Zeichen an UART oder LCd ankommen.
    Viel Spaß beim Suchen solcher Fehler.
    Daher ist schon ein Goto schlechter Stil
    und wird auch nicht wirklich gebraucht.

    Und dass Du die "If-Then-Schleife"
    schon zigmal gelesen hast macht sie dennoch
    nicht richtiger. 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.

    Bin kein Überflieger, mache auch Fehler und
    wenn die mir einer sagt hilft dieser mir aktiv.
    Auch konstruktive Kritik ist konstruktiv.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2009
    Ort
    NS
    Beiträge
    7
    Ich bin auch der meinung GOTOs sollte man im allgemein vermeiden, es gibt einfach viele situationen wo man keine GOTOs verwenden sollte.

    Um 'Schleifen' zu unterbrechen gibt es genug befehle im Bascom um dieses zu tun, wenn man auch Schleifen benutzt.

    For I = 1 to 10
    #Code
    If #Bedingung = TRUE Then Exit For
    Next I

    While #Bedingung = TRUE
    #Code
    If #Bedingung2 = TRUE Then Exit While
    Wend

    diese tolle Funktionen benutzen interne GOTOs mit den man nichts zu tun hat und so auch kaum probleme verursachen
    Die IF variante würde so aussehen

    Code:
    Dim Counter as Byte
    Dim Countfrom as Byte
    Dim Countto as Byte
    Dim Breakbedingung as Bit
    
       'Alias For I = 1 To 10
       Countfrom = 1
       Countto = 10
       Counter = Countfrom
    Pseudofor_start:
       #Code
       If Breakbedingung = 1 Then Goto Pseudofor_end
       If Countto > Counter Then
          Incr Counter
          Goto Pseudofor_start
       End If
    Pseudofor_end:
    Man sollte kein GOTO benutzten bei einem CALL, wo es ein RETI gibt beim rücksprung. Das ist ein Return befehl der die Register wieder herstellt.

    Also mit einem Call Befehl werden vorher die Register gespeichert, bei den Return befehl werden die wieder hergestellt, man sollte nicht in ein solchen Bereich rein oder raus springen.

    SUB FUNCTION
    <-- Hier nicht reinspringen
    ---> Hier nicht rausspringen mit Goto, Gosub ist ok.
    END SUB FUNCTION

    On Urxc Onrxd <-- Interruptaufruf wenn 1 Zeichen emfangen wurde(COM).


    Hier werden die Register gesichert und nacher zurück geschrieben.
    Onrxd:
    <-- Mit einem Sprung hier rein überschreibst du die Register mit unbekannte werte
    --> Mit einem Sprung hier raus werden die werte nicht wieder hergestellt beim nächsten RETURN
    Return <-- Ist ein RETI

    Mit GOTOs kann man auch schnell wieder in ein Programmteil landen der dir die Display variablen ändert während du sie gerade übertragst, oder einfach eine Variable ändert die was mit dem Display zu tun hat.
    Wenn du z.b. Ein String hast das die erste Zeile deines Displays entspricht, kann es passieren das wenn du vorher noch mit einem Index point ein Byte im String änderst, das dieses zu Fehlern kommen kann. Das kann es passieren, sollte man gerne Variablen doppelt benutzen, das diese in einem anderen Teil des Programs geändert wird, aber beim Display benutzt wird um das Index zu steuern. So kann es passieren das da dann Mühl steht.

    Natürlich gibts noch andere möglichkeiten, dafür müsste man aber mehr über das Programm wissen, und auch welche Bascom version du mit welchen Prozessor benutzt.

    Vielleicht habe ich dir ja schon so geholfen, sonst kannst dich ja nochmal melden.



    Ich benutze GOTOs manchmal um platz zu sparen und die 'AND' und 'OR' funktion zu ersetzen

    Code:
    Dummerweise sparrt das Platz :(
    Statt:
    
    If Var1 = 1 And Var2 = 1 Then 
       #Code
    Else
       #Code
    End If
    
    If Var1 = 1 Then
       If Var2 = 1 Then
          #Code
       Else
          Goto Now_do_else
       End If
    Else
    Now_do_else:
       #Code
    End If
    
       oder:-
    
    If Var1 = 1 Or Var2 = 1 Then 
       #Code
    Else
       #Code
    End If
    
    If Var1 = 1 Then
       Goto Now_do_if
    End If
    
    If Var2 = 1 Then
    Now_do_if:
       #Code
    Else
       #Code
    End If

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hallo Jungs!

    Danke für die vielen konstruktiven Anregungen!

    @vitis
    "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


    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!!!
    Angehängte Dateien Angehängte Dateien

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Immer locker. Besser ein Programm mit "goto", das funzt, als ein durchgestyltes, das abstürzt.

    Ist oft nur eine Frage der Optik: Ich hab' da z.B. den "Case 1:" Part OHNE goto umgebaut, in dem ich den "Else" mit dem GOTO einfach nach hinten geschoben habe, worauf sich gezeigt hat, dass davon garnix überbleibt.

    Code:
    Case 1 : If Rel_bad_zu = 0 And Fenster_bad_offen = 0 Then       
                       Toggle Rel_bad_auf                     
                       Fenster_bad_zu = 0                     
    
                       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       
                          Flag_bad_auf_1 = Rolltime + Timecount 
                          Elseif Rel_bad_auf = 1 And Flag_bad_zu_2 > 0 Then
                                  Flag_bad_auf_2 = Rolltime - Flag_bad_zu_2       
                          Flag_bad_zu_2 = 0            
                       End If
    
                       If Rel_bad_auf = 0 And Flag_bad_auf_2 > 0 Then   
                       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
                   End If
                   Twi_daten = 0
               ' hier springt er ja automatisch ans Ende der "CASE" Anweisung, auch ohne goto. 
    Case 11:

    Das war jetzt nur geschönt, damit Ruhe im Karton ist.

    Ich werd' noch versuchen, die Logik zu begreifen, dann gibt's noch mehr Vorschläge.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    das Programm sonst schaut gut aus,
    ist auch prima kommentiert , wie Du bei
    PicNick siehst brauchste das Goto garnicht
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests