dポイントプレゼントキャンペーン実施中!

int a ,b;
int wk[100][100];

for(a = 0 ; a < 100 ; a++){
for(b = 0 ; b < 100 ; b++){
wk[a][b] = 0;
}
}

を行うと、処理がフリーズしてしまいます。
wk[a][b] の行を外すとフリーズは起こらなくなるようです。
printfで中身がどこで止まっているかを調べて見ましたが、
aは0のままで、bは80くらいまでは動いているようです。
コンパイラはlccを使用しています。
原因のわかる方、教えていただけないでしょうか。

A 回答 (6件)

DOSならメモリモデルで扱えるデータの大きさに制限がある場合があります。


昔のCPUやDOSではメモリをセグメント単位で管理していたからですね。

100×100は1万で、これにint型のバイト長を掛けますから、思ったよりもデータサイズは大きいんです。実際にsizeofで配列のデータの大きさを確認して見て下さい。
それに他の変数やスタック領域など、全てのデータ領域の合計が上限の64KBをオーバーしているんじゃないかと思います。(普通はエラーや警告などが出ると思うのだけど?)
それで実行途中でスタックが破壊されて暴走しているのだと推測します。

対処方法としては、一度に大量のメモリを使わない様にプログラムを変えるか、より大きいメモリモデルに変更するかですね。

タイニーモデル:データとコード(プログラム)を合わせて64KB以内
※DOSの実行ファイルの.COMはこのメモリモデルです。
スモールモデル:データは64KB以内、コード64KB以内
ミディアムモデル:データは64KB以内、コード64KB以上
コンパクトモデル:データは64KB以上、コード64KB以内
ラージモデル:データは64KB以上、コード64KB以上

LSI-Cがもしフリーの試食版ならスモールモデルしか使えなかった筈です。

参考URL:http://www.kumei.ne.jp/c_lang/intro/no_56.htm
    • good
    • 0

int wk[100][100];


の前にstatic を付けてみてください。
    • good
    • 0

>原因のわかる方、教えていただけないでしょうか。



マニュアルも解凍しましたよね。

  3.3 データの内部表現
  3.9 スタックの大きさ

  スタックの大きさは、標準ではSモデルとPモデルでは2500バイト、DモデルとLモ
  デルでは 5000 バイトになっています。LSI C-86で作成したプログラムの実行に
  は、最低でもこの大きさのスタックが必要です。

また、 49 ページ

   -kX
    リンカにオプションXを渡します。たとえば、 スタックの大きさを設定
    するにはこのオプションを使い、 以下のようにします。

     lcc foo.c -k'-s 5000'

なども参照し、扱う値が -128 127 の範囲内だったら char に変えるとか、
いろいろ試して下さい。
    • good
    • 0

前の回答に補足します。


質問のようにプログラムすると、配列はスタック領域にローカル変数として確保されます。
確かデフォルトではスタック領域は数KBしか確保していなかったと思います。
スモールモデルのまま動かせるかもしれない方法は、
リンカのオプションで通常よりもスタック領域を大きく確保するように設定するか、
配列をグローバル変数にすれば動くかもしれませんね。
根本的にはDOS時代のLSI-Cを使い続けるよりも、VCなどもっとマシな開発環境を使ったらと思いますけどね。

参考URL:http://hp.vector.co.jp/authors/VA029427/v-lsic2. …
    • good
    • 0

「DOS上」ということだと, この wk を局所変数にしていたら (スタックがあふれて) 動かないかもしれない... かな?



なぜいまどき LSI-C なのか, 理解に苦しむけど.
    • good
    • 0

一口に「lcc」といってもいくつか種類があるようです. あなたはどのようなシステムでどの「lcc」を使っているのですか?

この回答への補足

コンパイラはLSI C-86のもので、
DOS上でコンパイルを行っています。

補足日時:2012/01/10 14:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!