C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: Segmentation fault


(過去ログ 19 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■7935 / inTopicNo.1)  Segmentation fault
  
□投稿者/ akamatsu (1回)-(2007/09/20(Thu) 11:20:48)

分類:[C/C++] 

2007/09/20(Thu) 11:21:45 編集(投稿者)

C++で4次元配列を作っているのですが、コンパイル時にSegmentation faultと返されます。
4次元配列の各要素数を減らして1桁にすると、エラーが出ないので、要素数が問題だと思われます。
ちなみに要素数は49×5×41×81です。
どこをどう修正すればよいのでしょうか??

引用返信 編集キー/
■7937 / inTopicNo.2)  Re[1]: Segmentation fault
□投稿者/ Blue (346回)-(2007/09/20(Thu) 11:34:28)
char型の場合
49×5×41×81=813645
→およそ814KB

int型(=32ビットの場合)の場合さらに4倍で、およそ3.255MBとなります。

※配列の型が書いていないので実際のところどれぐらいスタックを消費しているか不明。

とりあえず、スタックのメモリをオーバーしてしまっているようなのですが、
対処方もコンパイラを何を使っているのか一切かかれていないようなので解答できません。
引用返信 編集キー/
■7938 / inTopicNo.3)  Re[1]: Segmentation fault
□投稿者/ 774RR (41回)-(2007/09/20(Thu) 11:37:33)
開発環境だの実行環境だのコンパイルオプションだの、その辺の情報がまったく無いので
> 各要素数を減らして1桁にすると、エラーが出ないので
> どこをどう修正すればよいのでしょうか??
ぢゃあ要素数を減らせばいいんぢゃないかな。って答えしか返せないんだけど。

開発・実行環境がWin32 であると仮定して、その配列が自動変数だと仮定して、
49×5×41×81 個の int であると仮定して3254580bytes=3.1MBytes
スタックデフォルトサイズは 1MB だからエラーになるのが当然。
スタック増やせばいい。ないしは malloc で取るよう修正するか。
読者にこういう仮定(=妄想)をさせるような書き込みは、質問が下手な証拠。

# Blue 氏とかぶったな・・・

引用返信 編集キー/
■7939 / inTopicNo.4)  Re[2]: Segmentation fault
□投稿者/ akamatsu (2回)-(2007/09/20(Thu) 11:48:23)
2007/09/20(Thu) 11:51:11 編集(投稿者)

No7937 (Blue さんのみ) に返信 
> char型の場合
> 49×5×41×81=813645
> →およそ814KB
>
> int型(=32ビットの場合)の場合さらに4倍で、およそ3.255MBとなります。
>
> ※配列の型が書いていないので実際のところどれぐらいスタックを消費しているか不明。
>
> とりあえず、スタックのメモリをオーバーしてしまっているようなのですが、
> 対処方もコンパイラを何を使っているのか一切かかれていないようなので解答できません。



