ファイルからデータを読み取り、それを配列に格納する Delphi アプリケーションがあります。ファイルの各行には、アドレス、lineTypeIndicator、およびデータが含まれています。これはアルゴリズムです(重要だと思われるコードが含まれています):
AssignFile(inputFile, inFileName);
Reset(inputFile);
while not EOF(inputFile) do
begin
Readln(inputFile,fileLineBuffer);
if Copy(fileLineBuffer, 8, 2) = '01' then //Never managed to catch the error here
begin
break;
end;
//extract the address from the line and use it to determine max and min address.
end;
//Now that you have min and max address, use it to set the length of an char array
SetLength(memoryArray,(lastAddress - firstAddress) * 2);
Reset(inputFile);
while not EOF(inputFile) do
begin
Readln(inputFile,fileLineBuffer);
if Copy(fileLineBuffer, 8, 2) = '01' then //I caught all the errors here
begin
break;
end;
//extract the address and data from the fileLineBuffer and place it in the corresponding place in an array
end;
このコードは、ユーザーがフォーム上の対応するボタンをクリックするたびに実行されます。最初の数回は実行されますが、数回実行すると次のようになります。
MyProgram.exe が次のメッセージで失敗しました: '0x00406111 でのアクセス違反: アドレス 0x00090d1c の書き込み (これはさまざまです)。プロセスが停止しました。step または run を使用して続行します。
私には、これはある種のヒープ オーバーフローのようなにおいがします。交換してみた
if Copy(fileLineBuffer, 8, 2) = '01' then
と
lineTypeBuffer := Copy(fileLineBuffer, 8, 2);
if lineTypeBuffer = '01' then
また
if (fileLineBuffer[8] = '0') and (fileLineBuffer[9] = '1') then
しかし、それは役に立ちませんでした。この問題にどのように取り組むべきかについて何か提案はありますか?
PS Win7 32 ビットと Win7 64 ビットで実行してみました - 違いはありません PPS 長い質問で申し訳ありません。