GOTO auch noch variabel möglich?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

GOTO auch noch variabel möglich?

Beitrag 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.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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:
Zuletzt geändert von Froggerprogger am 10.09.2007 10:35, insgesamt 1-mal geändert.
!UD2
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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. :)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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?
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, CH, dat mache wir doch da....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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 ;-)
!UD2
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

@ Kaeru: Ja, das schon, aber eigentlich müßte es auch mit reinen PB-Sprachmitteln gehen, also ohne Assembler-Konstrukte.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten