Lua к 'C' вызывает проблемы соглашения - PullRequest
0 голосов
/ 23 марта 2011

Я новичок в Луа, так что голый со мной! Я действительно не хочу идти по пути метатаблиц и т. Д., Поскольку это кажется довольно сложным В настоящее время для грубого доступа к структурам C в Lua я делаю:

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' заканчивается как ноль.

Мой сценарий Луа:

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 Ответ

1 голос
/ 29 марта 2011

Онлайновая книга " Programming In Lua " содержит хорошее описание того, как реализовать типы Lua в C. На мой взгляд, вам лучше всего следовать примерам, приведенным в Глава 28 чтобы "сделать все правильно" и создать полную обертку Lua для вашего объекта.Помимо того, что его легче поддерживать, он почти наверняка будет быстрее, чем реализация на основе strcmp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...