在stdlib.h
,有功能的qsort()的原型聲明:像qsort這樣的C函數如何使用不同的數據類型?
void qsort(void *ptr, size_t count, size_t size,
int (*comp)(const void *, const void *));
顯然,這是一個泛型編程。 我不知道它是如何實現的,如何從void *類型獲取元素?
在stdlib.h
,有功能的qsort()的原型聲明:像qsort這樣的C函數如何使用不同的數據類型?
void qsort(void *ptr, size_t count, size_t size,
int (*comp)(const void *, const void *));
顯然,這是一個泛型編程。 我不知道它是如何實現的,如何從void *類型獲取元素?
void *
指針根據size_t size
(在qsort
的第三個參數)
首先,我們強制轉換的void*
到char*
,然後根據size
(因爲焦炭需要1
字節,從而增加將規模做指針運算鑄造內置的數據類型()
char *ptr = (char*)vp; //here vp is void *p
*(ptr + (n-1)*size); //will give you nth element
:給予正確的指針運算)
編輯
例如
size =1 and want 3rd element it means it will give you 3rd char
size =4 and want 3rd element it means it will give you 3rd int or float
size =2 and want 3rd element it means it will give you 3rd short int
size =8 and want 3rd element it means it will give you 3rd double
注:大小是實現定義,因此可能會發生變化,以編譯器
是的,我想知道的是具體的過程。例如,如何獲得ptr中的第3個元素? –
@PyLion:看我的編輯 – Omkant
最後一個參數是一個函數指針。正如你隱式提到的,你必須在某個地方實現了這個功能。但是,當你實現它時,你確實知道指針的哪個指針實際上是你的void *元素。
在你的補償功能,你要投你的2個參數爲您要使用的指針類型,如下:
int myCompFn(const void * e1, const void * e2)
{
MyType *elem1=(MyType*)e1;
MyType *elem2=(MyType*)e2;
... /* then compare elem1 and elem2 regarding to there definition */
}
#include <stdio.h>
void compare_first_to_rest(void *ptr, size_t nelem,
size_t size, int (*cmp)(const void*, const void*)) {
unsigned i;
for(i = 1; i < nelem; ++i)
{
int res = cmp(ptr, (char*)ptr + i * size);
if(res < 0)
printf("First element is less than element at %u\n", i);
else if(res > 0)
printf("First element is greater than element at %u\n", i);
else
printf("First element is equal to element at %u\n", i);
}
}
int icmp(const void *x, const void *y) {
return *(int*)x - *(int*)y;
}
int main()
{
int x[] = { 5, 3, 6, 2, 4, 8, -1, 10 };
compare_first_to_rest(x, 8, sizeof(int), icmp);
}
正如你所看到的,`compare_first_to_rest」不瞭解它在第一個參數中收到的元素的類型。但是知道每一個的大小,就可以得到一個指向它們每一個的指針,並讓函數指針完成這項工作。
對大多數答案的注意:這個問題是關於如何使用qsort()的** not **,它關於如何使用qsort內部qsort可以找出元素的位置void * – nos