我有一个Lua脚本,我正在尝试使用十六进制数字(0x ..)。如果我在控制台中使用官方Windows二进制文件运行此脚本,它可以正常工作。但如果我在我的应用程序(简单dofile)中运行它,我会得到
malformed number near '0x1F'
十六进制是什么并不重要,我总是得到那个错误,就像它不支持它们一样。我正在使用的库是Lua 5.1.4,我尝试了两个不同的库(第一个是我自己编译的那个),所以这应该不是问题。
有没有人知道这里可能有什么问题?
修改 这不是剧本。无论我做什么,简单的“foo = 0xf”都会触发错误,即使文件中没有其他内容也是如此。
更新
tonumber("0xf")
返回nil,而
tonumber("15")
工作正常。在我的库中,十六进制肯定有问题......
答案 0 :(得分:5)
如果十六进制文字对你不起作用(尽管它们应该),你可以通过tonumber("fe",16)
答案 1 :(得分:3)
为什么不同编译器中的函数必须不同,...为什么?
好吧,问题是Lua默认尝试将数字转换为double。为此,它使用函数“strtod”,它接受2个参数,字符串和char指针。 char指针应该指向解析后的数字后的最后位置。对于十六进制数字,在'0'之后表示'x'。如果不是这种情况,Lua会出现错误,并向我们提供这个不错的小错误消息。
我使用DMC编译了Lua,因为我需要lib在OMF中,我假设其他人也使用了DMC。但显然DMC的strtod工作方式不同,因为指针始终指向字符串的开头,如果它是十六进制......或者更确切地说是无效数字。
我现在添加了一个小hack,它检查x,如果转换为double失败。不漂亮,但现在一切正常。
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 */
答案 2 :(得分:0)
我用lua5.2面对这个错误。 Lua 5.1工作正常。