goto stoppt ausführung?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    goto stoppt ausführung?

    Hallo Leute,

    ich schonwieder :) Ich weiss "GoTo" ist ein "schlechter Programmierstil" etc. Aber bei meinem derzeitigen Programm hilft es mir weiter, da das Programm den PC Namen ändert und danach neugestartet wird und ich mittels einer ausgelagerten Variable in einer textfile auf den aktuellen stand abprüfe und dann mittels goto zu den jeweiligen lines springe.

    Allerdings fiel mir auf, dass wenn zu der sprungmarke "gesprungen" wird die nachfolgenden aktionen NICHT mehr ausgeführt werden.
    Also zb

    If IO.File.ReadAllText("datei.txt") = "a2" then
    goto abschnitt2
    endif

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    function1()
    function2()
    function3()
    aschnitt2:
    function4()
    function5()

    End Sub

    Springe ich zu Abschnitt2 steht das Programm. Function4 und Function5 werden nicht ausgeführt.
    Ist das so beabsichtigt, wie kann ich es richtig stellen? Irgendwer eine Idee? Habe den Befehl das letzte mal in VB6 bzw. QuickBasic benuzt!

    Danke im Vorraus,
    Mfg
    Ich weiß es nicht 100% aber ich würde mal behaupten das Du zwar zu aschnitt2: "Springst" aber der Sub dadurch trotzdem nicht aufgerufen wurde (Sprich: Steht zwar da so rum aber läuft nicht los :P)
    zudem warum willst du das überhaupt mit GoTo machen? ich würde es zb. so umsetzen


    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinAufrufvonGoTo2()
    7. If IO.File.ReadAllText("datei2.txt") = "a2" Then
    8. DeinGoToZiel(2)
    9. End If
    10. End Sub
    11. Private Sub DeinGoToZiel(i As Integer)
    12. Select Case i
    13. Case 1
    14. function4()
    15. function5()
    16. Case 2
    17. function1()
    18. function2()
    19. Case Else
    20. function3()
    21. End Select
    22. End Sub

    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Mit Case wäre auch eine Möglichkeit, aber dann pack ich das ganze recht unübersichtlich in eine Schleife rein!
    ...
    Ja ich denke dass ist das problem, aber wie kann ich vb dazu bewegen einfach im ablauf weiterzumachen? Die Sprungmarke ist innerhalb des selben subs.
    @v-go ich bin mir nicht mal sicher ob es überhaupt möglich ist mit einen goto Befehl einen anderen Sub direkt auch auszuführen
    (verstehe aber immer noch nicht ganz warum du es unbedingt mit goTo machen möchtest O.o wenn du selber weißt das es "schlechter Programmierstil" ist)

    noch eine Möglichkeit:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinGoToZiel(i As Integer)
    7. If i = 1 Then
    8. function4()
    9. function5()
    10. Else
    11. function1()
    12. function2()
    13. function3()
    14. DeinGoToZiel(1)
    15. End If
    16. End Sub


    wird DeinGoToZiel(0) (normal) aufgerufen werden alle functionen 1 bis 5 ausgeführt ruft man DeinGoToZiel(1) auf wird nur function 4 und 5 ausgeführt


    wen du es unbedingt mit einen Goto lösen möchtest evt so ?!

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinGoToZiel(i As Integer)
    7. If i = 1 Then
    8. GoTo abschnitt2
    9. End If
    10. function1()
    11. function2()
    12. function3()
    13. aschnitt2:
    14. function4()
    15. function5()
    16. End Sub

    Ist aber letztendlich das gleiche wie meine If Version nur (meiner Meinung nach) unschöner

    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Ruerte“ ()

    wen du es unbedingt mit einen Goto lösen möchtest evt so ?!

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinGoToZiel(i As Integer)
    7. If i = 1 Then
    8. GoTo abschnitt2
    9. End If
    10. function1()
    11. function2()
    12. function3()
    13. aschnitt2:
    14. function4()
    15. function5()
    16. End Sub


    Hi danke für dein Antworten :) So habe ich es aber gerade von deinem 1 Beispiel abgekupfert und probiert. Ausführung stoppt aber schon wieder bei der Sprungmarke
    @v-go

    Es gibt meines erachtens in VB.net keinen Grund GoTo zu verwenden. Das führt IMMER zu mehr Fehler wie Lösungen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @v-go wie gesagt ich würde meine if lösung nutzen :D
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinGoToZiel(i As Integer)
    7. If i = 1 Then
    8. function4()
    9. function5()
    10. Else
    11. function1()
    12. function2()
    13. function3()
    14. DeinGoToZiel(1)
    15. End If
    16. End Sub
    wird DeinGoToZiel(0) (normal) aufgerufen werden alle functionen 1 bis 5 ausgeführt ruft man DeinGoToZiel(1) auf wird nur function 4 und 5 ausgeführt

    oder auch so (ohne schleife)

    VB.NET-Quellcode

    1. Private Sub DeinAufrufvonGoTo()
    2. If IO.File.ReadAllText("datei.txt") = "a2" Then
    3. DeinGoToZiel(1)
    4. End If
    5. End Sub
    6. Private Sub DeinGoToZiel(i As Integer)
    7. If i = 1 Then
    8. function4()
    9. function5()
    10. Else
    11. function1()
    12. function2()
    13. function3()
    14. function4()
    15. function5()
    16. End If
    17. End Sub

    @Schamash hab noch nie gesehen das wer in VB.NET GoTo nutzt das sagt schon alles aus

    Das GoTo Beispiel funktionirt eigentlich (Gibt nur JA wieder und bleibt nirgends stehen)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. test1(1)
    4. End Sub
    5. Private Sub test1(i As Integer)
    6. If i = 1 Then
    7. GoTo test
    8. End If
    9. MsgBox("nein")
    10. test:
    11. MsgBox("ja")
    12. End Sub
    13. End Class

    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Ruerte“ ()

    v-go schrieb:

    Ich weiss "GoTo" ist ein "schlechter Programmierstil" etc. Aber bei meinem derzeitigen Programm hilft es mir weiter,
    Nein, hilft es nicht. Weiterhelfen würde dir, wenn du Hirn anmachst, und überlegst, wie du mit strukturierter Programmierung dein Prob löst.

    v-go schrieb:

    Ich weiss "GoTo" ist ein "schlechter Programmierstil" etc. Aber...
    Wenn du das weisst, dann verstehe ich die Frage nicht. Weil da gibt's kein Aber
    Schade dass es nicht klappt. Verstehe aber nicht wieso ihr GoTo so verteufelt, früher war das Usus. Aber was solls.
    Und @Ruerte Ich finde deinen Seitenhieb mit "hab noch nie gesehen das wer in VB.NET GoTo nutzt das sagt schon alles aus" nicht okay, denn wenn es absolut sinnlos wäre,
    wäre es nicht mehr vorhanden und ich bin mir bewusst dass dies wohl als "schlechter Programmierstil" gilt in manchen Fällen ist es aber eine gute Lösung . Das einzige Problem ist und war immer das der Code unübersichtlich für Dritte wird, da diese mühsam sich die Sprungmarken raussuchen mussten.
    Rein von der Funktionalität des Codes/Programmes ergeben sich dadurch keine Nachteile!
    Aber das ist in meinem Fall nicht das Problem weil ich es inerhalb ein und desselben moduls verwende und in sonst keinem anderen.

    @ErfinderDesRades da es scheinbar nicht funtkioniert, muss ich mir eh eine alternative überlegen. Für meinen Zweck wäre goto in diesem speziellen falle aber eine gute wahl, da ich dadurch den source übersichtlicher statt unübersichtlicher mache. Schreibe ich die Load in eine einzige Schleife ist das zum lesen einfach nur grausam. Mein Source besitzt 55 functionen, wovon 40 im load ausgeführt werden müssen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „v-go“ ()

    @v-go

    1. GoTo funktioniert bei mir (zumindest im Selben Sub) ohne Probleme (auch wenn man es nicht nutzen sollte)
    2. GoTo ist bei mir So oder So nicht Sub übergreifend (bekomme schon ne Fehlermeldung wenn ich es allein versuche)
    3. "hab noch nie gesehen das wer in VB.NET GoTo nutzt das sagt schon alles aus" meinte ich nicht im sinne dich nieder zu machen sondern eher im Sinne wenn's niemand nutzt wird's wohl seine gründe haben!
    4. GoTo gibt es nur noch, damit man alte Projekte wegen so was nicht komplett neu schreiben muss! Wenn man eh was neues macht bitte auch Ordentlich!

    All in all bin ich der Meinung von @ErfinderDesRades entweder du nimmst unsere Hilfe an (zb. mein GoTo Möglichkeit oder Die if Version) oder man wartet bis einer, einen anderen Vorschlag hat,
    aber direkt angepisst zu sein wegen "hab noch nie gesehen das wer in VB.NET GoTo nutzt das sagt schon alles aus"...
    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Ruerte“ ()

    Es widerstrebt mir, bei einem GoTo-Problem Hilfe zu leisten, aber sich hier jemand zu Tode sucht:
    Dein Label ist falsch geschrieben (aschnitt2 statt abschnitt2).
    Das müsste die Fehlermeldung aber recht eindeutig anzeigen.

    Ansonsten:
    Aber das ist in meinem Fall nicht das Problem weil ich es inerhalb ein und desselben moduls verwenden und in sonst keinem anderen.
    Ich hoffe, du meinst "innerhalb einer Prozedur", denn was anderes funktioniert nicht:
    The GoTo statement can branch only to lines in the procedure in which it appears.

    Und weiter:
    ​You cannot use a GoTo statement to branch from outside a For...Next, For Each...Next, SyncLock...End SyncLock,Try...Catch...Finally, With...End With, or Using...End Using construction to a label inside.
    Quelle: msdn.microsoft.com/en-us/library/69whc95c.aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Ruerte schrieb:

    ich würde meine if lösung nutzen
    Ich nicht. :D
    @v-go Meine geht so:

    VB.NET-Quellcode

    1. Private Sub DeinGoToZiel(i As Integer)
    2. If i <> 1 Then
    3. function1()
    4. function2()
    5. function3()
    6. End If
    7. function4()
    8. function5()
    9. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany ist doch das gleiche nur umgedreht würd ich behaupten :D
    @ErfinderDesRades Da bin ich mal gespant welche ^^

    Ich möchte im allgemeinen nur mal Drauf hinweisen:

    GoTo Verzweigt ohne Bedingung zu einer bestimmten Zeile INNERHALB einer Prozedur.


    Wenn ich mich nicht irre ist ein Sub eine Prozedur für sich?!


    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @Ruerte Nein ich bin nicht angepisst. Sorry ich habe deinen Satz einfach falsch verstanden! Danke nochmals für deine Hilfsbereitschaft!
    @ErfinderDesRades Ich wollte den Code für mich übersichtlicher gestalten. Aber ich werde wohl IF Abfragen einbauen, so ähnlich wie von @RodOfGermany vorgeschlagen hat.
    Es sollte einfach im mainmodul möglichst ohne schleifen ablaufen, so wie ein inhaltsverzeichnis in einem buch. Ich hoffe du kannst es dir so leichter vorstellen was mein ziel ist.
    Also so:

    Sub Form1.load
    ...
    sub1
    function1
    function 2
    function 3
    functiion 4
    ...
    end sub

    Also übersichtlich eben, und dann mit der goto abfrage so

    sub form1.load
    ...
    wenn variable = 1 dann
    goto 1
    else
    goto 4
    ende wenn
    wenn variable 4 dann
    goto 8
    ende wenn
    ...
    8:
    sub1
    1:
    function1
    function 2
    4:
    function 3
    function 4
    ...
    end sub

    @Ruerte ja ich weiss innerhalb einer prozedur / innerhalb eines subs/function. prozedurübergreifend klappts ohnehin nicht.


    Ruerte schrieb:

    würd ich behaupten
    Ich sage mal, dass im Falle <> 1 bei Dir im Gegensatz zu @v-go und mir

    VB.NET-Quellcode

    1. function4()
    2. function5()
    nicht ausgeführt werden. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    v-go schrieb:

    Ich hoffe du kannst es dir so leichter vorstellen was mein ziel ist.
    Nein, verstehe von deinen Erklärungen nichts.
    Nur dasses iwie übersichtlicher sein soll, aber inwiefern wäre eine Goto-Verwendung denn übersichtlicher als If-Verzweigungen?
    Von deinem PseudoCode verstehe ich garnix - kannst du den nicht vernünftig layouten?
    gugge

    Ich habe gehofft, du könntest erklären, was unter welchen Umständen passieren soll.
    Also ich versuche mal zu raten: Wenn - nach deinem Code variable = 1, dann soll Funktion 1-4 ausgeführt werden, bei variable = 4 hingegen nur Funktion 1-2 ?

    Das wäre einer der denkbaren Fälle, denn vb.net kennt keine Fall-Through-Verzweigung

    also hier mal meine beiden Beispiele. Das erste ist das Raushopfen aus verschachtelten gleichartigen Schleifen:

    VB.NET-Quellcode

    1. Private Sub ExitNestedLoops()
    2. For i = 0 To 99
    3. For ii = 0 To 99
    4. If i = 9 AndAlso ii = 14 Then GoTo Raus
    5. Next
    6. Next
    7. Raus:
    8. 'etwas hinter beiden Schleifen...
    9. End Sub


    Das annere ist etwas, was ich "FallThrough-Verzweigung" nenne, also die Ausführung springt in einen Ablauf hinein, von dem ggfs. vom Anfang her was übersprungen werden kann:

    VB.NET-Quellcode

    1. Private Sub GoToFallThrough(ByVal i As Integer)
    2. Select Case i
    3. Case 3 : GoTo Label1
    4. Case 9 : GoTo Label2
    5. Case 999 : GoTo Label3
    6. Case 0 : GoTo Label4
    7. Case 11 : GoTo Label5
    8. Case 90 : GoTo Label6
    9. Case Else : GoTo Label7
    10. End Select
    11. Label1:
    12. method1()
    13. Label2:
    14. method2()
    15. Label3:
    16. method3()
    17. Label4:
    18. method4()
    19. Label5:
    20. method5()
    21. Label6:
    22. method6()
    23. Label7:
    24. method7()
    25. End Sub
    Beides braucht man allerdings extrem selten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Private Sub ExitNestedLoops()
    For i = 0 To 99
    For ii = 0 To 99
    If i = 9 AndAlso ii = 14 Then GoTo Raus
    Next
    Next
    Raus:
    'etwas hinter beiden Schleifen...
    End Sub

    Da würde ich auch ein GOTO akzeptieren.
    Alternativ habe ich das schon mit einem solchen Hilfskonstrukt gelöst, was im Grunde auch nicht schöner ist (solange die Do-Loop nicht sinnvoll genutzt werden kann):

    VB.NET-Quellcode

    1. Private Sub ExitNestedLoops()
    2. Do
    3. For i = 0 To 99
    4. For ii = 0 To 99
    5. If i = 9 AndAlso ii = 14 Then Exit Do
    6. Next
    7. Next
    8. Loop Until True
    9. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --