2013-12-09 2 views
0

Я все еще получаю ошибку lldb, потому что я, вероятно, получаю доступ к памяти, которой я не должен. Похоже, что я делаю что-то неправильно при манипулировании параметрами в io_seg_sort, потому что перед вызовом qsort все еще в порядке.C++ qsort 2D-массив

#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: проблема я получаю некоторые случайные значения в io_seg_sort при вызове cout вместо того, что я ожидал. inputs[i] является членом класса int inputs[IO_SEG][2];

+4

Почему бы не использовать уровень C++ ** 'std :: sort' ** из' algorithm'? –

+0

Какова связь между IO_SEG и IO_SEG_IMAX? – Moberg

+0

@Moberg это означает IO_SEG_INDEX_MAX – Krab

ответ

1

Основная причина, по которой ваш код печатает мусор, заключается в том, что у вас есть несоответствующие уровни косвенности внутри функции сравнения. Ваш массив temp, который вы передаете qsort, состоит из указателей в двухэлементных массивах. Это означает, что внутри функции сравнения вы фактически получаете указатели для указателей до 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::vector и std::sort.

+0

у меня есть #define IO_SEG_IMAX (IO_SEG - 1) sry, я добавлю его – Krab

+0

Я предполагаю, что другой вопрос, то есть у вас на самом деле есть входы IO_SEG, или может количество входов меняется? Я не вижу никакой другой ошибки в коде, который вы предоставили. –

+0

Я добавил дополнительную информацию, если это может помочь – Krab

Смежные вопросы