型はdoubleです。
コンパイラはg++ですが。
>g++ ***.cxx -o ***DO.cxx
>./***DO.cxx
とすると
Segmentation fault
が出ます。



引用返信 編集キー/
■7953 / inTopicNo.5)  Re[3]: Segmentation fault
□投稿者/ PATIO (17回)-(2007/09/20(Thu) 15:47:15)
No7939 (akamatsu さん) に返信
> 2007/09/20(Thu) 11:51:11 編集(投稿者)

> 型はdoubleです。
> コンパイラはg++ですが。
> >g++ ***.cxx -o ***DO.cxx
> >./***DO.cxx
> とすると
> Segmentation fault
> が出ます。

ここがどんな掲示板だか理解した上で質問をされていますか?
この掲示板で何も書かなければ、VC++での話と取られても仕方ないんですけれど。
g++ってOSは何を使ってます?
この掲示板で何も書かなきゃWindowsだと取られると思いますけれど。

コンパイラがSegmentation faultを出して止まってしまっているなら
コンパイラが想定しないようなコードを書いてしまっているか何かで
コンパイラ自体が飛んでしまっているのでは?
unix系ならコアダンプとかしてそうですけどねぇ。

引用返信 編集キー/
■7954 / inTopicNo.6)  Re[4]: Segmentation fault
□投稿者/ επιστημη (589回)-(2007/09/20(Thu) 15:55:50)
επιστημη さんの Web サイト
2007/09/20(Thu) 15:58:20 編集(投稿者)

> コンパイラがSegmentation faultを出して止まってしまっているなら
> コンパイラが想定しないようなコードを書いてしまっているか何かで
> コンパイラ自体が飛んでしまっているのでは?

ぃゃぃゃ、そぢゃなさそ。

>>g++ ***.cxx -o ***DO.cxx ← load-module名を***DO.cxxにしる!
>>./***DO.cxx

ってことだから、g++が吐いた実行コードを動かしてるポ。

どっちみち、デカすぎる配列をautomatic変数にしちゃってるもんだから、スタックが破裂してるようです。
配列のサイズを小さくしてやりくりするか、
さもなくばmallocなりnewなりでデカい領域をヒープに追い出してやらんと。

引用返信 編集キー/
■7955 / inTopicNo.7)  Re[5]: Segmentation fault
□投稿者/ PATIO (18回)-(2007/09/20(Thu) 16:09:17)
2007/09/20(Thu) 16:11:40 編集(投稿者)

No7954 (επιστημη さん) に返信
> ぃゃぃゃ、そぢゃなさそ。
>
> >>g++ ***.cxx -o ***DO.cxx ← load-module名を***DO.cxxにしる!
> >>./***DO.cxx
>
> ってことだから、g++が吐いた実行コードを動かしてるポ。
>
> どっちみち、デカすぎる配列をautomatic変数にしちゃってるもんだから、スタックが破裂してるようです。
> 配列のサイズを小さくしてやりくりするか、
> さもなくばmallocなりnewなりでデカい領域をヒープに追い出してやらんと。

のわっ。
ほんとだ。
最後に実行してるじゃないかぁ!
こういうのをコンパイルしたらSegmentation faultが出たとは言わないと思いますけど。(^^;
実行して出ているのとコンパイルで出ているのじゃ話が全く違うので
ちゃんと整理して質問して欲しい。(T-T)
この感じだとunix上でやってるのかなぁ。
板違いと言う気がする。
まあ、他の質問内容とかちゃんと確認しないで書き込んだんだろうなぁ。

引用返信 編集キー/
■7957 / inTopicNo.8)  Re[6]: Segmentation fault
□投稿者/ 恣意の (16回)-(2007/09/20(Thu) 16:15:58)
ヒープ使うの、ド安直に書くならこうかしら?


double hoge[49][5][41][81];

これを以下に変更

vector< vector< vector< vector<double> > > > hoge(49, vector< vector< vector<double> > >(5, vector< vector<double> >(41, vector<double>(81, 0.0))));

これで問題はクリアされるだろうけど
typedefしなきゃやってられないな、これ...

# 非難されても弁解できないようなコードだw

引用返信 編集キー/
■7958 / inTopicNo.9)  Re[7]: Segmentation fault
□投稿者/ 774RR (42回)-(2007/09/20(Thu) 16:25:02)
vectorのvector... と、4次元配列とはメモリ上の配置が違うからなー
必ずしも互換ではない、と。

オラんちの gcc-4.1.2.hppa2.0w-hp-hpux11.11 で double hoge[49][5][41][81]; を作ってみたけど
何も言わずに平然と動いたよん。 cygwin なのではないかと更に妄想を逞しくしてみる。

# そうか、最初の発言確かに「コンパイル時に」とあるな。
# よく読んでなかった orz
引用返信 編集キー/
■7964 / inTopicNo.10)  Re[8]: Segmentation fault
□投稿者/ επιστημη (590回)-(2007/09/20(Thu) 16:51:35)
επιστημη さんの Web サイト
> # そうか、最初の発言確かに「コンパイル時に」とあるな。
> # よく読んでなかった orz

我も我も...orz
どーみても「実行時に」だよねー

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -