• ベストアンサー

Out Of Near Heap Space?

宜しくお願いします。Quick C(MsDos上)でプログラムしています。1300行くらいのものですが、コンパイル時に「Out Of Near Heap Space」とエラーが出るようになりました。マニュアルにも対策が書いてありません。原因が分かりません。どなたか教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

コンパイラによって対応の方法が違うとは思うんですけど… 昔、私がシンボルテーブルでハマった時の対応は ・グローバル変数をとにかく減らす すべてのグローバル変数を1つの構造体にまとめて、グローバル変数は構造体変数一つにしました。 コンパイラによって無意味かもしれませんが、私の使っていたコンパイラは構文解析段階で構造体メンバをオフセット参照していたのでオッケーでした。 構文解析段階でシンボルテーブルを使って、コードジェネレーションでオフセットに変換するタイプのコンパイラではだめかもしれません。 ・プリプロセスを先にかけてしまう プリプロセッサと構文解析を段階的にではなく、一気にやってしまうタイプのコンパイラではdefineシンボル用のシンボルテーブルとその他のシンボルテーブルが混在するため、メモリをたくさん使います。 プリプロセッサを先にかけてしまうことでdefineシンボル用のシンボルテーブルを分離します。 Jhonson-Cみたいに元々プロプロセッサと構文解析が分離しているコンパイラでは無意味です。 私がメモリ不足を経験したコンパイラは MS-DOS用のLattice-C MS-DOS用のMS-C Flex-OS(コンカレントCP/Mの拡張OS)用のHi-Tech C 初期バージョンのMS-CはLattice-CのOEMだったので実質同じモノだったのかもしれません。 あるバージョンまでのQuick CはMS-Cのサブセットだったので効果あるかも?

toko703
質問者

お礼

ご教示有難う御座います。Quick Cに添付のサンプルソフトで外部変数をかなり使っている物が無事コンパイルできたのでやはり、自分のエラーのような気がします。 最後の説明の所は自分はアマチュアなんで意味が分かりませんでした。「プリプロセッサを一気に掛ける」の意を平易に教えて頂けないでしょうか?また、spwan系の関数を使い別モジュール間でのデータの送受信は出来ないでしょうか?なんとか頑張ってみます。有難う御座いました。 また、何か御座いましたらお教え下さい。

toko703
質問者

補足

有難う御座いました。if()の中の条件が多すぎてのエラーでした。条件を小分けして関数にしたらOKでした。 文法としてif()の条件の数に制限が有ったのでしょうか? どうしても完成させたいソフトだったので大変助かりました。本当に有難う御座いました。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

コンパイルエラーではなくてコンパイラ自身がエラーを起こしているのでは? コンパイラのシンボルテーブルがあふれたときに見られるエラーだったような記憶があります。 グローバル変数やdefineマクロが多すぎる時にシンボルテーブルがあふれます。

toko703
質問者

お礼

早速のRES有難う御座います。自分はプログラムが下手なので今回グローバル変数を多用してます。例えば関数を分けて別個に作っておきexec()などで呼び出す方法は無いのでしょうか?最初から作り直すのは大変なので非合法な方法でも何か対策があれば御教示ください。 宜しくお願いします。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

「ヒープ」と呼ばれるメモリの領域を使い切ってしまったかもしれません。 数十キロバイトのメモリを確保してないでしょうか? あるいは使う文字列が多すぎたり。 マニュアルに「メモリモデル」か「スモールモデル」か 「ラージモデル」の言葉がないか探してみてください。 「メモリモデル」を「ラージモデル」にすれば動くのではないかと思います。 Turbo C++では、-mlというオプションをつければよかったのですが…。

toko703
質問者

お礼

早速のご回答有難う御座います。自分の場合下記の様な配列を使ってます。 typdef struct {float の変数8ヶ}LINE; LINE work[50];LINE of[50];これで結構メモリ取られるのでしょうか?それにグローバル変数を多用してます。 ご指摘通りラージやヒュ-ジにもしましたが、エラーはでます。LINE far work[50];とすれば良いのでしょうか? Turbo CでもQuick Cと同様のグラフィックが使えるのでしょうか?今時DOSを話題にするのも恥ずかしい気がしますが、 何か情報がありましたら、お教えください。失礼します。

関連するQ&A