Lua和C语言之间的调用规则问题

我不想走元表等复杂的路线,因为这似乎很复杂。

为了粗略地访问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有关。 因此,任何解释都可以。如果有人希望给出一种使用“表”(因为我认为那会更有效率)的版本,那么我会感激有人的帮助。

原文链接 https://stackoverflow.com/questions/5407303

点赞
stackoverflow用户302742
stackoverflow用户302742

在线的 " Programming In Lua" 书提供了一个很好的描述,来告诉你如何在 C 中实现 Lua 类型。在我看来,你最好的选择是按照 第 28 章 中提供的例子来 "做正确的事" 并为你的对象创建一个完整的 Lua 封装。除了更易于维护之外,它几乎肯定比基于 strcmp 的实现更快。

2011-03-29 19:49:15