Seite 2 von 3
Verfasst: 09.11.2007 23:23
von STARGÅTE
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
Verfasst: 10.11.2007 10:00
von Milchshake
Muss ich jetzt pro gosub ein end machen?
Oder reicht da auch nur eines?
Verfasst: 10.11.2007 10:24
von Bisonte
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.
Verfasst: 10.11.2007 13:56
von Thomas
Milchshake hat geschrieben:Muss ich jetzt pro gosub ein end machen?
Oder reicht da auch nur eines?
Denk dich doch mal in dein Prog rein!
(Das sind alles logische Abfolgen ...)
Verfasst: 10.11.2007 16:35
von mk-soft
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.
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
FF

Verfasst: 10.11.2007 16:47
von STARGÅTE
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 :
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
oder so :
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
Beide Varianten finde ich umständlich.
Beim ersten, könenn nicht mehrere VARs zurückgegeben werden
Beim zweiten kann man die VAR x nicht mehr in "nützlich" Proceduren verwenden.
Verfasst: 10.11.2007 17:22
von mk-soft
Es geht einfach, aber auch struktuiert. Gerade bei grossen Projekten
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
Verfasst: 10.11.2007 17:36
von Zaphod
Wenn es ohne Gosub unbequem wird, dann weiß man dass man schlecht strukturiert hat... ich würde davon komplett die Finger lassen und habe es selbst in sehr langen Programmen nie gebraucht.
Verfasst: 10.11.2007 18:11
von Bisonte
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

)
Verfasst: 10.11.2007 18:20
von STARGÅTE
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

)
Wie soll denn das gehen ? Wenn du ohne Pointer arbeiten willst, aber mehrere VARs zurück bekommen willst ?