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.

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!