GLBasic forum

Other languages => GLBasic - de => Topic started by: G.o.D on 2008-Apr-08

Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-08
Hallo,

ich muesste eine Funktion aufrufen, die ueber eine .ini Datei festgelegt wird.

Gibt es in GLBasic soetwas wie eval bei anderen Sprachen, oder wenigstens Funktionsreferenzen wie im C?

Ich braeuchte praktisch folgendes:

bla.ini:
Code (glbasic) Select
[objects]
object=myobject
objectfunction=myObjectCallMe
bla.gbas
Code (glbasic) Select
function myObjectCallMe:
  print "hello world from myobject", 100, 100
endfunction

function$=iniget$('objects','objectfunction')
callfunction(function$)
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Quentin on 2008-Apr-08
mit INLINE .. ENDINLINE steht dir ja auch C++ in GLBasic zur Verfügung. Wenn du also weißt, wie das prinzipiell in C oder C++ gehandhabt wird, kannst du es ja mal damit versuchen.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-08
Das gbit's eigentlich nur bei interpretierten Sprachen. Sowas in C++ zu machen ist ein Riesenaufwand, da für für jede Funktion den Funktionsnamen irgendwo speichern und zuordnen musst.
Warum hast Du nicht eine Funktion und speichers in der .ini Datei einen Parameter, den Du mit SELECT auswertest?
Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-08
also ein function pointer wuerde mir reichen, eventuell auch per inline c eine basic funktion aufrufen (?)

ich moechte eine point and click adventure engine umsetzen, mit select haette das den nachteil, dass alles in einer hauptschleife liegen muss ala

Code (glbasic) Select
select object$
   case "fenster"
      if command$="oeffnen"
        // tief einatmen
      endif
enselect
und genau da liegt das problem, es soll eine engine sein, also letztendlich ueber .ini files konfiguriert und die eigentlichen aktionen sollen von den objekten selbst kommen.

letztendlich waere dieser code (der natuerlich nicht geht) der idealfall fuer mich

Code (glbasic) Select
object fenster
   function oeffnen:
      // tief einatmen
   endfunction
endobject
da das nicht moeglich ist gilt es einen anderen ansatz zu finden, da waeren mir erstmal nur function pointer ala c eingefallen, vielleicht weiss ja jemand noch ne andere idee
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-08
Code (glbasic) Select
TYPE Tobject
   what // 0=tuer, 1=fenster
ENDTYPE

function oeffnen: obj AS Tobject
   SELECT obj.what
   ...
   ENDSELECT

endfunction
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Quentin on 2008-Apr-08
so ganz kann ich dein Problem nicht nachvollziehen, muss ich gestehen.
Du kannst alles und jeden steuern mit deinem Coding, ob objektorientiert, prozedural oder Spagetti, ist erst einmal wurscht.

prinzipiell kannst du doch schematisch folgendermaßen vorgehen

Code (glbasic) Select
Ini_lesen()

// hier Hauptschleife
WHILE GAME_END = FALSE
  Handle_actions(object, action$)        // Beispiel, wenn du die auszuführenden Aktionen als Zeichenkette speicherst
  // ... weitere Aktionen
WEND

FUNCTION Handle_actions: pobj, pact$

  SELECT pobj
    CASE panzer
      SELECT pact$
        CASE "Fahren"
          // Aktionen
        CASE "Stoppen"
          // Aktionen
        CASE "Feuern"
          // Aktionen
      ENDSELECT
    CASE auto
      SELECT pact$
        CASE "Fahren"
          // Aktionen
        // etcpp
      ENDSELECT
    CASE ...
   
  ENDSELECT

ENDFUNCTION
meintest du so etwas in der Art?
Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-08
das problem entsteht dadurch, das es kein hardgecodedes spiel ist, sondern ein konfigurierbares environment das ich fuer mehrere spiele nutzen will

die funktion handle_actions aus deinem beispiel, kann also nicht wissen, dass es einen 'case panzer' geben muss, sondern irgenwo gibt es eine room4711.ini - die es zum zeitpunkt des entwickelns der engine noch nicht gab - in der hinterlegt ist, dass ein panzer in der szene ist und was man mit dem so alles anstellen kann

