2014-06-16 4 views
3

J'ai certaines fonctions déclarées et initialisées dans le fichier .lua. Puis, quand je reçois le signal, je lis la variable string_t avec le nom de la fonction à appeler à partir du fichier. Le problème est que je ne sais pas comment pousser la fonction à empiler par son nom ou l'appeler.Appel de la fonction Lua à partir de string_t

Par exemple:

test.lua

function iLoveVodka() 
    --some text 
end 

function iLoveFish() 
    --another text 
end 

C Fichier:

string_t a = "iLoveVodka()" 

Comment puis-je appeler la fonction de C/C++ Code iLoveVodka() seulement en ayant son nom?

+0

Poussez-le sur la pile, puis appelez 'lua_pcall' – Appleshell

+0

@Appleshell quelle fonction dois-je utiliser pour le pousser dans la pile? – VIRUS

+2

S'il s'agit d'une fonction globale, 'lua_getglobal (state," iLoveVodka ");', ou bien poussez son nom sur la pile et appelez 'lua_getfield'. (N'ayez pas peur d'explorer autour http://www.lua.org/manual/5.1/#index) – Appleshell

Répondre

1

Voici quelques exemples de code qui fait deux choses:

  • charge le fichier « test.lua » dans le même répertoire. Appelle la fonction iLoveVodka(), si elle peut être trouvée

Vous devriez être en mesure de construire ce assez facilement:

#include <lua.h> 
    #include <lauxlib.h> 
    #include <lualib.h> 
    #include <stdio.h> 
    #include <stdlib.h> 


    int main(int argc, char *argv[]) 
    { 
     lua_State *l = luaL_newstate(); 
     luaL_openlibs (l); 

     int error = luaL_dofile (l, "test.lua"); 
     if (error) 
     { 
      printf("Error loading test.lua: %s\n",luaL_checkstring (l, -1)); 
      exit(1); 
     } 

     /** 
     * Get the function and call it 
     */ 
     lua_getglobal(l, "iLoveVodka"); 
     if (lua_isnil(l,-1)) 
     { 
      printf("Failed to find global function iLoveVodka\n"); 
      exit(1); 
     } 

     lua_pcall(l,0,0,0); 

     /** 
     * Cleanup. 
     */ 
     lua_close (l); 

     return 0; 
    } 

Cela peut être compilé comme ceci:

gcc -O -o test `pkg-config --libs --cflags lua5.1` test.c 

Il suffit de définir votre fonction iLoveVodka() intérieur test.lua, et vous devriez être OK .

Questions connexes