gpt4 book ai didi

c - Lua C 函数调用返回 nil

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:46 25 4
gpt4 key购买 nike

我为 Lua 写了一个简单的 C 插件:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

static int bar (lua_State *L) {
double arg1 = luaL_checknumber(L, 1);
double arg2 = luaL_checknumber(L, 2);
lua_Number res = arg1 + arg2;
lua_pushnumber(L, res);
return 1;
}

int luaopen_foo (lua_State *L) {
static const struct luaL_Reg foo [] = {
{"bar", bar},
{NULL, NULL}
};
lua_newtable(L);
luaL_setfuncs(L, foo, 0);
lua_setglobal(L, "foo");
return 1;
}

使用此 GCC 命令成功编译代码:

gcc -W -Wall -g -fPIC -shared -I/usr/include/lua5.3 -o foobar.so foobar.c

在 Lua 5.3 REPL 中,我也能够成功找到并导入模块,但是函数调用的返回值始终是 nil:

root@b1898c1cc270:/# lua5.3
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> local foo = require "foo"
> local res = foo.bar(3.0, 6.0)
> res
nil

没有错误被抛出,因为我能够在返回值之前在 C 代码中printf 结果,我知道代码被调用并且结果计算成功。

有什么想法吗?

Edit1:通过不使用局部变量,我得到了这个堆栈跟踪而不是一个 nil 值:

root@d7340c919be4:/# lua5.3
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> foo = require "foo"
> res = foo.bar(3.0, 6.0)
stdin:1: attempt to call a nil value (field 'bar')
stack traceback:
stdin:1: in main chunk
[C]: in ?

最佳答案

luaL_setfuncs 只是将您的函数注册到一个表中。

相反,请使用 luaL_newlib。它创建一个新表并在那里注册您的函数。然后你需要将表推到 lua 堆栈上。

luaL_newlib (L, foo);
return 1;

关于c - Lua C 函数调用返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49689791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com