procedur als variable übergeben??

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

procedur als variable übergeben??

Beitrag 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
PB 5.10 Windows 7 x64
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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>.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag 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
PB 5.10 Windows 7 x64
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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 :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

supi :allright:

dankeschön
jpd
PB 5.10 Windows 7 x64
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag 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
PB 5.10 Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag 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 .. :oops: (für diesen fall!)

aber bestimmt sehr belehrend :)

Ciao
jpd
PB 5.10 Windows 7 x64
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten