2013-09-22 92 views
1

我試圖用qsort排序二維數組C中的排序工作的二維數組,但我得到了警告:警告而排序與快速排序

warning: initialization discards 'const' qualifier from pointer target type [enabled by default]

如何修改我的比較功能來消除警告(假定qsort需要的參數const void *pa, const void *pb

int cmp (const void *pa, const void *pb) { 
    const int (*a)[2] = pa; // warning here 
    const int (*b)[2] = pb; // warning here 
    if ((*a)[1] < (*b)[1]) return 1; 
    if ((*a)[1] > (*b)[1]) return -1; 
    return 0; 
} 

我對堆棧溢出閱讀this post,但我仍然不知道我應該如何改變比較功能。

我有一個數組,看起來像這樣:

int letterCount[26][2] = {{0, 0},{1, 0},{2, 0},{3, 0},{4, 0},{5, 0},{6, 0},{7, 0},{8, 0},{9, 0},{10, 0},{11, 0},{12, 0},{13, 0},{14, 0},{15, 0},{16, 0},{17, 0},{18, 0},{19, 0},{20, 0},{21, 0},{22, 0},{23, 0},{24, 0},{25, 0}}; 

除了在第二列中,而不是零的,那些填充有其它數字。我試圖在第二列排序這個二維數組,在0s被填充後。

回答

0

你可以玩弄的decls,但最終我認爲這將足以令比較您正在使用:

int cmp (const void *pa, const void *pb) 
{ 
    const int *a = pa; 
    const int *b = pb; 
    if (a[1] < b[1]) 
     return -1; 
    return (b[1] < a[1]); 
} 

你的數據「項」只不過是int[]抵消了在一個二維數組。如果這是一個指針數組而不是一個真正的二維數組,這將會有很大的不同。 Grijesh非常接近這個,只錯過了[1]補償(和簡單的數學),如果他沒有刪除他的答案來解決它,我會放棄這一點。

+0

請注意,如果數組中的值非常大並且符號相反,那麼使用像這樣的減法會有溢出和隨後的未定義行爲的風險。實際上,這通常不是問題,但要謹慎。使用'return(a [1]> b [1]) - (b [1]> a [1]);'或'可以返回-1,0或+1。或者你可以用等效但更清晰的方式做到:'if(a [1]> b [1])返回+1;否則如果(a [1]

+0

@JonathanLeffler注意和更新。感謝您的關注。 – WhozCraig

+0

爲什麼賦值const int(* a)[2] = pa;'給出警告? – haccks

0

這是應該做什麼(*a)[2]? 它似乎是在一個聲明中取消引用指向數組的指針。 這裏缺乏更好的事情要做,我寫我自己的版本,我希望它會幫助你:

#include <time.h> 
#include <stdio.h> 
    void Qsort(int matrix[][2] , int lenght) 
    { 
     if(!lenght) 
       return; 
     int temp = 0 , pivot , b = 0 , e = lenght - 1 , test = 0; 
     const int MIN =0 , MAX = e; 
     srand(time(NULL)); 
     test = (rand() % (MAX - MIN + 1)) + MIN; 
     pivot = matrix[test][1]; 
     while(b < e) 
     { 
      while(matrix[b][1] < pivot) 
       b++; 
      while(matrix[e][1] > pivot) 
       e--; 
      temp = matrix[b][1]; 
      matrix[b][1] = matrix[e][1]; 
      matrix[e][1] = temp; 
     } 
     Qsort(matrix , b); 
     Qsort(&(matrix)[b + 1] , lenght - 1 - b); 

    } 
+0

目標是通過第二列對二維數組進行排序 – Austin

+0

您在這些行中嘗試做什麼 –

+0

創建大小爲2的數組(因爲我正在對二維數組進行排序),然後比較第二個元素每個 – Austin