-

What Went Wrong

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

何が悪かったか

コンパイラはいろいろなエラーメッセージを出します。そのほとんどはソースコード(様々な種類のシンタックスエラーなど)のエラーですが、いくつかは制限、特にメモリに関するものです。

メモリ制限の影響を最も受ける2つのパスはコード生成と最適化です。コード生成はダイナミックメモリが不足すると"No room"のメッセージを出します。これは普通はエラーメッセージの出た行をシンプル化することで克服できます。


エクスプレッション(式)が複雑化すればするほど、それをツリー表現し、蓄えておくメモリが必要になります。プログラム内で使われるシンボル数を減らすことも役に立ちます。

このエラーは"Can't generate code for this expression"という、コードジェネレータが取り扱うには式が何らかの理由で複雑すぎるメッセージとは別物だということに注意してください。


このメッセージはあまり出くわすことはなく、何らかの形でエクスプレッション(式)を変更することで克服できます。仲介して計算する値は一時的な変数にする、などです。

オプティマイザはアセンブラコードの関数全体を一度にメモリへ読み込みます。とても大きな関数は収まらずに、"Optim: out of memory in _func"というエラーメッセージを出します。funcは対応した関数名が入ります。

この場合、関数を小さな関数に小分けにしなければいけません。これは数百行のCソースコードで発生します。良いコーディングでは、関数をどれも50行以内に小さくします。


パスが"Error closing file"や"Write error on file"などのメッセージを出して終了した時は、大抵の場合、現在のディスクに十分な空きがありません。


もし、Wordstarのようなワードプロセッサエディタを使用する場合は、"non-document"モードかそれに類するモードを使うように気をつけてください。編集されたファイルにはハイビットセットの??文字が含まれず、行末でのラインフィードが存在する必要があります。行は255文字を超えてはいけません。

不動小数点を使う場合には、不動小数点ライブラリが検索されるように、コマンドラインの「末尾で」-LFフラグを使う必要があります。これは不動小数点版のprintfやscanfが、特定の不動小数点ルーチンと同様に読み込ませるためです。不動小数点でない版のprintfは、%fのような不動小数点フォーマットとともに使われる場合、単純に文字fを出力します。

もし、リンカがあるシンボルに対して全く分からない"Undefined symbol"というメッセージを出した場合、ライブラリの誤った順序により、ライブラリ検索時に見つからなかったライブラリルーチンである可能性があります。

この場合、二回ライブラリを検索して、標準ライブラリ用にCコマンドライン末尾に-LCを付加するか、不動小数点ライブラリ用に-LFを付加するかしてください。もし、ライブラリを名前で指定した場合、単純に名前を繰り返します??