いつも参考に見させていただいております。
現在作成しているアプリケーションなのですが、
メインのフォームからCDialogでダイアログを呼び出すのですが
スタックオーバーフローとなって強制終了されてしまいます。
常時表示されているのはメインのフォームのみで、パラメータ等設定する際に
随時ダイアログを呼び出すような形で処理を作っており、
呼び出されるダイアログはトータルで80個ほどあり、
それらのダイアログにはエディットボックス、スタックテキスト等が存在しております。
ヘルプメニューを参照してプロジェクトのプロパティの「C/C++」
「コマンドライン」の「追加オプション」に/F 4096000と追記したのですが
何の変化も現れませんでした。
設定方法に何か誤りがあるのでしょうか?
また、「リンカ」の「システム」にも「スタックのサイズの設定」と
ありますがこれはどのような時に変更するのでしょうか?
追記ですが、呼び出すダイアログは下記のような形でエディットボックス等の
宣言を行っております。
//{{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);
};
VS6では次のようにして、設定できます。
「プロジェクトの設定」のダイアログの中の、「リンク」タブ内で、
「カテゴリ」で「アウトプット」を選択し、そこで表示される
「スタックアロケーション」の「予約」のところに値を入力して、
スタックサイズを設定します。
CNumEditが実は巨大なクラスだったりしませんか?
スタックサイズを変更する代わりに、
ダイアログを呼び出す際に、動的に確保する方法もあります。
CPatternDrive1TorqueDlg *pDlg = new CPatternDrive1TorqueDlg(this);
if(pDlg->DoModal() == IDOK)
{
...
}
KING・王さん、REEさんコメントありがとうございます。
REEさんが書いておられた動的に確保する方法で
ダイアログを呼び出す処理をいくつか変更したところスタックオーバーフローが
発生しないようになりました。
残りも同様に変更していこうと思います。
ありがとうございました。
ツイート | ![]() |