2014-04-10 307 views
6

我的qsort使用stdlib.h中,如何將變量傳遞給函數?

void qsort (void* base, size_t num, size_t size, 
      int (*compar)(const void*,const void*)); 
下列方式

void myfun (float *arr, int n, float c) // value of c is changeable 
{ 
...// some code 
qsort(float *arr, n, sizeof(float), compareme); 
...// some code 
} 

int compareme (const void * a, const void * b) 
{ 
    float tmp = f((float*)a, (float*)b, c); // f is some function, and how can I pass c here? 
    if (tmp < 0) return -1; 
    if (tmp == 0) return 0; 
    if (tmp > 0) return 1; 
} 

我怎樣才能讓ccompareme可用在這裏?

謝謝!

+0

你不能,因爲[tag:C]不是詞法範圍。如果你可以切換到[tag:C++],你可以創建一個包含'c'的比較對象。 –

+0

謝謝,我只能用c – Tim

回答

4

許多人訴諸使用(討厭的)全局變量。

qsort()不包含傳遞給用戶提供的compar()函數的額外的void指針參數太糟糕了。我最終編寫了我自己的qsort()來克服這個限制。

原型:

int myQsort(
    void *arrayBase, 
    size_t elements, 
    size_t elementSize, 
    int(*compar)(const void *, const void *, void *callerArg), 
    void *callerArg 
    ); 

這讓我對各種結構(轉換爲void *)傳遞給我的COMPAR()FN。

+2

如果你確定它是線程本地的,我認爲全局變量可以很好。不可移植的qsort_r http://man7.org/linux/man-pages/man3/qsort.3.html – this

4

如果你碰巧使用的Glibc(即Linux的),你可以使用qsort_r

int compareme (const void *a, const void *b, void *data) 
{ 
    float c = *(float *)data; 
    float tmp = f((float*)a, (float*)b, c); 
    if (tmp < 0) return -1; 
    if (tmp == 0) return 0; 
    if (tmp > 0) return 1; 
} 

然後調用

qsort_r(float *arr, n, sizeof(float), compareme, &c); 

你必須定義預處理宏_GNU_SOURCE包括任何前(例如-D_GNU_SOURCE)來獲得這個功能,它會限制你的程序的可移植性。

否則,您將不得不使用全局或線程本地存儲,或編寫自己的排序函數。