Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/11/2007, à 00:37

Chiuchu

[Résolu] Question sur le tri de tableau en C

Bonjour,

J'ai un tableau de noms en C et je voudrais le trier par ordre alphabétique. Je ne veux pas récrire une fonction pour ça (pourquoi réinventer la roue), mais je n'arrive pas à me servir de qsort pour arriver à mes fins.

C'est un code que je produis dans le seul but d'apprendre à maîtriser un peu mieux le C :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef char CH15[16];

typedef struct
{
	CH15	nom;
} Contact;

Contact c[100];

int name_compare( a, b )
{
	return strcmp( a, b );
}

int main()
{
	int i, j;
	CH15 nom;
	do
	{
		puts("nom ?");
		gets(nom);
		strcpy(c[0].nom, nom);
		puts("ok\n");
		i++;
	}
	while(strcmp(nom, "x") != 0);

	qsort( c, i, sizeof(Contact), name_compare );

	for(j = 0; j < i; j++)
	{
		printf("%s\n", c[j].nom);
	}
	return EXIT_SUCCESS;
}

Dans le tableau Contact c, j'aurai par exemple :

c[0].nom = "Salut!";
c[0].nom = "blabla";
c[0].nom = "alphabet";
c[0].nom = "test";

Voilà, j'ai testé tout plein de façons de faire, j'ai essayé de comprendre comment ca fonctionne mais rien, j'y arrive pas. GCC me renvoi systématiquement l'erreur :

attention : passing argument 4 of «qsort" from incompatible pointer type

Vraiment épuisé, je m'en réfère à vous.

Merci.

Dernière modification par Chiuchu (Le 02/11/2007, à 01:33)

Hors ligne

#2 Le 02/11/2007, à 01:13

AuraHxC

Re : [Résolu] Question sur le tri de tableau en C

Il est un peu tard donc j'ai pas les idées super clair mais est ce que ca marche pas mieux comme ca :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef char CH15[16];

typedef struct {
    CH15    nom;
} Contact;

Contact c[100];

int name_compare( a, b ) {
    return strcmp( a, b );
}

int main() {
    int i, j;
    CH15 nom;
    int (*compare)(const void *,const void *);
    compare = name_compare;

    do {
        puts("nom ?");
        gets(nom);
        strcpy(c[0].nom, nom);
        puts("ok\n");
        i++;
    } while (strcmp(nom, "x") != 0);

    qsort( c, i, sizeof(Contact),compare);

    for (j = 0; j < i; j++) {
        printf("%s\n", c[j].nom);
    }
    return EXIT_SUCCESS;
}

En tout cas ca compile, avec des warning...

nicolas@nicolas-laptop:~$ cd Desktop && gcc -Wall qsort.c -o qsort
qsort.c: In function ‘name_compare’:
qsort.c:14: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
qsort.c:14: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast
/tmp/ccavLK7v.o: In function `main':
qsort.c:(.text+0x50): warning: the `gets' function is dangerous and should not be used.

Après faut voir si ca fonctionne réellement mais bon c'est un début, moi je vais me coucher big_smile
Parce que j'ai quand même cours demain...

Dernière modification par AuraHxC (Le 02/11/2007, à 01:15)

Hors ligne

#3 Le 02/11/2007, à 01:33

Chiuchu

Re : [Résolu] Question sur le tri de tableau en C

Salut,

Merci énormément pour la réponse ! Malgré qu'elle n'ait pas l'air de marcher, elle m'a beaucoup aidé à trouver la solution.

La solution est là (un petit peu plus compliquée que prévu) :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef char CH15[16];

typedef struct
{
	CH15	nom;
} Contact;

Contact c[100];

int compare_noms(const void *a, const void *b)
{
	return strcmp( (*(Contact *)a).nom, (*(Contact *)b).nom );
}

int main()
{
	int i=0, j;
	CH15 nom;
	do
	{
		puts("nom ?");
		gets(nom);
		strcpy(c[i].nom, nom);
		puts("ok");
		i++;
	}
	while(strcmp(nom, "x") != 0);
	qsort(c, i, sizeof(Contact), compare_noms);
	for(j = 0; j < i; j++)
	{
		printf("%s\n", c[j].nom);
	}
	return EXIT_SUCCESS;
}

Merci encore !

Hors ligne