2012-03-31 11 views
0

私は行に依存しない方法でソートしたい構造体の(150x150)2次元配列を持っています。それは構造体なので、私は(私はここで間違っている場合)私はqsort()を使用することはできませんまたは少なくとも私は構造体をパッキングしていると私は比較している要素qsort()の比較プロトタイプ要件に反する二倍です。私はクイックソートを実行すると、さらに調査すると、アプリケーションがハング、Cで2d構造体の配列を整理する問題

for (i=0;i<150;++i) 
    { 
    for (j=0;j<150;++j) 
    { 
    My_array[i][j].x = somethingUseful; 
    My_Array[i][j].y = somethingEquallyUseful; 
    My_Array[i][j].d = CalcD(somethingUseful,somethingEquallyUseful); 
    } 
    qsort(My_Array[i],150,sizeof(my_struct),compare); 
    } 


     int compare(struct my_struct a , struct my_struct b) 
    { 
      return a.d -b.d; 
    } 

:私は私の主な機能 に

struct my_struct { 
    int x; 
    int y; 
    double d; 
}; 
void quicksort(struct my_struct* array,int start, int end) 
{ 

struct my_struct key, Pivot; 
int i,j,PivotPoint; 
if(start< end) 
{ 
    PivotPoint = (start+end)/2; 
    theswap(&array[start], &array[PivotPoint]); 
    key = array[start]; 
    i= start+1; 
    j = end; 
    while (i<=j) 
    { 
     while((i<=end) && (array[i].d <= key.d)) 
      ++i; 
     while ((j>=start) && array[j].d> key.d) { 
      --j; 
      if (i<j) { 
       theswap(&array[i], &array[j]); 
      } 
     } 
    } 
    theswap(&array[start], &array[j]); 
    quicksort(array, start, j-1); 
    quicksort(array, j+1, end); 
    } 
} 
void theswap(struct my_struct *a, struct TourElement *b) 
{ 
struct my_struct t; 
t=*a; 
*a=*b; 
*b=t; 
} 

にクイックソートを適用したいと思いますいずれにせよ、私はこのような何か を持っていますクイックソート機能内に配列の要素がないようです。 (私は、構造体のd値を項目化するためにクイックソートの冒頭にforループprintfを追加し、何も印刷されませんでした)

誰でも私がここで間違っていると特定できますか?コンパイルエラーが発生していません。そして、 "D"は正しく計算されます。

+0

クローズしてください:見知らぬ人に検査によるコード内のエラーを発見させることは生産的ではありません。デバッガやprintステートメントを使用して問題を特定(または少なくとも分離)してから、さらに具体的な質問に戻ってください。ちなみに、あなたは任意の構造体に対して 'qsort'を使用できますが、多くの例があります。 –

+1

['qsort()'](http://port70.net/~nsz/c/c99/n1256.html#7.20.5.2)(「クイックソート」アルゴリズムは必ずしも適用されません)を構造体の配列使い易さのために、あなたの二次元配列は一次元です。 – pmg

+0

OIはqsort()を使用しようとしましたが、実際にはソートしませんでした。しかし、少なくともそれはハングアップしませんでした。上記のコードを編集します。 – TheNewM

答えて

1

あなたコンペア機能のSTD C言語のqsort

void qsort(void *buf, size_t num, size_t size, int (*compare)(const void *, const void *)); 

を使用することができ、このようなものです:lenが配列の長さであるあなたが(qsort関数を呼び出すことができるよりも

int my_struct_comp(const void *p1, const void *p2){ 
    my_struct *mp1 = (my_Struct*)p1; 
    my_struct *mp2 = (my_Struct*)p2; 

    return mp1->d - mp2->d; 
} 

qsort(myarray, len, sizeof(my_struct), &my_struct_cmp); 

+0

はい!ありがとうございました。私の最初の試みdin'tは&従って働いていない。名誉! – TheNewM

関連する問題