• ベストアンサー

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

  • HEAP に関すること

    HEAP CORRUTOPN DETECTED: AFTER Normal block(c# 179) at 0x003EA6D0 CRT detected that the application wrote to memory after end of heap buffer; というエラーがでたのですが、最後の二行を訳すと、 ヒープ領域が終わったあとにアプリケーションがメモリーに書き込んだ のをCRTが発見したということになると思うのですけど、 これは、ヒープを使い切ったということになるのでしょうか? それとも、本来上書きしてはならないヒープの部分に上書きしたことに なるのでしょうか? ネットで今調べているのですがなかなか結論が出せなくて。

  • Out of memory?

    JavaScriptでちょっとしたプログラムを書いているのですが、HTMLに組み込んでビルド(実行)してみると、「Out of memory at line:384」というエラーが出てしまいました。 因みに384行目には、変数に空白を代入するプログラム(?)が書いてありました。 変数が多すぎるのですかね?384行目までに出てくるのは40個程度で、全体でも50個程度なのですが。 多分、メモリが足らないと言っているのだと思うのですが、原因が分からないのでどうやったら改善できるのか分かりません。 分かる方おられたら、よろしくお願いします。

  • DOS環境でコンパイルするとヒープメモリ不足エラー

    DOS環境(WindowsXP上)でC言語をコンパイルすると、 ヒープメモリ不足エラー”Fatal Error C1060 compiler is out of heap space”になって、コンパイルできません。 一時対策として、system32フォルダにある”CONFIG.NT”や”AUTOEXEC.NT”に記載されているDOS環境のデバイスドライバのメモリ割り当て(devicehigh等)を無効化して、ヒープメモリ領域を確保してやり過ごしています。 ただ、今後プログラムサイズが大きくなっていくと、またメモリが不足してコンパイルできなくなりそうです。 DOS環境(WindowsXP上)で任意のヒープメモリサイズを確保するような方法はないのでしょうか? ご存知の方いらっしゃいましたら、お願いします。

  • コンパイル時に「out of memory」とでます。

    C言語でソースを書いてコンパイルすると「rpg.c 13: out of memory」と表示されてコンパイルできません。どうしたらいいのでしょうか。

  • 前置詞 out of について

    out of の用法について質問があります。 She stayed gentle out of kindness. は文法的にも意味合い的にもまちがっていませんよね? "out of A"の意味として「(原因・動機を表して)…から、…のため」を採用すれば 「(例えば、普通であれば怒ってしまうような状況下において)親切心から彼女は優しいままでいました。」 と和訳できますよね? 某掲示板に「S + V + C + out of A なんつー文はそもそも文法的に破綻している、まずありえない」などという書き込みがありまして、たぶんこの主張は間違っていると思うのですが、確認のため質問させていただきました。 ご回答よろしくお願いします。

  • コンパイル時に a.out と入力するとエラーが出てしまいます。

    コンパイル時に a.out と入力するとエラーが出てしまいます。 テキストファイルを複数 (最大で255個) 書き込むC言語のプログラム「f.c」を作成しまして それらのファイルは全て cygwin/home という場所に保存されます。 ただ、ファイルの中身は多くの文字が並ぶので(最大 500列 × 70000行 程度) 全てのファイルを書き込むには時間がかかりすぎてしまいます。 a.out を使って プログラム内にある scanf("a=", &a); scanf("b=", &b); これらの変数 a,b を出力し 実行結果で書き込まれるファイルを データとして出力する方法が知りたいのですが (この方法をバッチ処理というのでしょうか?) $ cc f.c (← 実行結果の際のコンパイル) その次に a.out と入力するとエラーが起きます。 a.out の使い方や意味を調べてもいまいち理解し難く困っております。 さきほど言った scanf で値を決める a,b を プログラム内で決めるのではなく a.out a b と入力してデータを出力させるには どのようにすればよいのでしょうか? なぜエラーしてしまうのかも教えて頂けないでしょうか? 長々と質問してしまいすみません。 どうか ご回答 よろしくお願いします。

  • コメントアウトされたエスケープシーケンスについて

    Java初心者です。 コメントアウトされた中のエスケープシーケンスの使い方について質問があります。 class sample{ public static void main(String args[]){ System.out.println("16進数 :\u0001") // System.out.println("16真数 :\ugggg") } } 上記のようなソースコードがあった場合、 System.out.println("16進数 :\u0001") については、当然Unicodeの16進数範囲内なので、 コンパイルエラーにならないのですが、 コメントアウトされている行 // System.out.println("16真数 :\ugggg") については、 コンパイルエラーになります。 エラーメッセージは「エスケープシーケンスが不正です。」 コメントアウトされているので、この行は無視されるものだと思っていたのですが、コンパイルエラーになるのは何故でしょうか。 どうかご教授願います。

  • a.outはどこへ?

    WindowsでCのプログラミングを始めたばかりです。 環境はcygwinを使っているのですが、gccでコンパイルしてもa.outファイルが出来ません。 gccのコマンドの後には特にエラーも出ませんし、一見成功しているように見えるのですが、やっぱりa.outが出来ていません。 なぜなのでしょうか?

  • cc? a.out?

    最近、大学のパソコンを使ってプログラムを作ろうと思っているのですがコンパイル、実行の仕方がいまいちわかりません。 geditを使って「Hello!」が表示されるプログラムを書き「Hello.c」と名前を付け保存したまではすんなりいけたのですが、この後どうやってコンパイル、実行したらよいのでしょうか? %cc hello.c./a.out と打ってみたのですが cc; command not found とか a.out:command not found と表示されるだけなんです。実行の仕方がいけないのでしょうか? ちなみに学校ではVineLinux2.1を使っています。

  • 半角スペースの見分け方を教えて下さい。

    初歩的な質問ですいません。 Javaで簡単なプログラムをコーディングしているのですが コンパイルエラーになりどうやら全角スペースが含まれているようです。 ただ、何度やり直してもエラーとなります。 VistaのノートPCを利用していますが半角スペースは文字入力が "A"になっている状態で入力しています。 カーソルで何度確認しても全角文字・全角スペースはないのですが・・ 基本的なことですいません。 何かご説明頂ける方お願いします。

専門家に質問してみよう