qsort(tab,50,sizeof(struct individu),compare);
Et elle ne prend pas d´argument cette fonction?
il faut mettre & ( pas besoin de mettre les arguments, c´est pas le problème ( enfin, je crios pas)).
en effet y pas besoin de mettre d´argument a compare
le proto exact c´est :
int _cdecl compare(const void *ii, const void *_jj);
normalement avec ca le warning s´en ira
par contre un petit conseil pour l´avenir, codez votre propre qsort parceque c´est loin d´être rapide comme méthode ( malgré son nom)
c´est pratique mais pas super optimisé
Mais c´est quoi int _cdecl ? ![]()
c´est un type ?
ça sert a quoi?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core___cdecl.asp
je l´ai taper comme ça et ça:
int __cdecl compare(void *ii,void *jj){
struct individu *i=(struct individu*)ii;
struct individu *j=(struct individu*)jj;
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
et ça me met ces erreur:
exo1.c:41: error: parse error before " compare"
exo1.c: In function `main´:
exo1.c:65: warning: passing arg 4 of `qsort´ from incompatible pointer type
tu utilises quoi, DevCpp ou VisualC++ ?
j´utilise linux et le comilateur gcc
humm ah bin vi alors ca va peut être pas marcher . .. d´après le msdn _cdecl c´est un truc spécifique microsoft je sais pas quel est l´équivalent pour gcc
ya pas une doc sur qsort ? doit y avoir le prototype correspondant
ben la doc officielle dit:
QSORT(3) Manuel du programmeur Linux QSORT(3)
NOM
qsort - Trier une table.
SYNOPSIS
#include < stdlib.h>
void qsort ( void *base, size_t nmemb, size_t size,
int ( *compar)(const void *, const void *));
DESCRIPTION
La fonction qsort() trie une table contenant nmemb éléments de taille
size. L´argument base pointe sur le début de la table.
Le contenu de la table est trié en ordre croissant, en utilisant la
fonction de comparaison pointée par compar, laquelle est appelée avec
deux arguments pointant sur les objets à comparer.
La fonction de comparaison doit renvoyer un entier inférieur, égal, ou
supérieur à zéro si le premier argument est respectivement considére
comme inférieur, égal ou supérieur au second. Si la comparaison des
deux arguments renvoie une égalite ( valeur de retour nulle), l´ordre
lines 1-25
je te l´ai dit plus haut, quand tu passe à qsort l´adresse dela fonction, il ne faut pas faire :
qsort(...,compare);
mais :
qsort(...,&);
comme pour n´importe quel variable quand tu passe un pointeur.
ça marche pas qant je compile avec :
struct individu{
char nom[20];
char ville[10];
char prenom[10];
int age;
};
struct individu tab[50];
void init(){
strcpy(tab[0].nom,"henri");
strcpy(tab[0].ville,"paris");
strcpy(tab[0].prenom,"martin");
tab[0].age=40;
strcpy(tab[1].nom,"chevalier");
strcpy(tab[1].ville,"marseille");
strcpy(tab[1].prenom,"mark");
tab[1].age=33;
strcpy(tab[2].nom,"barock");
strcpy(tab[2].ville,"bordeau");
strcpy(tab[2].prenom,"marie");
tab[2].age=19;
}
int compare(struct individu * i,struct individu * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
/ *int __cdecl compare(void *ii,void *jj){
struct individu *i=(struct individu*)ii;
struct individu *j=(struct individu*)jj;
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}*/
int compare2(struct individu * i,struct individu * j){
if(i->age!=j->age)
return i->age-j->age;
return strcmp(i->ville,j->ville);
}
int main(){
int i;
init();
printf("Voici votre agenda au debut:\n");
for(i=0;i<3;i++)
printf("%s\n%s\n%s\n%d\n",tab[i].nom,tab[i].ville,
tab[i].prenom,tab[i].age);printf("Voici votre agenda trié:\n");
qsort(tab,50,sizeof(struct individu),&);
for(i=0;i<3;i++)
printf("%s\n%s\n%s\n%d\n",tab[i].nom,tab[i].ville,
tab[i].prenom,tab[i].age);
return 0;
}
ça me remet les meme erreur
sinon je peux executer le programme malgrès le warning mais le tableau n´est pas trié j´obtient ceci:
Voici votre agenda au debut:
henri
paris
martin
40
chevalier
marseille
mark
33
barock
bordeau
marie
19
Voici votre agenda trié:
0
0
0
c´est quoi ton warning?
Heu un memset a 0 sur le tableau de depart serait le bienvenu je pense ; )
nan faut pas de & pour un pointeur de fonction ( le nom de la fonction est déjà un pointeur de fonction).
Mais la doc te dit bien ce qu´il faut pour la déclaration de compare :
int compare(const void *e1, const void *e2)
{
. ..
}
qsort(...,compare);
quant je met :
int compare(const struct individu * i,const struct individu * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
ca me met les meme erreur a savoir:
exo1.c: In function `main´:
exo1.c:74: warning: passing arg 4 of `qsort´ from incompatible pointer type
et quant je met :
int compare(const void * i,const void * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
ca me met:
exo1.c: In function `compare´:
exo1.c:34: warning: dereferencing `void *´ pointer
exo1.c:34: error: request for member `nom´ in something not a structure or union
exo1.c:34: warning: dereferencing `void *´ pointer
exo1.c:34: error: request for member `nom´ in something not a structure or union
exo1.c:37: warning: dereferencing `void *´ pointer
exo1.c:37: error: request for member `prenom´ in something not a structure or union
exo1.c:37: warning: dereferencing `void *´ pointer
exo1.c:37: error: request for member `prenom´ in something not a structure or union
oui mais faut caster tes pointeurs sinon il sait pas comment interpéter les const void * !
j´ai vu quelquepart plus la fonction avec les cast . ..
faut dans la fonction compare écrire qqchose comme :
struct individu *individu_i = ( struct individu *)i;
struct individu *individu_j = ( struct individu *)j;
et utiliser ces nouvelles variables dans le reste de la fonction
quelquepart plus haut*
c´est bon j´ai trouver le problem ![]()