デバックエラー

[戻る]
ゴン太 2002/12/16(月) 15:29:59
ビルドするとエラーはないのですが
実行するとDbug Assetion Failed
とでてしまい実行できません。

tib 2002/12/16(月) 15:34:28
そこになにかのエラーがあるのでしょう。

ビルドが通った位で「正しく動くプログラムが完成した」などと思ってはいけません。ビ
ルドエラーとランタイムエラーの両方をクリアしてください。

assertionの内容が示されていないので解決法は提示のしようがありません。

PAI 2002/12/16(月) 15:53:30
『実行できません』
という言葉は微妙ですね、実行はできています。

実行時に何らかのエラーがあったわけです。

ゴン太 2002/12/16(月) 17:01:55
エラーの内容は

Debug Assertion Failed

program:場所
File afxtempl.h
Line:262

For information on how your program can cause Visual C++
documentation on asserts.

です。

PAI 2002/12/16(月) 17:16:24
おそらく、CArray等を使用する際のセマンティクス的なエラーでしょう。
デバッグ実行し、該当のAssertionで引っかかったところからコールスタックを表示させ、
自分のソースまでさかのぼってロジックをチェックしてください。

いぷ 2002/12/16(月) 17:16:33
> File afxtempl.h
> Line:262

と出てるのですから該当箇所を見てください。
原因がわかると思います。

tib 2002/12/16(月) 17:25:45
afxtempl.h 266行目はVC++ 5, 6のいずれも同じ内容でした。

template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
    { ASSERT(nIndex >= 0 && nIndex < m_nSize);
        return m_pData[nIndex]; }

ASSERT()で引っかかっている、ということは「ASSERTが示す条件に合致していない」とい
うことです。あなたはCArray(もしくはCArrayの派生クラス)に対してElementAt()を呼ん
だものの、その引数に与えた数値は、その時点で範囲外だったということです。

まずは、メニューバー > 表示 > デバッグウィンドウ > コールスタックでコールスタッ
クウィンドウを表示させ、どういう関数を経てそこへ行き着いているかを調べます。自分
が作ったコードに辿り着いたら、そこで引数に何を与えているか、そのときにArrayのサ
イズがいくつになっているか、について調べてください。

ゴン太 2002/12/16(月) 17:31:11
>デバッグ実行し、該当のAssertionで引っかかったところからコールスタックを表示させ、
>自分のソースまでさかのぼってロジックをチェックしてください。

デバックを実行したんですが次のようなことが表示されたんですが

C:\WINDOWS\SYSTEM\MFCO42D.DLL' のシンボルを読み込みました
'C:\WINDOWS\SYSTEM\USER32.DLL' をロードしました、合致するシンボル情報は見つかりませんで
した。
'C:\WINDOWS\SYSTEM\ADVAPI32.DLL' をロードしました、合致するシンボル情報は見つかりません
でした。
'C:\WINDOWS\SYSTEM\GDI32.DLL' をロードしました、合致するシンボル情報は見つかりませんでし
た。
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりません
でした。
'C:\WINDOWS\SYSTEM\MSVCRTD.DLL' のシンボルを読み込みました
'C:\WINDOWS\SYSTEM\MFC42D.DLL' のシンボルを読み込みました
'C:\WINDOWS\SYSTEM\MFC42LOC.DLL' をロードしました、合致するシンボル情報は見つかりません
でした。
'C:\MOUSE\SYSTEM\CCMSGHK.DLL' をロードしました、合致するシンボル情報は見つかりませんでし
た。
'C:\WINDOWS\SYSTEM\IMM32.DLL' をロードしました、合致するシンボル情報は見つかりませんでし
た。
'C:\WINDOWS\SYSTEM\IMEJP98K.DLL' をロードしました、合致するシンボル情報は見つかりません
でした。
'C:\WINDOWS\SYSTEM\COMCTL32.DLL' をロードしました、合致するシンボル情報は見つかりません
でした。
'C:\WINDOWS\SYSTEM\IMEJP98.IME' をロードしました、合致するシンボル情報は見つかりませんで
した。
Detected memory leaks!
<以下省略>
初心者なんでよくわからないのですがおしえてもらえないでしょうか?

メモリ 2002/12/16(月) 17:35:06
メモリリークです。
処理の途中で動的に宣言した変数を開放していますか?
Newなどで宣言している変数を追ってみてください。

PAI 2002/12/16(月) 17:38:44
それはアウトプットウィンドウ。

ASSERTに引っかかったときに
    Press retry to debug the apprication
とかでません?

そのとき再試行を押すと、その状態からデバックできるんで、
そこでtibさんが説明してくれたようにしてみてください

ゴン太 2002/12/16(月) 17:42:05
>処理の途中で動的に宣言した変数を開放していますか?
開放というのは変数をどうしてることをいうのでしょうか?

ゴン太 2002/12/16(月) 17:52:09
PAIさんが書いてくれた通りにすると
黄色の矢印がでて
{ ASSERT(nIndex >= 0 && nIndex < m_nSize);
        return m_pData[nIndex]; }
をさしました。
シンボル名と値のところに
m_nSize    42
+m_pData[nIndex]    {x=-842150451 y=-842150451}
nIndex    42
+this    0x00781fa4 {VCPoint::?$CArray}
とでました。

euro2004 2002/12/16(月) 18:00:07
x,yの値がおかしいような気がしますが大丈夫でしょうか?
とりあえずコールスタックを見てはどうでしょう?
(ウィンドウのツールバーあたりで右クリックして
チェックしてやると見れると思います。)

ゴン太 2002/12/16(月) 18:27:05
理由がわかりました。
CArray<CPoint,CPoint> m_r; で宣言した
ADDで42個の値を追加していて
for文でまわしていたんですが
for(i=0;i<50;i++){
   pDco->m_r[i];
}
としていました。

この50のところを取得することってできるんですか

PAI 2002/12/16(月) 18:33:14
無理です。
42個なら 0 - 41 の42個しかありません。

ゴン太 2002/12/16(月) 18:41:48
すいません。
>この50のところを取得することってできるんですか
 入れた分だけの数を取得するという意味です。

PAI 2002/12/16(月) 18:47:01
CArray::GetSize()

ゴン太 2002/12/16(月) 19:06:56
この場合 全部表示させようとするなら

for(i=0;i<=pDoc->m_r.GetSize;++i){
    pDoc->m_r[i];
}

if文で<=のイコールは必要ですよね?

PAI 2002/12/16(月) 19:12:53
っていうか、ヘルプで調べてやってみればわかるんじゃないですか?

<=のイコールが必要か、必要じゃないか、とかではなくて、やってみて
その意味をちゃんと理解するようにしたほうがいいと思いますよ。

ちなみに、GetSizeで返ってくるのは『要素数』、インデックス0の部分があるんで
返って来た値のインデックスの先には要素はないです。

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