2017-10-14 12 views
0

Disons que j'ai une structure appelée Student.qsort() - compare le paramètre de fonction

typedef struct student { 
    int age; 
    char name[10]; 
} Student; 

Et j'ai un tableau de pointeurs aux étudiants.

Student *a[10]; 

J'ai besoin de trier le tableau par les noms des étudiants. J'ai donc écrit la fonction de comparaison:

int compare(const void *a, const void *b){ 
    Student *temp1=*(Student **)a; 
    Student *temp2=*(Student **)b; 
    return strcmp(temp1->name, temp2->name); 
} 

Ensuite, je dois la fonction pour trier:

void SortArray(Student *a[], int len){ 
    qsort(a, len, sizeof(Student *), *compare*); 
    printArray(a); 
} 

La dernière partie du qsort est ce que je ne comprends pas. J'ai vu quelques messages où ils ont écrit &compare, et d'autres où ils ne l'ont pas fait. Seulement quand j'ai utilisé &compare cela a fonctionné. Comment savoir si utiliser & ou non?

+2

Les fonctions sont similaires à des tableaux dans un sens: Si la fonction est utilisée quand un pointeur sur une fonction, il va * décroître * à un pointeur. Il est généralement sûr d'utiliser par exemple.'comparer 'seulement, mais je vous recommande d'utiliser' & compare' pour le rendre plus explicite pour les lecteurs du code. –

+4

Vous n'avez pas besoin de décoration, il suffit de passer 'compare'. – Amit

+0

'& & compare' est explicite/lisible exactement de la même manière' & array [0] 'est: confus et gratuitement gratuit pour quiconque connaît la langue. Utilisez simplement 'compare' ou' array'. Notez que ** chaque fois que vous appelez une fonction **, comme dans func (x) ', le nom' func' se décompose en un pointeur car l'opérateur '()' (appel de fonction) requiert un pointeur de fonction comme opérande . –

Répondre

1

Comme le nom de la fonction référencée à la fonction, vous pouvez utiliser le nom de la fonction. En outre, comme mentionné dans les commentaires, & est ok pour faire référence aussi.

0

Avez-vous essayé d'appeler la fonction comme par exemple :)

qsort(a, len, sizeof(Student *), ***********compare); 

ou comme

qsort(a, len, sizeof(Student *), &***********compare); 

Selon la norme C (6.3.2.1 lvalues, les tableaux et les désignateurs de fonction)

4 Un désignateur de fonction est une expression qui a un type de fonction. Sauf quand il est l'opérande de l'sizeof operator65) ou l'opérateur unaire & , un identifiant de fonction de type « » Type de fonction renvoyant « » est converti en une expression est de type « » pointeur vers fonction renvoyant type » '.

Ainsi, dans cette expression

***********compare 

la désignateur fonction compare est implicitement convertie pour fonctionner pointeur puis en appliquant le déréférencement est à son tour converti au type de fonction, puis de nouveau fonctionner pointeur et ainsi de suite.

Bien sûr, vous pouvez spécifier explicitement &compare bien que cela ne soit pas nécessaire.

Voici un programme démonstratif

#include <stdio.h> 

void f(void) 
{ 
    puts("Hello eitanmayer"); 
} 

void g(void f(void)) 
{ 
    f(); 
} 

int main(void) 
{ 
    g(&******f); 
} 

Sa sortie est

Hello eitanmayer 

Le problème avec votre code peut être ailleurs.