スタックオーバーフローの回避について

解決


YANA  2005-04-13 05:23:11  No: 56971

いつも参考に見させていただいております。

現在作成しているアプリケーションなのですが、
メインのフォームからCDialogでダイアログを呼び出すのですが
スタックオーバーフローとなって強制終了されてしまいます。

常時表示されているのはメインのフォームのみで、パラメータ等設定する際に
随時ダイアログを呼び出すような形で処理を作っており、
呼び出されるダイアログはトータルで80個ほどあり、
それらのダイアログにはエディットボックス、スタックテキスト等が存在しております。

ヘルプメニューを参照してプロジェクトのプロパティの「C/C++」
「コマンドライン」の「追加オプション」に/F 4096000と追記したのですが
何の変化も現れませんでした。

設定方法に何か誤りがあるのでしょうか?

また、「リンカ」の「システム」にも「スタックのサイズの設定」と
ありますがこれはどのような時に変更するのでしょうか?


YANA  2005-04-13 05:43:50  No: 56972

追記ですが、呼び出すダイアログは下記のような形でエディットボックス等の
宣言を行っております。

//{{AFX_DATA(CPatternDrive1TorqueDlg)
enum { IDD = IDD_PTN_D1_TORQUE_MODE_DLG };

//}}AFX_DATA
の間で宣言しているCStaticやCNumEditを複数コメント化して数を減らすと
スタックオーバーフローは発生しませんでした。

********************************************************************
class CPatternDrive1TorqueDlg : public CDialog
{
// コンストラクション
public:
  CPatternDrive1TorqueDlg(CWnd* pParent = NULL);   // 標準のコンストラクタ

// ダイアログ データ
  //{{AFX_DATA(CPatternDrive1TorqueDlg)
  enum { IDD = IDD_PTN_D1_TORQUE_MODE_DLG };
  CButton  m_btnOpen;
  CButton  m_btnSave;
  CButton  m_btnSet;
  CButton  m_btnPrev;
  CButton  m_btnNext;
  CButton  m_btnClose;

  CStatic    m_staticPatternItem;
  CNumEdit  m_editPatternItem[2];
  CComboBox  m_comboTimeScale;

  CStatic    m_staticDrive1OrderItem[1];
  CStatic    m_staticStepNo[10];
  CNumEdit  m_editDrive1OrderTorque[10];
  CNumEdit  m_editDrive1ShiftTime[10];
  CNumEdit  m_editDrive1NotchFrequency[10];
  CNumEdit  m_editContinuationTime[10];
  CButton    m_checkShiftTime[10];

  CStatic    m_staticAnalogItem1;
  CStatic    m_staticAnalogItem2;
  CStatic    m_staticAnalogItem3;
  CStatic    m_staticAnalogItem4;
  CStatic    m_staticAnalogItem5;
  CStatic    m_staticAnalogItem6;
  CButton    m_checkAnalogFlag[10];
  CNumEdit  m_editAnalogEnactmentTime[10];
  CNumEdit  m_editAnalogLogTime[10];
  //}}AFX_DATA

  BOOL  m_bPageNo;
  BOOL  m_bSettingFlag;
  BOOL  m_bReadFileFlag;

  double  dDrive1OrderTorque[10];
  int    dDrive1MaxStep;

  PATTERN_DATA    m_PatternData;
  ANALOG_COLLECT_DATA  m_AnalogCollectData;

// オペレーション
public:
  BOOL DataCheck();

// オーバーライド
  // ClassWizard は仮想関数のオーバーライドを生成します。
  //{{AFX_VIRTUAL(CPatternDrive1TorqueDlg)
  public:
  virtual BOOL PreTranslateMessage(MSG* pMsg);
  protected:
  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
  //}}AFX_VIRTUAL

// インプリメンテーション
protected:
  CFont  m_ftNowFont;
  int    dStepNo;
  int    dStatus;
  char  szFileName[_MAX_PATH];

  void OnPrev();
  void OnNext();
  void OnOpen();
  void OnSet();
  void OnSave();
  void OnReadFile();
  void OnWriteFile();
  void SetEditBox(int flag);
  BOOL GetEditData(int flag);
  void InitComboBox();
  void OnHeader();

  // 生成されたメッセージ マップ関数
  //{{AFX_MSG(CPatternDrive1TorqueDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnDestroy();
  afx_msg void OnSelEndOkTimeCombo();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
protected:
  double  str2double(PCHAR pStr);
};


KING・王  2005-04-13 17:15:54  No: 56973

VS6では次のようにして、設定できます。

「プロジェクトの設定」のダイアログの中の、「リンク」タブ内で、
「カテゴリ」で「アウトプット」を選択し、そこで表示される
「スタックアロケーション」の「予約」のところに値を入力して、
スタックサイズを設定します。


REE  2005-04-13 20:45:05  No: 56974

CNumEditが実は巨大なクラスだったりしませんか?

スタックサイズを変更する代わりに、
ダイアログを呼び出す際に、動的に確保する方法もあります。

CPatternDrive1TorqueDlg *pDlg = new CPatternDrive1TorqueDlg(this);
if(pDlg->DoModal() == IDOK)
{
 ...
}


YANA  2005-04-14 04:03:44  No: 56975

KING・王さん、REEさんコメントありがとうございます。

REEさんが書いておられた動的に確保する方法で
ダイアログを呼び出す処理をいくつか変更したところスタックオーバーフローが
発生しないようになりました。

残りも同様に変更していこうと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加