natuerlich koennte man auch einfach die funktion handle_actions ausserhalb der engine, sozusagen durch das finale spiel definieren lassen, gehen wuerde es so - und wenn es keine andere moeglichkeit gibt wird mir auch nichts anderes bleiben - aber schoen isses nicht.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-08
äh... Ja, soll der Programmcode in der ini stehen? Dann geht's nur mit einer Scripting Engine. Trucidare hat LUA mal in GLBasic eingebaut.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-08
ja, ne, aber da koennten die funktionsnamen drinstehen die aufgerufen werden sollen bei den verschiedenen aktionen (benutze, oeffne, etc), aber ich seh schon, geht wohl nicht ;)

nicht so schlimm, mach ichs halt ueber einen dicken select im finalen spiel

meines wissens wird der glbasic code aber ja eh vorher in c code umgewandelt (?) daher moechte ich vielleicht anregen ueber eine zukuenftige loesung ala c function pointer nachzudenken, machbar sollte es sein und es gibt eine ganze reihe an anwendungsmoeglichkeiten dafuer.

das mit lua klingt allerdings trotzdem interessant, werd ich mir mal zu gemuete fuehren, sofern das plattform uebergreifend fungoniert
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-08
Du hast auch in C keine Chance eine Funktion über einen String anzusprechen. Nur mit viel Overhead, den Du slebst machen must (Im Prinzip SELECT)
Title: Funktionsreferenzen oder Eval moeglich?
Post by: trucidare on 2008-Apr-08
Ja Lua leeeebt :) Ich bau es nur gerade um. Eine möglichkeit Funktionen anzusprechen ist sowohl als string als auch als datei möglich.

[OT] Gernot ich hab ne 360 Premium für 180 tacken bekommen :) wir können Proggen ;) [/OT]
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Schranz0r on 2008-Apr-08
180 Euro?
Da bekomm ich die ja neu, nur halt net als Premium :)
Viel spass beim ersten ROD, scheiss Kiste *Hust*
*meiner treuen XBOX 360 nachtrauer*
Title: Funktionsreferenzen oder Eval moeglich?
Post by: trucidare on 2008-Apr-08
Das is ja das coole ;) Board und Laufwerk sind neu... Kein Rod mehr :) außerdem BenQ laufwerk (flash flash flash)
Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-09
Quote from: GernotFrischDu hast auch in C keine Chance eine Funktion über einen String anzusprechen. Nur mit viel Overhead, den Du slebst machen must (Im Prinzip SELECT)
aber da der c code ja aus glbasic erzeugt wird, koennte man ja folgendes machen:

glbasic code:

Code (glbasic) Select
type
   name$
   funcptr usefunction(par1, par2)
endtype

...

function AutoUse: par1, par2
   // bla
endfunction

...

local auto as type
auto.name="turbokiste"
auto.usefunction="AutoUse"
und beim generieren des c codes wird daraus

Code (glbasic) Select
typedef struct {
   char *name;
   void *(usefunction)(int, int);
} auto;

...

void AutoUse(int par1, int par2) {
 // bla
}

...

auto *a=malloc(sizeof(auto *));
a->name=strdup("turbokiste");
a->usefunction=&AutoUse;
waere wirklich ein grosses plus fuer glbasic wenn sich sowas umsetzen liesse, den letztendlich koennte man so wenigstens ansatzweise objektorientiert programmieren.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-09
Hmm... Evtl. als sub.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: trucidare on 2008-Apr-09
Sag hier bloß nicht das OO - Wort ;)
Ein großer Schritt wäre es, jedoch ist es auch mit Viel Arbeit unda uch vielen Fehlern verbunden.
mal sehen was der gf sich einfallen lässt ich halt mich da raus *versteck*
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-09
Nächstes Update:
Code (glbasic) Select
CALLBYNAME("s1")
CALLBYNAME("sx")
CALLBYNAME("s2")

SUB s1:
PRINT "Hello", 0,0
ENDSUB

SUB s2:
SHOWSCREEN
MOUSEWAIT
ENDSUB
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Schranz0r on 2008-Apr-09
Jow wie wärs mit OO ........ó.Ã'
Title: Funktionsreferenzen oder Eval moeglich?
Post by: Kitty Hello on 2008-Apr-09
Du kannst jetzt SUBs mit dem Namen als Sting aufrufen. Das kann manchmal ganz nett sein. Besonders als Alternative zu CALLBACK.
Title: Funktionsreferenzen oder Eval moeglich?
Post by: trucidare on 2008-Apr-09
Coollio :)
Title: Funktionsreferenzen oder Eval moeglich?
Post by: G.o.D on 2008-Apr-12
klasse, danke.