関数内のCArry変数はうまくいくのですが、メンバ変数のCArry変数はうまく働きません

[戻る]
はまち 2002/04/21(日) 20:00:08
ドキュメントの派生クラスCXXXDocクラスの中でCArrayクラスのオブジェクトを下のように宣言
しています。

class CXXXDoc : public CDocument
{

private:
   CArray<CString, CString&> m_stringA;

}

同じCXXXDocクラスの関数の中でこの変数のAdd関数を使おうと思っているのですが
エラーになってしまいます。下のように同じ関数内で宣言した変数ではうまくAdd関数が
働いているようですが、その下のメンバ変数のAdd関数では止まってしまいます。

void CXXXDoc::ZZZ()
{

CString s;
CArray<CString, CString&> stringA;
        
stringA.Add(s);
m_stringA.Add(s);//ここで止まってしまいます.

}

何かおかしなところがあるのでしょうか。よろしくお願いします。
環境はWin98SE, VC++6.0です。

クリリン 2002/04/22(月) 09:27:33
どうも、クリリンです。


CArray<CString, CString&> の[&]を取り除いてください。
動作確認したソースです。

CString s = "ABC";
CArray<CString, CString> stringA;
        
stringA.Add(s);
m_stringA.Add(s);  
m_strA = m_stringA[0]; // エディットボックスに表示
UpdateData(FALSE);

クリリン 2002/04/22(月) 09:30:08
すいません。&が付いていても動作しました。

[E-Mail] 2002/04/22(月) 09:32:20
ご参考ですが、
CStringArray っていうのもあります。

はまち 2002/04/22(月) 10:27:43
クリリンさん、んさん、いつもすみません。お返事ありがとうございました。

CStringArrayというのもあるのですね。知りませんでした。まだ、どうしてCArrayがうまく
いかないのかわかりませんが、こちらもいっしょに調べてみようと思います。

dairygoods 2002/04/22(月) 10:38:39
> 働いているようですが、その下のメンバ変数のAdd関数では止まってしまいます。

働いている、止まってしまうとは、
1)コンパイルできない
2)コンパイルできるが実行中に落ちる
3)コンパイルできるが実行中に固まってしまう
のどれとも取れるあいまいな表現なので、具体的に示しましょう。
そして、止まってしまったときのエラーメッセージを掲示すると、
適切な回答が得られると思いますよ。

で、上記のソースを見たところでは、
m_stringA は private で宣言されているので、
他のクラスからはアクセスできません。

はまち 2002/04/22(月) 10:45:33
以前、んさんとクリリンさんもCArrayについて話合われていると思いますが、

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200202/02020056.txt

こののなかで、んさんが

>CString str = aaa[0].a ; // 取得例

となっていると思いますが、これはどうやって取得しているのでしょうか。。operator
関数の[]演算子を使って取得しているということでしょうか。もしよかったら教えてください
。よろしくお願いします。

はまち 2002/04/22(月) 10:48:03
daiarygoodsさん、お返事ありがとうございます。早速調べてみます。

クリリン 2002/04/22(月) 11:02:04
おそらく、
>CString str = aaa[0].a
CString str = m_aaaArray[0].a
の記述ミスです。

クリリン 2002/04/22(月) 11:06:46
話はずれるかも知れませんが、
vector(ベクトル)を使用する方法もあります。
これを使うと、MFCに依存しない動的配列が使用できます。
結構、便利な機能がありますよ!

不良PG 2002/04/22(月) 11:06:50
>CString str = aaa[0].a ; // 取得例
>
>となっていると思いますが、これはどうやって取得しているのでしょうか。。operator
>関数の[]演算子を使って取得しているということでしょうか。もしよかったら教えてください
>。よろしくお願いします。
その通りだと思います

クリリン 2002/04/22(月) 11:16:40
さらにミスです
>CString str = m_aaaArray[0].a
は
CString str = m_aaaArray.GetAt(0).a;
でした。
すいません。

クリリン 2002/04/22(月) 11:21:16
CString str = m_aaaArray[0].a
CString str = m_aaaArray.GetAt(0).a;
どちらでも、出来ます。すいません。

不良PG 2002/04/22(月) 11:21:37
>その通りだと思います
よく読んでませんでした
間違いです m( _ _ )m

はまち 2002/04/22(月) 23:18:40
クリリンさん、不良PGさん、とんでもないです。こちらこそいろいろやってもらって
申し訳なく思います。
やっぱり、
>CString str = m_aaaArray[0].a
はoperator関数なんですね。こんな使い方ができるとは驚きです。クリリンさんの言うvector
も面白そうですね。特に、
>結構、便利な機能がありますよ!
にはそそられます。早速、書店でチェックしてみようと思います。ところで、質問の件ですが
m_stringA をpublicで宣言してもやってみたのですが、うまく行きません。
デバッグでステップオーバーしていくと、

void CXXXDoc::ZZZ()
{

     CString s;
     CArray<CString, CString&> stringA;
        
   stringA.Add(s);
⇒  |m_stringA.Add(s);

}

とここまで進んできます。ここでステップインすると、

template<class TYPE, class ARG_TYPE>
AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
⇒|    { int nIndex = m_nSize;
        SetAtGrow(nIndex, newElement);
        return nIndex; }

とCArray内部に入るようですが、もう一度ステップインすると、
「ハンドルされていない例外はXXX.exeにあります。:0XC0000005:Access Violation。」
の表示が出てきてしまいます。すぐ上の関数内で宣言したものと何が違うのか思案に暮れて
いるのですが、まだわかりません。
 もし、どなたか、心当たりがある方がいればよろしくお願いします。

kazuma 2002/04/23(火) 00:20:50
CXXXDoc::ZZZ の呼び出し側がまずいのでは?
例えば pDoc->ZZZ(); とかやっていて、pDoc が変なところをさしているとか。
呼び出し側のソースはどうなってるんでしょうか?

はまち 2002/04/23(火) 01:32:24
[[解決]]
kazumaさん、お返事ありがとうございました。まさにkazumaさんの仰る通りでした!
実は、pDoc->ZZZ(); はCMainFrameのOnTimer(UINT nIDEvent)ハンドラ関数内で

CXXXDoc* pDoc = (CXXXDoc*)GetActiveDocument();
pDoc->ZZZ(); 

としていたのですが、実は、今回からMDIでプログラムを作ったばかりで、てっきりSDIと同じ
ようにすればいいのかと思っていました。正しくは、CChildFrame内で行わなければならなか
ったのですね。これでやっと次の段階に進めそうです。kazumaさん、ありがとうございまし
た!

初めからMDIと一言書いておけばよかったのですが、てっきり、CArrayに原因があるのだと思
い、まさかMDIが関係があるとは思いませんでした。クリリンさん、んさん、dairygoodsさん、
不良PGさん、ご面倒をお許しください。

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