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)
整数类型为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)
虽然NativeInt将完成工作,我宁愿把它投射到PByte:
inc(PByte(s1), PtrD);
Run Code Online (Sandbox Code Playgroud)
既然s1是一个指针,那么转换为另一个指针更自然 - 现在或将来不可能存在指针宽度错误.