簡體   English   中英

Lua C函數調用返回nil

[英]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").barnil

因此,即使不按照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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM