2016-05-15 69 views
0

下面的代碼用Win32編譯,但是產生Delphi編譯器錯誤E2064左側用Win64編譯時無法分配。用Win32編譯好,但用Win64-編譯器出錯E2064

type 
    PRGB24 = ^TRGB24; 

    TRGB24 = record 
    B, G, R: Byte; 
    end; 

    PRGBArray = ^TRGBArray; 
    TRGBArray = array [Word] of TRGB24; 

procedure TFormCurves.ApplyCurve(Src: TIEBitmap); 
var 
    iRGBArray: PRGBArray; 
    SFill, X, Y: Integer; 
begin 
    if not AImageLoaded then 
    Exit; 
    iRGBArray := PRGBArray(Src.Scanline[0]); 
    SFill := Integer(Src.Scanline[1]) - Integer(iRGBArray); 
    for Y := 0 to Src.Height - 1 do 
    begin 
    for X := 0 to Src.Width - 1 do 
    begin 
     iRGBArray[X].R := ALUT[0, ALUT[1, iRGBArray[X].R]]; 
     iRGBArray[X].G := ALUT[0, ALUT[2, iRGBArray[X].G]]; 
     iRGBArray[X].B := ALUT[0, ALUT[3, iRGBArray[X].B]]; 
    end; 
    Inc(Integer(iRGBArray), SFill);//compiler error E2064 left side cannot be assigned to 
    end; 
end; 

procedure TFormCurves.GetHist; 
var 
    iRGBArray: PRGBArray; 
    X, Y, SFill: Integer; 
    iIEBitmap: TIEBitmap; 
    iRGB: TRGB24; 
    R, G, B, l: Byte; 
begin 
    if not AImageLoaded then 
    Exit; 
    for Y := 0 to 3 do 
    begin 
    AMaxHistory[Y] := 0; 
    for X := 0 to 255 do 
     AHistory[Y, X] := 0; 
    end; 
    iIEBitmap := imgView.IEBitmap; 
    iRGBArray := PRGBArray(iIEBitmap.Scanline[0]); 
    SFill := Integer(iIEBitmap.Scanline[1]) - Integer(iRGBArray); 
    for Y := 0 to iIEBitmap.Height - 1 do 
    begin 
    for X := 0 to iIEBitmap.Width - 1 do 
    begin 
     iRGB := iRGBArray[X]; 
     R := iRGB.R; 
     G := iRGB.G; 
     B := iRGB.B; 
     l := (R + G + B) div 3; 
     AHistory[0, l] := AHistory[0, l] + 1; 
     AHistory[1, R] := AHistory[1, R] + 1; 
     AHistory[2, G] := AHistory[2, G] + 1; 
     AHistory[3, B] := AHistory[3, B] + 1; 
    end; 
    Inc(Integer(iRGBArray), SFill); //compiler error E2064 left side cannot be assigned to 
    end; 
    for Y := 0 to 3 do 
    for X := 0 to 255 do 
     if AHistory[Y, X] > AMaxHistory[Y] then 
     AMaxHistory[Y] := AHistory[Y, X]; 
end; 

我怎樣才能消除與Win64的編譯器錯誤?

回答

2

在Win64上,指針是64位寬,Integer是32位寬。這種轉換需要賦值表達式的兩邊是相同的大小。因此錯誤。

而不是鑄造到Integer鑄造PByte

Inc(PByte(iRGBArray), SFill);  

您所有的其他Integer劇組錯誤。你必須掌握這些類型的不同大小。您可以投到NativeInt來解決它們。

+0

修正了編譯錯誤,但現在我得到與Win64的運行時異常與PRGBArray(sDst)[X]:= C; Win32沒有運行時錯誤。有任何想法嗎?如果有必要,我應該在另一個問題中發佈過程? – Bill

+0

該代碼不在問題中。你真的想要我的代碼我看不到? –

+0

好的..我會爲我的運行時問題發佈問題 – Bill