Lua 十六进制常数=格式错误的数字?
我有一个Lua脚本,我试图使用十六进制数(0x..)。如果我在控制台中使用官方的Windows二进制文件运行此脚本,它就可以正常工作。但是如果我在我的应用程序(简单dofile)中运行它,我会得到 不管十六进制是什么,我总是得到那个错误,好像它不支持它们。我使用的库是Lua5.1.4,我尝试了两个不同的库(第一个是我自己编译的库),所以这应该不是问题所在 有人知道这里可能出了什么问题吗 编辑:Lua 十六进制常数=格式错误的数字?,lua,Lua,我有一个Lua脚本,我试图使用十六进制数(0x..)。如果我在控制台中使用官方的Windows二进制文件运行此脚本,它就可以正常工作。但是如果我在我的应用程序(简单dofile)中运行它,我会得到 不管十六进制是什么,我总是得到那个错误,好像它不支持它们。我使用的库是Lua5.1.4,我尝试了两个不同的库(第一个是我自己编译的库),所以这应该不是问题所在 有人知道这里可能出了什么问题吗 编辑: 这不是剧本。不管我做什么,一个简单的“foo=0xf”已经触发了错误,即使文件中没有其他内容 更新:
这不是剧本。不管我做什么,一个简单的“foo=0xf”已经触发了错误,即使文件中没有其他内容 更新:
tonumber("0xf")
这将返回nil,而
tonumber("15")
干得好。我的libs中的hex肯定有问题…如果hex文本不适合您(尽管它们应该),您可以通过执行
tonumber(“fe”,16)
在不同的编译器中为什么函数必须不同,为什么
好吧,问题是Lua试图在默认情况下将数字转换为double。为此,它使用函数“strtod”,它接受两个参数、字符串和一个字符指针。char指针应该指向解析数字之后的最后一个位置。对于十六进制数,它表示“0”之后的“x”。如果不是这样的话,Lua会假设一个错误,并给我们这个漂亮的小错误消息
我使用DMC编译了Lua,因为我需要lib在OMF中,我假设其他人也使用DMC。但显然DMC的strtod的工作原理不同,因为如果字符串是十六进制的,指针总是指向字符串的开头。。。或者更确切地说是任何无效的数字
我现在添加了一个小的hack,如果转换为double失败,它会检查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 */
我用lua5.2面对这个bug。Lua 5.1工作正常。能否在出现此错误的地方显示脚本部分?这不是脚本。不管我做什么,一个简单的“foo=0xf”已经触发了错误,即使文件中没有其他内容。我在上面尝试十六进制数时没有收到错误。试着在那里运行你的代码,它能工作吗?就像我说的,它不是脚本。但是是的,它在那里工作得很好。既然它是和官方口译员一起工作的,我想我尝试使用的LIB肯定有问题。但是我不知道。。。如果我在编译Lua时出错,我可以理解,但毕竟我也尝试过其他lib。Lua使用后端libc解析十六进制字符串。众所周知,一些微软的libc在这方面是一个缺陷,但即使对他们来说,这似乎也有点极端。如果您自己编译过它,您可以尝试在lobject.c中的
luaO\u str2d
处放置一个断点,看看会发生什么。嗯,我的lib现在已经修复了。也许有一天我会把那个坏掉的挖出来,看看这是否管用^^^我想,这应该是一个评论。
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 */