Was haltet ihr von Goto

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.

Was haltet iht von Goto?

Benutze ich ständig
7
13%
Brauch ich eigentlich nicht
19
37%
Noch nie davon gehört
2
4%
Ist mir egal
2
4%
Goto ist das Werk des Teufels
11
21%
Brauch ich selten
8
15%
Diese Umfrage ist ein Mülleimerkandidat
3
6%
 
Insgesamt abgegebene Stimmen: 52

Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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...
und genau das ist der Ausnahmefall, der in Wiki erwähnt wird, und genau so ist er gemeint, und nicht anders.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Kaeru Gaman hat geschrieben:
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...
und genau das ist der Ausnahmefall, der in Wiki erwähnt wird, und genau so ist er gemeint, und nicht anders.
Meine Meinung
+1
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

Beitrag von Burstnibbler »

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
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

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

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

dieser crash tritt aber nur in höheren PB-Versionen auf.

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!"
Warum FakeEndSelect aus PB genommen wurde verstehe ich bis heute nicht. Aber das ist wieder mal ein Grund manchmal 3.3 zu benutzen!
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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

@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

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

@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
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag von Captn. Jinguji »

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):

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"]
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.
QUatsch. Wenn Du die Suchtiefe begrenzen willst, kommst Du ohne garantiert nicht aus.
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.
Ähmmm warum erzählst Du das MIR ?
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

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.
!UD2
Antworten