und genau das ist der Ausnahmefall, der in Wiki erwähnt wird, und genau so ist er gemeint, und nicht anders.milan1612 hat geschrieben:Also ich hatte erst letztens einen Fall in dem ich ohne ein klug gesetzes Goto
den Code so umstrukurieren hätte müssen dass er wesentlich unleserlicher
geworden wäre. Goto also pauschal zu verteufeln halte ich für absoluten Quatsch,
nur darf man es halt nicht unüberlegt einsetzen...
Was haltet ihr von Goto
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Meine MeinungKaeru Gaman hat geschrieben:und genau das ist der Ausnahmefall, der in Wiki erwähnt wird, und genau so ist er gemeint, und nicht anders.milan1612 hat geschrieben:Also ich hatte erst letztens einen Fall in dem ich ohne ein klug gesetzes Goto
den Code so umstrukurieren hätte müssen dass er wesentlich unleserlicher
geworden wäre. Goto also pauschal zu verteufeln halte ich für absoluten Quatsch,
nur darf man es halt nicht unüberlegt einsetzen...
+1
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
-
- Beiträge: 58
- Registriert: 04.10.2008 12:10
Das letzte "Goto/Gosub" hatte ich zu C64-Zeiten benutzt, danach nie wieder - ist halt alles eine Frage des Programmierstils.
Und darum halte ich persönlich auch nichts davon, Anfängern mal zwei, drei Programme mit "Goto" proggen zu lassen. Weil man ihnen damit beibringt, dass Sie auf diesen Befehl ausweichen können, wenn Sie mal nicht weiter wissen - anstatt von Anfang an so zu coden, dass Sie erst gar nicht in die Verlegenheit kommen, diesen Befehl nutzen zu müssen.
Ergo: Ich persönlich halte "Goto" zwar nicht für "ein Werk des Teufels", aber wenn man sich angewöhnt strukturiert zu coden, kann man den Befehl -ohne weiteres- aus seinem PB-Wortschwatz streichen.
Pure Greetz,
Burstnibbler
Und darum halte ich persönlich auch nichts davon, Anfängern mal zwei, drei Programme mit "Goto" proggen zu lassen. Weil man ihnen damit beibringt, dass Sie auf diesen Befehl ausweichen können, wenn Sie mal nicht weiter wissen - anstatt von Anfang an so zu coden, dass Sie erst gar nicht in die Verlegenheit kommen, diesen Befehl nutzen zu müssen.
Ergo: Ich persönlich halte "Goto" zwar nicht für "ein Werk des Teufels", aber wenn man sich angewöhnt strukturiert zu coden, kann man den Befehl -ohne weiteres- aus seinem PB-Wortschwatz streichen.
Pure Greetz,
Burstnibbler
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
Hier ein Beispiel in welchem innerhalb einer PROCEDURE mit GOTO aus einer SELECT..CASE-Anweisung gesprungen wird (wobei das Sprungziel netterweise sogar innerhalb der Prozedur liegt). Aber da das Rücksprungziel der Prozedur auf dem Stack liegt und der Stackpointer durch das GOTO aus dem SELECT..CASE heraus nun nicht mehr korrekt ist, will das Programm am Ende der Procedure an eine ungültige Adresse zurückspringen und crasht:
Code: Alles auswählen
; BAD CODE
Procedure DoCrash(a.l)
Select a
Case 0 : Debug "nothing"
Case 1 : Goto handle1
Default : Debug "nothing"
EndSelect
ProcedureReturn
handle1:
Debug "ok so far, but crash NOW on ProcedureReturn..."
ProcedureReturn
EndProcedure
DoCrash(1)
!UD2
Dann muss man den Stack eben wieder erniedrigen. Es wurde nie behauptet das man mit GoTo leichtsinnig irgentwo herrumspringen sollte, es muss natürlich gezielt eingesetzt werden, aber wenn man es gezielt und überlegt einsetzt ist es an manchen Stellen die bessere Lösung.
Code: Alles auswählen
Procedure DoCrash(a.l)
Select a
Case 0 : Debug "nothing"
Case 1 : Goto handle1
Default : Debug "nothing"
EndSelect
ProcedureReturn
handle1:
!POP dword[ESP]
Debug "ok so far, and doesn't crash on ProcedureReturn..."
ProcedureReturn
EndProcedure
DoCrash(1)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
dieser crash tritt aber nur in höheren PB-Versionen auf.
In 3.3 funzt er super:
Warum FakeEndSelect aus PB genommen wurde verstehe ich bis heute nicht. Aber das ist wieder mal ein Grund manchmal 3.3 zu benutzen!
In 3.3 funzt er super:
Code: Alles auswählen
; BAD CODE
Procedure DoCrash(a.l)
Select a
Case 0 : Debug "nothing"
Case 1 :
FakeEndSelect
Goto handle1
Default : Debug "nothing"
EndSelect
ProcedureReturn
handle1:
Debug "ok so far, but crash NOW on ProcedureReturn..."
ProcedureReturn
EndProcedure
DoCrash(1)
Debug "geht doch!"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
@Stargate: Ich denke ich kann dich glücklich machen:
Code: Alles auswählen
Macro FakeEndSelect
!POP dword[ESP]
EndMacro
Procedure DoCrash(a.l)
Select a
Case 0 : Debug "nothing"
Case 1
FakeEndSelect
Goto handle1
Default : Debug "nothing"
EndSelect
ProcedureReturn
handle1:
Debug "ok so far, and doesn't crash on ProcedureReturn..."
ProcedureReturn
EndProcedure
DoCrash(1)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
@cxAlex danke ^^ *glücklich sei*
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
QUatsch. Wenn Du die Suchtiefe begrenzen willst, kommst Du ohne garantiert nicht aus.AND51 hat geschrieben:Egal, ob Schleifen oder Rekursionen, ein Goto zum Verlassen des ganzen Konstrukts ist unnötig.
Bei Konstrukten wie diesem hier kann man sich das Goto ganz einfach durch setzen richtiger Abbruchbedingungen sparen (Pseudocode):Jinguji un DrFalo, natürlich kennt man hier seine Rekursionstiefe nicht, das stimmt. Da habe ich anfangs nicht dran gedacht. Aber es ist auch gar nicht nötig, sie zu kennen und auch einen Rekursionstiefenmesser braucht man nicht.Code: Alles auswählen
Procedure scan() While scannen If noch_mehr_zu_scannen scan() Else Goto raus_hier EndIf Wend EndProcedure [/quote] Ähmmm warum erzählst Du das [b]MIR[/b] ? [quote="AND51"]
Ähmmm warum erzählst Du das MIR ?AND51 hat geschrieben: Man kann auch 2 verschiedenen Wegen die Rekursion verlassen: Entweder, wenn es nichts mehr zu scannen gibt, oder indem man Werte wie -1 zurückgibt, die signalisieren, dass die Rekursion abgebrochen werden soll.
In Fällen wie diesem ein Goto zum verlassen einer Rekursion einzusetzen, halte ich wie andere hier auch, für "schlechten" Programmierstil. Was machst du denn, wenn diese Prozedur die Größe in Bytes eines Verzeichnisses inklusive Unterverzeichnisse zurückgeben soll? Zählst du dann die Größe in einer globalen Variable mit und springst da bei Bedarf mit Goto raus? LOL. Das macht man "anständigerweise" mit geschützen Variablen (Protected) und einem ProcedureReturn am Ende der Prozedur. Das zeigt auch, dass man die Rekursion 100%ig verstanden hat.
Ist das Kunst hier, oder kann das weg ?
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
Natürlich kann man die Effekte eines Goto wieder auffangen und es dann auch in solchen Situationen nutzen (und da kann es sogar sinnvoll sein). Man darf damit auch aus Prozeduren heraus und sogar in andere hineinspringen, wenn man weiß, wie man den Stack(pointer) zu korrigieren hat. Man könnte sogar direkt auf dem Stack eine Reihe von rekursiven Aufrufen erzeugen und abschließend abarbeiten lassen, ohne die Rekursionstiefe vorher durch einzelne Prozeduraufrufe aufgebaut zu haben. Ebenso kann man mit Inline-Assembler machen was man will.
Es ist für Programmieranfänger nur wichtig zu sehen, dass ein Goto nicht die Möglichkeit der Wahl ist, um von einer Stelle des Programmcodes einfach woandershin zu springen - sondern man kann sich damit leicht versteckte Probleme einhandeln.
Es ist für Programmieranfänger nur wichtig zu sehen, dass ein Goto nicht die Möglichkeit der Wahl ist, um von einer Stelle des Programmcodes einfach woandershin zu springen - sondern man kann sich damit leicht versteckte Probleme einhandeln.
!UD2