加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在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运算符的代码问题.

编译器引发此错误

E2010 Incompatible types: ‘Integer’ and ‘Int64’

我写了这个示例应用程序来复制问题.

{$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 []);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读