- - PR -
構造体配列のソートについて (C++/CLI)
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ); }; |
|
投稿日時: 2007-10-26 23:00
これだけなら問題なくソートできてますが。
どこかで要素に nullptr を代入してたりしませんか? なお、IComparer::Compare には引数に nullptr が含まれる場合の比較についても実装が要求されています。詳しくはヘルプの解説をご覧ください。 それから、System::Collections::Generic::IComparer<T> の方を実装したほうがいいかもしれません。両方実装することも良くありますが。 |
|
投稿日時: 2007-10-27 12:19
回答ありがとうございます。
現状、要素にnullptrは、代入はしておりません。 出来ましたら、IComparer<T>の実装ではなく、 このままの構造体の配列でやりたいのですが、 他に原因があるのでしょうか。 |
|
投稿日時: 2007-10-28 12:27
ソートできましたね。
ここに書いてない部分に何か問題があるんじゃないですか。 新しくプロジェクトを作って、自分の提示したソースを試してみてください。 |
|
投稿日時: 2007-10-28 14:53
回答ありがとうございます。
出来る事がわかっただけでも、嬉しいです。 プロジェクトを再度、作成したのですが、駄目だったので、 その他、クラスの作成方法など、色々変えて試してみたい と思います。 |
|
投稿日時: 2007-10-29 09:54
よく見ると、配列の95番目〜100番目の中にソート結果が格納されていました。
配列の最初に入っていると思い込んでしまっていました。 ソート対象の配列開始位置とソート対象要素数を指定することで出来ました。 Array::Sort( data, 0, 5, myComp ); 色々とお騒がせしてすみません。有り難う御座いました。 |
1