2011-10-08 31 views
3

在XE2中的64位平台上,这将如何正确?64位XE2中的Integer()

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" 

回答

5

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

inc(NativeInt(s1), PtrD); 

应该解决这个问题。


BTW:Inc过程可以接受的指针,因此通常没有必要投指针到这里整数。同样的结果可以通过

inc(PByte(s1), PtrD); 

获得为了避免s1铸造不惜一切,甚至更好

inc(s1, PtrD); 

,但它改变了代码的含义 - 它相当于是

inc(PByte(s1), PtrD * SizeOf(TRGB24)); 
+0

工作,谢谢! – hikari

+1

inc确实接受指针,但当然意义发生了变化。所以我会说你总是避免投射整数,但要小心。 –

5

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

inc(PByte(s1), PtrD); 

由于s1是一个指针,所以转换为另一个指针更自然 - 现在或将来都不可能存在指针宽度错误。