首页 文章

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

提问于
浏览
4

我继承了一个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);

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

3 回答

  • 1

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

    也许你想把它输入到一个两字节的东西,比如 Word . 或者你想 GammaTable 是一个 Char 的数组,所以你根本不需要输入 . 或者,如果此代码最初是为2009年之前的Delphi版本编写的,那么您希望 PChar 声明为 PAnsiChar - 字符类型变得更宽 . 另一种选择是将 Dest 类型转换为 PByte ,然后取消引用结果 . 's probably a bad idea, though, because you'll只会覆盖缓冲区的每个其他字节 .

    根据函数的名称,听起来像 PChar 永远不是正确的数据类型 . 该类型用于字符数据,但我认为此代码处理字节 . 正确的做法是将 PChar 更改为 PByte ,然后根本不需要输入 Dest .

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

  • 1

    这看起来像你're working with Gustavo Daud'的TPngImage库 . 自2009年D2009以来,你没有被包括在RTL中 . 从BPL中删除该单元,您应该能够通过 PngImage 单元获得更新版本 .

  • 8

    原因是,从Delphi 2009开始,Char,PChar和String都是Unicode,并且每个字符存储多个字节 .
    您不应该将这些指针强制转换为字节,如果将赋值的左侧强制转换为字节,编译器会阻止您分配它们 .

    这编译:

    procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pAnsiChar); overload;
    begin
      Byte(Dest^) := Pass;
    end;
    

    这不是:

    procedure CopyInterlacedRGB8(const Pass: Byte; Dest: pChar); overload;
    begin
      Byte(Dest^) := Pass;
    end;
    

    而不是pChar,你应该使用pByte,这使代码更简单:

    procedure CopyInterlacedRGB8(const Pass: Byte; Dest: PByte); overload;
    begin
      Dest^ := Pass;
    end;
    

    --jeroen

相关问题