[問題] qsort compare 與 strcmp 轉型問題

看板C_and_CPP作者 (策)時間13年前 (2012/03/17 18:34), 編輯推噓0(0016)
留言16則, 3人參與, 最新討論串1/2 (看更多)
qsort 的參數4 沒辦法直接丟 strcmp 進去, 是因為型態的問題嗎?還是兩個 compare 比較對象不同? ---- QSORT(3) FreeBSD Library Functions Manual QSORT(3) void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); STRCMP(3) FreeBSD Library Functions Manual STRCMP(3) int strcmp(const char *s1, const char *s2); ---- 原本的想法是 qsort 的參數 要傳的 compare function 參數型態是 (const void *, const void *) strcmp 的參數型態是 (const char *, const char *) 所以參數要從 void 換成 char 不過不知道怎麼轉型這種函式庫的 function ,所以 Google 出這個: http://twpug.net/docs/ccfaq/node228.html ---- int pstrcmp(const void *p1, const void *p2) { return strcmp(*(char * const *)p1, *(char * const *)p2); } ---- 不過看到這裡,感覺像不只是 void -> char 的問題而已 看很久看不懂 return strcmp(*(char * const *)p1, *(char * const *)p2); 的意義為何..... 網頁好像一堆大陸用語,也看不太懂..... 意思是不是,qsort 和 strcmp 的比較對象不同? 所以要另外生一個用指標指向字串的 compare function? 那行轉型的邏輯也搞不清楚... 另外,這麼看來每次要用 qsort 時 compare function 都要自己寫一個來轉型才行囉? 原本系統裡的函式庫是不是都無法直接塞入 qsort? 抱歉問題很多,謝謝解惑! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.222.191

03/17 18:42, , 1F
void * 是指任何類型的 pointer,而不是 pointer to
03/17 18:42, 1F

03/17 18:42, , 2F
一種叫 "void" 的 type
03/17 18:42, 2F

03/17 20:57, , 3F
所以我的 void -轉型-> char 的想法是錯的囉...
03/17 20:57, 3F

03/18 00:36, , 4F
是的。通常拿到 void*,你直接 cast成你想要的type就行
03/18 00:36, 4F

03/18 00:53, , 5F
你只要記住他傳給你 comparator 的是陣列裡元素的位址
03/18 00:53, 5F

03/18 00:53, , 6F
這樣就比較好知道怎轉了
03/18 00:53, 6F

03/18 03:28, , 7F
陣列裡元素的位址? 意思是要寫個指標幫他傳嗎?
03/18 03:28, 7F

03/18 03:31, , 8F
也就是雖然你在 comparator 裡看到的是 void const *
03/18 03:31, 8F

03/18 03:34, , 9F
但在此例 qsort 丟給 comparator 是一個個 char* 元素
03/18 03:34, 9F

03/18 03:35, , 10F
的位址, 可以看成他呼叫的方法為
03/18 03:35, 10F

03/18 03:36, , 11F
(*compar)( (char*)base+i*size, (char*)base+j*size)
03/18 03:36, 11F

03/18 03:37, , 12F
所以你 comparator 得到兩個指標之後, 為了適當的操作
03/18 03:37, 12F

03/18 03:38, , 13F
它, 還需要轉型成 char * const * 才能轉回正確的型態
03/18 03:38, 13F

03/18 03:38, , 14F
而又不失 constness
03/18 03:38, 14F

03/18 12:04, , 15F
char * const * 是什麼? 為什麼要轉成這個...
03/18 12:04, 15F

03/18 12:04, , 16F
抱歉.Google都只有找到const char* 而找不到我要的 謝謝
03/18 12:04, 16F
文章代碼(AID): #1FP6Z9p7 (C_and_CPP)
文章代碼(AID): #1FP6Z9p7 (C_and_CPP)