2016-03-26 21 views
-1

Bir dizi yapısal kayıt ayırmaya çalışıyorum. Bazı sebeplerden dolayı çekirdek bir döküntü oluşmaya devam ediyor.C iç içe geçmiş yapıların dizisi dizisi

Aynı şeyi bir dizi ints veya struct ile yapmayı denediğimde, gayet iyi çalışıyor. Ancak iç içe geçmiş yapıları kullanmaya başladığımda, çekirdek dökümüne başlar.

akım çıkışı:

Before sorting 
first last 0 
first last 1 
first last 2 
first last 3 
first last 4 
first last 5 

AFTER sorting 
Segmentation fault (core dumped) 

Derleyici:

list=malloc(6*sizeof(record*));

böylece geçmesi gerekiyor: Cygwin

typedef struct { 
    char last[NAMESIZE]; /* last name (1 word) */ 
    char first[NAMESIZE]; /* first name (1 word) */ 
} name; 

typedef struct { 
    name name; 
    int score; /* score (between 0 & 100 inclusive) */ 
} record; 

int compare (const void * a, const void * b){ 
    const record *recordA = (record *)a; 
    const record *recordB = (record *)b; 
    printf("%d: %d", recordA->score, recordB->score); 
    return (recordB->score - recordA->score); 
} 

int main(){ 
    record ** list; 
    int i; 
    list=malloc(6*sizeof(record*)); 
    printf("Before sorting\n"); 
    for(i=0; i<6; i++){ 
     list[i]=malloc(sizeof(record)); 
     strcpy(list[i]->name.first,"first"); 
     strcpy(list[i]->name.last,"last"); 
     list[i]->score=i; 
    } 
    for (i=0; i<6; i++){ 
     printf ("%s %s %d\n",list[i]->name.first, list[i]- >name.last,list[i]->score);   
    } 

    printf("AFTER sorting\n"); 
    qsort (list, 6, sizeof(record), compare); 
    for (i=0; i<6; i++){ 
     printf ("%s %s %d\n",list[i]->name.first, list[i]- >name.last,list[i]->score);   
    }  
    return 0; 
} 
+0

Kodunuzda 'struct struct 'diziniz yok. Yapı kaydına * bir dizi * işaretçiniz var. Ve bu, qsort'a çalıştığınız şey. Yani, kodunuzdaki diğer her şey buna göre yeniden yazılmalıdır. 'Qsort' yanlış diyorsunuz. Karşılaştırma fonksiyonunuz yanlış. – AnT

cevap

0

listrecord 6 işaretçiler bir dizidiriçin aynı boyutta 210.

qsort (list, 6, sizeof(record), compare);

qsort (list, 6, sizeof(record*), compare); 

veya daha iyisi ben bir şey açık ilk answer.But katılıyorum ediyorum

qsort (list, 6, sizeof(*list), compare); 
0

sen ( qsort kullanmayın gerektiğidir olmalıdır list, 6, sizeof (kayıt), karşılaştır), burada, kayıt(), toplam bayt kayıtlarını döndürür, ancak adın kullandığı baytları otomatik olarak saymaz. veya qsort (liste, 6, sizeof (kayıt), karşılaştırın), burada, bir işaretçi olduğu için, boyut (kayıt) 4 baytlık kayıt * döndürecektir. Bunun yerine, belki de sadece kendi baytınız tarafından baytları saymalı ve veri yapısı kaydınızda

0

başka bir veri eklemelisiniz. İki kayıt için bir karşılaştırma işleviniz varsa, bunları bir işaretçiye atamak istiyorsunuz bir reklama işaret eden bir sabite.

Qsort'unda, kayıt listesi veri yapısına geçtiğinizi tahmin ediyorum, bu nedenle öğe sayısı sizin kullanımınız olacaktır.

/*Comparison function: Score ascending only.*/ 
int cmp_sasc(const void *p, const void *q){ 
    record * const *pp = p; 
    record * const *qq = q; 
    return (*pp)->score - (*qq)->score; 
} 
+0

Neden onları bir göstericiye bir kaydı işaret eden bir sabite atamam gerekiyor? Void * 'i uygun işaretçiye dönüştürmek için karşılaştırma işlevindeki bir göstericiye atamak değil mi? – macchagreen