どうしても納得いかないことがあるので,ここで解決できたらと思い,書き込ませていただきます.
以前作った,複素数計算のプログラムは正しく数値として出力されるのですが,このプログラムを少し書き換えたら,とたんに次のメッセージが表示されてしまいます.
'System.StackOverflowException' のハンドルされていない例外が ○○○.exe で発生しました。
ビルドは通ります.計算開始ボタンを押すと,このメッセージが出ます.
どのように書き換えたかというと,二次元だった配列を三次元にしただけです.そこで最初,原因は三次元配列によるメモリ不足とか,無限ループとかを疑ったんですが,同じプログラム(書き換えた後のやつ)で,扱う数値を実数にして試したところ,普通に出力されました.なので,複素数の扱いに原因があるということになると思うんですが,何が,どこがおかしいのか全く分かりません.書き換える前は,複素数を使って普通に計算できたのですが・・なにか原因が思い当たる方がいましたら,ご返信いただきますよう,よろしくお願いします.
Win XP, VC++2005, CLR Windows Form Application
ホントにメモリ不足じゃないんですか?
複素数は実数の二倍メモリ食いますよ?
そのままスタックオーバーフローだと思います。
巨大な自動変数(ローカル変数)を宣言してませんか?たぶんその「三次元配列」だと思いますが。
スタックはPCのメモリ容量に関係なく1MBぐらいしかありません。それ以上の自動変数を宣言すると上記エラーが出ます。
#CLRはそのあたりを自動でよろしくやってくれるもんだと思ってましたが、
#よく考えたらOS依存のスタック容量をCLRでよろしくはできないか…
ちなみにスタックは「自動変数等が確保される場所」です。
スタックサイズの問題ならコンパイルオプションで回避できると思いますけれど、CLRで使えるのかは不明です。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vccore/html/_core_.2f.F.asp
解決しました.
メモリ不足でした.そして勉強不足でした.動的確保がいい方法だと思いますが,強引にスタック増やしたらできました.
また何かのときにお世話になるかもしれませんのでよろしくお願いします.
CやC++なら無理に動的確保にしなくてもstatic変数や外部変数にすればOKです。スタックを増やすのは最終手段としてあまり乱用しないでおきましょう。
CLRに詳しくないのでstatic変数や外部変数が無いなら話は別ですが。
ツイート | ![]() |