【问题标题】:Calling Lua function without executing script在不执行脚本的情况下调用 Lua 函数
【发布时间】:2010-02-27 02:57:02
【问题描述】:

我将 Lua 嵌入到 C/C++ 应用程序中。有没有办法在不先执行整个脚本的情况下从 C/C++ 调用 Lua 函数?

我试过这样做:

//call lua script from C/C++ program
luaL_loadfile(L,"hello.lua");

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

但它给了我这个:

PANIC: unprotected error in call to Lua API (attempt to call a nil value)

我只能在执行此操作时调用 bar():

//call lua script from C/C++ program
luaL_dofile(L,"hello.lua");  //this executes the script once, which I don't like

//call lua function from C/C++ program
lua_getglobal(L,"bar");
lua_call(L,0,0);

但它给了我这个:

hello
stackoverflow!!

我想要这个:

stackoverflow!

这是我的 lua 脚本:

print("hello");

function bar()
 print("stackoverflow!");
end

【问题讨论】:

  • 由于您必须运行脚本才能让 Lua 虚拟机看到它,就像 Etan 指示的那样,您必须将 function bar() 提取到另一个文件并运行该文件。

标签: c++ c lua


【解决方案1】:

正如刚刚在#lua on freenode 中讨论的那样,luaL_loadfile 只是将文件编译成一个可调用的块,此时文件内的任何代码都没有运行(包括函数定义),因此为了获得定义必须调用 bar 来执行块(这是 luaL_dofile 所做的)。

【讨论】:

  • 我是在聊天中提出这个问题的人:P
  • 我以为你是,但我想无论如何我都会明确引用,以防万一。
【解决方案2】:

发现必须运行脚本才能调用该函数。

【讨论】:

    【解决方案3】:

    一种可能的解决方案/破解(记住我目前无法对此进行测试)...


    插入一个虚拟的“return;” LUA 代码顶部的行。

    • 将文件加载到字符串中(就像准备使用 luaL_loadstring() 一样)
    • 现在使用printf_s("return;\r\n%s", <b>[pointer to string holding actual LUA code]</b>) 应该很简单
    • 现在您可以luaL_loadstring() 连接的字符串

    代码仍然会执行,但它应该在它真正到达任何做某事的东西之前被切断(在您的print("hello"); 示例中,打印行将变得无法访问)。它应该仍然更新了所有函数原型的列表,您现在应该能够使用lua_get() 来引用这些函数。


    注意:对于那些不知道 "\r\n" 是 Windows 操作系统上表示换行符的转义码的人,它必须是那些斜杠... IE: THIS \r\n      NOT THIS /r/n

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2012-07-03
      • 1970-01-01
      相关资源
      最近更新 更多