2012-03-20 57 views
0

我有兩個文件 - 一個用於執行Lua腳本和腳本本身。將一些數據推送到Lua調用函數

在這裏,他們是:

host.cpp

#include <lua.hpp> 
#include <iostream> 

using namespace std; 

int someHandler(lua_State *l) 
{ 
    int argc = lua_gettop(l); 

    for (int i = 0; i < argc; i++) 
    { 
     cout << "ARG[" << i + 1 << "] = " << lua_tostring(l, i + 1) << endl; 
    } 

    lua_pushstring(l, "m_pi"); 
    //lua_pop(l, argc - 1); 
    //lua_pushnumber(l, 3.14); 

    return argc; 
} 

int main() 
{ 
    lua_State *l = lua_open(); 
    luaL_openlibs(l); 

    lua_register(l, "moo", someHandler); 

    luaL_dofile(l, "script.lua"); 

    lua_close(l); 

    return 0; 
} 

script.lua

res = moo("hello", "world"); 

print(moo()); 

for k, v in res do 
    print(k.." = "..v); 
end 

編譯host.cppg++ host.cpp -o host.elf -I/usr/include/lua5.1 -llua5.1

運行host.elf的結果是:

ARG[1] = hello 
ARG[2] = world 
<\n> 

,而應該是:

ARG[1] = hello 
ARG[2] = world 
m_pi 

我該怎麼辦錯了嗎?

+3

你不是應該返回'1'而不是'argc'是'2'? – 2012-03-20 08:21:33

+0

那麼,在'moo()'的情況下,'argc'是'0',但是這個點是站立的。 – Mankarse 2012-03-20 08:54:56

+1

「for」(在Lua中)的含義是什麼? 'res'是一個字符串,不是有效的迭代器構造函數。 – Mankarse 2012-03-20 09:37:27

回答

2

行由行解釋:

--This calls moo with two arguments 
--(ignore the assignment for now, we will come back to that) 
res = moo("hello", "world"); 

控制轉移到C++:

//the stack of l looks like this: ["hello", "world"] 
int someHandler(lua_State *l) 
{ 

    int argc = lua_gettop(l); //int argc = 2; 

    //This loop prints: 
    //"ARG[1] = hello\n" 
    //"ARG[2] = world\n" 
    for (int i = 0; i < argc; i++) 
    { 
     cout << "ARG[" << i + 1 << "] = " << lua_tostring(l, i + 1) << endl; 
    } 
    //This pushes "m_pi" on to the stack: 
    lua_pushstring(l, "m_pi"); 

    //The stack now looks like ["hello", "world", "m_pi"] 

    //Returns 2. 
    //Lua will treat this as a function which 
    //returns the top two elements on the stack (["world", "m_pi"]) 
    return argc; 
} 

控制返回到Lua:

--Assigns the first result ("world") to res, discards the other results ("m_pi") 
res = moo("hello", "world"); 

--Calls `moo` with zero arguments. 
--This time, `lua_gettop(l)` will evaluate to `0`, 
--so the for loop will not be entered, 
--and the number of results will be taken to be `0`. 
--The string pushed by `lua_pushstring(l, "m_pi")` will be discarded. 
--`moo()` returns no results, so `print` prints nothing. 
print(moo()); 

--WTF??: res = "world", which is a string, not an expression which evaluates to 
--a loop function, a state variable, and a element variable. 

--The for loop will raise in an error when it 
--attempts to call a copy of `res` (a string) 
for k, v in res do 
    print(k.." = "..v); 
end