2016-06-01 3 views
1

Так что я застрял с этой функцией сортировки, потому что все, кажется, отлично работает, когда я отлаживаю ее, и нет никаких ошибок или предупреждений, что бы это ни было, но это каким-то образом застревает в бесконечном цикле.qsort бесконечный цикл вызывает ошибку C

Моя структура (если это поможет):

typedef struct raeume{ 
char number[5]; 
char klasse[6]; 
int tische; 
}raeume; 

мой старт функции QSort:

void ausgabesortiert(struct raeume *arr[],int used,int size) 
{ 
    qsort(*arr,size,sizeof(raeume),cmp); 
    ausgabesortiert(arr,size,used); 
} 

Моя функция сравнения:

int cmp(const void * a, const void * b) 
{ 
    raeume *raumA = (raeume *) a; 
    raeume *raumB = (raeume *) b; 
    int tempA = raumA->klasse[0] - '0'; 
    int tempB = raumB->klasse[0] - '0'; 
    if(tempA < tempB) 
    { 
     return -1; 
    } 
    else if(tempA > tempB) 
    { 
     return 1; 
    } 
    else if(tempA == tempB) 
    { 
     if(raumA->tische > raumB->tische) 
     { 
      return -1; 
     } 
     else if(raumA->tische < raumB->tische) 
     { 
      return 1; 
     } 
     else if(raumA->tische == raumB->tische) 
     { 
      return 0; 
     } 
    } 
    return 0; 
} 
+0

Кроме того, функция 'cmp' может быть проще, поскольку два теста совершенно не нужны (2 теста равенства). Функция требует только 4 теста с окончательным 'return 0', который в настоящее время не выполняется. Ни один из '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

@WeatherVane да, ваше право, спасибо! –

+0

И хотя я не собираюсь выбирать, функция 'cmp' может быть немного быстрее, удалив' - '0' 'из каждой инициализации - вы все равно будете делать достоверные сравнения. –

ответ

3

Декларация вашей ausgabesortiert функции

void ausgabesortiert(struct raeume *arr[],int used,int size) 

ясно указывает, что массив arr содержит указатели до struct raeume объекты, а не сами объекты.

Но призыв к qsort

qsort(*arr,size,sizeof(raeume),cmp); 

и функция сравнения записываются так, как будто вы пытаетесь сортировать массив из struct raeume самих объектов, который начинается в arr[0] месте.

Хотя в этом нет ничего формально недействительного, оно все еще выглядит довольно странным. Это действительно ваше намерение? Что именно вы пытаетесь сортировать, снова? Массив arr или какой-либо другой массив, на который указывает arr[0]? Я подозреваю, что это первый, и в этом случае вам нужно исправить функцию вызова и сравнения .

+0

Спасибо, что сказал мне это. –

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