Gosub Fehler?
ehrlich gesagt finde ich Gosub für große Programmteile wirklich besser, da man nicht alle Variablen mit geben muss, oder als global deklarieren muss.
Mit groß meine ich das ich ein Hauptprogramm habe (5000 Zeilen) und dan mit Gosub zu 2000 Zeilen springe
Mit groß meine ich das ich ein Hauptprogramm habe (5000 Zeilen) und dan mit Gosub zu 2000 Zeilen springe
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
- Milchshake
- Beiträge: 166
- Registriert: 30.01.2006 17:47
- Wohnort: Zwischen dem Sessel und dem Computer
Du musst nur dafür sorgen, dass die aufgerufenen routinen nicht abgearbeitet werden können.
Es darf halt nicht passieren das das Programm ein Return ohne Gosub erwischt.
Es darf halt nicht passieren das das Programm ein Return ohne Gosub erwischt.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Mit "Goto" oder "Gosub" zu programmieren ist eine unsauber Methode und sollte nicht mehr verwendet werden. Schön das es PB noch unterstütz, aber es geht auch anders.
FF 
Code: Alles auswählen
; PB 4.10
; Funktionen und Procedure deklarieren
Declare Steuerung()
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"Gosub Fehler")
LoadSprite(0,"Sprite.bmp",0)
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
DisplayTransparentSprite(0,x,y)
Steuerung()
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure Steuerung(); Result = Void
If KeyboardPushed(#PB_Key_Left)
x - 2
EndIf
If KeyboardPushed(#PB_Key_Right)
x + 2
EndIf
EndProcedure

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
lol genau das geht ja gerade nicht -.- da es der Procedrue scheiß egal ist was mit "x" passiert!
Bei deinem Code würde er nicht laufen.
Man müsste es jetzt entwerde so machen :
Beim ersten, könenn nicht mehrere VARs zurückgegeben werden
Beim zweiten kann man die VAR x nicht mehr in "nützlich" Proceduren verwenden.
Bei deinem Code würde er nicht laufen.
Man müsste es jetzt entwerde so machen :
oder so :PureBasic-Code hat geschrieben:
Declare Steuerung(x)
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"Gosub Fehler")
LoadSprite(0,"Sprite.bmp",0)
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
DisplayTransparentSprite(0,x,y)
x = Steuerung(x)
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure Steuerung(x); Result = Void
If KeyboardPushed(#PB_Key_Left)
x - 2
EndIf
If KeyboardPushed(#PB_Key_Right)
x + 2
EndIf
ProcedureReturn x
EndProcedure
Beide Varianten finde ich umständlich.PureBasic-Code hat geschrieben:
Global x
Declare Steuerung()
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"Gosub Fehler")
LoadSprite(0,"Sprite.bmp",0)
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
DisplayTransparentSprite(0,x,y)
Steuerung()
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure Steuerung(); Result = Void
If KeyboardPushed(#PB_Key_Left)
x - 2
EndIf
If KeyboardPushed(#PB_Key_Right)
x + 2
EndIf
EndProcedure
Beim ersten, könenn nicht mehrere VARs zurückgegeben werden
Beim zweiten kann man die VAR x nicht mehr in "nützlich" Proceduren verwenden.
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
Es geht einfach, aber auch struktuiert. Gerade bei grossen Projekten
Beispiel für Programmiertechniken
Beispiel für Programmiertechniken
Code: Alles auswählen
; PB 4.10
Procedure MultiVarFunction(*longVal.long, *floatVal.float)
If *longVal = 0
ProcedureReturn #False
EndIf
If *floatVal = 0
ProcedureReturn #False
EndIf
*longVal\l + 2
*floatVal\f + 4.0
ProcedureReturn #True
EndProcedure
Structure udtDaten
x.l
y.f
EndStructure
Procedure StructurVarFunction(*daten.udtdaten)
If *daten = 0
ProcedureReturn #False
EndIf
With *daten
\x + 2
\y + 4.0
EndWith
ProcedureReturn #True
EndProcedure
If MultiVarFunction(@x.l, @y.f)
Debug x
Debug y
EndIf
If MultiVarFunction(@x.l, @y.f)
Debug x
Debug y
EndIf
If StructurVarFunction(d.udtDaten)
Debug d\x
Debug d\y
EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Genau. Wenn man mehrere Variablen zurückhaben will macht man sich eine
Struktur zurecht und benutzt sie immer wieder....
(und btw... es geht auch ohne Pointer
)
Struktur zurecht und benutzt sie immer wieder....
(und btw... es geht auch ohne Pointer

PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Wie soll denn das gehen ? Wenn du ohne Pointer arbeiten willst, aber mehrere VARs zurück bekommen willst ?Bisonte hat geschrieben:Genau. Wenn man mehrere Variablen zurückhaben will macht man sich eine
Struktur zurecht und benutzt sie immer wieder....
(und btw... es geht auch ohne Pointer)
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