2015-02-15 6 views
2

я использую Lua C API в цикле переменные в таблице, как этотИзвлечение пользовательские данные из таблицы, используя Lua C API

Lua сценарий:

array = {0,1,2,3} 

Lua C API

lua_getglobal(l, "array"); 
if(lua_isnil(l, -1)) { 

} 
lua_pushnil(l); 
while(lua_next(l, -2)) { 

    int value=(int)lua_tonumber(l, -1); 
    printf("%d \n",value); 

    lua_pop(l, 1); 
} 

и я могу получить результат

Тогда я хочу поставить некоторые USERDATA OBJS в таблицу и затем цикл их в C API

Lua скрипт

foo0 = Foo.new("fred0") 
foo1 = Foo.new("fred0") 
foo2 = Foo.new("fred0") 
foo3 = Foo.new("fred0") 
array = {foo0,foo1,foo2,foo3} 

Lua C API

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

#include <iostream> 
#include <sstream> 

#include <vector> 

class Foo 
{ 
public: 
    Foo(const std::string & name) : name(name) 
    { 
     std::cout << "Foo is born" << std::endl; 
    } 

    std::string Add(int a, int b) 
    { 
     std::stringstream ss; 
     ss << name << ": " << a << " + " << b << " = " << (a+b); 
     return ss.str(); 
    } 

    ~Foo() 
    { 
     std::cout << "Foo is gone" << std::endl; 
    } 

    std::string name; 
}; 


int l_Foo_constructor(lua_State * l) 
{ 
    const char * name = luaL_checkstring(l, 1); 

    Foo ** udata = (Foo **)lua_newuserdata(l, sizeof(Foo *)); 
    *udata = new Foo(name); 

    luaL_getmetatable(l, "luaL_Foo"); 

    lua_setmetatable(l, -2); 

    return 1; 
} 




Foo * l_CheckFoo(lua_State * l, int n) 
{ 
    return *(Foo **)luaL_checkudata(l, n, "luaL_Foo"); 
} 

int l_Foo_add(lua_State * l) 
{ 

    return 1; 
} 

int l_Foo_destructor(lua_State * l) 
{ 
    Foo * foo = l_CheckFoo(l, 1); 
    delete foo; 

    return 0; 
} 

void RegisterFoo(lua_State * l) 
{ 
    luaL_Reg sFooRegs[] = 
    { 
     { "new", l_Foo_constructor }, 
     { "add", l_Foo_add }, 
     { "__gc", l_Foo_destructor }, 
     { NULL, NULL } 
    }; 

    luaL_newmetatable(l, "luaL_Foo"); 

    luaL_register(l, NULL, sFooRegs); 

    lua_pushvalue(l, -1); 

    lua_setfield(l, -1, "__index"); 

    lua_setglobal(l, "Foo"); 
} 

int main() 
{ 
    lua_State * l = luaL_newstate(); 
    luaL_openlibs(l); 
    RegisterFoo(l); 

    int erred = luaL_dofile(l,"/Volumes/Work/CODE/Test/testStatic/testStatic/kami.txt"); 
    if(erred) 
     std::cout << "Lua error: " << luaL_checkstring(l, -1) << std::endl; 



    lua_getglobal(l, "array"); 
    if(lua_isnil(l, -1)) { 
     //return std::vector(); 
    } 
    lua_pushnil(l); 

    std::vector<Foo *> v; 
    while(lua_next(l, -2)) { 


     Foo * foo = l_CheckFoo(l, -1);//this line do not work 
     // 
     // 
     // 
     // 
     //I don't know how to do it here. 
     // 
     // 
     // 
     // 
     //v.push_back(foo); 
     lua_pop(l, 1); 
    } 


// for (Foo* theValue:v) 
// { 
//  printf("==>%s",theValue->name.c_str()); 
// } 

    lua_close(l); 

    return 0; 
} 

как извлечь данные из таблицы? , пожалуйста, помогите мне, спасибо.

+1

'Foo * Foo = l_CheckFoo (л, -1); // эта строка не работает. Что вы имеете в виду, это не работает? – greatwolf

+0

Извините за мой плохой английский ... Я отлаживаю код, и он генерирует исключение в этой строке, он говорит: «PANIC: незащищенная ошибка при вызове Lua API (плохой аргумент # -1 (luaL_Foo expected, got table))» – BPS1945

ответ

0

, наконец, я soved это сам

l_CheckFoo(l, -1); 

должно быть

lua_touserdata(l, -1); 

void * hehe=lua_touserdata(l, -1); 

Foo ** haha=(Foo **)hehe; 

Foo *f=*haha; 

printf("%s \n",f->name.c_str()); 
Смежные вопросы