angesteckt durch bobobos Goto-Affinität, wollte ich hier mal ein kleines Beispiel zum besten geben, das zeigt, wie man Goto sinnvoll nutzen kann.
Dazu möchte ich einen Code-Schnipsel aus meinem aktuellen Projekt als Beispiel nehmen. Der Schnipsel ist zwar ohne das drum herum nicht lauffähig, aber es geht hier in erste Linie um die Idee dahinter. Diese wird übrigens auch häufig in C-Treiber-Code verwendet. Zuletzt gab es da bei Apple einen hübschen Fehler wegen eines Gotos, das zu viel war. Zum Glück kann dieser Fehler in PureBasic wegen der anderen Syntax nicht so einfach auftreten, also könnt ihr beruhigt sein.
Hier also zuerst mal der Code, wie man ihn wohl üblicherweise so schreiben würde:
Code: Alles auswählen
Procedure.i init()
;Libusb initialisieren
If (Not USB::init())
ProcedureReturn #False
EndIf
;Gerät finden
*device = USB::findDevice(#idVendor, #idProduct)
If (Not *device)
USB::free()
ProcedureReturn #False
EndIf
;Konfigurationsmöglichkeit überprüfen
If (Not USB::checkConfiguration(*device, #nConfiguration, #nInterface, #nAltSetting))
USB::unuseDevice(*device)
*device = 0
USB::free()
ProcedureReturn #False
EndIf
;Gerät öffnen
*handle = USB::openDevice(*device)
If (Not *handle)
USB::unuseDevice(*device)
*device = 0
USB::free()
ProcedureReturn #False
EndIf
If (Not USB::useConfiguration(*handle, #nConfiguration, #nInterface, #nAltSetting))
USB::closeDevice(*handle)
*handle = 0
USB::unuseDevice(*device)
*device = 0
USB::free()
ProcedureReturn #False
EndIf
ProcedureReturn *handle
EndProcedure
Deswegen habe ich jetzt etwas umgebaut und das ganze sieht so aus:
Code: Alles auswählen
Procedure.i init()
;Libusb initialisieren
If (Not USB::init())
ProcedureReturn #False
EndIf
;Gerät finden
*device = USB::findDevice(#idVendor, #idProduct)
If (Not *device)
Goto end1
EndIf
;Konfigurationsmöglichkeit überprüfen
If (Not USB::checkConfiguration(*device, #nConfiguration, #nInterface, #nAltSetting))
Goto end2
EndIf
;Gerät öffnen
*handle = USB::openDevice(*device)
If (Not *handle)
Goto end2
EndIf
If (Not USB::useConfiguration(*handle, #nConfiguration, #nInterface, #nAltSetting))
Goto end3
EndIf
ProcedureReturn *handle
end3:
USB::closeDevice(*handle)
*handle = 0
end2:
USB::unuseDevice(*device)
*device = 0
end1:
USB::free()
ProcedureReturn #False
EndProcedure
Mich hat das Konzept überzeugt und ich nutze es überall, wo es sinnvoll ist.
Konstruktive Kritik nehme ich gerne an und wenn ihr weitere sinnvolle Goto-Einsatzgebiete kennt, dann lasst alle daran teilhaben, indem ihr hier eine entsprechende FAQ-mäßige Antwort drunter setzt.