在C+中访问Lua函数的返回值+;反之亦然 我在Lua有一些函数,C++中的一些函数,我从我的加法、幂和除法中得到正确的结果。我唯一的问题是阶乘,因为我无法将正确的数字传递给它,这应该是除法的结果

在C+中访问Lua函数的返回值+;反之亦然 我在Lua有一些函数,C++中的一些函数,我从我的加法、幂和除法中得到正确的结果。我唯一的问题是阶乘,因为我无法将正确的数字传递给它,这应该是除法的结果,c++,lua,C++,Lua,在卢阿: function powLua(a, n) b = 1 for i=1,n do b = b * a end return b end function divisionLua(a, b) c = b/a return c end aLua = additionLua(2, 3) bLua = additionLua(1, 3) print("Result of additionLua is a = "..aLua.."

在卢阿:

function powLua(a, n)
   b = 1
   for i=1,n do b = b * a end
   return b
end

function divisionLua(a, b)
   c = b/a
   return c
end

aLua = additionLua(2, 3)
bLua = additionLua(1, 3)

print("Result of additionLua is a = "..aLua.."\nResult of additionLua is b = "..bLua.."\n")

fac = factorialLua(divLua) <---- this is the part that doesn't work

print("factorial of divLua is "..fac.."\n")
导致factorialua(divLua)的正确结果,但是当我将“divLua”设置为division()的值时,如下所示:

int div = 5;
lua_pushnumber(L, div);
lua_setglobal(L, "divLua");
...
...
luaL_dofile(L, "test01.lua");
int div = division(L, 5, 30); //div should be 6 now
lua_pushnumber(L, div);
lua_setglobal(L, "divLua");
...
...
luaL_dofile(L, "test01.lua");
factorialua(divLua)的结果是1,而不是720

原因必须是division()必须在luaL_dofile之后调用,但lua_setglobal(L,“divLua”)必须在它之前。 因此,我需要让“div”知道稍后将进行的计算结果


有什么建议吗?

上面有几个问题:

    <> >您试图在代码之前计算<代码> FraceReLuua(DIVLUA)<代码> >从C++设置。
  • 您正在使用负索引调用
    lua\u pop
    ,但它需要一个正整数
  • 假设解决了前两点,您将尝试计算
    125这将是一个非常大的数字
请注意,当前为
factorialua
获取
1
的原因是
lua\u tonumber
返回
0
,前提是给定的堆栈索引实际上不是一个数字。由于调用该函数时,
divLua
仍然是
nil
,因此可以有效地计算
factorialua(0)

解决这一问题的两种显而易见的方法:

  • 在实际执行脚本之前,先执行一个
    lua\u setglobal(L,“divLua”)
  • 将因子计算移到C++的土地上,实际上是定义了代码> DIVLUA<代码>。
    (我想补充一点,可以使用
    luaL\u checknumber
    而不是
    lua\u tonumber
    来捕捉最后一个问题。)感谢您的快速回答。我换了lua_pop电话,没意识到那个错误。然后,在使用luaL_dofile执行脚本之前,我设置了divLua global。我已经试过了,我知道你是对的,但如果我这样做,它就无法识别分区的参数,即pwr和a,因为它们必须在执行脚本后设置。至少如果我在执行前声明它们是行不通的。
    int div = division(L, 5, 30); //div should be 6 now
    lua_pushnumber(L, div);
    lua_setglobal(L, "divLua");
    ...
    ...
    luaL_dofile(L, "test01.lua");