Delphi 使用Win32编译-正常,但使用Win32-编译器错误E2064

Delphi 使用Win32编译-正常,但使用Win32-编译器错误E2064,delphi,delphi-10-seattle,Delphi,Delphi 10 Seattle,以下代码使用Win32进行编译,但在使用Win32进行编译时会产生Delphi编译器错误E2064左侧无法指定 type PRGB24 = ^TRGB24; TRGB24 = record B, G, R: Byte; end; PRGBArray = ^TRGBArray; TRGBArray = array [Word] of TRGB24; procedure TFormCurves.ApplyCurve(Src: TIEBitmap); var iR

以下代码使用Win32进行编译,但在使用Win32进行编译时会产生Delphi编译器错误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消除编译器错误?

在Win64上,指针是64位宽,整数是32位宽。这样的强制转换要求赋值表达式的两侧大小相同。因此出现了错误

而不是强制转换为
Integer
强制转换为
PByte

 Inc(PByte(iRGBArray), SFill);    

您的所有其他
Integer
强制转换都是错误的。你必须掌握这些类型的不同大小。您可以强制转换到
NativeInt
来解决这些问题

在Win64上,指针是64位宽,
整数是32位宽。这样的强制转换要求赋值表达式的两侧大小相同。因此出现了错误

而不是强制转换为
Integer
强制转换为
PByte

 Inc(PByte(iRGBArray), SFill);    

您的所有其他
Integer
强制转换都是错误的。你必须掌握这些类型的不同大小。您可以强制转换到
NativeInt
来解决这些问题

这修复了编译错误,但现在我得到了Win64的运行时异常,带有PRGBArray(sDst)[X]:=C;Win32没有运行时错误。有什么想法吗?如果有必要,我是否应该在另一个问题中发布程序?该代码不在问题中。你真的想听听我对我看不见的代码的看法吗?好的。。我将针对修复了编译错误的运行时问题发布问题,但现在我得到了带有PRGBArray(sDst)[X]:=C的Win64运行时异常;Win32没有运行时错误。有什么想法吗?如果有必要,我是否应该在另一个问题中发布程序?该代码不在问题中。你真的想听听我对我看不见的代码的看法吗?好的。。我将针对我的运行时问题发布问题