• 締切済み

スタック領域変更

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

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

開発統合環境(IDE)から実行されているのではないのでしょうか それとも出来上がったEXEを エクスプローラ等から起動しているのでしょうか 前者なら、F5キーによる実行ならエラー発生時にIDEのデバッガが起動するはずです

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

0x1e8480は16進数で表現されているということですよ 2,000,000バイトです つまり 1.907MB(1953.125KB)です Windowsの電卓を起動して 表示 > 関数電卓 表示 > 16進 として 1e8480 を入力 表示 > 10進 とすれば 10進数に変換した値を表示してくれます デバッグ実行しているならエラーで停止した時点で呼び出し履歴をチェックしてみましょう

BOY12345
質問者

補足

デバッグ実行の仕方がわかりません。 以前やろうとしましたが、意味が分からず・・

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

VC++でも VC6/2003/2005/2008などいろいろなバージョンがあります プロジェクトの設定画面のリンカー関連に『スタックサイズ』といった項目があります コンパイラのバージョン、エディションなどを明記しましょう コマンドラインオプションなら /STACK:希望のサイズ になるでしょう 希望のサイズはバイト単位で指定します 本当にスタックの不足なのでしょうか プログラム的にバグがあり期待しないところで再帰がかかっていてスタックを食いつぶしていることも考えられますよ

BOY12345
質問者

補足

さっそくのご解答有難う御座います。 変更する場所は、設定内をいろいろ見ていたら見付けることができました。スタック領域を変更しようと思い、いじりました。 予約とコミットには、0x1e8480と設定されていました。 これを最大にすればまぁスタック領域エラーはでないだろうと思い、 最大値の9294967295を入力しました。 しかしながら、相変わらずスッタクエラーが・・・ ご指摘の通り、プログラムのどこかで食いつぶしが生じていると考え、コードを見直しています。 ところで、0x1e8480とは何kBでしょうか? 単位はkBで、16進法なので、 16^(8480)kBと読めばいいのでしょうか?少々自信がありません。

