gpt4 book ai didi

delphi - Delphi 64 位项目中的 in 运算符问题

转载 作者:行者123 更新时间:2023-12-03 14:57:15 26 4
gpt4 key购买 nike

我正在将 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

更新

检查 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 []); 

关于delphi - Delphi 64 位项目中的 in 运算符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com