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?
:shock:
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 :wink:

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 ?