Gosub

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

g-hunn

Betreff: Gosub

BeitragDo, Feb 09, 2006 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich verstehe irgendwie die funktion Gosub nicht!

Kann mir das einer erklären???

Very Happy

Danke

Spikespine

BeitragDo, Feb 09, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:Gosub
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

miLORD

BeitragDo, Feb 09, 2006 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze nie GoSub.
GoSub ist böse.
Böse!
BÖSE!
Böses GoSub
usw.

GoSub springt zum nächsten deklarierten befehl.
Aber um Himmels willen Junge, nimm functions, du steigst sonst durch deinen eigenen code nicht mehr durch!
brqwq?! oO

Cardonic

BeitragDo, Feb 09, 2006 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Gosub arbeitet schneller als Funktionen; daher für Unterprogramme, die ständig aufgerufen werden, zu empfehlen. Man mus schon aufpassen, das man den Code gut strukturiert und den Überblick nicht verliert Very Happy

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

D2006

Administrator

BeitragDo, Feb 09, 2006 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Cardonic hat Folgendes geschrieben:
Gosub arbeitet schneller als Funktionen


Zeige mir sofort einen Quellcode, wo sich eine derartige Optimierung gegenüber dem enormen Übersichtsverlust lohnt.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Cardonic

BeitragDo, Feb 09, 2006 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@ D2006 : Wenn man bei einem Spiel viele (z.B. 200) Objekte mit einem Unterprogramm bearbeitet und eine Framerate von 70 FPS hat, dann addiert sich der Zeitverlust immerhin um das 14'000-Fache in einer Sekunde Smile
(wenn man mehrere solche Dinge beachtet, dann kann das im Endeffekt etwas ausmachen)

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Feb 09, 2006 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Programme bestehen fast nur aus Functionen!
GoSub geht da eh nicht !

GoTo benutzte ich manchmal!

Ein Haupt(Main) Programm mach ich grundsätzlich nicht, da es dann schwieriger ist ein Menüe oder ähnliches zu impletieren!

Und der minimale Speedverlust der bei Functionen draufgeht ist mir egal!
Abgesehen davon würde ich keine Function 200 mal innerhalb eines Frames aufrufen, sondern das so programmieren das das nicht nötig ist!
[BB2D | BB3D | BB+]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 10, 2006 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
.Bemerkung
Also wenn was böse ist, dann Goto. Gosub dagegen ist harmlos, da es automatisch wieder dorthin zurrück geht von wo aus es aufgerufen wurde... Demnach unterscheidet sich ein Gosub kaum von einer Funktion. Wenn man davon ausgeht das sowieso zu über 90% aller hier geposteten Programmabschnitte die Funktion missbrauchen. Eine Funktion ist eigentlich dazu gedacht um Rückgabewerte zu geben. Also sowas wie Sin/Cos/Sqr usw... Die meisten hier machen unendlich viele Funktionen in winzigen Programmen, weil sie denken das es toll sein soll und schiessen sich damit selbst ins Bein. Zudem ist ein Gosubaufruf schneller als ein Funktionsaufruf. Das einzige was mich persönlich an Gosub stört, ist die schlechte Übersichtlichkeit eines Punktes als Anfang.
Return

x-pressive

BeitragFr, Feb 10, 2006 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Awa! Weder Gosub noch Goto sind "böse" -auf den Einsatz kommt es an. Ein Coder, der einen Befehl pauschal verdammt, hat doch nur Angst vor seiner eigenen Unfähigkeit Very Happy
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Xaron

BeitragFr, Feb 10, 2006 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Cardonic hat Folgendes geschrieben:
Hi

Gosub arbeitet schneller als Funktionen;


Dieses Märchen hält sich aber ziemlich hartnäckig.

Ich verweise einfach mal auf meinen Vergleich: Link

Der wirklich minimale Zeitvorteil bei Gosub, der fast im Rauschen untergeht, spielt bei der Spieleentwicklung nun wirklich keine Rolle. Da gibt es ganz andere Flaschenhälse. Wink

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 10, 2006 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xaron, habe mir mal dein Geschwindigkeitstest mal angesehen. Muß aber dazu sagen, daß so ein Test nicht 'veralgemeinert' werden kann... Beispiel: Habe mal ein Spiel geschrieben wo man ein Raumschiff steuern konnte. Beim Schub wurden Flammen mit Line dargestellt (sah sehr gut aus). Immer wenn ich ein neuen Schub angestossen habe, hackte das Spiel ganz kurz. Das war echt nervig und nach sehr langem rumtesten bin ich zum Schluss gekommen, daß das Line der Grund dafür war. Habe dann zusätzlich bei jedem Schleifendurchlauf ein Line -Befehl in den Koordinaten -1,-1,-2,-1 ausserhalb des Bildschirmes gelegt. Und was war passiert? Das Spiel lief gnadenlos fliessend, egal wann ich Schub gegeben habe und wann nicht. Ein Funktionsaufruf kann von mir aus schnell sein, muß aber nicht wenn dieser längere Zeit nicht in Anspruch genommen wurde und dann mal wieder aufgerufen wird... Will jetzt auch keine Disskusionen über das auskitzeln der letzten 0.000001 ms beisteuern, nur das so ein Test nicht unbedingt eine grundlegende Aussage machen muß.

