2. C言語/MFC CArray を qsort する

 
 いきなりぶっとんだ話になるが、必要にメモを残しておくのだ。いずれどこかに移します。
2.1 CArray を qsort したかったのだよ
2.2 コーディングの実際

2.1 CArray を qsort したかったのだよ

 本項は「CArrayをqsortする | 思い立ったが吉日」を参考にさせていただきました。  MFC というか VC++ なんか使いたくないのだが、Windows の仕事をしている以上、仕方ない。  VC++ 使っていても MFC 使う必要はないんですが、これも、昔からのいきさつでしょうがない。  で、メモリを効率よく使うには、単純な配列を使って最大の領域を使うのはもったいないので CArray を使いたいのですが、qsort できないもんなと思っていたのですが、結構簡単な方法でできるんですね。

2.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 なんですね。知らなかった。