Miniskriptsprache mit procedureaufrufen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bobo-Jack
Beiträge: 26
Registriert: 08.09.2010 11:59

Miniskriptsprache mit procedureaufrufen...

Beitrag von Bobo-Jack »

hey zusammen, wenn man eine prozedur anhand ihrer adresse aufrufen will
macht man das ja mit prototypes, und zwar so ungefähr (danke nochmal STARGÅTE)

Code: Alles auswählen

Prototype BlubAufruf(paramter1.s)

Procedure blub(parameter.s)
  Debug parameter.s
EndProcedure

Adresse = @blub()
Aufruf.BlubAufruf = Adresse
Aufruf("Test")
naja gut, ich will eine einfache skriptsprache umsetzen, bei der es eben "keywords" giebt, die erkannt werden und auf die dann irgendwas passierten soll, und das ist dann jeweils in einer prozedur für dieses eine keyword geschrieben. bei mir sieht das dann vielleicht so aus:

Code: Alles auswählen

Global NewMap keywords.l() ; long -> procedure address

;/// Procedures

Global Procedure1.l ; für mögl. rückgabewert
Prototype Procedure1()
Procedure Procedure1()
  ; irgendwas...
  ProcedureReturn Random(1)
EndProcedure

Global Procedure2.l ; für mögl. rückgabewert
Prototype Procedure2(text.s)
Procedure Procedure2(text.s)
  ; irgendwas...
  Debug text
EndProcedure

;/// Keywords definieren

keywords("Eins") = @Procedure1
keywords("Zwei") = @Procedure2
soo gut, und wenn ich jetzt irgendeine schleife durchmach um den skript auszuführen und dann eine prozedur aufgerufen werden soll dann steh ich vor dem problem dass das was "BlubAufruf" im oberen code ist, also der prototype, für jede prozedur anders ist und einen anderen namen hat. hmm
vielleicht könnte ich auch auf den prototype irgendwie einen pointer machen?

wie könnte man sowas umsetzen?

danke für eure hilfe! schönes wochenende noch bei dem super wetter <)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Miniskriptsprache mit procedureaufrufen...

Beitrag von NicTheQuick »

Zunächst ist es falsch Longs für Adressen zu verwenden. Dazu nimmt man entweder Integer oder gleich Pointer. Aus der ersten Zeile wird also

Code: Alles auswählen

Global NewMap keywords.i() ; Integer -> procedure address
oder eben

Code: Alles auswählen

Global NewMap *keywords() ; Pointer -> procedure address
Um zu deinem eigentlichen Problem zurück zu kommen, frage ich mich warum du überhaupt noch Prototypes verwenden willst, wenn deine einzelnen Procedures sowieso verschiedene Parameter verwenden und du sie anscheinend demnach nur einmal einsetzt. Wenn du sowieso anhand das Keywords in der Map unterscheiden musst welche Parameter übergeben werden müssen, dann wäre es wahrscheinlich geschickter gleich das ganze mit einem Select:Case:EndSelect-Block zu machen und darin die Proceduren direkt aufzurufen.
Falls du das aber nicht machen möchtest, könnte ich dir vielleicht mit folgendem Code noch auf die Sprünge helfen. Schlüsselwörter wären hier 'Structure' mit 'StructureUnion'.

Code: Alles auswählen

Prototype Procedure1()
Prototype Procedure2(text.s)

Structure Procedures
	StructureUnion
		*address
		p1.Procedure1
		p2.Procedure2
	EndStructureUnion
EndStructure

Global NewMap keywords.Procedures()

;/// Procedures

Global Procedure1.l ; für mögl. rückgabewert

Procedure Procedure1()
  ; irgendwas...
  ProcedureReturn Random(1)
EndProcedure

Global Procedure2.l ; für mögl. rückgabewert
Procedure Procedure2(text.s)
  ; irgendwas...
  Debug text
EndProcedure

;/// Keywords definieren
keywords("Eins")\address = @Procedure1()
keywords("Zwei")\address = @Procedure2()

Debug keywords("Eins")\p1()
keywords("Zwei")\p2("Test")
Benutzeravatar
Bobo-Jack
Beiträge: 26
Registriert: 08.09.2010 11:59

Re: Miniskriptsprache mit procedureaufrufen...

Beitrag von Bobo-Jack »

Danke, damit klappts jetzt super! :allright:

Man muss zwar immernoch den Prototype in dem StructureUnion per select oder sowas ausssuchen aber das macht auch nix aus von der Geschwindigkeit.
Antworten