Funktionsreferenzen oder Eval moeglich?

Previous topic - Next topic

G.o.D

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$)

Quentin

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.

Kitty Hello

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?

G.o.D

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

Kitty Hello

Code (glbasic) Select
TYPE Tobject
   what // 0=tuer, 1=fenster
ENDTYPE

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

endfunction

Quentin

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?

G.o.D

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.

Kitty Hello

äh... Ja, soll der Programmcode in der ini stehen? Dann geht's nur mit einer Scripting Engine. Trucidare hat LUA mal in GLBasic eingebaut.

G.o.D

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

Kitty Hello

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)

trucidare

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]
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Schranz0r

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*
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

Das is ja das coole ;) Board und Laufwerk sind neu... Kein Rod mehr :) außerdem BenQ laufwerk (flash flash flash)
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

G.o.D

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.

Kitty Hello