Tri bulle sur chaîne de caractères [C] - C - Programmation
Marsh Posté le 12-11-2004 à 00:36:49
Commences déjà par changer le prototype de Inverser. Ce ne sont pas des pointeurs sur des int que tu as besoin.
De plus je doute que ce soit la structure qui te convienne.
Marsh Posté le 12-11-2004 à 01:42:01
ofbdood a écrit :
|
Tu es sûr que l'inversion des chaînes fonctionne bien ?
Elles sont déclarées comme des tableaux et non comme des pointeurs : "char* nom;" que tu allouerais plus tard.
Je me demande comment il est possible d'inverser les adresses de ces tableaux dans ton tableau de structures "typeliste".
Marsh Posté le 12-11-2004 à 16:56:55
darkoli a écrit : Tu es sûr que l'inversion des chaînes fonctionne bien ? |
Bah non justement ça marche pas parfaitement ... d'ailleurs je ne sais pas si ma méthode est la bonne je voulais juste essayer de ré-utiliser ma fonctione de tri bulle sur des chaînes de caractères.
Marsh Posté le 12-11-2004 à 17:23:04
ofbdood a écrit : Bah non justement ça marche pas parfaitement ... d'ailleurs je ne sais pas si ma méthode est la bonne je voulais juste essayer de ré-utiliser ma fonctione de tri bulle sur des chaînes de caractères. |
Dans ce cas, il faut que tu appelles la fonction Inverse de la façon suivante : "Inverse(liste[i].nom, liste[i+1].nom);", les paramètres de la fonction étant de type "char*".
Et dans la fonction il suffit de copier le contenu des chaînes de caractères en utilisant une chaîne temporaire de la même taille (fonction strcpy).
Une fois que tu auras fait ça, ton programme devrait fonctionner mais il y a encore d'autres améliorations à faire.
Bon courage.
Marsh Posté le 12-11-2004 à 18:31:12
Bon alors d'après tes conseils j'ai fait ça :
Code :
|
Bon j'ai plus les erreurs de compilation mais j'ai toujours pas un résultat correct.
en entrée :
cc
bb
aa
en sortie :
ÖP
aa
bb
Pourtant là j'envoie les chaînes ça devrat être bon nan ?
Marsh Posté le 12-11-2004 à 18:57:28
Tu as toujours des char et non des char* dans ta structure
Marsh Posté le 12-11-2004 à 23:51:48
Je me mele de ce qui ne me regarde pas, mais qsort() c'est bien aussi.
Marsh Posté le 13-11-2004 à 00:37:31
ofbdood a écrit : Bon j'ai plus les erreurs de compilation mais j'ai toujours pas un résultat correct. |
Ton tri fonctionne très bien !
Je vais te laisser réflechir avant de te dire ce qui ne va pas.
Voilà un indice : de quelle taille est ton tableau ?
Marsh Posté le 13-11-2004 à 00:45:52
fafounet a écrit : Tu as toujours des char et non des char* dans ta structure |
Non c'est bon car dans la structure c'est un tableau et c'est presque équivalent à un char*. Et il est tout à fait possible de copier l'adresse du tableau dans un pointeur.
Marsh Posté le 13-11-2004 à 11:33:26
ofbdood a écrit : Bon alors d'après tes conseils j'ai fait ça :
|
Dans un premier temps, pour faire fonctionner correctement ton tri, donne-lui un tableau de la bonne taille
Code :
|
Là, cela devrait marcher
Dans un second temps, si je regarde ton tout premier source, ton idée d'inverser les adresses des chaînes n'est pas mal du tout, et cela est beaucoup plus rapide qu'inverser des chaînes. Mais il faut, comme l'a dit fafounet, déclarer les bons types.
Par exemple, si tu appelles "inverse(&liste[i].nom)" alors tu passes à ta fonction "inverse" un pointeur sur une chaîne. Mais comme une chaîne c'est un tableau de char, tu obtiens en final un pointeur sur un pointeur sur un char, donc un "char **"
A mon avis, tu devrais écrire ta fonction "Inverse" comme ceci:
Code :
|
j'ai pas testé mais à mon avis, cela devrait fonctionner. Et au lieu de permuter des chaînes tu ne permutes que les adresses de ces chaînes donc c'est plus rapide !!!
Enfin dernier truc: Avec la magie des maths, on peut permuter deux valeurs "a" et "b" sans utiliser de variables intermédiaires en utilisant ces 3 instructions:
a=a ^ b
b=a ^ b
a=a ^ b
A+
Marsh Posté le 13-11-2004 à 12:00:00
Sve@r a écrit : j'ai pas testé mais à mon avis, cela devrait fonctionner. Et au lieu de permuter des chaînes tu ne permutes que les adresses de ces chaînes donc c'est plus rapide !!! |
Je suis d'accord avec toi, mais modififier la fonction "Inverse" n'est pas suffisant car ce sont toujours des tableaux qui sont déclarés dans la structure "typeliste".
Dans ce cas il faut remplacer le tableau par un pointeur et faire l'allocation mémoire pour chaque chaîne lue (sans oublier de désallouer à la fin).
Marsh Posté le 13-11-2004 à 12:05:01
# void Inverse(char *x, char *y)
# {
# char adr_temp[100];
# strcpy(adr_temp, x);
# strcpy(x, y);
# strcpy(y, adr_temp);
# }
Marsh Posté le 13-11-2004 à 12:08:26
'fectivement, dans le genre bourrin...
Marsh Posté le 13-11-2004 à 12:17:32
darkoli a écrit : Je suis d'accord avec toi, mais modififier la fonction "Inverse" n'est pas suffisant car ce sont toujours des tableaux qui sont déclarés dans la structure "typeliste". |
Il se peut que tu aies grandement raison. Même si un tableau se comporte souvent comme un pointeur, il ne doit pas être possible de changer sa valeur comme ça, ce qui oblige donc à n'utiliser que des pointeurs alloués au départ et libérés en final...
Marsh Posté le 13-11-2004 à 12:25:32
Bon cette fois ci c'est la bonne
Alors voilà ça ça marche :
Code :
|
J'ai mis la longueur du tableau en constante et ce qui faisait tout foirer c'était juste la longueur du tableau (merci darkoli )
en fait le "sizeof" retournait 4 et non 3. J'ai réduit au passage la taille de mon tableau à 3 (je ne sais pas pourquoi j'avais mis 4 d'ailleurs, la fatigue sûrement)
Sinon j'ai quand même testé la solution donnée par Sve@r mais ça ne marche pas.
Un grand merci à tous, vous m'avez bien aidé !
Si certains veulent chercher pour la solution de Sve@r je suis toujours preneur, enfin ne gâchez pas votre week-end à cause de ça
Marsh Posté le 13-11-2004 à 12:55:16
ofbdood a écrit : Sinon j'ai quand même testé la solution donnée par Sve@r mais ça ne marche pas. |
Pas besoin de tout un WE. Ya qu'à prendre ton code et changer qq trucs...
Essaye ceci (je n'ai pas essayé, je ne compile qu'au boulot mais cela devrait être pas mal...)
Code :
|
Marsh Posté le 13-11-2004 à 13:45:47
Taz a écrit : scanf("%s", &liste[i].nom); |
Je débute en C, mais d'après ce qu'on m'a appris on ne met pas de & lorsque le type de la variable est string. J'ai bon?
Marsh Posté le 13-11-2004 à 14:14:31
non. ça a rien à avoir. l'argument de scanf doit être un pointeur vers une zone mémoire capable de stocker la variable. une chaine en C, c'est un tableau ou un pointeur, t, &t[0] ou p sont déjà des pointeurs vers cette zone
Marsh Posté le 13-11-2004 à 14:20:19
Taz a écrit : non. ça a rien à avoir. l'argument de scanf doit être un pointeur vers une zone mémoire capable de stocker la variable. une chaine en C, c'est un tableau ou un pointeur, t, &t[0] ou p sont déjà des pointeurs vers cette zone |
merci de l'explication
Marsh Posté le 13-11-2004 à 14:26:03
Taz a écrit : # void Inverse(char *x, char *y) |
se moquer, c'est mal !
Marsh Posté le 13-11-2004 à 14:30:35
Taz a écrit : je me moque, je vois une blague, j'en rie |
il débute, tu vas le braquer, spa gentil gentil ça
t'as pas une idée pour mon defunct ?
PS : t'es toujours ban de osa ou quoi, on te voit plus ?
Marsh Posté le 13-11-2004 à 14:33:16
Marsh Posté le 13-11-2004 à 17:37:06
Taz a écrit : je me moque, je vois une blague, j'en rie |
Elle est où la blague, j'aimerais bien rire aussi !
Marsh Posté le 13-11-2004 à 17:47:32
ReplyMarsh Posté le 14-11-2004 à 11:05:24
Remarquez, c'est quand même du tri à bulle, alors qu'il fasse des strcpy au lieu d'échanges de pointeurs, ça ne va pas changer des masses (enfin un peu quand même).
Mais d'un point de vue purement éducatif, apprendre à manipuler les pointeurs, c'est pas plus mal.
Marsh Posté le 14-11-2004 à 11:50:43
avec les pointeurs ça serait plus simple, souple et performant. C'est dommage de faire un tri bridé comme ça. Surtout que le passe-passe de pointeur est trivial comparé à sa fonction Inverse. Enfin bon, Inverse(&liste[i].nom, &liste[i+1].nom); il est tout de façon pas près pour les pointeurs ...
Marsh Posté le 14-11-2004 à 12:02:52
Taz a écrit : scanf("%s", &liste[i].nom); |
Ahhh !!! Cette ligne m'avait échappé... MeaCulpa
Marsh Posté le 11-11-2004 à 22:18:51
Bonsoir à tous,
Je viens vous demander un petit coup de main
Ce que je cherche à faire :
Un tri bulle sur plusieurs chaînes de caractères.
Ce qui ne marche pas :
Il me sort des valeurs étranges et j'ai 2 warning à la compilation.
Voici mon code :
J'ai donc une structure ("liste" ) dans laquelle je stocke 3 chaines. Ensuite tri sur mon tableau mais là ça foire un peu.
Si je rentre dans l'ordre :
cc
bb
aa
il me sort :
(chaine vide)
aa
bb
Voilà si quelqu'un à une solution, c'est sûrement très bête m'enfin bon ça fait trop longtemps que je suis dessus, je vais craquer
EDIT : les 2 warnings sont :
l.26 "passage de l'argument N°1 de "inverse" d'un type pointeur incompatible"
l.26 "passage de l'argument N°2 de "inverse" d'un type pointeur incompatible"
Message édité par ofbdood le 11-11-2004 à 22:21:11