• ベストアンサー

プログラムが落ちる。

VisualStudio2005を使用しています。 ダイアログを作成し、配置したコントロールに手動で変数を追加していたんですが、 22個めの変数を追加したところ、プログラムが落ちるようになりました。(ビルドは通ります) エラー内容は、 Run-TimeCheckFailure #2 - Stack around the variable 'dlg' was corrupted DoModalから帰って来たところでエラーが発生しているようですが… 変数の追加作業しかしていませんし、同じ作業の繰り返しだったのに、22個になったとたん落ちる理由がわかりません。 コントロール変数はいくつまで・など、数の制限でもあるのでしょうか。 このエラー内容は、どういった場合に(何が悪いと)発生するのでしょうか。

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

  • ベストアンサー
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

リビルドしてみてください たまにIDEが追加されたIDを認識できず正常にコンパイルできないときがあるみたいです。 それでもだめなら resource.hを開いて ID_BUTTON22の値を見てください どっか重複するIDがあったりしませんか? あるならばID_BUTTON22の値を重複しない値に変えてみる。 とりあえず思いつくことはそんなところです。

-Kororon-
質問者

お礼

> リビルドしてみてください > たまにIDEが追加されたIDを認識できず正常にコンパイルできないときがあるみたいです。 ありがとうございます。 おっしゃる通りリビルドをしてみたところ、 プログラムが落ちることはなくなりました。 こんなこともあるんですね。 勉強になりました。ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

そのエラーは宣言した配列の範囲を超えてアクセスしたときに出ます エラーのでる部分のコードと変数の宣言を確認してみましょう int dlg[10]; で dlg[10] = 1; とかするとエラーになります(dlg[0]~dlg[9]までしか確保されていない)

-Kororon-
質問者

お礼

No.2の方のアドバイスどおりリビルドしたところ、 プログラムが落ちなくなり、無事に解決しました。 本当にありがとうございました!

-Kororon-
質問者

補足

