在Delphi 64位项目中使用in运算符
发布时间:2020-12-15 04:25:34 所属栏目:大数据 来源:网络整理
导读:我正在将Delphi项目移植到64位,我遇到了一行有IN运算符的代码问题. 编译器引发此错误 E2010 Incompatible types: ‘Integer’ and ‘Int64’ 我写了这个示例应用程序来复制问题. {$APPTYPE CONSOLE}{$R *.res}uses System.SysUtils;Var I : Integer; L : Arr
我正在将Delphi项目移植到64位,我遇到了一行有IN运算符的代码问题.
编译器引发此错误
我写了这个示例应用程序来复制问题. {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; Var I : Integer; L : Array of string; begin try if I in [0,High(L)] then except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; readln; end. 这段代码工作正常32位,但为什么不用Delphi XE2 64位编译?我该如何解决这个问题? *更新* 似乎我的帖子引起了很多混淆(对不起),只是为了解释我移植的原始代码更复杂,我只是将这段代码作为样本来说明问题.原始代码使用in运算符来检查一个值(小于255)是否属于一组值(所有次要或等于255),如此 i in [0,1,3,50,60,70,80,127,High(LArray)] 解决方法
此代码无法编译,因为
High 函数返回的是一个8字节值,这不是一个序数值.并且In运算符只能在具有序数值的集合中使用.
仅供参考,High函数返回的结果大小因参数传递的参数而异. 检查此样本 Writeln(SizeOf(High(Byte))); Writeln(SizeOf(High(Char))); Writeln(SizeOf(High(Word))); Writeln(SizeOf(High(Integer))); Writeln(SizeOf(High(NativeInt))); Writeln(SizeOf(High(TBytes))); 最后,您可以修复代码,将High函数的结果转换为整数. if I in [0,Integer(High(L))] then UPDATE 检查David提供的其他信息,并记住在使用in运算符检查变量值集合中的值的成员资格时要非常小心. in运算符仅检查每个元素的最低有效字节(以delphi 32位为单位). 检查此样本 i:=257; Writeln( 1 in [i]); 返回true,因为257的低字节为1. 在Delphi 64位中,大于255的值被删除.所以这段代码 i:=257; Writeln( 1 in [i]); 将返回false,因为相当于 Writeln( 1 in []); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |