Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo pasar datos del lenguaje C al lenguaje lua

Cómo pasar datos del lenguaje C al lenguaje lua

Utilice lightuserdata y metatable para conciliar este problema. Es decir, simplemente le proporciona a lua punteros a datos y metamétodos que le indican cómo operar con esos datos.

estructura typedef

{

int x

int y

int

}TData;

static int getAttribute(lua_State* L)

{

TData *data = (TData*)lua_touserdata(L, 1

std::string atributo = luaL_checkstring(L, 2

int resultado = 0

if( atributo == "x");

{

resultado = datos->x

}

En caso contrario if( atributo == "y")

{

resultado = datos->y

}

De lo contrario

{

resultado = datos->z;

}

lua_pushnumber(L, resultado

devuelve 1; >

estructura estática luaL_reg dataLib[] = {

{"__index", getAttribute},

{NULL, NULL}.

}; /p>

void getMetaTable(lua_State* L, luaL_reg* métodos)

{

lua_pushlightuserdata(L, métodos);

lua_gettable(L, LUA_REGISTRYINDEX);

if (lua_isnil(L, -1)) {

/* no encontrado */

lua_pop(L, 1); p> p>

lua_newtable(L);

luaL_register(L, NULL, métodos);

lua_pushlightuserdata(L, métodos); pushvalue( L, -2);

lua_settable(L, LUA_REGISTRYINDEX

}

}

}

int main()

{

const char* filename = "test. lua"

lua_State *lua = lua_open(); p>

if (lua == NULL)

{

fprintf(stderr, "falló al abrir lua");

return -1; /p >

}

luaL_openlibs(lua);

entrada TData = {1, 2, 3}

lua_pushlightuserdata(lua, &entrada)

getMetaTable(lua, dataLib);

lua_setmetatable(lua, -2)

);

lua_setglobal(lua, "entrada");

if (luaL_dofile(lua, nombre de archivo))

{

luaError. (lua, "Error al cargar el archivo %s", nombre de archivo

}

lua_getglobal(lua, "datos"); ( lua, 0);

std::coutlt << ; salida << std::endl

retorno

}