さっそくの回答ありがとうございます。 配列ということでしたが、特に配列を使用している心当たりがないため、 コードを補足させて頂きます。 エラー部分は void CProject::Test(){ CTestDlg dlg; dlg.DoMoal(); } 上記でDoModalから帰ってきた部分です。 変数の追加は以下のようにしています。 -------------実装ファイル--------------------- void CTestDlg::DoDataExchange(CDataExcange* pDX){  DDX_Control( pDX, IDC_BUTTON1, m_vxStanderd)  :(略)  DDX_Control( pDX, IDC_BUTTON21, m_vxCustom5)  DDX_Control( pDX, IDC_BUTTON22, m_vxCustom6) //←★追加 } -------------ヘッダーファイル------------------ public:  CButton m_vxStanderd;  :(略)  CButton m_vxCustom5;  CButton m_vxCustom5; //←★追加 上記の★印部分を追記すると落ち、それらを削除すると正常に戻ります。 たびたびすみませんが、お気づきの事などありましたら 教えて頂けるとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Run-Time Check Failure?

    Run-Time Check Failure #2 - Stack around the variable 'x' was corrupted. と表記されました。 どういったエラーのことなんでしょうか?

  • Stack around the variable 'xx' was corrupted

    お世話になっております。 異常系に関して質問させてください。 想定内のサイズの文字列の処理では問題なく処理されておりますが、異常系のテストを行おうとして、想定外のサイズの文字列を処理しようとすると以下のメッセージが出力されます。 Stack around the variable 'xx' was corrupted 想定外なのでこのメッセージが出力されるのは良いのですが、ビルドを行い EXE を実行すると、return 0 で戻ってくる場合がある為、一見正常終了しているように見える場合があります。 「try {} catch (...) {}」で囲んでみましたが、Stack around は例外では無い為、catch する事ができません。 Stack around が出ないように組む!が正しいのでしょうが、Stack around が出た場合 return 1 で返却する方法はありますでしょうか? 開発環境は Visual C++ 2008 Express になります。 宜しくお願いします。

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • MFCに関する質問です。

    [VisualStudio2010]でMFCを勉強しているVC++初心者です。 (VBは、不足なく記述できるレベルです。) 現在、勉強でダイヤログアプリケーションを作成しており、配置しているボタンコントロールの色を変更しようとしていたのですが、やり方がよくわかりません。 どなたかご教示をお願いいたします。 ※簡単だと思っていたのですが・・・てこずってしまい、困っています。 尚、現時点では・・・ ボタンにはコントロール変数として m_Btn1 としております。 Dlg.cpp の  「// TODO: 初期化をここに追加します。」以降に m_Btn1.??? = 色 と記述しようと思っているのですが・・・???がわかりません。 検索してみましたが・・・やはりわかりません。(記述方法がばらばらで・・・) どなたが、ご教示頂きますようお願い致します。

  • 配列

    /*10個の数字を受け取り,その中に一致する2つの数字があるかどうかを報告するプログラム*/ #include<stdio.h> int main(void) { int i,j,k; int item[9]; printf("10個の数字を入力してください\n"); for(i=0;i<10;i++) scanf("%d",&item[i]); for(j=0;j<10;j++) { for(k=j+1;k<10;k++) { if(item[j]==item[k]) printf("%dが2つ存在します.\n",item[j]); } } return 0; } というプログラムでエラーが出てしまいました. エラー内容は Stack around the variable 'item' was corrupted というものです. 原因を知りたいです.よろしくお願いします.

  • エラー Stack around the variable 'tmp' was corrupted.

    MFC7.0でプログラミングしています。 下記2のサブルーチンを出る時(fcloseの後)に 下記1のようなランタイムエラーが どうしても出てしまいます。 このルーチンがメインの関数なので、 これ以外の場所のコーディングはほとんどありません。 スタックと出ているので、 メモリ関連であることは分かるのですが、 それ以上進みません。 どなたかアドバイスよろしくお願いします。        記1 Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.        記2 } int i,j; FILE* fp; m_filename += ".lst"; fp = fopen(m_filename,"w"); char tmp[1]; itoa(m_num,tmp,10); CString num = tmp; m_url.Replace("%","%%"); CString sout = m_url + m_head for(i = m_start ; i<= m_end ; i++){  fprintf(fp,sout,i); } fclose(fp); }

  • VS2017を使った簡単なプログラムについて

    現在、VS2017(Visual Studio 2017 Professional)を使って、下のプログラムに示す簡単な計算をするダイアログベースのプログラムを作っています。 プログラムの流れとしては (1):[ + ]ボタンを押して2つの数値(エディトボックス1と2の値)の和を求めバッファに代入する。 (2):[ = ]ボタンを押してバッファの値をエディトボックス3に表示する。 という流れです。 (1)は動作したのですが、(2)のところでうまく表示されません。どうしたらよいでしょうか。教えてください。 以下に示すプログラムが和を求める部分とエディトボックスに表示させる部分です 変数zは外部で定義してあります。 ========▼以下プログラム============ void CMFCApplication2Dlg::OnBnClickedPlus() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 double x, y; //IDC_EDIT1に入力された値を変数m_strXに代入 GetDlgItemText(IDC_EDIT1, m_strX); //IDC_EDIT2に入力された値を変数m_strYに代入 GetDlgItemText(IDC_EDIT2, m_strY); //それぞれ文字列をdouble型に変換 x = _ttof(m_strX); y = _ttof(m_strY); //和を求めて、変数zに代入 z = x + y; } void CMFCApplication2Dlg::OnBnClickedEqual() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 WCHAR strAns[256]; //zを文字列に変換 wsprintf(strAns,_T("%4.3f"),z); //文字列をIDC_EDIT3に代入 SetDlgItemText(IDC_EDIT3,strAns); }

  • プログラム終了時にエラーが発生する

    現在作成中のプログラムは終了する時にアクセス違反が発生しましたと 表示されます。 以前はこの様なことはなかったのですが構造体に変数を追加した直後に起こるようになりました。 typedef struct _A{ int x,y; int cost; vector<int> To; vector<int> E_cost; }A_t; typedef struct _B{ double x,y; int sex; char Name[20]; vector<int> root; vector<A_t> Map; //このMapという変数を追加するとエラーがでる。 }B_t; この変数を消すとエラーが出ることはありません。 まだこの変数は追加しただけで使っていません。終了時にのみ発生します。

  • ダイアログを終了させてもハンドルが1つ増加したまま。。。

    VC++のMFCを使ってダイアログベースのEXEを造っています。 ハンドルのリークが発生し、困っています。 <動作内容> メインのダイアログで、ボタン押下により別のダイアログを表示します。 DoModal()でモーダルダイアログを作成します。 別のプロセスからブロードキャストされるメッセージを処理したいため、 ボタン押下のルーチンで DoModal() せずに、スレッドを作成し、 そのスレッドで DoModal() を実行しています。 スレッド作成は AfxBeginThread() を使用しています。 <サンプルソース> ●メインダイアログ // ボタン押下のルーチン void CTestModalDlg::OnButton1() { AfxBeginThread( TestDlgThread, (LPVOID)this, THREAD_PRIORITY_NORMAL ); } // スレッド static UINT TestDlgThread(LPVOID pThis) { CTestDlg1 Dlg; Dlg.DoModal(); } ●DoModal() で表示されるダイアログ 何も手を加えてない、デフォルトのまま。 <結果> DoModal() で表示されたダイアログを CDialog::OnCancel() で終了させ、 メインのスレッドが終了しても、ハンドルカウントが1つ増加しています。 Sleep() を入れて値をみてみると、 ・スレッド作成:2増加 ・DoModal() でダイアログ表示:1増加 ・OnCancel() で終了:増減なし ・スレッド終了:2減少 =>結果、1増加となっていました。 以下のパターンでは問題ありませんでした。 ・スレッドを作成+終了(ダイアログ表示しない) ・スレッドを作成せずに、ボタン押下ルーチンから DoModal() でダイアログ表示+終了 ということで、AfxBeginThread()、DoModal() 自体は問題ないのですが、 スレッドを作成して DoModal() するとリークが発生します。 識者の方、原因、対策など、ご教授願います。

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。