2012-05-20 79 views
0

我花了6個小時試圖解決這個問題!我coulnt隨時隨地:■將lua表格從C++傳遞給.Lua腳本

我希望能夠在C創建一個Lua表++文件,然後傳遞到LUA腳本文件,它具有以下LUA功能:

function MTable (t) 
local n=#t 
    for i=1,n do 
     print(t[i]) 
    end 
end 

我動態創建的一個一個維陣列具有兩個字符串:

lua_newtable(L); 
lua_pushstring(L,"10.10.1.1"); 
lua_pushstring(L,"10.10.1.2"); 
lua_rawseti(L,-3,2); 
lua_rawseti(L,-2,1); 

所以我現在在堆棧的頂部的表中。 我已經通過寫這個來驗證它: if(lua_istable(L,lua_gettop(L)))`返回1,表示它是一個表。

那麼我這樣做:

lua_getglobal(L, "MTable"); // push the lua function onto the stack 

uint32_t result = lua_pcall(L, 1, 0, 0); //argument 1 is for the table 
if (result) { 
printf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1)); 
     exit(1); 
} 

,所以我得到了錯誤: 無法運行腳本:嘗試調用表值

請注意該文件還有其他幾個功能我從C++調用成功。

有人可以幫我解決這個錯誤嗎?這可能是來自LUA的錯誤嗎? cz我非常正確地遵循了步驟......我想!

+0

這已經在Lua郵件列表中被詢問和回答。 – lhf

回答

3

該函數必須是第一個在堆棧上的參數之前。

您可以:

  1. 推功能生成表之前在棧上調用,例如:

    lua_getglobal(L, "MTable"); 
    ...generate table on stack... 
    int result = lua_pcall(L, 1, 0, 0); 
    
  2. 不要在你現在要做的順序,然後就換在ARG和之前做PCALL功能:

    ...generate table on stack... 
    lua_getglobal(L, "MTable"); 
    lua_insert (L, -2); // swap table and function into correct order for pcall 
    int result = lua_pcall(L, 1, 0, 0); 
    
+0

謝謝!它像魔術一樣工作! 我還有一個問題,C怎麼可能從lua中得到表格? 我編輯了Lua腳本以返回t。所以到現在爲止,lua把t推到了堆棧上。 C怎麼拿?我讀了另一個解決這個問題的線索,但我無法理解解決方案的一個字。我所知道的是,我必須編寫一個採用Lua狀態參數的C函數,並且我不知道如何從那裏繼續!你知道嗎? – PeacefulSoul