我有一个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)
工作得很好.在我的库中,十六进制肯定有问题......
为什么函数在不同的编译器中必须不同,......为什么?
好吧,问题是 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)
| 归档时间: |
|
| 查看次数: |
6370 次 |
| 最近记录: |