使用 Win32 编译 - 正常但使用 Win64 - 编译器错误 E2064
Compile With Win32- Ok But With Win64- Compiler Error E2064
以下代码使用 Win32 编译,但在使用 Win64 编译时产生 Delphi 编译器错误 E2064 left side cannot be assigned to。
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 的编译器错误?
在 Win64 上,指针是 64 位宽,Integer
是 32 位宽。这样的转换要求赋值表达式的两边大小相同。因此错误。
而不是转换为 Integer
转换为 PByte
。
Inc(PByte(iRGBArray), SFill);
你所有其他 Integer
演员都是错误的。您必须掌握这些类型的不同大小。您可以转换为 NativeInt
来解决它们。
以下代码使用 Win32 编译,但在使用 Win64 编译时产生 Delphi 编译器错误 E2064 left side cannot be assigned to。
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 的编译器错误?
在 Win64 上,指针是 64 位宽,Integer
是 32 位宽。这样的转换要求赋值表达式的两边大小相同。因此错误。
而不是转换为 Integer
转换为 PByte
。
Inc(PByte(iRGBArray), SFill);
你所有其他 Integer
演员都是错误的。您必须掌握这些类型的不同大小。您可以转换为 NativeInt
来解决它们。