tri d'un tableau d'objet suivant une relation d'ordre

tri d'un tableau d'objet suivant une relation d'ordre - C++ - Programmation

Marsh Posté le 15-12-2004 à 18:29:59    

Bonjour,
mon problème concerne la fonction
stable_sort (ou sort)
 
je désire trier un "vector<Concept>" ou Concept est une classe définie
Dans la classe Concept les opérateurs <,<=,==,>=,>,!= ont étés surdéfinis
afin notamment que < définisse un ordre.
 
j'écris alors:
stable_sort(vect.begin(),vect.end(), ???????);
 
comme il faut préciser la relation d'ordre à la place de ????
j'ai mis "less<Concept>" ce qui, il me semble doit faire référence
à l'opérateur < de la classe Concept.
 
j'ai aussi inclu <functional>
 
mais rien à faire ça ne compile pas...
sinon le stable_sort (ou le sort) sans le 3eme argument compile mais
provoque une segmentation fault à l'éxécution.
 
Merci de m'aider.  
d'autre part je suis débutant C++ (mais pas C ni Java) alors aller y doucement avec la technique SVP.


Message édité par jlinho2 le 15-12-2004 à 18:34:05
Reply

Marsh Posté le 15-12-2004 à 18:29:59   

Reply

Marsh Posté le 15-12-2004 à 18:43:35    

le 3ème paramètre est optionnel.
 
std::sort(vect.begin(), vect.end()); et voilà

Reply

Marsh Posté le 16-12-2004 à 08:28:45    

En fait le problème n'est pas celui que j'ai exposé...en effet les 2 paramètres sufissent pour réussir à compiler. mais le programme s'executre avec une erreur (probablement segfault)
 quand je fais sort(v.begin(),v.end()-1) ça passe mais me le tri n'inclu evidemment pas le dernier élément t si je fais
sort(v.begin(),v.end()) j'ai une segmentation fault....
bizarre d'autant plus que tous les éléments ont étés insérér avec
vect.push_back(objet)
et que la fonction d'affichage des objets du tableau s'exécute, elle accede a tous les elements du tableau sans faire de segfault....

Reply

Marsh Posté le 16-12-2004 à 09:15:28    

ben le problème, c'est ton code à toi, pas sort. vérifie ton code, utilise un débugger

Reply

Marsh Posté le 16-12-2004 à 09:21:16    

Oui je me doute que le problème c'est mon code à moi.Ca je l'ai compris, mais je voulais simplement savoir si certains avaient déjà rencontrés la m^meme erreur.

Reply

Marsh Posté le 16-12-2004 à 09:24:51    

ça se saurait depuis le temps

Reply

Marsh Posté le 16-12-2004 à 09:34:27    

Taz a écrit :

ça se saurait depuis le temps


+1  :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 16-12-2004 à 10:13:52    

je pense pas qu'il faisait reference a une erreur sur le sort lui meme . mais bien a son code "a lui" et pour savoir si d autre avait deja eu le meme style de probleme.
 
-2

Reply

Marsh Posté le 16-12-2004 à 10:15:58    

deja tu pourrai rajouter des traces pour voir si on < est bien apelle. ca t eviterai de douter . et par la meme occasion tu trouverai peut etre celui qui fait crasher..

Reply

Marsh Posté le 16-12-2004 à 10:37:37    

Citation :

je pense pas qu'il faisait reference a une erreur sur le sort lui meme . mais bien a son code "a lui" et pour savoir si d autre avait deja eu le meme style de probleme.


--> bah oui... et pour mon premier post je n'étais pas sûr de mon emploi de la fonction sort c'est tout...
 

Citation :


deja tu pourrai rajouter des traces pour voir si on < est bien apelle. ca t eviterai de douter  


--> apparemment le < est bien appelé puisque lorsque je trie que les N-1 premiers éléments (N étant la taille du tableau) avec le < de la classe 'Concept" ça marche (enfin dans certains cas :().
 
En attendant que je trace tout ça au debugger je dépose quelques lignes de code (le moins possible)...
 
l'objet concept
Concept.h

Code :
  1. class Concept
  2. {
  3.     protected:
  4.         string nom_associe;
  5.         unsigned int pts_occ;
  6.         unsigned int pts_mf;
  7.         float pts_total;
  8.      
  9.     public:
  10.         Concept(string nom);
  11.         void set_pts_total(const float f);
  12.         bool operator < (const Concept & autre) const;
  13. }


Concept.cpp

Code :
  1. Concept::Concept(string nom) {nom_associe=nom;pts_occ=pts_mf=0;pts_total=0;}
  2. void Concept::set_pts_total(const float f)
  3. {pts_total=f;}
  4. bool Concept::operator < (const Concept & autre)
  5. const
  6. {return pts_total < autre.pts_total;}


 
et un fichier de test qui plante

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   Concept A("famille" );
  4.   A.set_pts_total(1.1);
  5.   Concept B("familiales" );
  6.   B.set_pts_total(2.2);
  7.   Concept C("poulet" );
  8.   C.set_pts_total(3.3);
  9.   vector<Concept> v;
  10.   v.push_back(A);
  11.   v.push_back(B);
  12.   v.push_back(C);
  13.   system("PAUSE" ); //une pause juste avant le plantage
  14.   sort(v.begin(),v.end());
  15.   return 0;
  16. }

 
 
Voilà je reviens cette aprem avec les traces


Message édité par jlinho2 le 16-12-2004 à 10:40:25
Reply

Marsh Posté le 16-12-2004 à 10:37:37   

Reply

Marsh Posté le 16-12-2004 à 11:49:00    

Tu as quel compilateur (+ version) ?
Utilise un deboguer, il t'emène direct sur le lieu de l'erreur.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-12-2004 à 18:15:31    

En effet après changement de compilo ça passe

Reply

Marsh Posté le 16-12-2004 à 19:47:41    

lequel -> lequel ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-12-2004 à 20:00:48    

[HS]
(const float f) => le const est inutile, c'est une copie
[/HS]


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-12-2004 à 20:06:45    

jlinho2 a écrit :

En effet après changement de compilo ça passe

et si tu foutais ton operator< en fonction libre :o

Reply

Marsh Posté le 16-12-2004 à 22:10:16    

c'est quoi une fonction libre? (je fait du C++ depuis 3 jours je précise)
----
sinon il semblerait que la véritable cause du problème était un opérateur d'affectation "operator=" que j'avais surdéfini inutilement.
----
sinon en disant changement de compilateur j'aurais plutôt dû dire changement d'environnement de developpemment (et ceux ci font plein de trucs dans mon dos..optimisations et autres)...  
je suis passé de DevC++(version 5 beta) à Borland C++ builder...
mais comme je le dis la cause serait l'operateur d'affectation (pourant je m'en servait jamais) mais la fonction sort probablement oui...
j'ai été idiot de pas mettre tout mon code et que des morceaux (même si il me semblaient servir a rien car inutilisés explicitement)...désolé je m'excuse


Message édité par jlinho2 le 16-12-2004 à 22:12:16
Reply

Marsh Posté le 17-12-2004 à 19:43:03    

fonction libre = fonction à la C, pas une méthode de classe donc :
 
bool operator < (const Concept & c1, const Concept & c2);

Reply

Marsh Posté le 18-12-2004 à 11:35:33    

OK j'ai pigé merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed