ページ 11

CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:07
by ざこ
VC++6.0のMFCでCStringArrayを最近よく使ってるのですが
例えばドロップしてきたファイルとリストビューに表示されているファイルが一致している場合の
処理を考えると
CStringArray xxx;
CStringArray yyy;
int index=-1;
for(int i=0; f<=__argc;i++){
  xxx.Add(__argv);
  while((index=m_list.GetNextItem(index,LVNI_ALL))!=-1){
     CString str=m_list.GetItemText(index,0);
     yyy.Add(str);
  }

  if(xxx==yyy){
     //処理
  }
}

と試しにしてみましたがif(xxx==yyy){ の所でDebug Assertion Failedと出て辿ってみると

_AFXCOLL_INLINE CString& CStringArray::ElementAt(int nIndex)
{ASSERT(nIndex>=0&&nIndex<m_nSize);
return m_pData[nIndex];}


となっておりました。
CStringArray同士の要素比較はできないのでしょうか?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:13
by box
> for(int i=0; f<=__argc;i++){

変数 i の上限のガードがかかっていなくて、
i の値は増えっぱなしであるように見えます。
そんなことはないですか?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:18
by ざこ
すいません
i<=__argc のミスです。
サンプルプログラムを組みながら書いたのでコピペしませんでした。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:21
by Blue
数が一致していますか?

if (xxx.GetSize() != yyy.GetSize()) {
AfxMeesageBox(_T("中身見るまでもなく、ちげぇ"));
}

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:30
by ざこ
あ・・一緒じゃないですね。サイズが同じものしかできないのでしょうか?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:37
by Blue
( ゜Д゜)<ハァ?
サイズが違う=全部が同じになるわけがない

ということではないの?
途中まであっていれば一致している?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:46
by ざこ
あああそういうことですか。そりゃ全部が同じになるわけがないですね。やり方がどうやらおかしいようです。
xxxとyyyの要素が一致している場合の処理をしたいんですけどこの場合どうやったらいいのでしょうか?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:49
by ざこ
しかしサイズが同じでも同じエラーがでますね。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:50
by Blue
そのままなのでは?
bool bSame = true;
if (xxx.GetSize() != yyy.GetSize()) {
	bSame = false;
}
else
{
	for (int i = 0; i < xxx.GetSize(); ++i)
	{
		if (xxx != yyy)
		{
			bSame = false;
			break;
		}
	}
}

// 一致した場合
if (bSame)
{

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:52
by Blue
>しかしサイズが同じでも同じエラーがでますね。
というか、ループの中でAddしているのであれば、タイミングによって同じになったりしますよね。
まずは、追加しながら比較せず、どちらの配列も追加し終わった後に比較しましょう。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 14:55
by ざこ
そういうことでしたか、ヤフーとかで調べてるのですがどうも情報が少なく質問しました。
色々いじくって理解してみます。ありがとうございました。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:13
by ざこ
ああ、やはりサイズが同じじゃないと比較できないのかな。どうもそこがしっくりきません。
xxx[1]=C:\\○
xxx[2]=C:\\△
xxx[3]=C:\\□
xxx[4]=C:\\×

yyy[1]=C:\\+
yyy[2]=C:\\@
yyy[3]=C:\\△
だったときにxxx[4]のときとyyy[3]のときを取り出したい。

ちょっとサンプルプログラム変更してみて
for(int i=1;i<__argc;i++){
  xxx.Add(__argv);
}

while((index=m_list.GetNextItem(index,LVNI_ALL))!=-1){
   CString str=m_list.GetItemText(index,0);
    yyy.Add(str);
}

//両方の配列コレクションの要素格納完了
for(int p=1;p<=c;p++){
  for(int q=0; q<yyy.GetSie();q++){
    if(xxx[p]==yyy[q]){
       //処理
     }
  }
}

でも同じ結果でした。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:15
by ざこ
CStringArrayじゃなくてもそういうことが可能なクラスやメンバ関数を求めてるのですが・・

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:20
by ざこ
あーでもなんか同じことしてるような気もする・・
全部一致しませんよね。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:21
by Blue
一致している項目だけ拾いたいということ?

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:26
by ざこ
そうです。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:39
by バグ
普通に二重ループじゃ駄目なの?(^_^;)

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 15:55
by ざこ
できればCStringArrayで格納しておいて使いたいんです。今後色々つかえそうだしこんなことができるなら
結構幅広がりますしね。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 16:16
by toyo
//両方の配列コレクションの要素格納完了
for(int p=1;p<=c;p++){
  for(int q=0; q<yyy.GetSie();q++){
    if(xxx[p]==yyy[q]){
       //処理
     }
  }
}
やりかたはこの2重ループでよいと思いますが
for(int p=1;p<=c;p++){
は
for(int p = 0; p < (__argc - 1); p++){
でしょう

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 16:17
by バグ
こんな感じ?

cmp1とcmp2が比較用のCStringArrayで、bufにcmp1とcmp2を比較した結果見つかった同じCStringが格納されるようになってます。

ただし、同じデータが2つ以上あった場合にダブって検出されるんで、その辺の抑止は自分で考えてみてください。
void cmpStringArray(CStringArray& cmp1, CStringArray& cmp2, CStringArray& buf)
{
	for (int i = 0; i < cmp1.GetSize(); ++i)
	{
		for (int j = 0; j < cmp2.GetSize(); ++j)
		{
			if (cmp1.GetAt(i) == cmp2.GetAt(j))
			{
				buf.Add(cmp1.GetAt(i));
			}
		}
	}
}

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 16:20
by ざこ
cは__argc-1に置き換えてました。。
しかしそれに直してもやはり同じエラーです。

Re:CStringArrayの要素比較

Posted: 2009年4月02日(木) 16:36
by ざこ
うううむ、pの上限をp<__argc-1ではなく
p<xxx.GetSize()にしたらエラーでなくなりました。
中身みたら同じ値でしたが、これは何かおかしいのでしょうか?