qsort - C - Programmation
Marsh Posté le 26-12-2005 à 14:13:00
Prototype de qsort() :
void qsort(void *base, size_t nel, size_t width, |
Sinon pour ton char **chaine, l'absence de malloc() c'est juste parce que tu as restreint l'exemple ?
EDIT : mon message n'est pas très clair : j'ai mis le prototype de qsort() pour que tu te rendes compte que l'on passait à la fonction de comparaison des pointeurs sur les éléments à comparer.
Marsh Posté le 26-12-2005 à 14:32:20
golzinne a écrit : ou est mon erreur ? |
Ton code est incomplet. Peux-tu poster un exemple compilable et réduit au minimum de ton code, par ce que telle quel, il y a tellement d'erreurs possible, que je ne sais pas par quoi commencer...
Marsh Posté le 26-12-2005 à 14:56:43
oui, vous avez raison, ce n'est pas tres clair,voici le code :
#include<malloc.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
int compare_chaines(const void *chaine1,const void *chaine2) ;
int compare_chaines(const void *chaine1,const void *chaine2)
{
return strcmp (chaine1,chaine2);
}
Main()
{
int nb_chaines,i;
char **chaine ;
char tampon[256+1];
//entrée du nombre de chaines
printf("combien de chaines voulez vous rentrer? \n" );
scanf("%d",&nb_chaines);
chaine=(char**)malloc(sizeof(char*)*nb_chaines);
//entrée des chaines de caractere
if (chaine!=0)
{
scanf("%*c" );
for(i=0;i<nb_chaines;i++)
{
printf("entrez une chaine :" );
gets(tampon);
chaine[i]=(char*)malloc(strlen(tampon)+1);
if (chaine[i]!=0)
{
strcpy(chaine[i],tampon);
}
}
}
//tri
qsort(chaine,nb_chaines,sizeof(*chaine),compare_chaines);
//affichage
for(i=0;i<nb_chaines;i++)
{
printf("\nchaines n %d : ",i+1);
puts(chaine[i]);
}
}
Marsh Posté le 26-12-2005 à 15:30:21
Bon alors, très rapidement :
Code :
|
Marsh Posté le 26-12-2005 à 17:20:20
Citation : int compare_chaines(const void *chaine1,const void *chaine2) ; |
ok, g pris note des modification, mais je ne comprend pas ce que je dois mettre a la place de mes const viod *chaine1 et const void *chaine2
Marsh Posté le 26-12-2005 à 17:22:58
Rien, c'est ce qu'attend qsort() de ta fonction.
Par contre tu dois déréférencer ces paramètres pour les passer à strcmp().
A l'heure actuelle strcmp() s'attend à des const char*, et toi tu lui passes des const char **.
Marsh Posté le 26-12-2005 à 18:00:41
golzinne a écrit : je ne comprend pas ce que je dois mettre a la place de mes const void *chaine1 et const void *chaine2 |
Ne modifie pas les paramètres (à part les noms !). Simplement ceux-ci reçoivent les adresses des 2 objets dans le tableau que l'on veut comparer. Les objets étant de type char*, leurs adresses sont de type char **. Pour déréférencer correctement les données, il faut donc initialiser des pointeurs locaux du bon type (soit ... char ** !)
Code :
|
ensuite le début des chaines se trouve à *p1 et *p2 (ou p1[0] et p[2])? C'est cette valeur que l'on doit passer à strcmp() :
Code :
|
Marsh Posté le 27-12-2005 à 14:20:21
OK, je suis parvenu a y arriver grace a tous ces bons conseil. Et en plus ça m'a permit de comprendre l'astuce des pointeurs de pointeurs? Je vais aborder l'examen avec moins de craintes maintenant.
Merci beaucoup.
Marsh Posté le 08-01-2006 à 03:55:55
Reply
Marsh Posté le 26-12-2005 à 14:04:43
Bonjour,
c'est a moi d'avoir un probleme :
je doit trier un tableau de chaines avec qsort, en c, malheureusement la seule chose qu'il me fait, c'est mettre la premiere chaine à la derniere place. Bizarre autant qu'etrange!!
les chaines sont : (le nombre, nb_chaines, est variable mais quatre suffisent pour l'exemple)
char **chaine;
chaine[0] = premiere
chaine[1] = deuxieme
chaine[2] = troisieme
chaine[4] = quatrieme
int compare_chaines(char *chaine1,char *chaine2)
{
return strcmp (chaine1,chaine2);
}
qsort(chaine,nb_chaines,sizeof(*chaine),compare_chaines);
int j;
for(j=0;j<nb_chaines;j++)
{
printf("\nchaines n %d : ",j+1);
puts(chaine[j]);
}
voici ce qu'il m'affiche :
chaine 1 : deuxieme
chaine 2 : trosieme
chaine 3 : quatrieme
chaine 4 : premier
ou est mon erreur? aidez moi svp
merci beaucoup