• ベストアンサー

C#のスタック領域

C#でA*のアルゴリズムを用いたプログラムを作成しています。 しかし、探索範囲によってスタックオーバーフローを起こします。 スタック領域そのものを増やすことはできないのでしょうか? よろしくお願いします。

  • k_ppm
  • お礼率69% (16/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • yama06
  • ベストアンサー率61% (101/164)
回答No.1

1Mと下のURLに書いてあるようですが、ご自身で御確認ください。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/thread_stack_size.asp スレッドごとに割り当てられるので、コンストラクタで指定できます。 Thread (ThreadStart, Int32) "Initializes a new instance of the Thread class, specifying the maximum stack size for the thread." デフォルトのサイズを変更するには.defファイルに設定しておく というようなことが上のURLに書いてあるようです。

k_ppm
質問者

お礼

紹介していただいたとおり、スレッドに大きなスタックサイズを与えることで、無事スタックオーバーフローを回避できました。 ありがとうございました。

関連するQ&A

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • 組み込みOSでスタックオーバーフローしたら?

    マイコンにて組み込みOSでスタックオーバーフローするとその振る舞いはどうなるのでしょうか? SH2を使っています。 組み込みOSはNorti4を使っています。 タスク作成したときにスタック容量を指定しています。 タスクはひとつです。 タスクのスタックより前の領域には定義メモリ(グローバルメモリ)の領域になっています。 タスクのスタックより後の領域は大きな領域(数Kbyte)ほどあいています。 この場合にタスクのある関数の動作中にスタックオーバーフローが起きた場合、どうなるのでしょうか? 思いついた選択肢は以下のとおりです。 1.定義メモリ(グローバルメモリ)の領域をオーバーフロー分書き換えて、その関数が終了したら呼び出し元の関数に戻る。 その後、書き換えられた定義メモリ(グローバルメモリ)による影響で処理によってはマイコンが意図しない動作になる。 2.スタックオーバーフローした時点でアドレス例外などの例外処理に飛んでしまう。 3.スタックオーバーフローした時点で、暴走し戻れなくなる。 4.その以外 どんなことが考えられますでしょうか?

  • H8マイコン スタック領域について

    スタック領域について教えて下さい。 [動作環境]  開発環境:ルネサス HEW Version 4.08  マイコン:ルネサス H8/1653  コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00 HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200 が自動で生成されると思います。 しかし、入手したH8/1653用のサンプルには #pragma stacksize のような サイズ指定がありませんでした。 [サンプル] (1)セクション定義やスタック領域のサイズ指定が無い (2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが サイズの設定が無い。 -- サブコマンドファイル(xxxx.sub)-- START  CStart/00000000; START  P,C,D/00000400; START  B,R/00FF2000; START S/00FFC000; [質問]  質問1   (1)のスタック領域はどこに配置されるのでしょうか?  質問2   (2)のスタック領域は 00FFC000 を基準にどう確保   されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保?          00F00000 (a)         ↑       00FFC000 (設定アドレス)         ↓       00FFFFFF (b)        質問3   (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。   これらは指定しなくても問題ないものなのでしょうか?   また、熟練者の方は指定しないものなのでしょうか? よろしくおねがいします。

  • スタックオーバーフローとは?

    スタックオーバーフローを起こす簡単プログラムを作れって、 大学の教授に言われたんですけど、さっぱり分かりません。 コンパイルと実行の仕方しかわからない自分にそんな過酷な課題を・・・ 誰か助けてください。 そもそもスタックオーバーフローってなんなんですかね・・・。

    • ベストアンサー
    • Java
  • スタック領域変更

    Stack overflow エラーが発生したので、スタック領域を拡張しようと思い、ネットで調べたのですが、その設定画面が自分の持っているやつにはありませんでした。 自分のは Microsoft Visual C++です。 スタック領域変更の仕方教えて下さい。

  • .NET(C#)でのスタックオーバーフロー回避方法

    ASP.NET初心者です。初めて質問させていただきます。 ASP.NET(C#)でwin32系の外部ライブラリを使用したいのですが、そのライブラリを読み込むところで スタックオーバーフローが発生してしまいます。 同じライブラリをWindowsアプリケーション(C#)で使用したところ問題なく実行できました。 ASP.NETで同じように使用しようとするとスタックオーバーフローが発生してしまう状態です。 [デバッグ中のエラーメッセージ] xxxx.dllを読み込めません。再帰が深すぎます。スタックがオーバーフローしました。 [イベントログ] 障害が発生しているアプリケーション名: w3wp.exe、バージョン: 7.5.7600.16385、タイム スタンプ: 0x4a5bcd2b 障害が発生しているモジュール名: xxxx.dll_unloaded、バージョン: 0.0.0.0、タイム スタンプ: 0x4d92e27c 例外コード: 0xc0000005 xxxx.dllは、今回使用したいDLLです。 過去の質問等でスタックオーバーフローが発生した場合の解決策を探してはみたのですが、見つけられた方法が以下の2つでどちらもうまくいきませんでした。 (1)スタック領域を大きくする →スレッドでスタック領域を指定して実行してみました。 (2)ライブラリの中身をスタックオーバーフローが起きないように変更する → ライブラリの中身は変更できない状態です。 (1)のほうは、指定方法間違えてるかもしれません。。。 Thread newthread = new Thread(new ThreadStart(init), 0); もしくは、w3wp.exeでエラーが発生しているということはIIS関係で何かおかしなことをしてしまってるのかもとか・・・。 根本から見方が間違ってるかもしれませんが、(1)の方法の正しいやり方、もしくはそれ以外の解決策をご教授頂きますようよろしくお願いいたします。

  • VBでスタックオーバーフロー

    VisualBasic6でハノイの塔のプログラムを書いたのですが、スタックオーバーフローが表示されて困っています。VBでスタックを明示的に増やすことは可能でしょうか?

  • c言語でスタック領域の使われ方について

    c言語でスタック領域の使われ方について質問です。 メイン関数{ if(true){ } //if文終わり サブ関数1() サブ関数2() } このときのスタックのプッシュ、ポップの行われ方について教えてください。 自分の予想では以下のようになると考えていますが自信が全くありません・・・・ 1 まずメイン関数をプッシュ 2 if文をプッシュ     ???   <???が特に自信ないです。 3 if文をポップ      ??? 4 サブ関数1をプッシュ 5 サブ関数1をポップ   ??? 6 サブ関数2をプッシュ 7 サブ関数2をポップ   ??? 8 メイン関数をポップ もし知っていたら教えてください。 よろしくお願いします。

  • C++のstructが確保される領域について

    C++ではstructはクラスとして扱われるそうですが、 確保される領域はスタック領域だと聞きました。 StructHoge *structHoge = new StructHoge; とした場合structHogeに入っているStructHogeインスタンスのアドレスが指し示しているのは  スタック領域なのでしょうか?

  • スタックメモリについて

    プログラムの起動時に、スタックメモリは初期化(NULLに設定)されるのでしょうか。 PUSH・POPで使用したらデータは残りますが、未使用の場合、初期化されているかの質問です。 グローバル変数の領域はクリアされると思われますが、スタックは不明です。 クリアされないときは、ほかのプログラムで使用されたゴミデータが 残っているのでしょうか 目的は、スタック領域でメモリ障害の場合動作が変わってしまうのか、確認したいためです。 すいませんが、よろしくお願いします。

専門家に質問してみよう