2017-10-10 8 views
0

Je viens de commencer à apprendre C et je suis encore jeune. Dans ce programme, je travaille avec un éventail de structures. Les structures sont:Utiliser qsort() avec Structs

typedef struct { 
    int day; 
    int month; 
    int year; 
} Date; 

typedef struct { 
    int serial_num; 
    char full_name[15]; 
    Date *pDate; 
} Person; 

La matrice est Person *people.

Maintenant, j'ai deux tableaux de personnes et les dates de naissance de ces personnes (même index):

const char* names[MAX] = { "Sasson_Sassoni", "Pooh", "James_Bond", "Elvis_is_Alive", "Shilgiya", "Cleopatra", "Sissoo_VeSimmhoo" }; 

const int dates[MAX][COLS] = { 
     { 10, 1, 1988 }, 
     { 12, 12, 1948 }, 
     { 4, 12, 1970 }, 
     { 11, 11, 1890 }, 
     { 11, 11, 1948 }, 
     { 1, 10, 1213 }, 
     { 12, 11, 1948 } 
    }; 

En utilisant switch case, chaque fois que les types d'utilisateur 1 une personne à partir des listes (nom et date de naissance) est ajouté à la liste people. Ensuite, si l'utilisateur tape 3, la liste people doit être triée par date (du plus ancien au plus jeune). Donc, je l'ai écrit les deux fonctions suivantes:

void sortList(Person **people, int index) { 
    qsort(*people, index, sizeof(Person), intcmp); 
} 
int intcmp(const void *a, const void *b) { 
    Person *one = (Person *)a; 
    Person *two = (Person *)b; 
    int year1 = one->pDate->year; 
    int year2 = two->pDate->year; 
    int month1 = one->pDate->month; 
    int month2 = two->pDate->month; 
    int day1 = one->pDate->day; 
    int day2 = two->pDate->day; 
    if (year1 > year2) 
     return -1; 
    else if (year2 > year1) 
     return 1; 
    if (month1 > month2) 
     return -1; 
    else if (month2 > month1) 
     return 1; 
    if (day1 > day2) 
     return -1; 
    else if (day2 > day1) 
     return 1; 
    return 0; 
} 

Mais chaque fois que je reçois une erreur disant:

Exception thrown: read access violation. 
one->pDate was nullptr. 

Toute aide? Merci! Explication supplémentaire: Afin d'insérer les personnes dans le tableau un par un, j'ai créé une variable appelée index et chaque fois qu'une personne est ajoutée, l'index augmente de un. Donc, lors de l'appel de la fonction qsort(), index est le nombre de personnes dans le tableau. Aussi MAX=7, COLS=3, LEN=10. La fonction qui ajoute les gens au tableau est le suivant:

void addToList(Person **people, int *index, const char *names[MAX], const int dates[][COLS]) { 
    people[*index] = (Person *)malloc(sizeof(Person)); 
    people[*index]->serial_num = *index + 1; 
    strcpy(people[*index]->full_name, names[*index]); 
    Date *temp = (Date *)malloc(sizeof(Date)); 
    temp->day = dates[*index][0]; 
    temp->month = dates[*index][1]; 
    temp->year = dates[*index][2]; 
    people[*index]->pDate = temp; 
    printf("%d %s  %d/%d/%d \n", people[*index]->serial_num, people[*index]->full_name, people[*index]->pDate->day, people[*index]->pDate->month, people[*index]->pDate->year); 
    *index = *index + 1; 
} 
+0

S'il vous plaît fournir un [mcve]. Quelle est la valeur de 'index' par exemple, qu'est ce que' people'? – Stargateur

+0

montrez-nous le code qui remplit le tableau 'people' –

+0

Désolé, ajouté les variables et la fonction qui peuple' people'. – eitanmayer

Répondre

2

Votre mcve n'est pas complète, mais je pense qu'il est parce que vous confondez le pointeur et struct:

void sortList(Person **people, int index) { 
    qsort(people, index, sizeof(Person *), intcmp); 
    // or qsort(people, index, sizeof *people, intcmp); 
} 

int intcmp(const void *a, const void *b) { 
    const Person *one = *(const Person **)a; 
    const Person *two = *(const Person **)b; 
+0

Wow qui a fonctionné! J'ai été bloqué sur cela un moment, merci! – eitanmayer

+0

BTW, bon usage de 'const' et ne pas utiliser' Person * one = * (Personne **) a; ' – chux