[英]Lua C function call returns nil
我為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;
至於導致錯誤的原因, lua_setglobal
從堆棧中彈出庫表,因此luaopen_foo
不會返回它。 然后(盡管我不明白為什么) require "foo"
返回庫的文件路徑(字符串),而字段("foo_filepath").bar
為nil
。
因此,即使不按照Ravi的建議使用創建庫的宏luaL_newlib
,刪除對lua_setglobal
的調用也可以解決該問題。
要將庫表設置為全局foo
並從require
返回它,您必須先使用lua_pushvalue(L, -1)
將表的第二個副本推入堆棧,然后再執行lua_setglobal(L, "foo")
,保留原始副本luaopen_foo
返回的luaopen_foo
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.