begin process at 2012 05 30 04:08:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Maux de tête causé par une fonction de tri


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Maux de tête causé par une fonction de tri

mercredi 18 août 2004 à 21:23:46 | Maux de tête causé par une fonction de tri

MissSixty

Désespoir...
je me chauffe encore les neurones avec un problème de tri de tableau 2D qui m'apparaît pourtant assez basic. J'ai bien tenté de m'inspirer de codes déjà faits dans les sources ou encore des exemples sur cplusplus.com, mais non, ça sert à rien, je n'y arrive pas !

Voilà... je vais recourir encore à votre aide au risque d'être étiquettée "DÉBUTANTE"... Je me lance donc: j'essaie de mettre en place une fonction toute simple qui me permettrait de trier mon tableau en ordre croissant avec la fonction qsort() en C.

Les éléments à trier se retrouvent dans le tableau suivant:
xyz[i].s[j], où i=nb_noeuds et j=nombre de coordonnées (0=x, 1=y, 2=z).

Je veux utiliser la fonction qsort() et combiner avec fncompare de la façon suivante :

qsort(xyz, ???,sizeof(float), fncompare ???);

Les ??? sont les endroits où je n'ai aucune idée de ce que je dois y insérer... vraiment AUCUNE ! Je comprends comment exploiter cette fonction en 1d, mais en 2d, NIET !!

Je suis donc à la recherche de quelqu'un qui pourrait me donner un exemple de l'utilisation de la fonction qsort() sur un tableau de type structure ou encore qui pourrait me diriger vers un site où l'on retrouve EXPLICITEMENT une telle utilisation... je suis à cours de ressources et ce n'est pas que je n'ai pas chercher !!!

Merci mille fois à celui ou à celle qui pourra m'aider =)

mercredi 18 août 2004 à 21:48:35 | Re : Maux de tête causé par une fonction de tri

BruNews

Administrateur CodeS-SourceS
qsort(xyz, nbrLignesTableau, tailleLigneTableau,fncompare);

ciao...
BruNews, Admin CS, MVP Visual C++
mercredi 18 août 2004 à 21:52:49 | Re : Maux de tête causé par une fonction de tri

djl

oui voila, ca donnerais ca avec un tableau de struct


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


typedef struct
{
double x,y,z;
} Point;

int fncompar( Point *p1, Point *p2);

int main()
{
Point tab[5] =
{ { 1.5, 5.5, 6.5 }, { 1.5, 5.5, 6.5 },
{ 1.5, 5.5, 6.5 }, { 1.5, 5.5, 6.5 },
{ 1.5, 5.5, 6.5 } };

qsort( tab, sizeof tab / sizeof *tab, sizeof *tab, fncompar );
}

int fncompar( Point *p1, Point *p2)
{
return (p1.x + p1.y + p1.z > p2.x + p2.y + p2.z) ? 1 : 0 ;
}
mercredi 18 août 2004 à 22:21:03 | Re : Maux de tête causé par une fonction de tri

MissSixty

DJL :
on pourra dire que tu m'auras sorti de la "mémerde" plus d'une fois cette semaine...

Question #1 : qu'est-ce que je mets où il y a ??? selon mon code? (voir plus bas si j'ai bien compris tes explications et m'aider à compléter les ???)
Question #2 : dans la fonction où on définit fncompar et que l'on compare les termes entre eux, qu'arrive t-il si les termes sont égaux?

_____________________

int fncompar (???) //comprend pas quoi mettre là selon mon code

int main {
typedef struct _DBL3 { double s[3]; } DBL3;
DBL3 *xyz_S = new DBL3[nb_lignes-3];
if (xyz_S == NULL) exit(1);

//LES DONNÉES PROVIENNENT D'UN FICHIER
//VOICI COMMENT JE PROCÈDE POUR LES RÉCUPÉRER...
xyz_S[i].s[j] ...

//COPIE DU TABLEAU DANS UN AUTRE POUR NE PAS ECRASER LES DONNEES INITIALES
DBL3 *co_xyz_S = new DBL3[nb_lignes-3];
if (co_xyz_S == NULL) exit(1);

for (int i=0; i<(nb_lignes-3); i++)
for (int j=0; j<3; j++)
co_xyz_S[i].s[j] = xyz_S[i].s[j];

qsort(co_xyz_S, (nb_lignes-3), 3, fncompar); //est-ce mon programme comprend seul ce que veule dire "... sizeof tab / sizeof *tab, sizeof *tab, ..." ou dois-je les remplacer que qqchose

}

int fncompar (???) {
return (xyz[i].s[0] + xyz[i].s[1] + xyz[i].s[2] > xyz[i].s[0] + xyz[i].s[1] + xyz[i].s[2]) ? 1 : 0 ;
} //pas sûre si j'ai bien compris
mercredi 18 août 2004 à 22:44:48 | Re : Maux de tête causé par une fonction de tri

djl


a la place de 3 il faut mettre la taille en octet d'un element de ton tableau, le plus sur c'est de mettre sizeof *co_xyz_S, c'est equivalent à sizeof co_xyz_S[0]

qsort(co_xyz_S, (nb_lignes-3), sizeof *co_xyz_S, fncompar);



la fonction de comparaison doit retourner un int (a valeur booleenne) et prendre en paramettre un pointeur sur les 2 elements à comparer

int fncompar (const DBL3 *xyz1, const DBL3 *xyz2)
{
return (xyz1[i].s[0] + xyz1[i].s[1] + xyz1[i].s[2] > xyz2[i].s[0] + xyz2[i].s[1] + xyz2[i].s[2]) ? 1 : 0 ;
}

pour rappel, l'operateur ternaire ()?:

( [condition] ) ? [ valeur retournée si vrai ] : [ valeur retournée si faux ]
mercredi 18 août 2004 à 23:01:14 | Re : Maux de tête causé par une fonction de tri

MissSixty

DJL :

j'ai modifié mon code avec tes suggestions et voici ce que ça me sort comme erreur...

"testIRM.C", line 586.17: 1540-0274 (S) The name lookup for "i" did not find a declaration. //qui correspond au i trouvé dans la fonction fncompar
"testIRM.C", line 699.57: 1540-0064 (S) Syntax error: "(" was expected but "compare" was found. // qui correspond a ce que j'ai dans le qsort()


Je te remets le code que j'ai utilisé :

typedef struct _DBL3 { double s[3]; } DBL3;
int compare (const DBL3 *xyz1, const DBL3 *xyz2)
{
return (xyz1[i].s[0] + xyz1[i].s[1] +xyz1[i].s[2] > xyz2[i].s[0] + xyz2[i].s[1] +xyz2[i].s[2])?1:0;
}; //comment transférer le i là-dedans

int main {
(...)
DBL3 *co_xyz_S = new DBL3[nb_lignes-3];
if (co_xyz_S == NULL) exit(1);

for (int i=0; i<(nb_lignes-3); i++)
for (int j=0; j<3; j++) co_xyz_S[i].s[j] = xyz_S[i].s[j];

qsort(co_xyz_S, (nb_lignes-3), sizeof *co_xyz_S, compare);
//pqoi il ne comprend pas compare

}

MERCI =)
mercredi 18 août 2004 à 23:04:37 | Re : Maux de tête causé par une fonction de tri

djl

a ouai desolé, j'etais encore dans les tableaux

int compare (const DBL3 *xyz1, const DBL3 *xyz2)
{
return (xyz1->s[0] + xyz1->s[1] +xyz1->s[2] > xyz2->s[0] + xyz2->s[1] +xyz2->s[2])?1:0;
};
mercredi 18 août 2004 à 23:13:52 | Re : Maux de tête causé par une fonction de tri

MissSixty

Oh lala... en faisant rouler le tout, j'ai obtenu une erreur ! Du genre que j'ai jamais vu auparavant...

La voici (l'erreur s'est produite dans ma fonction fncompar):

"testIRM.C", line 698.53: 1540-0256 (S) A parameter of type "extern "C" int (*)(const void *, const void *)" cannot be initialized with an expression of type "int (const DBL3 *, const DBL3 *)".
"testIRM.C", line 698.53: 1540-1205 (I) The error occurred while converting to parameter 4 of "qsort(void *, size_t, size_t, extern "C" int (*)(const void *, const void *))".
mercredi 18 août 2004 à 23:15:06 | Re : Maux de tête causé par une fonction de tri

MissSixty

DJL :

je prends 2 minutes pour te mentionner que j'apprécie grandement ton aide ... en plus c'est iper rapido ! =)
mercredi 18 août 2004 à 23:21:29 | Re : Maux de tête causé par une fonction de tri

djl

cette fois c'est bon, j'avais oublié le caractere generique de la fonction

int compare (const void *_xyz1, const void *_xyz2)
{
DBL3 *xyz1 = _xyz1, *xyz2 = _xyz2;

return (xyz1->s[0] + xyz1->s[1] +xyz1->s[2] > xyz2->s[0] + xyz2->s[1] +xyz2->s[2])?1:0;
};

on aurait aussi pu caster la fonction, mais c'est plus sur comme ca

1 2

Cette discussion est classée dans : fonction, tableau, tri, qsort, maux


Répondre à ce message

Sujets en rapport avec ce message

qsort fonctionnement? [ par deck_bsd ] Bonjour a tous,Voila, je voudrai trier ce tableau :char nt[][100] = {"un","trois","quatre","cinq","a","bb","b","axxxxxxxxxxxxxxxxxxx"};Avec la fonctio TABLEAU de STRUCTURE [ par timy94 ] Bonjour Comment en C faire un tableau de pointeur pointant sur des structures.dans le but de trier ce tableau ex "tab.nom"  en modifiant les adresses creation d'un tableau et fonction image [ par zaz0u ] Alors voila je voudrai faire un tableau qui permet d'afficher des images avec la lib SDL!je sais faire un tableau et je sais afficher une image mais m tri d'un tableau a deux dimensions [ par alexey27 ] Bonsoir j'aimerai poser une question simple comment s'y prend on pour trier dans l'ordre croissant un tableau a deux dimensions ( tableau [x][y])? Fonction Rand pour démineur [ par pitidragon ] Bonjour à tous,je dois programmer un démineur en langage C pour mes études et j'ai besoin d'aide. Je dois utiliser la fonction Rand pour générer mes b ecriture dans fichier C [ par green mamba ] Bonjour à tous!voilà, j'ai refait un code de tri (je me suis légèrement inspiré d'un cs présent ici, je code plutôt mal en général), et je voudrais ré Foncton qui retourne un tableau [ par sarcipus ] Bonjour à tous,dans le programme sur lequel je travaille, j'aurais besoin qu'une fonction retourne un tableau multidimensionnel (dont je ne peux conna problème fonction récursive [ par kenikun ] Bonjour à tous,J'ai un petit problème avec une fonction récursiveen C.Je lui passe un tableau 2D en paramètre contenant des éléments à traiter, et en Fonction qui utilise un int* externe pour créer un tableau [ par tibob51 ] Bonjour je voudrai savoir si il est possible qu'une fonction recoive un pointeur d'entier,créé un tableau dynamiquement puis l'initialise,afin de le r


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,616 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales