typedef struct {
        char *name;
        char type;
        long size;
} NODE;
class CloudUploadMenu : public DGContainerMenu
{
public:
.... 略 .....

private:
.... 略 .....
        vector dir_node;

private:
.... 略 .....
        static int CompareData(const void *, const void *);
};
int CloudUploadMenu::GetDirFile(char *path)
{
.... 略 .....
        qsort(&dir_node[0], dir_node.size(), sizeof(NODE*), CompareData);
        return 0;
}

int CloudUploadMenu::CompareData(const void *a, const void *b)
{
        if ((*((NODE**)a))->type == (*((NODE**)b))->type)
                return(strcmp((*((NODE**)a))->name, (*((NODE**)b))->name));
        else
                return((*((NODE**)a))->type - (*((NODE**)b))->type);
}
void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

重點

  • vector 不要用指標變數,不知為啥就是有問題。
  • compare function 需要宣告成 static,因為它是函數指標。
  • base 指向 vector 的第一個元素。
  • num 指向 vector 的 size。
  • size 則取 vector 型別T的大小。
  • 記得不要用 vector.at() 來取得第一筆資料,因為當 size=0 會造成當機。
  • 看別人的文章說 std::sort 的速度比 qsort 快,而且也比較符合 vector 的用法,但是剛好我的 embeded linux 沒支援,所以就沒實做了。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()