Seite 1 von 3

GOTO auch noch variabel möglich?

Verfasst: 10.09.2007 09:58
von GreyEnt
Hallo Jungs und Mädels,
ich weiß, meine Frage ist ein wenig abgespaced.
Bitte nicht böse sein. :)
Mit dem Befehl GOTO sollte man nicht rumhantieren wenn es sich vermeiden läßt. Würde gerne aber eine Idee verfolgen.
Kann ich die sprungmarkte für ein GOTO auch Variabel gestalten?
Ungefähr so?

Code: Alles auswählen

.
.
.
Select Auswahl
   Case "Abbruch"
   LastElement(menu())
   DeleteElement(menu())
   msprung$= menu()
   Goto msprung$
   
   Case "Fertig"
   Goto spielmaske
EndSelect
.
.
.
Natürlich kann ich auch den gesammten Code reinstellen.
Ist aber nicht lauffähig weil die Externen Grafikdateien fehlen.

Danke an euch.

Verfasst: 10.09.2007 10:10
von Froggerprogger
Goto erwartet einen Labelnamen, also kann man die Sprungadresse nicht ändern. Allerdings geht das mit dem Assemblerbefehl JMP, wenn die ASM-Unterstützung aktiviert ist, z.B. per:

Code: Alles auswählen

ziel = ?marke1
JMP ziel
End

marke1:
Debug "1"
End

marke2:
Debug "2"
End
Allerdings sollte man so nicht programmieren, solange man nicht genau weiß, was man tut. Auf diese Weise kann man beliebig im Code herumspringen, auch in Prozeduren oder aus denen heraus. Gerade dabei ist jedoch dann das Problem, das auf den Stack geschobene Dinge nicht mehr entfernt werden und das ganze Programm damit unvorhersagbaren Blödsinn machen kann.
Ergo: So klappts, aber das sollte man eigentlich lieber sein lassen. :wink:

Verfasst: 10.09.2007 10:23
von GreyEnt
@Froggerprogger,

danke für das Beispiel.
Aber so will ich nicht proggen. :)
Da gibt Dir jeder recht.

Aber vielleicht ein Sado Progger mit hang zur selbstaufgabe. :)

Verfasst: 10.09.2007 16:18
von Kaeru Gaman
nur um mal zu demonstrieren, was man damit für quatsch machen kann:

Code: Alles auswählen

Dim Label(2)
Label(0) = ?marke1
Label(1) = ?marke2
Label(2) = ?marke3

For n=0 To 2
  ziel = Label(n)
  !JMP [v_ziel]
Rueck:
Next
Debug "feddisch"
End

marke1:
Debug "1"
Goto Rueck
End

marke2:
Debug "2"
Goto Rueck
End 

marke3:
Debug "3"
Goto Rueck
End 
aber ich glaube, das war ne eher theoretische frage.
dir ist bestimmt bewußt, dass man mit Select oder If und Procedures viel sicherer arbeiten kann....

Verfasst: 10.09.2007 16:57
von GreyEnt
@Frosch & Frogger

ich bekomme Angst vor euch wenn ich euer Listing sehe.
:)

Habt Ihr sonst noch irgendwelche Hobbys? Wann wart Ihr das letzte mal an der frischen Luft?

Verfasst: 10.09.2007 16:58
von ZeHa
Hmm könnte es nicht mit Funktionspointern gehen? Also man kann doch von einer Funktion die Adresse kriegen, dann müßt man die doch auch irgendwie so aufrufen können, oder nicht?

Gleiches müßte aber doch auch mit 'nem Label gehen, immerhin kann man auch von einem Label die Adresse kriegen...

Verfasst: 10.09.2007 17:40
von Kaeru Gaman
yo, CH, dat mache wir doch da....

Verfasst: 10.09.2007 18:55
von Froggerprogger
Mit Funktionspointern ginge das so:

Code: Alles auswählen

Procedure dummy1(a.l)
  Debug "Proc 1: "
  Debug a
EndProcedure

Procedure dummy2(a.l)
  Debug "Proc 2: " 
  Debug a
EndProcedure

pFunc = @dummy1()
CallFunctionFast(pFunc, 10)

pFunc = @dummy2()
CallFunctionFast(pFunc, 20)
Damit wird sogar der Stack korrekt gehandhabt. Allerdings findet keine Überprüfung mehr statt, ob die Anzahl der Parameter stimmt.

P.S.: Apropos frische Luft... da war ich soeben... reicht also für diese Woche ;-)

Verfasst: 10.09.2007 20:53
von ZeHa
@ Kaeru: Ja, das schon, aber eigentlich müßte es auch mit reinen PB-Sprachmitteln gehen, also ohne Assembler-Konstrukte.

Verfasst: 10.09.2007 22:17
von Kaeru Gaman
ZeHa hat geschrieben:...aber eigentlich müßte es auch mit reinen PB-Sprachmitteln gehen...
wozu zum Geier?
es ist schon fast ne Schande, dass der Befehl "Goto" überhaupt existiert.
jetz forderst du eine Umsetzung für ein Variables Goto?
dann vielleicht für ein relatives Goto?

hey, der sinn einer Hochsprache ist, dass man keine rudimentären Sprünge mehr benötigt.
wer das zu brauchen meint, soll dankbar den Inline-Assembler nutzen!