4

Delphi アプリケーションを継承しましたが、オブジェクト パスカルについては何も知りません。

これは、新しいバージョンの C++ Builder XE にコンパイルする必要がある BPL です
make を実行すると、次のエラーが表示されます。

E2064左側は割付けできません。

値を割り当てようとしている定数があることを知るのに十分な obj pascal を学習しました。

しかし、どうやら、この動作をオーバーライドすることができます。基本的に、Delphi コンパイラのビルド オプションに移動し、「割り当て可能な型付き定数」をオンにすることで、定数を var に変換します。

私はそれをしましたが、同じエラーが引き続き発生します。

コードを {$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 に変更すると、宣言が前の宣言と異なるというエラーが表示されますが、前の宣言がどこにあるかわかりません....

4

3 に答える 3

9

Char2バイトのもの( )を1バイトのもの()に型キャストしていますByteその値を読み取ることは簡単に定義できますが、その値を書き込み可能にするのは難しいです。おそらく同じ理由で、正式な「var」パラメーターと実際の「var」パラメーターのタイプを同一にする必要があります。

たぶん、それを.などの2バイトのものに型キャストしたいと思うでしょうWordGammaTableまたは、配列になりたいCharので、型キャストする必要はまったくありません。あるいは、このコードが元々2009年より前のDelphiバージョン用に作成されていた場合は、それらのPChar宣言を作成する必要がありますPAnsiChar—文字タイプが広くなりました。もう1つのオプションは、に型キャストDestしてからPByte、結果逆参照することです。ただし、バッファの1バイトおきにしか上書きしないため、これはおそらく悪い考えです。

関数の名前からすると、PChar使用するのに適切なデータ型ではなかったようです。そのタイプは文字データ用ですが、このコードはバイトを扱っていると思います。正しいことは、おそらくに変更PCharするPByteことです。そうすれば、型キャストする必要はまったくありませんDest

$Jディレクティブは関係ありません。コンパイラが型付き定数に値を割り当てることを許可するかどうかを制御します。このコードにはそれらのどれもありません。

于 2010-11-12T03:45:06.343 に答える
2

その理由は、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

于 2010-11-12T06:19:40.687 に答える
1

Gustavo Daud の TPngImage ライブラリを使用しているようです。D2009 以降 RTL に含まれているため、外部 BPL にそのコードは必要ありません。そのユニットを BPL から削除すると、ユニットを介して更新されたバージョンを入手できるはずですPngImage

于 2010-11-12T05:05:32.067 に答える