2011-10-08 35 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是一個指針,所以轉換爲另一個指針更自然 - 現在或將來都不可能存在指針寬度錯誤。