Lua到'C'召集会议问题

时间:2011-03-23 15:05:59

标签: lua

我是Lua的新手,对我来说很光鲜! 我真的不想沿着metatables等路线走下去,因为它似乎相当复杂。 目前在Lua中粗略地访问'C'结构我做:

void execute_lua_script(char *name)
{
    lua_pushstring (L,name);
    lua_gettable (L, LUA_GLOBALSINDEX); 
    lua_pushstring(L,"junk");
    lua_pushinteger(L,7);
    lua_pushlightuserdata(L, avatar_obj);
    lua_pcall (L, 3, 2, 0);
}

注册的C函数是:

int get_obj_struct(lua_State *L)
{
    const char *str;
    OBJECT_DEF *obj;
    int stack;

    obj=(OBJECT_DEF *)lua_touserdata(L,1);

    str=lua_tostring(L,2);

    //printf("\nIN OBJ:%d %s",obj,str);

    if (!strcmp(str,"body->p.x"))
        lua_pushnumber(L,obj->body->p.x);

    if (!strcmp(str,"collided_with"))
        lua_pushlightuserdata(L, obj->collided_with);

    if (!strcmp(str,"type"))
        lua_pushnumber(L,obj->type);

    stack=lua_gettop(L);
    //printf("\n%d",stack);

    if (stack<3)
        report_error("Unknown structure request ",(char *)str);

    return 1;
}

虽然原油;有用! :-) 问题是我请求“collided_with”(一个指针);我需要把它还给我的剧本;但由于我不明白'obj'的原因最终为零。

我的lua脚本:

function test(a,b,obj)
    --print("\nLUA! test:",a,b);

    b=b+1;

    c=get_obj_struct(obj,"body->p.x");

    --print("x:",c);

    collided_with=get_obj_struct(obj,"collided_with");
    type=get_obj_struct(collided_with,"type");

    print("type:",type);

    return a,b;
end

我期待'collided_with'成为一个指针,然后我可以将其传递回get_obj_struct并查找类型。 我知道这与我错误使用pushlightuserdata以及读取obj有关。 所以解释会很棒!此外,如果有人希望提供使用“表格”的版本(因为我认为会更有效率),那么我将非常感谢您的帮助。

干杯

1 个答案:

答案 0 :(得分:1)

在线“Programming In Lua”书提供了如何在C中实现Lua类型的详细说明。在我看来,您最好的选择是按照Chapter 28中提供的示例“执行此操作“并为您的对象创建一个完整的Lua包装器。除了更易于维护之外,它几乎肯定比基于strcmp的实现更快。