2014-05-02 33 views
0

我奮力的發現和了解如何從Lua傳遞一個表到C++的Lua例如/ C++

我有什麼:

的Lua文件:

-- lua script for sending table data 
io.write("lua table to send") 
tableexample = {x = 1, y = 2, z = 100} 
return tableexample 

C/C++側

L = lua_open(); 
luaL_openfile(L, "luafile"); 
... call the function... 
luaLdofile(L, luafile); 
int result; 
result = lua_pcall(L,0, LUA_MULTRET,0); 
if(result){ 
fprintf(stderr, "failed %s\n", lua_tostring(L,-1)); 

if(lua_istable(L,-1)){ 
    lua_gettable(L,-1); 
    x = lua_tonumber(L,-2); 
    y = lua_tonumber(L,-3); 
    z = lua_tonumber(L,-4); 
} 
else 
printf("fail"); 

結果回來與失敗「試圖調用一個表值」

我已經看了許多不同的教程/例子,但還沒有找到一個簡單的教程,不具有其他100米的東西怎麼回事,我越來越迷茫自己

一些參考類似於 - 但太複雜爲我正在尋找的 Iterating through a Lua table from C++?

+2

那麼你使用什麼語言,C或C++? –

回答

4

您使用lua_gettable是錯誤的。

看一看的Lua manual

void lua_gettable (lua_State *L, int index);

壓棧值t[k],其中t處於 給定索引和k值是在的頂部的值疊加。

該功能從堆棧中彈出密鑰(將結果值 置於其位置)。

在您的示例中,堆棧頂部的值是表格本身,因此您正在做相當於tableexample[tableexample]查找。

達到你想要什麼,最簡單的辦法是使用lua_getfield,它可讓用字符串鍵訪問表元素:

lua_getfield(L, -1, "x"); 

或者,先在堆棧上推string類型的Lua的價值和使用lua_gettable查找。

lua_pushliteral(L, "x"); 
lua_gettable(L, -2); 

不要忘記保持堆棧平衡。您在堆棧上推送的每個值都需要正確彈出。 Lua手冊指定每個API調用如何通過\[ \] brackets on the right side of each function name中的數字更改堆棧。

+0

雖然在lua_pcall上失敗 - 所以我甚至沒有把它寫到lua_istable – morty346

+0

@ morty346那麼你可能沒有初始化'io'庫。使用'io.write'刪除該行以便快速修復,或者執行一些[research](http://www.lua.org/manual/5.2/manual.html#luaL_requiref)關於如何獲得標準庫的初始化。 – ComicSansMS

+0

但像我說的錯誤是「試圖調用表值」 - 所以不是一個IO失敗(我也刪除了io.write並沒有改變錯誤代碼) – morty346