IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

std::sort() sur std::vector()


Sujet :

SL & STL C++

  1. #1
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut std::sort() sur std::vector()
    Bonjour,
    soit un std::vector:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    typedef std::vector<Station*> ListStation;
    ListStation m_ListStation;
    La classe Station est une classe que j'ai d�fini.
    Je veux trier le vector, pour cela je fais :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    std::sort( m_ListStation.begin(), m_ListStation.end(), stationPtrCompare );
    la fonction stationPtrCompare() est d�clar�e comme ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bool stationPtrCompare( Station* p1, Station* p2 )
    elle est de port�e globale.

    Bon, �a compile, no problemo.

    MAIS, quand j'ex�cute �a plante : "access violation".
    En utilisant le debugger (Visual C++ 6.0), je vois que ma fonction stationPtrCompare() est appel�e avec p1==0xcdcdcdcd.
    Hum, �a sent le pointeur pourri.
    Donc, juste avant d'appeler std::sort, je dumpe le contenu de mon vector, comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /*! sort the station collection */
    void StationCollection::sortStationCollection()
    {
    	// TEST JULIEN
    	char Buff[255];
    	for (int i=0; i<m_ListStation.size(); i++)
    	{
    		sprintf( Buff, "m_ListStation[%d]=%X\n",i,m_ListStation[i]);
    		TRACE(Buff);
    	}
     
     
    	std::sort( m_ListStation.begin(), m_ListStation.end(), stationPtrCompare );
    }
    je sais, sprintf()/char[] c'est du C, mais, c'est du code de d�buggage.
    Bref, le pointeur 0xcdcdcdcd ne se trouve pas dans mon vector juste avant l'appel � std::sort.
    Je ne comprends pas pourquoi ma fonction stationPtrCompare() est appel�e avec cette valeur bizarre.
    Ca m'�tonnerait tr�s fortement que la STL fournie avec Visual C++ 6.0 soit bugg�e sur un truc aussi utilis� que cela.
    Des id�es ? :

  2. #2
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Il y a quoi � l'int�rieur de stationPtrCompare ? (juste pour pinailler, pourquoi ne pas en faire un foncteur ?).

    Sinon comme d'hab, essaie de faire un code complet minimal qui reproduise le probl�me , �a permet souvent de tomber sur l'origine du probl�me.

  3. #3
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut Re: std::sort() sur std::vector()
    Citation Envoy� par tut
    Ca m'�tonnerait tr�s fortement que la STL fournie avec Visual C++ 6.0 soit bugg�e sur un truc aussi utilis� que cela.
    Il y a pourtant des bugs sur des trucs si utilis�s (mais je ne sais pas si �a s'applique � ton cas). Chez moi, trier un grand vecteur revenait � le tronquer. Apr�s avoir appliqu� les conseils trouv�s l� : http://www.dinkumware.com/vc_fixes.html ca c'est mieux pass�.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  4. #4
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut
    @Loulou24 : il y a �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /*! this function is used to compare two station pointers */
    bool stationPtrCompareFreq( Station* p1, Station* p2 )
    {
     
    	bool Res = false;
     
    	if ( !(p1&&p2) )
    		return Res; // error
     
    	switch ( Station::m_SortField )
    	{
    		case Station::Freq:
    			Res =  p1->getDFreq() < p2->getDFreq();
    			break;
    		case Station::Pi:
    			Res = p1->m_Pi < p2->m_Pi;
    			break;
    		case Station::PsName:
    			Res = p1->m_PsName < p2->m_PsName;
    			break;
    		case Station::Pty:
    			Res = p1->m_Pty < p2->m_Pty;
    			break;
    		case Station::Fs:
    			Res = p1->m_POCWStationQuality.m_FieldStrength < p2->m_POCWStationQuality.m_FieldStrength;
    			break;
    	}
     
    	if ( Station::m_SortType == Station::descen )
    		Res = !Res;
     
    	return Res;
    }
    C'est curieux parce que le probl�me n'appara�t pas lorsque l'on fait un tri sur Station::Freq, qui compare des double, alors qu'il appara�t sur les autres, qui eux comparent des std::string. Je crois qu'il y a baleine sous caillou l�, je vais chercher dans cette direction.
    Qu'est-ce que tu veux dire par foncteur ? d�clarer un type foncteur pour l'utiliser avec std::sort() ?
    De toute fa�on, je crois que je vais refaire cette fonction : je peux mettre le switch case ailleurs de telle sorte qu'il soit appel� avant std::sort(), comme �a je gagne autant de switch/case inutiles... Il me faudra cr�er une fonction de comparaison sp�cifique pour chaque case.

    @JolyLoic : je ne savais pas que cela �xistait. Est-ce que tu as essay� le header qu'ils proposent � l'adresse que tu sp�cifies ? mon vecteur n'est pas �norme : 206 �l�ments, qui sont des pointeurs.

  5. #5
    Membre �m�rite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    D�tails du profil
    Informations personnelles :
    �ge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par d�faut
    Bonjour,

    C'est ici que les bact�ries attaquent, surtout si une des deux cha�nes est vide (null). Pour compar� des cha�nes utilises plut�t strcmp.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
         case Station::PsName:
             Res = p1->m_PsName < p2->m_PsName;
             break;

  6. #6
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut
    il y a des cha�nes vides, c'est s�r.
    Mais pourquoi donc le fait de comparer une chaine vide avec une non vide peut engendrer des erreurs ?
    J'ai chercher dans les diff�rentes doc � ma disposition sur std::string, je ne vois aucune mise en garde l�-dessus...
    Bon, par contre, je dois reconnaitre que le fait d'utiliser strcmp() ne fait plus planter le bazar...
    Merci !
    au moins, j'aurai appris des trucs.

  7. #7
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Attention � ce que tu renvoies dans ta fonction de tri : elle doit indiquer si le premier est strictement inf�rieur au second. Hors quand tu tries en ordre d�croissant, tu fais la n�gation de l'inf�rieur strict, ce qui te donne un sup�rieur ou �gal.

    Ce genre d'erreur dans les set ou map peut cr�er beaucoup de probl�mes, par contre avec sort je ne sais pas dans quelle mesure c'est g�nant et si �a peut provoquer ce genre de bug.

  8. #8
    tut
    tut est d�connect�
    Membre �clair�
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par d�faut
    bien vu !
    je corrige �a... 8)

  9. #9
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par tut
    je ne savais pas que cela �xistait. Est-ce que tu as essay� le header qu'ils proposent � l'adresse que tu sp�cifies ?
    On l'utilise au boulot quotidiennement depuis quelques ann�es. Apr�s tout, c'est quand m�me le site de ceux qui on fait la biblioth�que standard pour Visual C++, on peut leur faire confiance.
    Citation Envoy� par tut
    mon vecteur n'est pas �norme : 206 �l�ments, qui sont des pointeurs.
    Ce n'est effectivement pas gros.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  10. #10
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par Caine
    C'est ici que les bact�ries attaquent, surtout si une des deux cha�nes est vide (null). Pour compar� des cha�nes utilises plut�t strcmp.
    L'op�rateur < est tout � fait correct pour comparer des std::string. M�me vides.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  11. #11
    Membre �clair� Avatar de bilb0t
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    378
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 378
    Par d�faut
    Bonjour,

    je me permet de d�terer ce vieux post car je me pose une question. Est-ce que c'est "threadSafe" d'utiliser une variable static pour sp�cifier le type de tri (ou j'ai peut �tre rien compris).

    Merci.

    Citation Envoy� par tut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    /*! this function is used to compare two station pointers */
    bool stationPtrCompareFreq( Station* p1, Station* p2 )
    {
     
    	switch ( Station::m_SortField )
    	{...}
     
    }

  12. #12
    Membre exp�riment�
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activit� : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Par d�faut
    A priori, non... A moins de bloquer le mutex, d'une en entrant dans la boucle de tri et deux, avant de modifier le type de tri.
    Ou de respecter une discipline stricte (mais scabreuse vis-�-vis de la maintenance).

    Mais l� il est pas question de thread, ou c'est moi qu'est rien compris ?

    Citation Envoy� par tut
    Hum, �a sent le pointeur pourri.

  13. #13
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    static et thread safe se marrient difficilement.

  14. #14
    Membre �clair� Avatar de bilb0t
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    378
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 378
    Par d�faut
    ok, j'ai d�clarer un object et red�fini l'op�rateur() pour �tre thread safe.

    Merci.

  15. #15
    Membre exp�riment�
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activit� : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Par d�faut
    D�sol pour les yeux ronds...
    Pas bien comprite en fait, tu l'utilises comment, l'operator() ?

    Simple curiosit�...

  16. #16
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Citation Envoy� par SKZ81
    D�sol pour les yeux ronds...
    Pas bien comprite en fait, tu l'utilises comment, l'operator() ?

    Simple curiosit�...
    Voir http://c.developpez.com/faq/cpp/?page=STL#STL_functor et les 2 exemples qui suivent.

  17. #17
    Membre exp�riment�
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activit� : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Par d�faut
    OK et merci...
    Je connaissais la surcharge d'ops, et () �galement, mais cette utilisation m'�tait inconnue...
    "On nous cache tout, on nous dis rien !!!" Ha !! Les profs !

    Bref... Par contre dans l'exemple, en l'occurence, je ne vois toujours pas comment �a s'utilise...
    Je veux dire, comment que Bilb0t y s'en sert ?? (J'aime bien parler bien, comme �a!!)

    Tu peux m'dire, s'teup??

  18. #18
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    C'est la STL qui appelle simplement l'op�rateur, comme t'appelerait une fonction sauf que l� c'est un objet (d'o� le nom de fonction objet->functor). Tu peux regarder dans le code STL de std::sort.

  19. #19
    Membre �clair� Avatar de bilb0t
    Profil pro
    Inscrit en
    D�cembre 2003
    Messages
    378
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 378
    Par d�faut
    J'aurais pas r�pondu mieux...

  20. #20
    Membre exp�riment�
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activit� : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Par d�faut
    Ok j'ababonne... Si vous vous obstinez � m'expliquer des trucs que j'ai compris...


    Je vois toujours pas pkoi un foncteur (qui effectue le tri) rend thead safe la modif du mode tri, qui a priori se fait pas pendant le tri (ou alors )

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. Pointeur sur std::vector casser apr�s un resize()
    Par jerem3000 dans le forum Langage
    R�ponses: 3
    Dernier message: 20/01/2012, 00h30
  2. Manipulations de vector, std::sort et std::unique
    Par dhoorens dans le forum C++
    R�ponses: 4
    Dernier message: 16/11/2007, 09h41
  3. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    R�ponses: 27
    Dernier message: 24/07/2007, 16h23
  4. Question sur std::vector
    Par FabaCoeur dans le forum SL & STL
    R�ponses: 11
    Dernier message: 24/06/2007, 18h22
  5. tri sur std::vector<std::pair<int, float> >
    Par b4u dans le forum SL & STL
    R�ponses: 15
    Dernier message: 01/10/2006, 09h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo