2013-12-22 2 views
3

Я пытаюсь вызвать функцию Lua из C. Функция Lua создает таблицу, а затем выполняет итерацию через нее. Он работает, как ожидается, при вызове из Lua, но не тогда, когда я вызываю его из программы C. Есть ли причина, по которой я не могу сделать то, что я здесь пытаюсь?Итерации через таблицу в Lua, в функции, вызванной от C

test.lua:

function f() 
    t = {["a"] = "aaa", ["b"] = "bbb", ["c"] = "ccc"} 
    for z, v in t do 
     print(t .. " " .. v) 
    end 
end 

test.c:

#include <string.h> 
#include <stdio.h> 
#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 

int main(void) 
{ 
    char read_buffer[1024]; 

    lua_State *L = lua_open(); 
    luaL_openlibs(L); 
    if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0)) 
     fprintf(stderr, "Error loading test.lua"); 

    lua_getglobal(L, "f"); 

    if(lua_pcall(L, 0, 0, 0) != 0) 
     fprintf(stderr, "error: %s\n", lua_tostring(L, -1)); 

    strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer)); 
    lua_pop(L, 1); 
    printf("got from lua: %s\n", read_buffer); 

    lua_close(L); 

    return 0; 
} 

Спасибо!

+1

ли вам не нужно вызывать 'load_dofile()' вместо 'lua_loadfile()'? –

+0

Я считаю, что luaL_dofile просто вызывает lua_loadfile и lua_pcall: http://pgl.yoyo.org/luai/i/luaL_dofile – user693861

+0

Вы обычно делаете это с помощью ['lua_next'] (http://pgl.yoyo.org/luai/i/lua_next). У них даже есть пример. – greatwolf

ответ

2

Я замечаю пару проблем, которые вызывают проблемы.

За здесь:

function f() 
    t = {["a"] = "aaa", ["b"] = "bbb", ["c"] = "ccc"} 
    for z, v in t do 
    print(t .. " " .. v) 
    end 
end 

Вы не можете использовать таблицу Lua в for in цикле, как, что, если вы сделаете t вызываемую в некоторым образом (например, с помощью __call, например.). Скорее вы, вероятно, просто пытается итерацию через него, в этом случае вы должны использовать pairs:

for z, v in pairs(t) do 
    -- etc. 

Другая ошибка в том, что вы пытаетесь Concat строк на стол. Не знаете, что вы здесь намеревались. Возможно, вы хотели распечатать адрес таблицы? Вы можете использовать для этого tostring.

Второй вопрос, который я замечаю в вашем C код:

if(lua_pcall(L, 0, 0, 0) != 0) 

Таким образом, вы не ожидали f ничего возвращать, если нет ошибки. Но сразу после того, что вы пытаетесь преобразовать верхний элемент в строку:

strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer)); 
lua_pop(L, 1); 
printf("got from lua: %s\n", read_buffer); 

, который не делает много смысла - там не может быть ничего на стеке в этой точке. Это явно логическая ошибка в коде. Если предположить, чтобы быть частью обработки, вы должны заключить его в скобки ошибки, так что это правильно область видимости:

if(lua_pcall(L, 0, 0, 0) != 0) 
{ 
    fprintf(stderr, "error: %s\n", lua_tostring(L, -1)); 
    strncpy(read_buffer, lua_tostring(L, -1), sizeof(read_buffer)); 
    lua_pop(L, 1); 
    printf("got from lua: %s\n", read_buffer); 
} 
+0

К сожалению, я имел в виду concat z и v, а не t и v. С кодом C моя оригинальная функция Lua, которую я упростила для тестирования, вернула строку - я думаю, я забыл отредактировать C соответственно. Не имеет значения, так как код Lua дал мне ошибку до этого. В любом случае, используя 'пар' для итерации через проработанные, спасибо очень. – user693861

Смежные вопросы