C言語 - MFC - ウィンドウの表示更新 メモを残しておくのだ。
1. CArray を qsort したかったのだよ 本項は、参考サイトがあったのですがデッドリンクになっちゃったのでリンクを削除いたしました。 参考にさせていただいたリンクの作者の方に感謝いたします。 「MFC」というか、「VC++」なんか使いたくないのだが、「Windows」の仕事をしている以上、仕方ない。 「VC++」使っていても、「MFC」使う必要はないんですが、これも、昔からのいきさつでしょうがない。 で、メモリを効率よく使うには、単純な配列を使って最大の領域を使うのはもったいないので「CArray」を使いたいのですが、「qsort」できないもんなと思っていたのですが、結構簡単な方法でできるんですね。 2. コーディングの実際 うまく単純な説明ができればいいのですが・・・。 struct StructHoge { int number; }; てな構造体があるとして CArray <StructHoge, StructHoge> arrayHoge; で配列化します。 昇順にソートするとして下記のような関数を用意しておきます。ここの比較ロジックは仕様によるものを記述するわけです。 int compareHoge(void* context, const void* a1, const void* a2) { StructHoge* p1 = (StructHoge*)a1; StructHoge* p2 = (StructHoge*)a2; if (p1->number != p2->number) { return p1->number - p2->number; } return 0; } 「qsort」の呼び出しを下記のように記述すれば StructHoge* pHoge = arrayHoge.GetData(); qsort_s((LPVOID)pHoge, arrayHoge.GetCount(), sizeof(StructHoge), compareHoge, NULL); うまいことソートできるようです。 「CArray」の「GetData」メソッドで、中身がまるまるもらえて、中身書き換えて「OK」なんですね。 知らなかった。
struct StructHoge { int number; };
CArray <StructHoge, StructHoge> arrayHoge;
int compareHoge(void* context, const void* a1, const void* a2) { StructHoge* p1 = (StructHoge*)a1; StructHoge* p2 = (StructHoge*)a2; if (p1->number != p2->number) { return p1->number - p2->number; } return 0; }
StructHoge* pHoge = arrayHoge.GetData(); qsort_s((LPVOID)pHoge, arrayHoge.GetCount(), sizeof(StructHoge), compareHoge, NULL);