内部エラーを解決する(Delphi)
操作手順:デバッガを使用する への移動
「内部エラー: X1234
」というエラー メッセージは、コンパイラが、構文エラー以外で、正しく処理できない状況を検出したことを示します。
ヒント: 内部エラーの番号は、コンパイラでエラーが発生した場所のファイルと行番号を示しています。この情報は、テクニカル サポート サービスが問題を追跡する際に役立つものです。この情報を記録し、内部エラーの説明に添えてお知らせください。
目次
内部エラーを解決する
- エディタでコードを変更した直後にエラーが発生したのであれば、変更を行った箇所に戻って変更内容をメモします。
- 変更を元に戻すかコメントにすることでアプリケーションの再コンパイルが成功するなら、導入したプログラミング構造がコンパイラで問題とされている可能性があります。その場合には、次の手順に従ってコードを確認します。
まだ問題が残っている場合
- プロジェクトに関連付けられている
.dcu
ファイルをすべて削除します。 - [ファイル|すべて閉じる]を使ってプロジェクトを完全に閉じます。
- プロジェクトを開き直します。これにより、IDE が保持していたユニット キャッシュが消去されます。あるいは、IDE を閉じてから再起動しても構いません。
- [プロジェクト|<プロジェクト名> を再構築]オプションを使ってアプリケーションを再コンパイルし、コンパイラにすべての .dcu ファイルを再生成させるという方法もあります。
- それでもエラーが残っている場合は、IDE を終了し、コマンド プロンプトでコンパイラのコマンドライン版(
dccil.exe
)を使ってアプリケーションをコンパイルしてみます。これによって IDE のユニット キャッシュが削除され、問題を解決できる可能性があります。
最後に変更した箇所のコードのレビュー
- まだ問題が残っている場合には、ファイルを最後に変更した箇所に戻り、コードを確認します。
通常、ほとんどの内部エラーは、ほんの数行のコードが原因で発生します。また多くの場合、そのコードは例外的または想定外の構文や構造を含んでいます。その場合には、異なる方法で同じ処理を行うよう、コードを変更してみます。たとえば、値の型キャストを行っている場合には、キャスト型の変数を宣言し、最初に代入を行います。
begin if Integer(b) = 100 then... end; var a: Integer; begin a := b; if a = 100 then... end;
- 次に示すのは想定外のコードの例です。このエラーは修正して解決することができます。
var A : Integer; begin { Below the second cast of A to Int64 is unnecessary; removing it can avoid the Internal Error. } if Int64(Int64(A))=0 then end;
-
ここでは、
A
をInt64
に変換している 2 番目のキャストが不要で、これを削除することでエラーを修正できます。問題がwhile...do
ループにあると思われる場合には、代わりにfor...do
ループを使用してみます。これで実際に問題が解決するわけではありませんが、アプリケーションの作業を続行できる可能性があります。これで問題が解決したとしても、それはwhile
ループやfor
ループに問題があるという意味ではありません。おそらくは、コードを書いた方法が想定外だったということでしょう。 - 問題を特定できたら、エラーを再現できる最小のテスト ケースを作成し、Embarcadero にお送りくださるようお願いします。
内部エラーを解決するその他の方法:
- エラーが
while...do
ループ内のコードにあると思われる場合には代わりに for...do ループを使用したり、その逆を試してみます。 - ネストした関数や手続き(手続き/関数内に含まれる手続き/関数)を使用している場合には、ネストをやめてみます。
- 型キャストで発生している場合には、必要な型のローカル変数を使用するなど、型キャストの代わりとなる方法を探します。
- 問題が
with
文で発生している場合には、with
文を完全に削除してみます。
- [プロジェクト|オプション...|Delphi コンパイラ|コンパイル] でコンパイラの最適化をオフにしてみます。
どの方法でも解決しない場合
- 通常、どのようなコードも複数の異なる方法で記述することができます。コードを変更して内部エラーを解決できるか試してください。最善の方法ではないかもしれませんが、アプリケーションの作業を続行できる可能性があります。これで問題が解決したとしても、それは
while
ループやfor
ループに問題があるという意味ではありません。おそらくは、コードを書いた方法が想定外だったためにエラーが発生したということでしょう。 - コンパイラの最新リリースでコードをコンパイルしても問題が再現される場合は、エラーを再現できる最小のテスト ケースを作成し、Embarcadero にお送りください。最新版で再現されないなら、問題は既に修正されている可能性があります。
IDE の構成によって内部エラーを回避する方法
- 1 つのディレクトリを作成し、そこにすべての
.dcp
ファイル(プリコンパイル済みパッケージ ファイル)を置きます。たとえば、C:\DCP
というディレクトリを作成し、[ツール|オプション...|環境オプション]の下の[ライブラリ]ページで[DCP 出力ディレクトリ]をC:\DCP
に設定します。このように設定すると、コンパイラが生成した.dcp
ファイルが必ず最新であることを保証できます。これは、パッケージを別のディレクトリに移動する場合に便利です。プロジェクトごとの.dcu
ディレクトリは、[プロジェクト|オプション...|Delphi コンパイラ|ユニットの出力ディレクトリ]を使用して作成することができます。 - 重要なのは、最新版の
.dcu
ファイルおよび.dcp
ファイルを使用することです。そうでなければ、簡単に回避できるはずの内部エラーが発生する可能性があります。