Páginas

viernes, 3 de diciembre de 2010

Paso parámetros entre Lua y C++ : Variables globales

Como os prometí hace unos días os he preparado un pequeño tutorial de como integrar Lua en C\C++ y pasar argumentos entre ambos.

Bien lo primero que tenéis que hacer el instalar Lua en vuestro sistema. Una vez hecho esto y si habeis configurado vuestro entorno de desarrollo lo mejor es probar si lo habies hecho bien y para ello os recomiendo que hagais una prueba compilando el siguiente codigo:

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}


int main()
{
lua_State *LS = lua_open();
luaL_dofile(LS,"hello_name.lua");
lua_close(LS);
}



En el que como podeis ver importamos todas las cabeceras de la API de Lua y a continuación se crea un puntero a una estructura lua_State que sirve como base para cuaquier otra función con la que queramos trabajar. Después se abre el interprete, ejecutamos un script (que tan solo sacara por pantalla un hola mundo) y cerramos nuevamente el interprete.

Como podeís ver es un proces bastante simple, pero, ¿y si queremos que los scripts que tenemos en Lua se comuniquen con la aplicación y\o viceversa? Para ello la API dispone de varias funciones que agilizan estas tareas. En primer lugar y la forma más rapida y sencilla es por medio de variables globales que generamos en nuestra aplicación y que luego utiliza el script en Lua y cuyo contenido puede ser accedido tanto en el script como en la aplicación. Un ejemplo de ello sería el siguiente:

int main()
{
lua_State *L = lua_open();
// Establecemos la variable global "name" y le asiganmos un valor
lua_setglobal(L, "name");
lua_pushstring(L, "Project Infnat");
luaL_dofile(L,"hello_name.lua");
lua_close(L);
}


Para usar esta variable en el script deberemos saber que el script requiere de ella ya que para su utilización se accede a una variable con el mismo nombre que la que se a creado en el codigfo en C. Un sript en Lua que hace uso de esta sería:

io.write("Hello ", name,"\n")

Si, solo esta linea. En caso de querer modificar esta variable en el script y obtener los resultado suponiendo que se alamacenaran en esa variable tan solo tenemos que hacer una llamada a la función lua_getglobal como en el ejemplo:

lua_getglobal(L, "name");
string ret_name = "";
if (lua_isstring(L, -1)) {
ret_name = lua_tostring(L, -1));
printf(ret_name.c_str());
}


Donde -1 es el orden de llamada a la variable con la funcion lua_getglobal(...) y tal y como podeis ver en la API en el caso de los diferentes tipos de variables llamariamos a diferentes funciones segun el tipo.



2 comentarios:

  1. ...Gracias...!
    ¿sabes cómo pasar un objeto completo entre ambos?... por ejemplo un wxStyledTextCtrl... gracias..

    ResponderEliminar
  2. No sé si se podrá, yo lo que hago es parametrizarlos a través de tablas.

    ResponderEliminar