Gosub Fehler?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
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
Milchshake
Beiträge: 166
Registriert: 30.01.2006 17:47
Wohnort: Zwischen dem Sessel und dem Computer

Beitrag von Milchshake »

Muss ich jetzt pro gosub ein end machen?
Oder reicht da auch nur eines?
Hab jetzt PB 4.02
Muhahaha!!!!
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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.
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​​
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag 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 ...)
v6.00
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
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
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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 ;) )
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​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ?
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
Antworten