プログラムのプロセスが終了しない

[戻る]
merlo 2002/05/10(金) 06:41:17
w2k VC++6.0 MFC ダイアログ

以上の環境で作成したプログラムを
実行後,「(デフォルトである)OK」や,「(デフォルトである)キャンセル」
を押して,終了しても,
Windowsタスクマネージャのプロセスには,まだ実行中を装っています
Windowsタスクマネージャのアプリケーションには,もう存在しませんが(←当然)

具体的には,プロセスタブにて,CPUの値が99%になっています.
また,VC++にて,再実行ができません(起動中だからという理由でしょう)

これに関して,何かアドバイスありましたら
些細なことでもかまいません.
どうぞよろしくお願いします.

merlo 2002/05/10(金) 07:14:30
追記です

一応,解決しました.
原因は,配列の宣言した場所でした

/////////////////////////////////////////////////////////////////////////////
// CCGDlg ダイアログ

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

// ダイアログ データ
    //{{AFX_DATA(CCGDlg)
    enum { IDD = IDD_CG_DIALOG };
    CProgressCtrl    m_prog_ex_num;
    CStatic    m_pict;
    //}}AFX_DATA

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

// インプリメンテーション
protected:
    HICON m_hIcon;

    // 生成されたメッセージ マップ関数
    //{{AFX_MSG(CCGDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnBUTTONfileopen();
    afx_msg void OnBUTTONmono();
    afx_msg void OnBUTTONunnoise();
    afx_msg void OnBUTTONsharp();
    afx_msg void OnBUTTONlapla();
    afx_msg void OnBUTTON2tika();
    afx_msg void OnBUTTONhist();
    afx_msg void OnBUTTONbrd1();
    afx_msg void OnBUTTONbrd2();
    afx_msg void OnButtonNmbring();
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnBUTTONchar();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
public:
@    double circum_len[100];    //周囲長

};

A    double circum_len[100];    //周囲長



・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
このように,Aで宣言すれば,問題なかったのですが,
@で宣言すると,先ほど説明いたしましたように,プロセスが終了しなかったり
たまにShift+F5による実行でさえ,非常に時間がかかったりしました.

このdouble circum_lenというのは,
afx_msg void OnBUTTONchar();
afx_msg void OnBUTTONbrd2();
で使いたいので,ここでのpublicとして
宣言したく思い,
まだ同時に,グローバル変数は管理が難しいのでなるべく避けたいと
思っています.

よろしくお願いします.

merlo 2002/05/10(金) 07:22:56
追記です,何度もすみません

public:
    double circum_len[100];

をやめて,

public:
    double* circum_len;


コンストラクトで
    circum_len=NULL;
とか
実際に利用する場面で配列作成
    circum_len=new double[100];

って修正したら,問題なくいきました.

この方法は以前から習慣として利用してきたものですが,
なぜ,これでないとダメなのでしょうか(ダメとは言い過ぎで
ケースバイケースかもしれませんが).

クラス宣言時のpublicには,配列を宣言しては
いけないのでしょうか

dairygoods 2002/05/10(金) 09:39:13
クラスメンバに配列があっても問題ありません。
この配列の存在がプログラムの実行に影響するとも思えません。

なにか他の要因があるような気がします。
配列の範囲外に書き込んでプログラムを破壊しているとか。

merlo 2002/05/10(金) 10:13:40
[[解決]]
そうですよね.
別に配列宣言しても問題ないはずですよね・・・

それだけ聞いて安心しました.
ありがとうございました

古いスレッドには追加発言できません。