Seite 1 von 1

Prozeduren dynamisch starten

Verfasst: 12.10.2005 17:06
von derRaab
Hallo Leute,

kann man eine Prozedur auch dynamisch, d. h. mittels eines Variablenwertes ansprechen. Also in der Variable steht ein String mit dem Funktionsnamen.

Code: Alles auswählen

Procedure MyProcedure ()
    Debug "Wow, MyProcedure wurde aufgerufen."
EndProcedure

ProcedureName.s = "MyProcedure"

ProcedureName()
So geht es natürlich nicht, aber vielleicht gibt es da eine Syntax für? Oder befinde ich mich eh auf dem Holzweg, da die Funktionsnamen nach dem Kompilieren gar nicht mehr existieren?

Danke euch.

Verfasst: 12.10.2005 17:08
von ts-soft
CallFunctionFast ist Dein Freund, da gabs hier im Forum schon einen Beitrag, einfach mal suchen.

Verfasst: 12.10.2005 17:56
von derRaab
Hi ts-soft,

Code: Alles auswählen

Procedure MyProcedure ()
    Debug "Wow, MyProcedure wurde aufgerufen."
EndProcedure

ProcedureName.s = "MyProcedure"

ProcedureAdress = @MyProcedure()
CallFunctionFast(ProcedureAdress)
Funktioniert schön. Hat aber doch nichts damit zu tun, was ich wollte, oder? Ich habe mal viele Beiträge nach dem Befehl durchsucht und nix gefunden was ich möchte.

Habe jetzt mal mit Interface und Structure was versucht aber ich komme da nicht weiter. Sorry.
http://forums.purebasic.com/german/view ... nctionfast hat mir leider auch nix gebracht.

Wie kann man denn z. B. dynamisch eine Variable ansprechen? Im Sinne von "ermittle den Wert der Variable mit dem Namen". Z. B. um das in einer Schleife verwenden zu können.

Verfasst: 12.10.2005 18:07
von Deeem2031
Das was du machen willst geht so nicht. Im fertigen Programm stehen keine Variablen/Proceduren-Namen, somit kann man die dann auch nicht mehr zur Laufzeit rausfinden. Die einzige Möglichkeit das so ähnlich zu machen hat ts-soft schon erwähnt, mit Pointern auf die Proceduren/Variablen.

Verfasst: 12.10.2005 18:28
von DarkDragon
Deeem2031 hat geschrieben:Das was du machen willst geht so nicht. Im fertigen Programm stehen keine Variablen/Proceduren-Namen, somit kann man die dann auch nicht mehr zur Laufzeit rausfinden. Die einzige Möglichkeit das so ähnlich zu machen hat ts-soft schon erwähnt, mit Pointern auf die Proceduren/Variablen.
Eben. PureBasic wird oftmals mit einer Skriptsprache und einem richtigen Compiler verwechselt. PureBasic ist nur ein Übersetzer, der von PureBasicsyntax zu Fasmsyntax übersetzt(FASM ist daher der eigentliche/richtige Compiler). Und in der fertigen Datei stehen dann keine Funktionsnamen mehr oder so, da steht dann nur der fertige code, der so aussieht wie unlesbares ASM, bei dem namen nicht existieren, bzw. nur als kleine bytecodes rumschwirren.

[EDIT]
Natürlich kann man aber sowas machen:

Code: Alles auswählen

Structure Procedures
  Name.s
  Addr.l
EndStructure

NewList Proc.Procedures()

Procedure CallProcByName(Proc.s)
  ForEach Proc()
    If Proc()\Name = Proc And Proc()\Addr
      ProcedureReturn CallFunctionFast(Proc()\Addr)
    EndIf
  Next
EndProcedure

Procedure MyProc1()
  Debug "MyProc1 wurde aufgerufen"
EndProcedure

Procedure MyProc2()
  Debug "MyProc2 wurde aufgerufen"
EndProcedure

AddElement(Proc()) : Proc()\Name = "MyProc1" : Proc()\Addr = @MyProc1()
AddElement(Proc()) : Proc()\Name = "MyProc2" : Proc()\Addr = @MyProc2()

CallProcByName("MyProc1")
Delay(100)
CallProcByName("MyProc2")

Verfasst: 12.10.2005 18:56
von Deeem2031
DarkDragon hat geschrieben:Eben. PureBasic wird oftmals mit einer Skriptsprache und einem richtigen Compiler verwechselt. PureBasic ist nur ein Übersetzer, der von PureBasicsyntax zu Fasmsyntax übersetzt(FASM ist daher der eigentliche/richtige Compiler).
:freak:

Wenn man keine Ahnung hat sollte man die Klappe halten ;)
Beides (PB und FASM) sind "richtige" Compiler, wobei zweiteres eigentlich als Assembler und nicht als Compiler bezeichnet wird. Nur weil PB zu Asm-Code übersetzt heißt das nicht das es kein vollwertiger Compiler ist.

Und wenn du mir nicht glaubst: http://de.wikipedia.org/wiki/Compiler

"Üblicherweise handelt es sich dabei um die Übersetzung eines von einem Programmierer in einer Programmiersprache geschriebenen Quelltextes nach Assemblersprache, Bytecode oder Maschinensprache"

Verfasst: 12.10.2005 20:12
von DarkDragon
Deeem2031 hat geschrieben: :freak:

Wenn man keine Ahnung hat sollte man die Klappe halten ;)
Beides (PB und FASM) sind "richtige" Compiler, wobei zweiteres eigentlich als Assembler und nicht als Compiler bezeichnet wird. Nur weil PB zu Asm-Code übersetzt heißt das nicht das es kein vollwertiger Compiler ist.

Und wenn du mir nicht glaubst: http://de.wikipedia.org/wiki/Compiler

"Üblicherweise handelt es sich dabei um die Übersetzung eines von einem Programmierer in einer Programmiersprache geschriebenen Quelltextes nach Assemblersprache, Bytecode oder Maschinensprache"
Ja, schon, aber ein Compiler sollte nicht noch einen Compiler benötigen, oder hast du schonmal derart ähnliches gesehen?
[EDIT]
Das von dir hab ich früher auch immer geglaubt, bis ich bemerkt hab, dass PB das alles in leserlichen ASM Code übersetzt, sogar ohne den /COMMENTED Parameter.

Verfasst: 12.10.2005 20:18
von ts-soft
@DD
Sehe Dir doch mal BlitzMax, IBasic usw. an. Die Funktionieren alles so, die PBCompiler.exe ist ein Compiler. Selbst der Delphi-Compiler wandelt intern erst nach c++

Verfasst: 12.10.2005 20:45
von Deeem2031
DarkDragon hat geschrieben:Das von dir hab ich früher auch immer geglaubt, bis ich bemerkt hab, dass PB das alles in leserlichen ASM Code übersetzt, sogar ohne den /COMMENTED Parameter.
Hab ich etwa mal gesagt das PB ohne den /COMMENTED Parameter keinen ASM-Code erzeugt? Ganz bestimmt nicht.