Den genauen Grund, warum das Line die Verzögerung verursacht hat, weiß ich nicht. Könnte mir aber vorstellen das es mit dem Cache zusammen hängt. Dieser kann u.A. auch Codeabschnitte beinhalten und wenn diese 'längere' Zeit nicht benötigt werden, werden sie einfach raus geschmissen. Kommt dann wieder dieser Codeabschnitt, muß dieser erst vom langsamen RAM ausgelesen werden... Wenn die Funktion in ihrem Umfang wesentlich komplexer ist, dann kann so ein Neuabruf schon mal etwas länger dauern. Ausser man benutzt ständig irgendwelche Funktionen und behält sie somit im schnellem Cache...

Xaron

BeitragMo, Feb 13, 2006 10:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic, der Vergleich hinkt aber etwas. Die Zeiten, wo man noch in Taktzyklen gerechnet hat und Sachen auf dem Stack anlegen und wieder löschen noch wesentliche Zeit verbraten hat, sind ja glücklicherweise vorbei. Wink Ich weiß schon, worauf Du hinauswillst. Aber auf heutigen Systemen spielt der minimale Overhead bei Functions gegenüber Gosub einfach keine Rolle mehr.

Gruß - Xaron
Cerberus X - Monkey X Reloaded!
 

Dreamora

BeitragMo, Feb 13, 2006 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt einen elementaren Unterschied zwischen Gosub und Funktionen:

Funktionen erzeugen einen eigenen Variablenraum, wo man lokale Variablen erzeugen kann, die danach wieder entsorgt werden.

Gosub hingegen "beult" einfach den aktuellen Variablenraum ein wenig aus indem die Programmausführung temporär an einem anderen Ort weitergeführt wird, jedoch immer noch innerhalb des gleichen Variablenraumes.

Es gibt durchaus Fälle, wo Gosub vorzuziehen ist, zb Laden von Media, Variableninitialisierung etc, da man dann nicht alles global machen muss, was eine sehr schädliche Angelegenheit ist.

Anderseits gibt es Fälle wo Funktionen unumgänglich sind, weil man etwas durch bestimmte Werte machen will.


Gosub verwenden wenn:
- man etwas mit den Variablen machen will, die man schon hat
- es sonst eine Funktion ohne Übergabeparameter und Rückgabewert geben würde

Funktionen verwenden wenn:
- man einen Rückgabewert braucht (Erzeugungsfunktionen für Types zb)
- wenn man bestimmte, nicht vorgebene Werte übergeben will um etwas spezielles damit zu machen, was man an verschiedenen Orten braucht


Goto verwenden wenn:
Es gibt eigentlich nur einen Grund Goto zu verwenden: Der ist um aus mehrstufigen Schleifen herauszuspringen. Dies ist auch nur nötig, weil erst BlitzMax Schleifenlabels unterstützt, so das man mit einem Exit auch eine 3fache Schleife verlassen kann.
Ansonsten sollte man von Goto Abstand nehmen, denn der Code wird nur unlesbarer, an der Geschwindigkeit ändert sich nichts. (es gibt kaum etwas was Goto kann, was mit While / For / If nicht zu machen wäre, ausser halt Schleifen verlassen)


PS: Ich persönlich finde, es gibt nichts schlimmeres, als Leute die auch noch in Funktionen Goto / Gosub einsetzen. Entweder das eine oder das andere, aber nicht den Codefluss total zerstören bitte. Blitz erlaubt da leider sehr viel sehr grausiges Zeug auf das ich nicht näher eingehe um solche Dinge nicht noch zu fördern.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Feb 13, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
es gab schon mal so einen Thread
https://www.blitzforum.de/viewtopic.php?t=12164
[BB2D | BB3D | BB+]

miLORD

BeitragMo, Feb 13, 2006 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt eine Möglichkeit GOTO zu verwenden...
und zwar, wenn man aus einer function die selbe fuction aufrufen muss.

Sonst seh ich für Sachen mit .GO oder GO keine Verwendung - in meinen codes. Aber jeder wie er will.
brqwq?! oO

Hubsi

BeitragMo, Feb 13, 2006 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function test(peng)
  peng=peng+1
  If peng>10 Return peng
  test(peng)
End Function
Rekursiver Funktionsaufruf? Very Happy Ist es das was Du meintest? Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group