2

以下のコード スニペットは、最近の ISO イメージ ファイルから最近再インストールした Delphi XE2 のテキスト IO および UInt64 型変数で発生している問題を示しています。Text.ReadUInt64 関数またはプロシージャが見つからないことに関連するエラー メッセージが表示され、コンパイルが失敗します。失敗した行を次のように置き換えると

  ReadLn(F,A);

その後、プログラムはコンパイルされ、正しく書き込まれます

-1
18446744073709551615

その後、(予想どおり) 2 回目の読み取りで EInOutError: "Invalid Numeric Input" で失敗します。インストールが破損していますか、それとも誰かが ReadUInt64 関数の記述に失敗しましたか? ヘルプで見つけることができる ReadUInt64 への唯一の参照は、次の定義です。

function ReadUInt64: UInt64; virtual;

System.Classes.TBinaryReader.ReadUInt64 で。これが「同じ」機能なのかどうかはわかりませんが、もしそうなら、なぜそれが仮想なのですか...

UInt64 へのヘルプの参照にも少し混乱しています。それは次のように定義されています。

type UInt64 = Int64;

これが正しい場合、コンパイラは UInt64 を Int64 変数とは異なる方法で扱うことをどのように認識しますか?

procedure TForm1.Button1Click(Sender: TObject);
var
  F : TextFile;
  A : Int64;
  B : Uint64;
begin
{
Compiler warns on following line with message:
[DCC Warning] Unit1.pas(32): W1012 Constant expression violates subrange bounds
}
  A := $FFFFFFFFFFFFFFFF;
  B := $FFFFFFFFFFFFFFFF;
  AssignFile(F,'test.txt');
  ReWrite(F);
  Writeln(F,A);
  Writeln(F,B);
  CloseFile(F);
  AssignFile(F,'test.txt');
  ReSet(F);
  ReadLn(F,A);
{
Fails to compile on following line with message:
[DCC Fatal Error] Unit1.pas(42): E2158 System unit out of date or corrupted: missing 'Text.ReadUInt64'
}
  ReadLn(F,B);
  CloseFile(F);
end;
4

1 に答える 1

5

QC102876を参照してください。これは既知のバグであり、次のように報告されText.ReadUInt64 missingます。

コンパイラは、UInt64をストリームから読み取る必要がある場合に、Text.ReadUInt64への呼び出しを生成します。ただし、リンカはText.ReadUInt64が欠落していると文句を言います。

QCによると、この問題(バグ)はXE3(ビルド#17.0.4625.53395)で解決されています。

于 2013-03-19T22:06:41.400 に答える