Lua从C中添加/更改全局变量

6

我有一个小的Lua脚本:

function g ()
    print( AUp);
end

我从C中加载脚本,添加一个名为AUp的变量,并让它运行数百次。

for( i=0; i<2000; i++)
{
    num= i;
    lua_pushnumber( L, i);
    lua_setglobal( L, "AUp");

    lua_getglobal( L, "g");
    if (lua_call( L, 0, 0) != 0)
       printf( "%s", lua_tostring(L, -1));
}
print的输出总是0。如果我放入(i+1),输出总是1。我无法改变AUp的值。该值保持不变,就像第一次调用lua_pushnumner和lua_setglobal时一样。
问题出在哪里?这个函数应该被反复调用,但是AUp的值可以改变,所以在调用lua_call之前必须更新它。

如果您检查立即推送的数字,您会收到该数字吗?例如:assert(lua_tonumber(L,-1)== i);?设置后检查 AUp 呢?例如:lua_getglobal(L,“AUp”); assert(lua_tonumber(L,-1)== i); - greatwolf
1个回答

1

我不确定,但您是否尝试过: 1. 在Lua脚本中定义AUp的初始值。 2. 在C循环期间清除堆栈值。

编辑: 忘记这两个点 :)

for(i = 0; i<200; i++)
   {
            lua_pushnumber(l, i);
            lua_setglobal(l, "foo");

            lua_getglobal(l, "test_f");
            if (lua_pcall(l, 0, 0, 0) != 0)
            {
                    printf( "%s", lua_tostring(l, -1));
            }
    }

并且

function test_f()
    print(foo)
end

在 Lua 5.1.5 中完全正常工作。 顺便提一下,根据 manual - void lua_call (lua_State *L, int nargs, int nresults);(使用 lua_pcall() 替代)。无法使用 Lua 5.1.5 标头编译您的代码。


  1. 不行,因为那样AUp就必须在脚本内部。
  2. 怎么做呢?在循环的结尾处使用lua_rawgeti会导致异常。
- Karl Schulte
你使用的是哪个Lua版本?在我的情况下,你的代码片段根本无法编译。使用lua_pcall()可以正常工作。我还添加了代码片段。 - Kamiccolo
我使用的是4.1版本。它没有pcall。这是个好点。Lua 5太大了,我在PC和ARM9上使用相同的版本。因此,我决定使用版本4。 - Karl Schulte
2
@KarlSchulte lua_settop(L, 0);会清空堆栈。 - greatwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接