関連するQ&A

  • .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)の方法の正しいやり方、もしくはそれ以外の解決策をご教授頂きますようよろしくお願いいたします。

  • C言語で変更していただきたい所があるのですが・・・

    下のソースを加減乗除だけでなく、余りを求める演算(%)やべき乗演算(^)も使えるようにしたいのですがうまくいきません。 どなたか変更例をお見せできますでしょうか? #include <stdio.h> #include <stdlib.h> #define STACK_MAX 10 /* 配列によるスタック構造 */ double stack[STACK_MAX]; /* スタック頂上の位置(最下部からのオフセット)*/ int stack_top = 0; /* スタックへのpush */ void stack_push(double val) { if(stack_top == STACK_MAX) { /* スタックが満杯になっている */ printf("エラー:スタックが満杯です(Stack overflow)\n"); exit(EXIT_FAILURE); } else { /* 渡された値をスタックに積む */ stack[stack_top] = val; stack_top++; } } /* スタックからpop */ double stack_pop(void) { if(stack_top == 0) { /* スタックには何もない */ printf("エラー:スタックが空なのにpopが呼ばれました" "(Stack underflow)\n"); exit(EXIT_FAILURE); return 0; } else { /* いちばん上の値を返す */ stack_top--; return stack[stack_top]; } } int main(void) { char buffer[256]; double cal1, cal2; int i; do { printf("現在のスタック(%d個):", stack_top); for(i = 0; i < stack_top; i++) { printf("%0.3f ", stack[i]); } printf("\n>"); fgets(buffer, 255, stdin); switch(buffer[0]) { case '+': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 + cal1); break; case '-': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 - cal1); break; case '*': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 * cal1); break; case '/': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 / cal1); break; case '=': /* =の場合はこのすぐあとでwhile文からも抜ける */ break; default: /* 入力された値は数字のはずなので,スタックに積む */ stack_push(atoi(buffer)); break; } } while(buffer[0] != '='); printf("計算結果は%f です。\n",stack_pop()); if(stack_top != 0) { printf("エラー:スタックにまだ数が残っています\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }

  • Access2013でスタック領域不足エラー

    Access2013でスタック領域不足エラー お世話になっております。 Access2013で開発したシステムを現在Office365で修正を行っております。 親フォーム(連結フォーム)に「次へ」ボタンを配置し、クリックする度に次のレコードをフォーム上に表示するプログラムで、「スタック領域が不足しています」のエラーが発生します。 ゆっくりとレコードを送る分には問題ないのですが、ボタンを早くクリックし続けると、3,40件あたりでエラーとなります。 また、親フォームの中に8つのタブを作り、それぞれサブフォームを作成し、親フォームのIDとサブフォームのIDでリンクしており、次へいくたびに該当のデータを表示しております。 おそらくこのタブでの表示処理が多いためエラーとなっていると推測しております。 「次へ」ボタンのコードは以下の通りです。 Private Sub bt_next_Click() On Error Resume Next DoCmd.GoToRecord , , acNext End Sub 色々と調べておりますがなかなか解決しません。 何か良い対策はございませんでしょうか。

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

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

  • スタックのプログラムを作成しているのですが、うまく出来ません。

    プログラムの内容を簡単に言うと、配列s[100]と変数topを用いて、ファイルdata.datからgetc()を用いて文字を1文字ずつ読み込み、スタック(s[100])にpush-downするプログラムです。 細かく言うと、作成したプログラムによりファイルからキー(文字)を読み込みスタックにpush-downし、スタックの内容を表示した後に、キーボードからキー(文字)を1文字ずつ入力して、スタックを操作する。 ・スタック操作の仕様はキーボードからキー(文字)を1文字ずつ入力する際に、0を入力した場合、プログラム終了。1を入力した場合、1文字pop-upした後、pop-upした文字とスタックの内容を表示。その他の文字を入力した場合、その文字をpush-downした後、スタックの内容を表示。(スタックの内容の表示はprint_stack_mtrx(s,top)を使用する。) ・push-downとpop-upはそれぞれ1つの関数で定義する。 といった感じのプログラムを作成しているのですが、関数push,popの部分をどう書いたら良いのか良く分かりません。一応自分で書いてみたのですが、うまくいきませんでした。どなたか教えていただけないでしょうか? *ファイルdata.datからはリダイレクションを用いて読み込む。 <作成途中のソースプログラム> #include<stdio.h> #include<stdlib.h> #define MAX 100 char s[MAX]; int top; void init_stack(){ ______top = 0; _______return; } void print_stack_mtrx(char* s, int top){ __int i; ____if(top == 0){ ______printf("Stack is empty.\n"); ____} ____else{ ______printf("--- Contents of Stack ---\n"); ______for(i = 0; i < top; i++){ ________if(!i){ __________printf("%2c < -- Top (%2d)\n", s[top - i - 1], top); ________} ________else{ __________printf("%2c \n", s[top - i - 1]); ________} ______} ______printf("-------------------------\n"); ____} } char push(char* s, int top, char j){ ___s[top]=j; ___top++; } char pop(char* s, int top){ _char c; ___c = s[top]; ___top--; ___return c; } int main(void) { _int c; _char j; _char i; init_stack(); _______while(((c=getc(stdin))!=EOF) && top<MAX){ _______/* ファイルdata.dat からgetc()を用いて1文字ずつ読み込みスタックsに格納.ただしスタックの出入り口を示す top の値も監視すること*/ _________s[top] = c; _________top++; _______} _______print_stack_mtrx( s, top );/* スタック(配列)の内容を表示する関数*/ _______while(1){ _________scanf("%c\n", &j); _________if(j=='0'){ ___________break; _________} _________else if(j=='1'){ ___/* 1文字pop-upした後, pop-upした文字とスタックの内容を表示 */ ___________i = pop(s, top); ___________printf("pop-upした文字: %c\n", i); ___________print_stack_mtrx( s, top ); _________} _________else{ ___/* その他の文字を入力した場合, その文字をpush-downした後,スタックの内容を表示 */ ___________push(s, top, j); ___________print_stack_mtrx( s, top ); _________} _______} _______return 0; }

  • スタックのデータ構造を作りたい

    C言語でスタックと、スタックにデータを入れるプッシュ、取り出すポップを作りたいと思っており そこで以下のようなものを作ってみました。 ********************************************** #include<stdio.h> typedef struct{ int a[100]; int head=0; }Stack; void push(Stack stc,int x){ stc.a[head]=x; stc.head++; } int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } int main void{ int j; Stack s; push(s,5); push(s,90); j=pop(s); printf("%d",j); j=pop(s); printf("%d",j); return 0; } ****************************** コンパイルするとエラーが出まくりです。 何をどう直せばよいのか、どこが変なのかご教授いただきたいです。 よろしくお願いいたします。

  • Visual C++ 2008 オーバーフローのエラーについて

    プログラムのデータ量を増やしたところ、エラーが起こりました。 減らせば流れることから、スタックオーバーフローと呼ばれるものかと思います。 スタックサイズが初期値のままなのが原因だと予想したのですが、この変更方法がどうにもわかりません。 もしよろしければ、スタックサイズの変更方法を教えてください。 また、別の対処方法をご存知でしたらそちらでも結構です。 ソフトはMicrosoft Visual stdio 2008のC++です。 どうぞよろしくお願いします。

  • OCXからのコールバックを繰り返すとスタック領域が不足する

    こんにちは。 いつもお世話になっております。 OCXからのコールバックが繰り返された場合に「実行時エラー28 スタック領域が不足しています。」が発生して困っています。 以下のようにOCXからのコールバックでプロシージャを再帰的に呼び出しています。 <Command1_Clickイベント> ------------------------------------------------------------------------------------- Private Sub Command1_Click() 'OnTestイベントを発生させる Test.Test End Sub ------------------------------------------------------------------------------------- <OnTestイベント> ------------------------------------------------------------------------------------- Private Sub Test_OnTest(ByVal sStatus As Long, ByVal FileName As String) Select Case sStatus Case 0 'ステータスが0になったら終了 Exit Sub Case Else '再帰的にOnTestイベントを発生させる Test.Test End Select End Sub ------------------------------------------------------------------------------------- すると、294回目でスタック領域不足が発生します。 MSDNによると「イベント連鎖」と呼ばれるものであるようですが、途中までうまくいくので何か他に原因がないかと思っています。 http://msdn2.microsoft.com/ja-JP/library/0ctsw64a.aspx 回避策などありましたらご教示下さい。 ちなみにOCXの処理としては、フォルダ内の該当ファイル名を1つずつ返すというものです。 <環境> Windows 2000, VB6.0

  • 「デスクトップ領域」が変更できない

    Windows95を使っています。 先ほど電源を切る前に何か設定を変更したらしく、再び電源をつけたとこアイコン等すべてがでっかく表示されます。 画面のプロパティのディスプレイの詳細のデスクトップ領域が640×480になっており、この変更ができません。 おそらく、この設定を戻せばこの直ると思うのですが「デスクトップ領域」の変更の仕方を教えて下さい、お願いします。

  • 色数と画面の領域が変更できません

    富士通の[FMV DESKPOWER CIX40LC]を使用しています。 起動時に英語だらけの文字が出て, 色々いじっていると, 色数が16色しか出なくなりました。 画面の領域も640×480にしかなりません。 「画面のプロパディ」で変更を何度も試みたのですが 再起動をしても上記のままです。 印刷も出来なくなりました。 印刷しようとすると このページのスクリプトでエラーが発生しました。 ライン:1175 文字 :1 未定義のエラーです。 コード:0 url  :res://C:\WINDOWS\SYSTEM\SHDOCLC.DLL/preview.dlg と出て印刷できません。 御回答のほど,よろしくお願い致します。

専門家に質問してみよう