複素数計算を正しく出力させるには?

解決


ホンマmon  2007-11-14 01:29:10  No: 66856  IP: 192.*.*.*

どうしても納得いかないことがあるので,ここで解決できたらと思い,書き込ませていただきます.
以前作った,複素数計算のプログラムは正しく数値として出力されるのですが,このプログラムを少し書き換えたら,とたんに次のメッセージが表示されてしまいます.
'System.StackOverflowException' のハンドルされていない例外が ○○○.exe で発生しました。
ビルドは通ります.計算開始ボタンを押すと,このメッセージが出ます.
どのように書き換えたかというと,二次元だった配列を三次元にしただけです.そこで最初,原因は三次元配列によるメモリ不足とか,無限ループとかを疑ったんですが,同じプログラム(書き換えた後のやつ)で,扱う数値を実数にして試したところ,普通に出力されました.なので,複素数の扱いに原因があるということになると思うんですが,何が,どこがおかしいのか全く分かりません.書き換える前は,複素数を使って普通に計算できたのですが・・なにか原因が思い当たる方がいましたら,ご返信いただきますよう,よろしくお願いします.
Win XP, VC++2005, CLR Windows Form Application

編集 削除
επιστημη  2007-11-14 08:45:40  No: 66857  IP: 192.*.*.*

ホントにメモリ不足じゃないんですか?
複素数は実数の二倍メモリ食いますよ?

編集 削除
とおりすがり  2007-11-14 15:50:38  No: 66858  IP: 192.*.*.*

そのままスタックオーバーフローだと思います。
巨大な自動変数(ローカル変数)を宣言してませんか?たぶんその「三次元配列」だと思いますが。
スタックはPCのメモリ容量に関係なく1MBぐらいしかありません。それ以上の自動変数を宣言すると上記エラーが出ます。

#CLRはそのあたりを自動でよろしくやってくれるもんだと思ってましたが、
#よく考えたらOS依存のスタック容量をCLRでよろしくはできないか…

編集 削除
とおりすがり  2007-11-14 15:56:04  No: 66859  IP: 192.*.*.*

ちなみにスタックは「自動変数等が確保される場所」です。

編集 削除
ゴン  2007-11-14 16:58:29  No: 66860  IP: 192.*.*.*

スタックサイズの問題ならコンパイルオプションで回避できると思いますけれど、CLRで使えるのかは不明です。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vccore/html/_core_.2f.F.asp

編集 削除
ホンマmon  2007-11-14 22:17:44  No: 66861  IP: 192.*.*.*

解決しました.
メモリ不足でした.そして勉強不足でした.動的確保がいい方法だと思いますが,強引にスタック増やしたらできました.
また何かのときにお世話になるかもしれませんのでよろしくお願いします.

編集 削除
とおりすがり  2007-11-14 22:24:43  No: 66862  IP: 192.*.*.*

CやC++なら無理に動的確保にしなくてもstatic変数や外部変数にすればOKです。スタックを増やすのは最終手段としてあまり乱用しないでおきましょう。

CLRに詳しくないのでstatic変数や外部変数が無いなら話は別ですが。

編集 削除