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

C++ Discussion :

Compilation code source


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut Compilation code source
    Bonjour je suis en train d'essayer de compiler un code source mais j'ai des problemes lors de la compilation que je comprends pas le code a été développé sous VC et je l'ai adapté sous linux.

    Voici le message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    g++ -c Analysis.cpp -o Analysis.o
    Analysis.cpp: In function 'void DiscardMotif()':
    Analysis.cpp:108: error: no match for 'operator=' in 'MotifIter = MotifMap. std::map<_Key, _Tp, _Compare, _Alloc>::erase [with _Key = int, _Tp = MotifItem_t, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, MotifItem_t> >](MotifIter)'
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:152: note: candidates are: std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >& std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >::operator=(const std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >&)
    Analysis.cpp: In function 'void UniqueMotif()':
    Analysis.cpp:126: error: no match for 'operator=' in 'Next = MotifMap. std::map<_Key, _Tp, _Compare, _Alloc>::erase [with _Key = int, _Tp = MotifItem_t, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, MotifItem_t> >](Next)'
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:152: note: candidates are: std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >& std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >::operator=(const std::_Rb_tree_iterator<std::pair<const int, MotifItem_t> >&)
    make: *** [Analysis.o] Error 1
    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    En gros, il se plaint du fait qu'il n'y a pas d'opérateur d'affectation...

    Il te signale que ce l'opérateur d'affectation possible passe par un itérateur de type std::pair.

    Visiblement, si on en croit les renseignements donnés, tu essaie de supprimer une entrée dans un tableau associatif de type std::map<int, MotifItem_t>.

    La fonction erase de la std::map utilise un itérateur, et il est donc vraissemblable que tu doive disposer d'un itérateur sur l'élément à supprimer:
    • Soit en tant que membre de ta classe
    • Soit fournis comme paramètre à ta fonction
    • Soit recherché dans la fonction sur base d'une clé fournie en paramètre de la fonction


    PS: Il aurait été beaucoup plus facile pour tout le monde si tu avais fournis le code des fonctions incriminées, à savoir DiscardMotif et UniqueMotif
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    pas de probleme les voici :

    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
    34
     
    void DiscardMotif()
    {
    	map<int,MotifItem_t>::iterator MotifIter;
    	bool bAdd;
     
    	for(MotifIter=MotifMap.begin();MotifIter!=MotifMap.end();bAdd?MotifIter++:MotifIter)
    	{
    		bAdd=false;
    		if((int)(unsigned int)(*MotifIter).second.ProteinID.size()<Motif_MemberSize)
    			MotifIter = MotifMap.erase(MotifIter);
    		else
    			bAdd=true;
    	}
    }
     
    void UniqueMotif()
    {
    	map<int, MotifItem_t>::iterator MotifIter, Next;
    	bool bAdd;
     
    	for(MotifIter=MotifMap.begin();MotifIter!=MotifMap.end();MotifIter++)
    	{
    		Next=MotifIter;
    		for(++Next;Next!=MotifMap.end();bAdd?Next++:Next)
    		{
    			bAdd=false;
    			if((*MotifIter).second.ProteinID==(*Next).second.ProteinID && (*MotifIter).second.ProteinPos[0]==(*Next).second.ProteinPos[0])
    				Next=MotifMap.erase(Next);
    			else
    				bAdd=true;
    		}
    	}
    }

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    j'ai enlevé "MotifIter =" dans la première et "Next=" et il rale plus

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    par contre lors de la compilation en verufuant les bugs un par un j'ai obtenu ça comme message d'erreur


    g++ -c Analysis.cpp -o Analysis.o
    g++ -c MotifFinding5.cpp -o MotifFinding5.o
    g++ -c ReadProteinFile.cpp -o ReadProteinFile.o
    g++ -c stdafx.cpp -o stdafx.o
    g++ -c SubstitutionMatrix.cpp -o SubstitutionMatrix.o
    g++ -c Tools.cpp -o Tools.o
    g++ -o motif Analysis.o MotifFinding5.o ReadProteinFile.o stdafx.o SubstitutionMatrix.o Tools.o -g -g -lm -L blosum.h blosum62.h stdafx.h structure.h
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: ld returned 1 exit status
    make: *** [motif] Error 1

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    j'ai trouvé le problème.

    Merci tout de meme de votre message

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    ou peut etre pas

    j'ai compilé j'ai lancé et là segmentation fault avec ça comme erreur

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    *** glibc detected *** ./motif: double free or corruption (fasttop): 0x00000000009a2260 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x37ae470412]
    /lib64/libc.so.6(cfree+0x8c)[0x37ae473b1c]
    ./motif[0x408031]
    ./motif[0x408059]
    ./motif[0x4080a4]
    ./motif[0x408b32]
    ./motif[0x41566b]
    ./motif[0x4142b4]
    ./motif[0x40238a]
    ./motif[0x403bbb]
    ./motif[0x40f2da]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x37ae41dab4]
    ./motif(__gxx_personality_v0+0xb1)[0x4018b9]
    ======= Memory map: ========
    00400000-00421000 r-xp 00000000 00:20 8823532                            /groupes/poch/aniba/PattDT/motif
    00621000-00622000 rw-p 00021000 00:20 8823532                            /groupes/poch/aniba/PattDT/motif
    00622000-009af000 rw-p 00622000 00:00 0                                  [heap]
    37ae000000-37ae01a000 r-xp 00000000 fd:00 2193610                        /lib64/ld-2.6.so
    37ae21a000-37ae21b000 r--p 0001a000 fd:00 2193610                        /lib64/ld-2.6.so
    37ae21b000-37ae21c000 rw-p 0001b000 fd:00 2193610                        /lib64/ld-2.6.so
    37ae400000-37ae547000 r-xp 00000000 fd:00 2193611                        /lib64/libc-2.6.so
    37ae547000-37ae747000 ---p 00147000 fd:00 2193611                        /lib64/libc-2.6.so
    37ae747000-37ae74b000 r--p 00147000 fd:00 2193611                        /lib64/libc-2.6.so
    37ae74b000-37ae74c000 rw-p 0014b000 fd:00 2193611                        /lib64/libc-2.6.so
    37ae74c000-37ae751000 rw-p 37ae74c000 00:00 0
    37ae800000-37ae882000 r-xp 00000000 fd:00 2193622                        /lib64/libm-2.6.so
    37ae882000-37aea81000 ---p 00082000 fd:00 2193622                        /lib64/libm-2.6.so
    37aea81000-37aea82000 r--p 00081000 fd:00 2193622                        /lib64/libm-2.6.so
    37aea82000-37aea83000 rw-p 00082000 fd:00 2193622                        /lib64/libm-2.6.so
    37b4400000-37b440d000 r-xp 00000000 fd:00 2193623                        /lib64/libgcc_s-4.1.2-20070503.so.1
    37b440d000-37b460d000 ---p 0000d000 fd:00 2193623                        /lib64/libgcc_s-4.1.2-20070503.so.1
    37b460d000-37b460e000 rw-p 0000d000 fd:00 2193623                        /lib64/libgcc_s-4.1.2-20070503.so.1
    37b5000000-37b50e5000 r-xp 00000000 fd:00 987280                         /usr/lib64/libstdc++.so.6.0.8
    37b50e5000-37b52e5000 ---p 000e5000 fd:00 987280                         /usr/lib64/libstdc++.so.6.0.8
    37b52e5000-37b52eb000 r--p 000e5000 fd:00 987280                         /usr/lib64/libstdc++.so.6.0.8
    37b52eb000-37b52ee000 rw-p 000eb000 fd:00 987280                         /usr/lib64/libstdc++.so.6.0.8
    37b52ee000-37b5300000 rw-p 37b52ee000 00:00 0
    2aaaaaaab000-2aaaaaaac000 rw-p 2aaaaaaab000 00:00 0
    2aaaaaada000-2aaaaaadd000 rw-p 2aaaaaada000 00:00 0
    2aaaac000000-2aaaac021000 rw-p 2aaaac000000 00:00 0
    2aaaac021000-2aaab0000000 ---p 2aaaac021000 00:00 0
    7fffc4b6a000-7fffc4b80000 rw-p 7fffc4b6a000 00:00 0                      [stack]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vdso]
    ce que j'ai fait dans les deux premières routines n'est peut etre pas ce qu'il fallait faire

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    ça peut venir des fonctions DiscardMotif() et UniqueMotif() ?

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Ceci dit, et sans vouloir être méchant, j'ai rarement vu un code aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(MotifIter=MotifMap.begin();MotifIter!=MotifMap.end();bAdd?MotifIter++:MotifIter)
    A choisir, je préfèrerais encore une simple boucle "tant que" du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MotifIter=MotifMap.begin();
    while(MotifIter!=MotifMap.end())
    {
        /* reste du code */
        if(bAdd)
            MotifIter++;
    }
    qui aurait le meme effet.

    De même, pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((int)(unsigned int)(*MotifIter).second.ProteinID.size()<Motif_MemberSize)
        MotifIter = MotifMap.
    Heuu... je ne suis pas sur de bien comprendre l'utilité de caster ProteinId.size() en entier non signé (car size() renvoie déjà un... entier non signé, grace à un typdef unsigned int size_t), puis de le re caster en entier signé...

    On peut, en outre, estimer que Motif_MembreSize ne sera jamais inférieur à 0...

    Dés lors, pourquoi ne pas, tout simplement, utiliser un entier non signé comme type pour Motif_MemberSize, et s'éviter les casts inutiles

    Au final, le code pourrait très bien être, tout simplement (apres avoir décidé d'utiliser une size_t comme type de Motif_membreSize)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MotifIter=MotifMap.begin();
     
    while(MotifIter!=MotifMap.end())
    {
        if((*MotifIter).second.ProteinID.size()<Motif_MemberSize)
        {
            MotifIter = MotifMap.erase(MotifIter);
        }
        else
            MotifIter++;
    }
    (je me suis contenté de garder une logique identique, mais en évitant les tests inutiles )

    Il faut cependant tenir compte que, sauf erreur, la méthode erase de la std::map invalide l'itérateur, et que, en tout cas, elle ne renvoie pas un itérateur (au mieux, elle renvoie le nombre d'éléments supprimés, quand on fournis un itérateur de début et un itérateur de fin)

    De ma même manière, je dois avouer que la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(++Next;Next!=MotifMap.end();bAdd?Next++:Next)
    est, pour le moins... tendancieuse... voire, suspecte

    Là encore, une "simple" boucle "tant que" me semblerait bien plus adaptée, ce qui donnerait un code, en prenant les remarques précédentes en compte, proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(MotifIter=MotifMap.begin();MotifIter!=MotifMap.end();MotifIter++)
    {
        map<int, MotifItem_t>::iterator next=MotifIter;
        next++;
        while(next!=MotifMap.end())
        {
            if((*MotifIter).second.ProteinID==(*Next).second.ProteinID && 
               (*MotifIter).second.ProteinPos[0]==(*Next).second.ProteinPos[0])
                Next=MotifMap.erase(Next);
            else
                next++;
        }
    }
    (avec toujours la même remarque concernant la méthode remove)

    Re PS: essaye d'éviter, quand tu présente un code, d'avoir recours au caractère de tabulation (essaie de le remplacer par 2,3 ou 4 espaces): il est généralement affiché comme étant une succession de... 8 espaces, ce qui risque, à la longue, d'emmener le "code significatif" "au diable vaut vert"...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    tu peux etre mechant avec le code ya pas de soucis je l'ai recupéré pour le tester et son auteur m'a dis que c mal codé donc j'essaye de voir tout ça.
    merci pour les info je teste.

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    Dans MotifIter = MotifMap.erase(MotifIter); et Next=MotifMap.erase(Next); il rale toujours

  12. #12
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    si je fais par exemple MotifMap.erase(Next); au lieu de Next=MotifMap.erase(Next); ça compile sans probleme mais apres ça fait le meme message d'erreur que precedement , il ya un double free corruption

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    *** glibc detected *** ./motif: double free or corruption (fasttop): 0x00000000009a2260 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x37ae470412]
    /lib64/libc.so.6(cfree+0x8c)[0x37ae473b1c]
    ./motif[0x40801d]
    ./motif[0x408045]
    ./motif[0x408090]
    ./motif[0x408af6]
    ./motif[0x41562f]
    ./motif[0x414278]
    ./motif[0x402376]
    ./motif[0x403ba7]
    ./motif[0x40f29e]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x37ae41dab4]
    ./motif(__gxx_personality_v0+0xb1)[0x4018b9]

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    C'est bien ce que je craignais... (mais je n'en étais plus tout à fait sûr ), la méthode erase invalide l'itérateur.

    Tu peux peut être envisager de "jouer" avec la fonction std::remove_if, qui fait appel à un "prédicat" (une recherche sur le forum devrait te donner des explications sur la manière de faire ), ou essayer un code du genre de
    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
    MotifIter=MotifMap.begin(); 
    while(MotifIter!=MotifMap.end())
    {
        if((*MotifIter).second.ProteinID.size()<Motif_MemberSize)
        {
            /* comme erase va invalider l'iterateur,
             *  on va travailler avec un iterateur temporaire
             */
            map<int,MotifItem_t>::iterator temp=MotifIter;
            /* on fait passer l'itérateur réel à l'élément suivant
             */
            MotifIter++;
            /* et on fait supprimer l'itérateur temporaire
             */
            MotifMap.erase(temp);
        }
        else
            MotifIter++;
    }
    Sinon, une méthode qui risque de prendre pas mal de temps, serait de repartir du premier iterateur à chaque suppression (mais cela donnera un algorithme en !n -vu que cela retestera systématiquement tous les itérateurs déjà testés à chaque fois qu'une suppression aura lieu- ce qui risque d'être désastreux du point de vue des performances)

    Cela donnerait un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MotifIter=MotifMap.begin(); 
    while(MotifIter!=MotifMap.end())
    {
        if((*MotifIter).second.ProteinID.size()<Motif_MemberSize)
        {
            MotifMap.erase(MotifIter);
            MotifIter=MotifMap.begin();
        }
        else
            MotifIter++;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    euuh ouais je vois pas trop ce que tu veux dire au fait

    comme ç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
     
     
    void DiscardMotif()
    {
    	map<int,MotifItem_t>::iterator MotifIter;
    	bool bAdd;
       MotifIter=MotifMap.begin();
       while(MotifIter!=MotifMap.end())
       {
       map<int,MotifItem_t>::iterator temp=MotifIter;
        if((*MotifIter).second.ProteinID.size()<Motif_MemberSize)
        {
            MotifMap.erase(temp);
        }
        else
            MotifIter++;
            }
     
    }

  16. #16
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    est ce que je peux vous envoyer le package si ça ne te dérange pas trop juste pour voir ce qui cloche ds l'exécution , j'ai pas encore de debugger et je suis pas root

  17. #17
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par anibal Voir le message
    euuh ouais je vois pas trop ce que tu veux dire au fait

    comme ça ?
    <sniped code>
    Non, exactement tel que je l'ai indiqué: comme cela
    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
    void DiscardMotif()
    {
        map<int,MotifItem_t>::iterator MotifIter=MotifMap.begin(); 
        while(MotifIter!=MotifMap.end())
        {
            if((*MotifIter).second.ProteinID.size()<Motif_MemberSize)
            {
                /* comme erase va invalider l'iterateur,
                 *  on va travailler avec un iterateur temporaire
                 */
                map<int,MotifItem_t>::iterator temp=MotifIter;
                /* on fait passer l'itérateur réel à l'élément suivant
                 */
                MotifIter++;
                /* et on fait supprimer l'itérateur temporaire
                 */
                MotifMap.erase(temp);
            }
            else
                MotifIter++;
        }
    }
    ou, pour la fonction UniqueMotif un truc du genre de
    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
    void UniqueMotif()
    {
        map<int, MotifItem_t>::iterator MotifIter, Next;
        for(map<int, MotifItem_t>::iterator MotifIter=MotifMap.begin();
            MotifIter!=MotifMap.end();MotifIter++)
        {
            map<int,MotifItem_t>::iterator Next=MotifIter;
            Next++;
            while(Next!=MotifMap.end())
            {
                if((*MotifIter).second.ProteinID==(*Next).second.ProteinID && 
                  (*MotifIter).second.ProteinPos[0]==(*Next).second.ProteinPos[0])
                {
                    /*il faut aussi un iterateur  temporaire */
                    map<int,MotifItem_t>::iterator torem=Next;
                    Next++;
                    MotifMap.erase(torem);
                }
                else
                    Next++;
            }
        }
    }
    Quant à vérifier tout le projet, je manque malheureusement de temps pour pouvoir le regarder de près, mais, si tu joins le fichier zip à un message, peut être trouvera tu quelqu'un pour qui les journées ne devraient pas durer... 48heures
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    le nug vient de là au fait, ya qque chose qui cloche avec cette routine ?

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    string Clustering()
    {
    	int max_score;
    	int i, j, node_id; // protein_id
    	map<pair<int, int>, int>::iterator DistanceIter;
    	string tree_str;
     
    	node_id = (int)(unsigned int)ProteinVector.size();
     
    	while((int)(unsigned int)DistanceMap.size()>1)
    	{
    		DistanceIter = DistanceMap.begin();
    		max_score=(*DistanceIter).second;
    		i=(*DistanceIter).first.first;
    		j=(*DistanceIter).first.second;
    		//max_score=0;
    		for(DistanceIter=DistanceMap.begin();DistanceIter!=DistanceMap.end();DistanceIter++)
    		{
    			if(max_score<(*DistanceIter).second)
    			{
    				max_score=(*DistanceIter).second;
    				i=(*DistanceIter).first.first;
    				j=(*DistanceIter).first.second;
    			}
    		}
    		//cout << "max_score=" << max_score << endl << i << "," << j << endl;
    		// merge i and j
    		NodePair.insert(make_pair(node_id, make_pair(i, j)));
    		DistanceMap.erase(make_pair(i, j));
    		ModifyDistanceMap(i, j, node_id);
    		EraseDistanceMap(i, j);
    		node_id++;
    	}
    	DistanceIter=DistanceMap.begin();
    	NodePair.insert(make_pair(node_id, make_pair((*DistanceIter).first.first, (*DistanceIter).first.second)));
     
    	tree_str=TreeExpression(node_id);
    	tree_str.append(";");
     
    	cout << tree_str << endl;
    	return tree_str;
    }

  19. #19
    Membre confirmé
    Inscrit en
    Mars 2005
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 137
    Par défaut
    est ce que qqun peut me dire s'il ya qque chose qui cloche avec cette routine qui est certe mal codée mais qui normalement devrait fonctionner correctement ?

    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
     
    void EraseDistanceMap(int i, int j)
    {
    	map<pair<int, int>, int>::iterator DistanceIter;
    	bool bAdd;
    	int first_id, second_id;
     
    	for(DistanceIter=DistanceMap.begin();DistanceIter!=DistanceMap.end();bAdd?DistanceIter++:DistanceIter)
    	{
    		first_id = (*DistanceIter).first.first;
    		second_id = (*DistanceIter).first.second;
     
    		bAdd = true;
    		if(first_id == i || first_id == j || second_id == i || second_id == j)
    		{
    			DistanceMap.erase(DistanceIter);
    			bAdd = false;
    		}
    	}
    }

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne suis pas sûr du test sur first_id et second_id...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. compiler code source de trueCrypt
    Par boubounagh dans le forum Visual C++
    Réponses: 1
    Dernier message: 02/10/2012, 19h12
  2. compiler code source BIRT 4.0
    Par maatrihard dans le forum BIRT
    Réponses: 0
    Dernier message: 30/06/2012, 20h28
  3. Ouvrir .vcproj, compiler codes sources
    Par Lyth_o dans le forum Visual Studio
    Réponses: 3
    Dernier message: 06/11/2011, 18h46
  4. compiler code source en "interne"
    Par kespy13 dans le forum Général Java
    Réponses: 5
    Dernier message: 30/04/2008, 14h46
  5. probleme compilation code source sur autre pc
    Par milach dans le forum Visual C++
    Réponses: 1
    Dernier message: 18/04/2008, 09h06

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