【问题标题】:Hex constant = malformed number?十六进制常数=格式错误的数字?
【发布时间】:2014-12-25 17:46:43
【问题描述】:

我有一个 Lua 脚本,我正在尝试使用十六进制数字 (0x..)。如果我在控制台中使用官方 Windows 二进制文件运行此脚本,它可以正常工作。但是如果我在我的应用程序中运行它(简单的 dofile),我会得到

malformed number near '0x1F'

十六进制是什么并不重要,我总是得到那个错误,就好像它不支持它们一样。我使用的库是 Lua 5.1.4,我尝试了 2 个不同的库(第一个是我自己编译的),所以这应该不是问题。

有人知道这里可能出了什么问题吗?

编辑: 这不是剧本。无论我做什么,一个简单的“foo = 0xf”都会触发错误,即使文件中没有其他内容。

更新:

tonumber("0xf")

这将返回 nil,而

tonumber("15")

工作正常。我的库中的十六进制肯定有问题...

【问题讨论】:

  • 您能否在出现此错误的地方显示您的脚本部分?
  • 不是脚本。不管我做什么,一个简单的“foo = 0xf”已经触发了错误,即使文件中没有其他内容。
  • ideone.com/Mo0nP 上尝试十六进制数字时没有出错。尝试在那里运行你的代码,它有效吗?
  • 就像我说的,这不是脚本。但是,是的,它在那里工作得很好。而且由于它与官方解释器一起工作,我想我尝试使用的库一定有问题。但是我不知道是什么......如果我在编译Lua时出错了我可以理解,但毕竟我也尝试过其他库。
  • Lua 使用后端 libc 来解析十六进制字符串。众所周知,一些 Microsoft libcs​​ 在这方面存在缺陷,但即使对他们来说,这似乎也有点极端。如果你自己编译过,你可以尝试在 lobject.c 中的luaO_str2d 处设置一个断点,看看会发生什么。

标签: lua


【解决方案1】:

如果十六进制文字不适合您(尽管它们应该),您始终可以通过 tonumber("fe",16) 使用 lua 中的十六进制

【讨论】:

  • 好吧,我的库现在已经修好了。也许有一天我会挖出一个坏掉的,看看这是否可行^^
【解决方案2】:

为什么函数在不同的编译器中必须不同,...为什么?

好吧,问题是 Lua 默认会尝试将数字转换为双精度数。为此,它使用函数“strtod”,它接受 2 个参数、字符串和 char 指针。 char 指针应该指向解析后的数字 之后的最后一个位置。对于十六进制数字,这意味着在“0”之后的“x”。如果不是这样,Lua 会假设一个错误,并给我们这个漂亮的小错误消息。

我使用 DMC 编译了 Lua,因为我需要将 lib 放在 OMF 中,并且我假设其他人也使用 DMC。但显然 DMC 的 strtod 工作方式不同,因为指针总是指向字符串的开头,如果它是一个十六进制......或者更确切地说是任何无效数字。

我现在添加了一个小技巧,如果转换为双精度失败,它会检查 x。不漂亮,但现在可以正常使用。

int luaO_str2d (const char *s, lua_Number *result) {
  char *endptr;
  *result = lua_str2number(s, &endptr);

  /* Hack for DMC */
  if (endptr == s)
    if(*(s+1) == 'x' || *(s+1) == 'X')
      endptr++;
    else
      return 0; /* conversion failed */

【讨论】:

    【解决方案3】:

    我在 lua5.2 中遇到了这个错误。 Lua 5.1 运行良好。

    【讨论】:

    • 我猜,这应该是一条评论。
    猜你喜欢
    • 2010-12-09
    • 2023-01-28
    • 1970-01-01
    • 2021-11-20
    • 2022-01-15
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多