2015-08-26 206 views
1

我在1周前用LuaBridge做了第一個小測試,它的工作是從腳本中獲得一個int。LuaBridge getGlobal總是返回零

現在我刪除了這段代碼,並嘗試在我的遊戲引擎中包含Lua腳本,但它不再有效。 我想回去跟這個有基本的代碼:

#include <iostream> 

#include "lua5.2/lua.hpp" 
#include "LuaBridge/LuaBridge.h" 

using namespace luabridge; 


int main() 
{ 
    lua_State* L; 
    L = luaL_newstate(); 

    if(!luaL_loadfile(L, "../../script.lua")) 
     std::cout << "failed loading" << std::endl; 

    LuaRef s = getGlobal(L, "nmbr"); 
    int luaInt = s.cast<int>(); 
    std::cout << luaInt << std::endl; 

    return 0; 
} 

這個腳本

nmbr = 30 

,這讓我:

 
PANIC: unprotected error in cell to Lua API (bad argument #2 (number expected, got nil)) 
Aborted (core dumped) 

它,當我試圖得到相同一個字符串或從腳本中的函數,我不知道我在這做錯了什麼。

謝謝您的回答:)

回答

2

luaL_loadfileex文檔:

由於lua_load,該功能只加載塊;它不會運行它。

這意味着該腳本已加載,但尚未執行,因此確實沒有變量nmbr可以獲取。您需要首先運行腳本才能使代碼正常工作(例如,通過調用lua_call)。

這在第一個簡單示例in this LuaBridge tutorial中顯示得非常好。

+0

是的,我閱讀了本教程(這是它在第一個工作的原因,因爲我幾乎複製粘貼它)。但是我對dofile和loadfile之間的差異有一個不好的理解。現在,您和@Youka的回答讓我明白了這個問題以及變量賦值的必要性。非常感謝:) – Adinimys

1

luaL_loadfile〜= luaL_dofile。您加載腳本並將其作爲堆棧中的函數獲取,但不執行它,因此全局分配不會發生。

+0

好的,我知道它是不同的,但我只是認爲不同之處在於它在dofile中會調用腳本中存在的函數。我不知道這是可變分配所需要的。謝謝 :) – Adinimys