【问题标题】:Call only one specific function in a Lua script from c从 c 中仅调用 Lua 脚本中的一个特定函数
【发布时间】:2016-05-13 12:41:57
【问题描述】:

是否可以只从 C 调用 Lua 脚本中的一个特定函数。目前,我有一个调用 C 函数的 Lua 脚本。现在,我需要这个 C 函数从上述脚本中调用一个 Lua 函数。

编辑: C 函数如下所示:

#include <lua.h>
#include <lauxlib.h> 
#include <lualib.h>


static double E1(double x) {

    double xint = x;
    double z;


    lua_State *L;
    L = luaL_newstate();

    luaL_openlibs(L);

    luaL_loadfile(L, "luascript.lua");

    lua_pcall(L, 0, 0, 0);

    lua_getglobal(L, "func");
    lua_pushnumber(L, x);

    lua_pcall(L, 1, 1, 0);

    z = lua_tonumber(L, -1);
    lua_pop(L, 1);

    lua_close(L);

    return z;
}

static int Ret(lua_State *L){

    double y = lua_tonumber(L, -1);

    lua_pushnumber(L, E1(y));

    return 1;
}

int luaopen_func2lua(lua_State *L){
    lua_register(
                    L,
                    "Ret",
                    Ret
                    );
    return 0;
}

Lua 脚本如下所示:

 require "func2lua"

 function func (x)
     -- some mathematical stuff
     return value
 end

 x = 23.1

 print(Ret(x)) -- Ret is the C function from the top c-file

【问题讨论】:

  • 你不能用C写这个lua函数吗?通常是 lua 调用 C 而不是其他方式
  • 不幸的是,第三个程序依赖于 Lua。所以,对我来说,没有办法绕过它。
  • 也许对 Lua 文件的一些解释会有所帮助。当您执行 Lua 文件时,它: 1) 加载并运行 func2lua.lua,将全局 func 设置为函数值,将全局 x 设置为数字,调用全局 Ret 变量的值作为函数并将全局 print 变量的值作为函数调用。在设置func 之前,它的值将是nil。目前还不清楚你想给谁打电话,什么时候打电话。您可能不想多次加载和执行文件。

标签: c lua


【解决方案1】:

是的,你可以。 C 函数将需要一种方法来获取该函数。根据您的要求,您可以将该 Lua 函数作为参数之一传递给 C 函数,或者将该 Lua 函数存储在 C 可以访问的位置 - 在全局环境中(然后 C 将 lua_getglobal() 该函数),或者在一些预定义的表中,属于那个脚本。

【讨论】:

  • 但首先您需要执行块(例如文件或缓冲区),以便您实际创建此函数。你可以使用 lua_loadfile/lua_call
  • 调用C函数的脚本已经在执行,无需单独准备。但是是的,如果要调用的 Lua 函数将存储在全局环境中,那么它必须在第一次调用 C 函数之前存储在那里。
  • 我的意思是如果作者不调用 lua_call/pcall 而只是调用 lua_loadfile 则没有任何功能。
  • 根据定义,有“调用 C 函数的 Lua 脚本”。在调用 C 函数的那一刻 - 调用脚本已经在运行。
  • 感谢您的快速回复。很抱歉,我是 Lua 和 C 的新手。因此,我并不完全熟悉您使用的所有术语。到目前为止,我有一个调用 C 函数的 Lua 脚本,该 C 函数又调用另一个 C 函数,然后,理论上,从原始 Lua 脚本调用一个函数。 C--> Lua 调用是通过 luaL_loadfile、lua_getglobal 和 lua_pcall 调用的。但是,这会导致无限循环。长话短说:我怎样才能专门解决我想使用 lua_getglobal() 调用的一个 Lua 函数?再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2010-11-15
  • 2018-04-23
  • 1970-01-01
  • 2015-07-14
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多