向 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

使用 g++ host.cpp -o host.elf -I/usr/include/lua5.1 -llua5.1 编译 host.cpp

运行 host.elf 的结果是:

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

但是它应该是:

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

我做错了什么?

原文链接 https://stackoverflow.com/questions/9783252

点赞
stackoverflow用户485561
stackoverflow用户485561
--这里向 `moo` 函数传递两个参数
--(暂时忽略赋值运算,稍后会再介绍)
res = moo("hello", "world");

控制权转移到 C++ 中:

//l 的栈现在像这样:["hello", "world"]
int someHandler(lua_State  *l)
{

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

    //该循环输出:
    //"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;
    }
    //这里将 "m_pi" 推入栈中:
    lua_pushstring(l, "m_pi");

    //此时栈变为 ["hello", "world", "m_pi"]

    //返回值为 2。
    //在 Lua 中,这将被视为一个函数,并返回栈顶的 2 个元素(["world", "m_pi"])
    return argc;
}

控制权返回到 lua 中:

--将第一个返回值("world")赋值给 res,丢弃其他返回值("m_pi")
res = moo("hello", "world");

--调用 `moo` 函数,不传递任何参数。
--此时 `lua_gettop(l)` 将返回 `0`,
--所以不会进入 for 循环,
--同时返回值的数量将被视为 `0`。
--由 `lua_pushstring(l, "m_pi")` 推入的字符串将被丢弃。
--由于 `moo()` 未返回任何结果,所以 `print` 不会输出任何内容。
print(moo());

--WTF??: res 被赋值为 "world",这是一个字符串,
--并不是一个能够进行循环的函数,也不是状态变量或元素变量的求值运算结果。

--当循环尝试调用 `res` 的一个副本(一个字符串)时,
--它会引发错误
for k, v in res do
    print(k.." = "..v);
end
2012-03-20 10:03:23