Delphi编译器错误E2064左侧无法分配

Eri*_*ric 4 delphi unicode c++builder delphi-xe

我继承了一个Delphi应用程序,我对object pascal一无所知.

这是我需要编译到新版本的C++ Builder XE中的BPL.
当我运行make时,我得到错误:

E2064左侧无法分配.

我已经学会了足够多的obj pascal知道我有一个试图被赋值的常量.

但是,显然,你可以克服这种行为; 通过进入Delphi编译器下的Build选项并打开"Assignable Typed constants",实质上将常量转换为vars.

我这样做了,我继续得到同样的错误.

我尝试用{$ J +}和{$ J-}​​包围我的代码,但仍然无法编译.

procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte;
  Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar );
var
  Col: Integer;
 begin
 {Get first column and enter in loop}
 Col := ColumnStart[Pass];
 Dest := pChar(Longint(Dest) + Col * 3);
 repeat
 {Copy this row}

  Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
Run Code Online (Sandbox Code Playgroud)

在最后一行获取错误.如果我将const更改为var,那么我会得到声明与前一个声明不同但我不知道前一个声明在哪里的错误....

Rob*_*edy 8

你将一个双字节的东西(Char)打包成一个单字节的东西(Byte).读取该值很容易定义,但是使该值可写是很棘手的,可能出于同样的原因,正式和实际"var"参数的类型必须相同.

也许你想把它输入到一个两字节的东西,比如Word.或许你想GammaTable成为一个阵列,Char所以你根本不需要打字.或者,如果此代码最初是为2009年之前的Delphi版本编写的,那么您希望这些PChar声明是PAnsiChar- 字符类型变得更广泛.另一种选择是类型转换DestPByte,并随后取消引用的结果.不过,这可能是一个坏主意,因为你只会覆盖缓冲区的每个其他字节.

根据函数的名称,听起来似乎PChar从来没有使用过正确的数据类型.该类型用于字符数据,但我认为此代码处理字节.正确的做法可能是PChar改为PByte,然后你根本不需要打字Dest.

$J指令无关紧要; 它控制编译器是否允许您为键入的常量赋值.您没有此代码中的任何内容.