- PR -

構造体配列のソートについて (C++/CLI)

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/08/28
投稿数: 18
投稿日時: 2007-10-26 13:58
VS2005でC++/CLIを使っています。

構造体配列のソートをやりたいのですが、うまくいきません。
デバッグすると「Compare」の第1引数にはデータが入っていま
すが、第2引数のデータは未定義となって、比較が出来ません。
何か処理が間違っていましたら、ご指摘をお願い致します。

-------------------------------
Form1.h
-------------------------------
  ref struct INF_D
  {
    int     no;    // No.
    String^ name; // 名前
    String^ add;  // 住所
  };

  data = gcnew array<INF_D^>( 100 );
  for(int c=0; c<100; c++ ){
    data[ c ] = gcnew INF_D();
  }

  data[0]->no   = 3;
  data[0]->name = "鈴木";
  data[0]->add   = "鹿児島";

  data[1]->no   = 5;
  data[1]->name = "田中";
  data[1]->add   = "青森";

  data[2]->no   = 4;
  data[2]->name = "高木";
  data[2]->add   = "愛知";

  data[3]->no   = 2;
  data[3]->name = "佐々木";
  data[3]->add   = "和歌山";

  data[4]->no   = 1;
  data[4]->name = "藤本";
  data[4]->add   = "新潟";

  IComparer^ myComp = gcnew AAAClass();
  Array::Sort( data, myComp );

-------------------------------
AAAClass.cpp
-------------------------------
  int AAAClass::Compare( Object^ x, Object^ y ) ←←←この第2引数
  {
    test::Form1::INF_D^ t_X = (test::Form1::INF_D^)x;
    test::Form1::INF_D^ t_Y = (test::Form1::INF_D^)y;

    if( t_X->no == t_Y->no ){
      return ( 0 );
    }else if( t_X->no < t_Y->no ){
      return ( -1 );
    }else{
      return ( 1 );
    }
  }

-------------------------------
AAAClass.h
-------------------------------
ref class AAAClass: IComparer
{
public:
  AAAClass(void);

  virtual int Compare( Object^ x, Object^ y );
};
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-10-26 23:00
これだけなら問題なくソートできてますが。
どこかで要素に nullptr を代入してたりしませんか?

なお、IComparer::Compare には引数に nullptr が含まれる場合の比較についても実装が要求されています。詳しくはヘルプの解説をご覧ください。
それから、System::Collections::Generic::IComparer<T> の方を実装したほうがいいかもしれません。両方実装することも良くありますが。
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2007-10-27 12:19
回答ありがとうございます。

現状、要素にnullptrは、代入はしておりません。

出来ましたら、IComparer<T>の実装ではなく、
このままの構造体の配列でやりたいのですが、
他に原因があるのでしょうか。

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-10-28 12:27
ソートできましたね。
ここに書いてない部分に何か問題があるんじゃないですか。
新しくプロジェクトを作って、自分の提示したソースを試してみてください。
おしろ
会議室デビュー日: 2007/10/27
投稿数: 14
投稿日時: 2007-10-28 14:53
回答ありがとうございます。

出来る事がわかっただけでも、嬉しいです。

プロジェクトを再度、作成したのですが、駄目だったので、
その他、クラスの作成方法など、色々変えて試してみたい
と思います。
未記入
会議室デビュー日: 2007/08/28
投稿数: 18
投稿日時: 2007-10-29 09:54
よく見ると、配列の95番目〜100番目の中にソート結果が格納されていました。
配列の最初に入っていると思い込んでしまっていました。

ソート対象の配列開始位置とソート対象要素数を指定することで出来ました。
Array::Sort( data, 0, 5, myComp );

色々とお騒がせしてすみません。有り難う御座いました。
1

スキルアップ/キャリアアップ(JOB@IT)