Seite 1 von 2
procedur als variable übergeben??
Verfasst: 27.09.2007 12:49
von jpd
Hi @All,
wieso kann ich die procedure test nicht starten?
Code: Alles auswählen
Procedure test()
Debug "yep"
EndProcedure
Procedure Start(sec.l,Proced.s)
Repeat
Proced+"()"
Datum.s=FormatDate("%dd/%mm/%yyyy "+ "%hh:%ii:%ss ", Date())
Debug Datum
Sleep_(sec*1000)
ForEver
EndProcedure
start(1,"test")
Danke
jpd
Verfasst: 27.09.2007 12:56
von Zaphod
Weil Proced+<string>+<string> keine Prozedur ist, sondern ein nicht existentes Fantasie Keyword namens Proced plus zwei angehängter Strings.
Bevor du versuchst Proced auch in Anfürungszeichen zu setzen, <string>+<string>+<string> ist auch keine Prozedur sondern reduziert einfach nach <string>+<string>+<string>=<string>.
Verfasst: 27.09.2007 13:05
von jpd
Hi Zaphod,
erstmal Danke für die schnelle antwort!
in anderen worte ist das nicht zulässig?
proceduren müssen immer per namen aufgerufen werden und nicht als string zusammen "gepuzzelt"?
ist das richtig?
Danke nochmal
jpd
Verfasst: 27.09.2007 13:09
von mk-soft
So gehts
Code: Alles auswählen
Procedure test()
Debug "yep"
EndProcedure
Procedure Start(sec.l,*Proced)
Repeat
CallFunctionFast(*Proced)
Datum.s=FormatDate("%dd/%mm/%yyyy "+ "%hh:%ii:%ss ", Date())
Debug Datum
Sleep_(sec*1000)
ForEver
EndProcedure
start(1,@test())
FF

Verfasst: 27.09.2007 13:23
von jpd
supi
dankeschön
jpd
Verfasst: 27.09.2007 13:33
von Zaphod
Genau. Du musst bedenken, dass der Quellcode nach dem Compilieren nicht mehr da ist, die CPU also unmöglich wissen kann, wie welche Prozedur in deinem Quelltext hieß.
mk-soft nutzt in seinem Beispiel Zeiger. Das sind die Adressen der Prozeduren in dem kompilierten Programm. Das ist der einzige direkte weg so etwas umzusetzen.
Was du ursprünglich vor hattest funktioniert nur in ganz wenigen, rein interpretierten sprachen und bei Sprachen, die Stringersetzung als Funktionsparameter beim Präcompilieren haben. Ich kenne zwar die akademische Überlegung so eines Parametertypes aus dem Studium, mir ist aber keine einzige Sprache außerhalb der Laborwelt begegnet, die diesen umsetzt. So etwas würde auch das auffinden von Fehlern extrem schwer machen ohne viel mehr wert zu bringen, weswegen ich so einen Parametertyp auch nicht für sinnvoll halte. Würde auch eh nur statisch zur Kompilierzeit funktionieren, nicht zur Laufzeit.
Verfasst: 27.09.2007 14:10
von jpd
Hi Zaphod,
Danke für die ausführliche beschreibung,
als hobby programmierer versucht'du halt sachen die dir eben einfallen ohne großartig nachzudenken was der compiler umseztz oder nicht!
was ich merkwürdigt fand ist das es sich compilieren lies ohne eine fehlermeldung zu generieren ....
aber jetz habe ich eine lösung dank mk-soft, und eine
gute erklärung dazu, Dank dir!
Ciao
jpd
Verfasst: 27.09.2007 15:12
von Kaeru Gaman
> was ich merkwürdigt fand ist das es sich compilieren lies ohne eine fehlermeldung zu generieren ....
wieso sollte er, es ist ja kein fehler in dem code.
ich reduzier mal auf den kern:
Code: Alles auswählen
Procedure Start(sec.l,Proced.s)
Proced+"()"
Debug Proced
EndProcedure
start(1,"test")
wie du siehst, ist die operation absolut legal, allerdings tust du nix anderes,
als bei jedem durchlauf ein klammernpaar an der string namens "Proced" zu hängen.
es ist also definitiv kein
fehler in dem code,
aber du hast etwas ganz anderes programmiert, als du vorhattest.
Verfasst: 27.09.2007 15:30
von jpd
Hi Kaeru Gaman,
ich wollte eigentlich immer unterschiedliche procedure aufrufen , und dabei ein paar if das und das ..
mir ersparen.
leider muss ich es aber so machen, da die procedure start() eigentlich als thread laufen soll.
also ist das ganz für die ..

(für diesen fall!)
aber bestimmt sehr belehrend
Ciao
jpd
Verfasst: 27.09.2007 15:37
von #NULL
@jpd
wenn du z.b. ein macro verwendest, kannst du direkt den namen der prozedur übergeben, und diesen im marco verwnden wie du willst, weil das macro seine wirkung VOR dem compilieren hat.
Code: Alles auswählen
Procedure myproc()
Debug "hello from myproc"
EndProcedure
Macro callme(proc)
proc()
EndMacro
callme(myproc)
nach dem compilieren dagegen gibt es keine prozedur-namen mehr, sondern diese wurden durch speicher-addressen ausgetauscht.
(das beispiel soll nur zeigen was du MACHEN wolltest. das was du ERREICHEN willst wird aber besser so umgesetzt, wie mk-soft gezeigt hat)