gpt4 book ai didi

delphi - 如何调整为 WINx86 编写的代码以编译为 WINx64

转载 作者:行者123 更新时间:2023-12-03 15:17:04 32 4
gpt4 key购买 nike

我正在使用组件标记(NativeInt)值的分配,将其添加到字节集中。该程序在针对 WIN32 进行编译时可以正常工作,但无法针对 WINx64 进行编译。 (需要错误 2001 序数类型)这是一个 MCVE:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, System.Classes;
var
S:set of byte;
C:TComponent;

begin
C:=TComponent.Create(nil);
C.Tag:=1;
s:=[C.Tag];
C.Free;
end.

如何调整代码使其适合WINx64编译?

最佳答案

TagNativeInt。即 x86 中为 32 位,x64 中为 64 位。据我了解,32 位整数被视为序数,而 64 位整数则不是序数。我认为这就是编译器错误的原因,尽管我不能告诉你为什么 Integer 被认为是序数类型,而 Int64 不是。如果我不得不猜测,我想这与 Int64 不适合 x86 上的寄存器这一事实有关,因此与 1、2 和 相比,编译器需要进行完全不同的处理4 字节序数类型。

由于您可能不想要改变大小的东西,我希望您可以将其转换为Integer:

s := [Integer(C.Tag)];

而且由于您只使用低 8 位,因此您可能应该将其转换为 Byte:

s := [Byte(C.Tag)];

最好断言您在范围内:

Assert((C.Tag >= low(Byte)) and (C.Tag <= high(Byte)))

坦率地说,在我看来,您最好完全避免 Tag。将数据存储在专用于该任务的变量中,并使用您可以选择的类型。作为一般规则,在我看来,Tag 是您应该避免使用的东西。它不是类型安全的,除非您碰巧有一个 NatoiveInt 来存储,它的名称没有给出其内容的指示,并且当多方尝试使用它时很容易发生冲突。

关于delphi - 如何调整为 WINx86 编写的代码以编译为 WINx64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423078/

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