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

delphi – 如何调整为WINx86编译的代码以便为WINx64编译

发布时间:2020-12-15 09:42:14 所属栏目:大数据 来源:网络整理
导读:我正在使用Component Tag(NativeInt)值的赋值将其添加到字节集中.该程序在为WIN32编译时工作正常,但不为WINx64编译. (错误2001需要序数类型) 这是一个MCVE: program Project1;{$APPTYPE CONSOLE}{$R *.res}uses System.SysUtils,System.Classes; var S:set
我正在使用Component Tag(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编译?

解决方法

标签是NativeInt.这是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存储,它的名字没有给出其内容的指示,当多方试图使用它时,很容易发生碰撞.

(编辑:李大同)

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

    推荐文章
      热点阅读