十六进制常数=格式错误?

Mar*_*ars 5 lua

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

malformed number near '0x1F'
Run Code Online (Sandbox Code Playgroud)

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

有没有人知道这里可能有什么问题?

编辑: 这不是剧本.无论我做什么,简单的"foo = 0xf"都会触发错误,即使文件中没有其他内容也是如此.

更新:

tonumber("0xf")
Run Code Online (Sandbox Code Playgroud)

这会返回nil,而

tonumber("15")
Run Code Online (Sandbox Code Playgroud)

工作得很好.在我的库中,十六进制肯定有问题......

dau*_*tor 5

如果十六进制文字对你不起作用(尽管它们应该),你可以随时使用lua中的十六进制 tonumber("fe",16)


Mar*_*ars 3

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

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

我使用 DMC 编译了 Lua,因为我需要 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 */
Run Code Online (Sandbox Code Playgroud)