2013-12-09 146 views
0

我仍然lldb錯誤,因爲我可能訪問的內存,我不應該。 看起來我在使用io_seg_sort中的參數進行操作時出錯,因爲在調用qsort之前,它仍然可以。C++ qsort二維數組

#define IO_SEG_IMAX (IO_SEG - 1) 

    static int io_seg_sort (const void * seg1, const void * seg2) { 

      int * _seg1 = (int *)seg1; 
      int * _seg2 = (int *)seg2; 

      cout << _seg1[1] <<endl; // this gives some random values and not what i am expecting 

      if (_seg1[1] > _seg2[1]) { 
       return 1; 
      } 
      else if (_seg1[1] < _seg2[1]) { 
       return -1; 
      } 
      else { 
       return 0; 
      } 

     } 


      int **temp = new int *[IO_SEG]; 

      for (int i = 0; i <= IO_SEG_IMAX; i++) { 
       temp[i] = new int[2]; 
       memcpy(temp[i], inputs[i], sizeof(int) * 2); 
      } 


      qsort(temp, IO_SEG, sizeof(int *) , io_seg_sort); 

EDIT1:這個問題是調用的cout,而不是我所期待的時候我得到的一些io_seg_sort隨機值。 inputs[i]是班級成員int inputs[IO_SEG][2];

+4

爲什麼不從'algorithm'使用C++級別的'std :: sort' **? –

+0

IO_SEG和IO_SEG_IMAX之間的關係是什麼? – Moberg

+0

@Moberg這意味着IO_SEG_INDEX_MAX – Krab

回答

1

您的代碼打印垃圾的主要原因是您在比較函數內部存在不匹配的間接級別。您傳遞給qsorttemp陣列由指針組成,指向兩元素陣列。這意味着在比較函數中您實際上會收到指針指向int。即這已經是不正確

static int io_seg_sort (const void * seg1, const void * seg2) { 

     int * _seg1 = (int *)seg1; 
     int * _seg2 = (int *)seg2; 

     cout << _seg1[1] <<endl; 

你要做像

static int io_seg_sort (const void * seg1, const void * seg2) { 

     const int * _seg1 = *(const int *const *) seg1; 
     const int * _seg2 = *(const int *const *) seg2; 

東西通過_seg1_seg2以訪問您的數組作爲你的io_seg_sort身體做(我還添加了一些const預選賽,儘管它們並不是代碼工作所必需的。)

3

您正在將IO_SEG_MAX + 1項放入長度爲IO_SEG的數組中。

for (int i = 0; i <= IO_SEG_IMAX; i++) { 
     temp[i] = new int[2]; 
     memcpy(temp[i], inputs[i], sizeof(int) * 2); 
    } 

這應該是:

for (int i = 0; i < IO_SEG; i++) { 
     temp[i] = new int[2]; 
     memcpy(temp[i], inputs[i], sizeof(int) * 2); 
    } 

但如果你真的打算做這在C++,你應該看看std::vectorstd::sort

+0

我有#define IO_SEG_IMAX(IO_SEG - 1)sry我會加它 – Krab

+0

我猜另一個問題,那麼你是否確實有IO_SEG輸入,或者可以輸入數量有所不同?我在您提供的代碼中看不到任何其他錯誤。 –

+0

我添加了一些信息,如果它可以幫助 – Krab