64位XE2中的Integer()

hik*_*ari 3 delphi 64-bit delphi-xe2

在XE2的64位平台上,这怎么会是正确的?

type
  PRGB24 = ^TRGB24;
  TRGB24 = packed record
    B: Byte;
    G: Byte;
    R: Byte;
  end;

var
  s1: pRGB24;
  ptrD: integer;

....

inc(Integer(s1), PtrD); <- gives error here "Left side cannot be assigned to"
Run Code Online (Sandbox Code Playgroud)

klu*_*udg 5

整数类型为32位长,指针类型在64位平台上为64位长,因此出错.我现在无法测试,但是

inc(NativeInt(s1), PtrD);
Run Code Online (Sandbox Code Playgroud)

应该解决问题.


BTW:Inc过程可以接受指针,所以通常不需要在这里将指针转换为整数.通过以下方式可以获得相同的结果

inc(PByte(s1), PtrD);
Run Code Online (Sandbox Code Playgroud)

完全避免s1铸造甚至更好

inc(s1, PtrD);
Run Code Online (Sandbox Code Playgroud)

但它改变了代码的含义 - 它的等价物是

inc(PByte(s1), PtrD * SizeOf(TRGB24 ));
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 5

虽然NativeInt将完成工作,我宁愿把它投射到PByte:

inc(PByte(s1), PtrD);
Run Code Online (Sandbox Code Playgroud)

既然s1是一个指针,那么转换为另一个指针更自然 - 现在或将来不可能存在指针宽度错误.