2010-02-27 14 views
7

Estoy integrando Lua en una aplicación C/C++. ¿Hay alguna manera de llamar a una función Lua desde C/C++ sin ejecutar primero la secuencia de comandos completa?Llamar a la función Lua sin ejecutar el script

He intentado hacer esto:

//call lua script from C/C++ program 
luaL_loadfile(L,"hello.lua"); 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

pero me da esto:

PANIC: unprotected error in call to Lua API (attempt to call a nil value) 

que sólo puedo llamar bar() cuando hago esto:

//call lua script from C/C++ program 
luaL_dofile(L,"hello.lua"); //this executes the script once, which I don't like 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

Pero me da esto:

hello 
stackoverflow!! 

estoy queriendo esto:

stackoverflow! 

Este es mi script lua:

print("hello"); 

function bar() 
print("stackoverflow!"); 
end 
+1

Ya que tienes que ejecutar el script para obtener el Lua VM para verla como Etan indica que tendrá que extraer a cabo ' function bar() 'a un archivo diferente y solo ejecuta ese archivo. – greatwolf

Respuesta

13

Como se acaba se discutió en #lua en freenode luaL_loadfile simplemente compila el archivo en un trozo exigible, en ese punto no se ha ejecutado ningún código dentro del archivo (que incluye las definiciones de función), como tal para poder ejecutar la definición de barra para ejecutar el trozo debe llamarse (que es lo que hace luaL_dofile).

+0

Fui la persona que me preguntó eso en el chat: P – Person

+0

, pensé que lo era, pero me imaginé que haría explícita la referencia de todos modos, por las dudas. –

1

Descubrí que la secuencia de comandos debe ejecutarse para llamar a la función.

0

Una posible solución/piratear (y favor tener en cuenta que soy actualmente incapaz de probar esto) ...


Inserte un maniquí "retorno"; línea en la parte superior de su código LUA.

  • Carga tu archivo en una cadena (como lo haría en la preparación para el uso de luaL_loadstring())
  • Ahora debería ser un asunto sencillo de utilizar printf_s("return;\r\n%s", [pointer to string holding actual LUA code])
  • Ahora se puede luaL_loadstring() la cadena concatenada

El código aún se ejecutará, pero se cortará antes de que pueda llegar a algo que haga algo (en el ejemplo print("hello");, la línea de impresión se volvería inalcanzable). Es si aún tiene actualizada la lista de todos los prototipos de funciones y ahora debería poder usar lua_get() para hacer referencia a las funciones.


NOTA: Para aquellos que no conocen "\ r \ n" son los códigos de escape que representan un salto de línea en el sistema operativo Windows, y MUST ser esas barras ...IE: ESTA \ r \ n NO ESTA/r/n

Cuestiones relacionadas