簡體   English   中英

C ++和Lua-嘗試索引nil值錯誤

[英]C++ & Lua - attempt to index a nil value error

我目前正在學習如何使Lua與C ++一起使用,但我偶然發現了這個問題。 這是我目前正在使用的小應用程序:

#include <lua.5.2.3\src\lua.hpp>
#include <iostream>
#include <string>

int pluacall(lua_State *L){
    std::cout << "Called from inside Lua." << std::endl;
    return 0;
}

int main(){
    std::string x;
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {} };

    if (luaL_dofile(L, "test.lua")){
        std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
        lua_pop(L, 1);
    }

    luaL_setfuncs(L, _funcs, 0);

    lua_getglobal(L, "sup");
    if (lua_pcall(L, 0, 0, 0)){
        std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
        lua_pop(L, 1);
    }


    std::cout << "Test";
    std::getline(std::cin, x);

    lua_close(L);
    return 0;
}

在我添加luaL_setfuncs(...)之前,一切都可以正常工作。

現在,應用程序崩潰並出現以下錯誤:

PANIC: Unprotected error in call to Lua API (attempt to index a nil value)

我要說實話,我絕對不知道為什么它不起作用或者這個錯誤甚至意味着什么(谷歌今天不是我的朋友)。 有任何想法嗎?

還可能值得一提的是,我沒有將Lua庫與我的應用程序鏈接,而是將它們編譯在一起(所有Lua源代碼都添加到了項目中)

編輯:這是我正在測試的Lua腳本

function sup()
    io.write("Hey.\n")
    CppFunc()
    return 1
end
void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);

將數組l中的所有函數(請參見luaL_Reg)注冊到堆棧頂部的表中 (在可選的upvalue下方,請參見下一個)。


void luaL_newlib (lua_State *L, const luaL_Reg *l);

創建一個新表並在其中注冊列表l中的功能。 它通過以下宏實現:

 (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))

任一插入luaL_newlibtable(L, _funcs)之前luaL_setfuncs ,或使用luaL_newlib(L, _funcs)代替。 如果您不想將功能注冊到單獨的表中,而是注冊到全局名稱空間中,則可以使用以下方法:

lua_pushvalue(L, LUA_GLOBALSINDEX); // push _G table
luaL_setfuncs(L, _funcs, 0); // set funcs on _G
lua_pop(L, 1); // pop _G

嘗試顯式設置終止funcs數組的哨兵:

luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {NULL, NULL} };

我不認為編譯器會為它們提供默認的0值(但我不是100%),因此,如果不設置它們,最終可能會導致垃圾指針,從而導致崩潰。

注釋后編輯,上面的內容無濟於事:

如果這不是問題,請嘗試使用luaL_newlib代替luaL_setfuncs:它似乎使用luaL_newlibtable在表上創建一個表,然后調用setfuncs在其中注冊函數:

luaL_newlib(L, _funcs);

(令我驚訝的是,找到與此相關的清晰文檔/示例非常困難)。 在SO上看到對類似問題的很好回答

因此,我並沒有完全按照自己的想法解決此問題,但是總比沒有好。

我將luaL_setfuncs()更改為lua_register() ,現在一切似乎都可以工作了。 有什么問題-我不知道。

我以為luaL_setfuncs()是現在向Lua注冊C函數的luaL_setfuncs()方法,但是它不起作用,所以我不得不堅持通過lua_register()注冊所有內容。

如果我獲得有關此問題的更多信息,我將編輯此帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM