LUA_MULTRET 未按预期工作

2023-12-24

This is almost的副本这个问题 https://stackoverflow.com/questions/12528820/lual-dostring-puts-nothing-on-the-stack/;但是,答案表明并不能解决我的问题,而且我没有使用luaL_dostring()直接宏(虽然我am使用它扩展成的同一对调用)。鉴于这个程序:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <lua.hpp>

static int _foo(lua_State* L)
{
    lua_pushinteger(L, 1);
    lua_pushinteger(L, 2);
    lua_pushinteger(L, 3);
    printf("In foo(): pushed %d elements...\n", lua_gettop(L));
    return 3;
}

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    lua_pushcfunction(L, _foo);
    lua_setglobal(L, "foo");

    // This leaves three results on the stack...
    lua_pushcfunction(L, _foo);
    lua_pcall(L, 0, LUA_MULTRET, 0);
    int nresults = lua_gettop(L);
    printf("After foo(): %d results left on the stack...\n", nresults);
    lua_settop(L, 0);

    // ... and so does this.
    luaL_loadstring(L, "foo()");
    lua_pcall(L, 0, 3, 0);
    nresults = lua_gettop(L);
    printf("After foo(): %d results left on the stack...\n", nresults);
    lua_settop(L, 0);

    // But this does NOT. Why?
    luaL_loadstring(L, "foo()");
    lua_pcall(L, 0, LUA_MULTRET, 0);
    nresults = lua_gettop(L);
    printf("After foo(): %d results left on the stack...\n", nresults);
    return 0;
}

为什么最后一次调用lua_pcall(L, 0, LUA_MULTRET, 0) not在堆栈上留下任何结果吗?运行上述程序的输出是:

In foo(): pushed 3 elements...
After foo(): 3 results left on the stack...
In foo(): pushed 3 elements...
After foo(): 3 results left on the stack...
In foo(): pushed 3 elements...
After foo(): 0 results left on the stack...

我正在使用 Lua 5.1.5...


在第一次调用中,您将 C 函数 foo 压入堆栈,然后调用它。但是 luaL_loadstring 创建了一个块,因此在第二个和第三个调用中,您将推送一个块然后调用它,但该块不会返回任何内容,该块只调用 foo()。因此

lua_pcall(L, 0, 3, 0);

在 Lua 堆栈上创建 3 个 nils,因为 Lua 确保您请求的 3 个值都在那里,即使 chunk 没有返回。还

lua_pcall(L, 0, LUA_MULTRET, 0);

没有返回任何内容,因为该块没有返回任何内容。

如果你想从 Lua 执行 foo,请将 foo 全局变量放在堆栈上:

lua_getglobal(L, "foo");
lua_pcall(L, 0, LUA_MULTRET, 0);

或者,让块返回 foo() 返回的内容:

luaL_loadstring(L, "return foo()");
lua_pcall(L, 0, LUA_MULTRET, 0);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LUA_MULTRET 未按预期工作 的相关文章

  • 如何访问废弃的函数参数?

    在 Lua 中 调用带有多余参数的函数将简单地丢弃这些参数 有没有可能与debug库来访问这些被丢弃的参数 我不是在寻找可变参数函数 function test local info debug getinfo 1 u print info
  • Lua 如何创建可用于变量的自定义函数?

    对于像 io close 这样的方法 你可以像这样使用它 file close 有没有办法创建一个像这样工作的自定义函数 您可以在变量上调用它 对我来说 我尝试使用它通过使用 string find 查找空格来将参数与文本文件分开 所以在文
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • Lua:冒号符号、“自我”和函数定义与调用

    我对定义 调用 Lua 函数时使用的冒号表示法感到非常困惑 我以为我已经明白了 直到我看到这段代码 function string PatternSafe str return str gsub pattern escape replace
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 检查lua中是否存在目录?

    如何检查 lua 中是否存在目录 如果可能的话最好不使用 LuaFileSystem 模块 尝试做类似以下 python 行的事情 os path isdir path 这是一种在 Unix 和 Windows 上都适用的方式 无需任何外部
  • lua http套接字超时

    LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时 可以设置以下常量来控制 HTTP 模块的默认行为 PORT 用于连接的默认端口 PROXY 用于连接的默认代理 TIMEOUT 设置所有I O操作的超时时间 USER
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • Lua中如何获取表中的最大整数?

    Lua中如何获取表中的最大整数 在Lua 5 1及更早版本中 你可以使用 math max unpack 1 2 3 4 5 这受到Lua堆栈大小的限制 在 PUC Lua 5 1 上 该值的最大值可达 ca 8000 个数字 如果堆栈空闲
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 在Luasocket中,在什么条件下,即使在select告诉它可以安全读取之后,accept调用也可以阻塞?

    卢阿索基特select http w3 impa br diego software luasocket socket html select函数应该告诉何时可以在不阻塞的情况下读取套接字 它显然也可以用来告诉服务器套接字何时准备好接受新连
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 如何使用 Lua 运行可执行文件?

    我有一个可执行文件想要使用 Lua 运行 我该怎么做 似乎无法在任何地方找到有关此的任何文档 您可以使用 Lua 原生的 执行 命令 Example os execute c temp program exe 资料来源 Lua 指南 os
  • Lua表在内存中是如何处理的?

    lua如何处理表的增长 是否相当于ArrayList在Java中 IE 需要连续的内存空间 并且当它变得大于已经分配的空间时 内部数组被复制到另一个内存空间 有什么聪明的方法来引导吗 我的问题是 表是如何存储在内存中的 我不是问如何在 Lu
  • 如何从 Lua 内部运行另一个脚本?

    我需要从另一个 Lua 脚本中执行一个 Lua 脚本 有多少种方法 我该如何使用它们 通常您会使用以下内容 dofile filename lua 但你可以通过以下方式做到这一点require 很好 例子 foo lua io write
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile
  • 模式 ^u.meta(\.|$) 未按预期工作

    我有这个模式 u meta 预期行为 u meta 将匹配所有角色 例如 u meta u meta admin u meta admin system u meta 它不应该匹配如下所示的内容 u meta admin u meta ad
  • 构建自动化和 MySQL Workbench 脚本:正向工程师 SQL CREATE SCRIPT

    我目前正在研究自动化软件构建过程 其中包括 MySQL Workbench 中定义的数据库架构 使用 Workbench 的脚本编写功能 我想打开一个 Workbench 文档并将其架构导出为 SQL CREATE 脚本 我想知道是否有一个

随机推荐

  • 无法在 AWS Lambda (Python) 中导入模块

    我有一个名为的 python 脚本foo py 它有一个 lambda 处理函数 定义如下 def handler event context for record in event Records bucket record s3 buc
  • 柯尔莫哥洛夫复杂度近似算法

    我正在寻找一种算法 可以计算给定输入字符串的柯尔莫哥洛夫复杂度的近似值 因此 如果 K 是字符串 S 的柯尔莫哥洛夫复杂度 并且 t 代表时间 那么该函数的行为将如下所示 limit t gt inf K approx t S K 理论上
  • 如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查

    我正在编写一个控制台应用程序来验证 PowerShell 脚本语法 我的请求是验证 PowerShell 脚本而不执行该脚本 我在下面的 PowerShell 命令中发现了这个命令 它可以在不执行脚本的情况下执行语法检查 Get Comma
  • Self.Type 无法直接转换为 AnyClass 以扩展为 swift 中的 Objective-C 类

    我正在尝试创建结构方法来创建具有正确笔尖名称的 UIViewController 以修复 iOS8 默认初始化程序问题 为此 我添加了扩展 extension UIViewController class func create gt Se
  • Jquery 选择器中的引号

    我读过几个关于类似问题的答案 人们总是说单引号和双引号之间没有区别 问题是我有一小行代码似乎很重要 li data type veg append v 这段代码做了我希望他做的事情 在链接末尾放置一个 v 但是这段代码 li data ty
  • ApacheConnectorProvider:泽西客户端 2.5.1

    Ref https jersey java net documentation latest user guide html d0e4337 https jersey java net documentation latest user g
  • 关于游戏循环、tick和实时编程的一些问题

    首先 我想为我的英语水平道歉 因为我是法国人 我目前正在使用 LWJGL 用 java 制作实时游戏 我有一些关于游戏循环的问题 我正在线程中运行渲染例程 这是不是一个好主意 通常 渲染例程相当慢 并且不应该减慢更重要的世界更新 滴答 例程
  • Xcode 3.1.4 中添加 -Wall 和 -Wextra 的位置

    我试图找出在 Xcode 中添加额外警告标志的位置 例如 Wall 和 Wextra 我在 Leopard 上使用版本 3 1 4 苹果的文档适用于旧版本 如果我按照他们的说明进行操作 它会将我带到与他们显示的完全不同的窗口 他们还提供了特
  • Highcharts - 指定堆叠时间序列的顺序

    Highcharts 有没有办法指定时间序列的堆叠顺序 我发现的唯一方法是在系列出现时订购它们 因此 如果我有 A B 和 C 系列 并且希望通过以下方式订购 B C A然后我将系列添加到B C A顺序使得系列 0 B 系列 1 C 系列
  • 如何从 scala/sbt/slf4j 项目中排除公共日志记录?

    我的 scala sbt 项目使用 grizzled slf4j 和 logback 第三方依赖项使用 Apache Commons Logging 对于 Java Maven 我将使用 jcl over slf4j 和 logback c
  • Android XML:投影被截断

    我有一个带有边距的相对布局和一个嵌套在该布局内的浮动操作按钮
  • 如何正确处理 ASP.Net Core 3 Web API 中的多个端点

    我有 2 种方法来处理 HTTP GET 请求 第一个方法用于int键入输入 另一个用于string类型输入 GET api Fighters 5 HttpGet id public async Task
  • 如果我在 MySQL 中存储 int(255) ,最大数量是多少?

    我在mysql中使用int 255 作为我的id 这够长吗 如果我有大约 1 000 000 条记录 谢谢 有些东西可能只是将其转换为int 11 为你 因为你不能在一个字符中包含 255 个可见数字int 最大值将为2147483647
  • 在 asp.net mvc 2.0 中使用 Html.DropDownListFor 助手时如何更改 id 值?

    我有这样的部分观点 现在您可以创建新产品并编辑现有产品 编辑和创建都使用相同的形式 加载时创建位于主页上 编辑会在 jQuery UI 模型对话框中弹出并呈现新的部分视图 因此 就页面而言 我有两个具有相同 id 的下拉框 这很糟糕 因为它
  • 向下滚动到页面图像时是否能够部分加载页面图像,或者只是效果?

    我在一些网站上注意到 例如http mashable com http mashable com当您打开页面并尝试滚动它时 它似乎在您到达它时加载图像 我不知道这是否只是闪烁效果 或者它确实是为了减少滚动到它之前的图像负载 这是一个帮助您入
  • Hbase-hadoop集成中datanode、regionserver的作用

    根据我的理解 行被插入到 HBase 表中 并作为区域存储在不同的区域服务器中 因此 区域服务器存储数据 类似地 就 Hadoop 而言 数据存储在 hadoop 集群中的数据节点中 假设我在 Hadoop 1 1 1 之上配置了 HBas
  • 仅当安装支持 Android 应用程序时 HTML 重定向到自定义协议

    我想让所有用于我的应用程序的 URI 启动我的应用程序 如果已安装 如果未安装 我想显示有关我的应用程序的网页 看了下面两个问题 还是找不到靠谱的解决办法 意图过滤器适用于 Google 但不适用于 Chrome 和 Facebook ht
  • Flask jsonify 在新行上打印结果

    第一次使用 Flask 我创建了一个非常基本的应用程序 我正在尝试打印推荐系统的结果 第一组代码来自我的 python 函数 print most similar 正在创建一个格式化字符串 希望在新行上打印每个 REC 代码的第二部分显然是
  • 如何将不同的输入放入 sklearn Pipeline 中?

    我正在使用 sklearn 的 Pipeline 对文本进行分类 在此示例管道中 我有一个 TfIDF 矢量器和一些用 FeatureUnion 包装的自定义功能和分类器作为管道步骤 然后我拟合训练数据并进行预测 from sklearn
  • LUA_MULTRET 未按预期工作

    This is almost的副本这个问题 https stackoverflow com questions 12528820 lual dostring puts nothing on the stack 但是 答案表明并不能解决我的问