2012-05-12 34 views
0

我想在Lua中爲腳本編寫器創建幾個函數,但是當調用這些函數時,我希望它們實際上使用我定義的參數調用單個函數。這可能是這樣的:帶元數據的Lua回調

的Lua:

foo1() 
    foo2() 

C++:

int myFunction(lua_State * context) 
{ 
    int numArgs = lua_gettop(context); 
    int topOfStack = -3; 
    bool lightUserDataFlag = lua_islightuserdata(context, topOfStack); 

    if(lightUserDataFlag) 
    { 
    } 
} 

}

所以我對設置有點困惑。我正試圖用一個參數註冊回調。這是我迄今爲止所做的,並且有些東西並沒有保存函數註冊的參數;它似乎只保存了我添加的最後一個參數。

void setupCallback() 
{ 
    lua_register(context, "foo1", Callback); 
    lua_pushlightuserdata(context, &value[0]); 
    lua_register(context, "foo2", Callback); 
    lua_pushlightuserdata(context, &value[1]); 
} 

當lua調用我的回調函數時,我總是看到值[1],而不是值[0]。我玩了註冊回調的概念,然後添加了一個表格,但我不確定這會讓我更進一步。

至於爲什麼:我試圖抽象函數名稱,以便爲我們的lua程序員編寫代碼更簡單,但這些只需要轉換爲相同的參數化函數。想想它通過傳遞一個參數添加更改設置,但命名方式不同。

想法?

回答

4

您可能希望將這些上下文值附加爲函數的upvalues。看看lua_pushcclosure()

結合米奇Kawick的評論:

int Callback (lua_State *context) 
{ 
    int val= lua_tointeger(context, lua_upvalueindex(1)); 
    cout << val << endl; 
    ... 
} 

void setup() 
{ 
    lua_pushnumber(context, 3); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo1"); 

    lua_pushnumber(context, 42); 
    lua_pushcclosure(context, Callback, 1); 
    lua_setglobal(context, "foo2"); 
} 
+0

這正是我需要的。我結束了這一點。 (lua_State *上下文) int \t回調(lua_State *上下文) { int val = lua_tointeger(context,lua_upvalueindex(1)); cout << val << endl; ... void setup() { lua_pushnumber(context,3); lua_pushcclosure(context,Callback,1); lua_setglobal(context,「foo1」); lua_pushnumber(context,42); lua_pushcclosure(context,Callback,1); lua_setglobal(context,「foo2」); –

+0

@MickeyKawick:您應該通過點擊複選框來接受滿足您需求的答案。 – Managu