2016-06-01 12 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); 
} 

を比較My機能:

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

次のように、2つのテストが非常に不必要であるため、 'cmp'関数は単純になります(2つの等価テスト)。この関数は4つのテストしか必要とせず、現在実行されていない最終的な 'return 0'があります。 'else'も必要ではありません。 –

+0

@ WedVaneええ、あなたの権利はありがとう! –

+0

私がニットピッキングをしている間に、 'cmp'関数は各初期化から' - '0'を取り除くことによって少し速くなります - あなたはまだ有効な比較をしています。 –

答えて

3

あなたausgabesortiert関数の宣言

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

は明らかに、配列arrはオブジェクトポインタstruct raeumeオブジェクトを含み、オブジェクト自体は含まないことを示しています。

しかし、あなたはarr[0]場所から始まりstruct raeumeオブジェクト自体の配列をソートしようとしているかのようにqsort

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

と比較関数の呼び出しが書かれています。

正式に無効なものはありませんが、それでもやはり奇妙に見えます。これは本当にあなたの意志ですか?何を正確に並べ替えようとしていますか?配列arrまたはarr[0]が指す別の配列?私はそれが前者であると思われます。その場合は、qsort呼び出しと比較機能を修正する必要があります。

+0

それを教えてくれてありがとう。 –

関連する問題