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 :

erreur de segmentation


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Par d�faut erreur de segmentation
    Bonjour,

    Apr�s la copie d'un pointeur dans un autre, j'obtiens une erreur de segmentation mais je ne comprends pas pourquoi.

    Voici le code :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    void fullTreeInit(Element * elt, int depthTreeCurrent, int randDepth, vector<Element*>& leaves, int nbSeqByST, int *tabSeq, string * aligt, int racine, Element *father){ //si le noeud est la racine, racine=0 sinon racine=1
    	//cout<<"nbSeqByST : "<<nbSeqByST<<endl;
    	//cout<<"randDepth : "<<randDepth<<endl;
    	if(depthTreeCurrent==randDepth){
    		elt->STl=NULL;
    		elt->STr=NULL;
    		elt->posGap=-1;
    		elt->lengthGap=-1;
    		//elt->tabSequenceInST=NULL;
    		elt->sizeTab = nbSeqByST;
    		if(nbSeqByST==1){
    			elt->indexSequence=tabSeq[0];
    			//elt->tabSequenceInST=(int*)malloc(elt->sizeTab*sizeof(int));
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST) );
    			//elt->tabSequenceInST=tabSeq;
    		}
    		else{
    			elt->indexSequence=-1;
    			//elt->tabSequenceInST=NULL;
    		}
    	}
    	else{
    		//création des 2 sous arbres
    		//~ if(racine==1){
    			//~ elt->nodeFather=father;
    		//~ }
    		elt->STl = new Element();
    		elt->STr = new Element();
     
    		elt->STl->nodeFather=elt;
    		elt->STr->nodeFather=elt;
     
     
    		elt->sizeTab = nbSeqByST;
    		elt->indexSequence=-1;
    // 		cout<<"test"<<endl;
    // 		for(int i=0;i<elt->sizeTab;i++){
    // 			cout<<"tabSeq : "<<tabSeq[i]<<endl;
    // 		}
     
     
     
    		if(nbSeqByST!=0){
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST));
    		}
     
    		//on n'ajoute pas de gap sur un noeud contenant toutes les séquences
    		if(nbSeqByST==nbSequence){
    			elt->posGap=-1;
    			elt->lengthGap=-1;
    		}
    		else{
    			int minLength=min(nbSeqByST, tabSeq);
    			if(tossCoin(1.0)){
    				elt->posGap=random(0, minLength+1);//choix au hasard d'un nombre pour la position des gaps
    				elt->lengthGap=rand() %10+1;//nombre au hasard pour le nombre de gaps ajoutés
    				for(int j=0;j<nbSeqByST;j++){
    					int idSeq = tabSeq[j];
    					string seqGap=aligt[idSeq];
    					string newSeqGap="";
    					//~ aligt[idSeq]=addGap(seqGap, seqGap.size(), elt->posGap, elt->lengthGap, newSeqGap);
    				}
    			}
    			else{
    				elt->posGap=-1;
    				elt->lengthGap=-1;
    			}
    		}
     
    		int sizeTabL=0;
    		int sizeTabR=0;
    		int nbLeavesCurrent = expo(2, randDepth-depthTreeCurrent);//nombre de feuilles à* la fin du sous arbre
     
    		sizeTabL=random(0, nbSeqByST+1);
    		sizeTabL=seqShareRandom(nbLeavesCurrent, nbSeqByST, sizeTabL);
    		sizeTabR=nbSeqByST-sizeTabL;
     
    		//tableau avec les séquences se trouvant dans le sous arbre
    		int tabSTr[sizeTabR];
    		int tabSTl[sizeTabR];
     
     
    		//ajout au hasard des séquences dans les tableaux contenant les séquences dans le sous arbre
    		int r=0;
    		int l=0;
    		for(int i=0; i<nbSeqByST; i++){
    			int a=random(0,2);
    			if(a==0 && l<sizeTabL){
    				tabSTl[l]=tabSeq[i];
    				l++;
    			}
    			else{
    				if(r<sizeTabR){
    					tabSTr[r]=tabSeq[i];
    					r++;
    				}
    				else{
    					tabSTl[l]=tabSeq[i];
    					l++;
    				}
    			}
    		}
     
     
    		//initialisation noeud père
     
     
    		fullTreeInit(elt->STl, depthTreeCurrent+1, randDepth, leaves, sizeTabL, tabSTl, aligt, 1, elt);
    		fullTreeInit(elt->STr, depthTreeCurrent+1, randDepth, leaves, sizeTabR, tabSTr, aligt, 1, elt);
    	}
    }
    j'ai fais une recherche avec Valgrind mais je ne comprends pas o� est l'erreur.

    Stack overflow in thread 1: can't grow stack to 0x7fe801fe0
    ==5376==
    ==5376== Process terminating with default action of signal 11 (SIGSEGV)
    ==5376== Access not within mapped region at address 0x7FE801FE0
    ==5376== at 0x4C28AEA: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==5376== If you believe this happened as a result of a stack
    ==5376== overflow in your program's main thread (unlikely but
    ==5376== possible), you can try to increase the size of the
    ==5376== main thread stack using the --main-stacksize= flag.
    ==5376== The main thread stack size used in this run was 8388608.
    ==5376== Stack overflow in thread 1: can't grow stack to 0x7fe801fd8
    ==5376==
    ==5376== Process terminating with default action of signal 11 (SIGSEGV)
    ==5376== Access not within mapped region at address 0x7FE801FD8
    ==5376== at 0x4A2359C: _vgnU_freeres (vg_preloaded.c:58)
    ==5376== If you believe this happened as a result of a stack
    ==5376== overflow in your program's main thread (unlikely but
    ==5376== possible), you can try to increase the size of the
    ==5376== main thread stack using the --main-stacksize= flag.
    ==5376== The main thread stack size used in this run was 8388608.
    ==5376==
    ==5376== HEAP SUMMARY:
    ==5376== in use at exit: 53,344,335 bytes in 213,176 blocks
    ==5376== total heap usage: 222,618 allocs, 9,442 frees, 54,204,936 bytes allocated
    ==5376==
    ==5376== LEAK SUMMARY:
    ==5376== definitely lost: 0 bytes in 0 blocks
    ==5376== indirectly lost: 0 bytes in 0 blocks
    ==5376== possibly lost: 2,407 bytes in 45 blocks
    ==5376== still reachable: 53,341,928 bytes in 213,131 blocks
    ==5376== suppressed: 0 bytes in 0 blocks
    ==5376== Rerun with --leak-check=full to see details of leaked memory
    ==5376==
    ==5376== For counts of detected and suppressed errors, rerun with: -v
    ==5376== Use --track-origins=yes to see where uninitialised values come from
    ==5376== ERROR SUMMARY: 12902 errors from 7 contexts (suppressed: 4 from 4)
    Erreur de segmentation
    Est ce que quelqu'un peut m'aider?

    Merci

    Alaninho

  2. #2
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par d�faut
    Salut!

    Alors j'ai regard� rapidement les messages d'erreurs. A priori tu essaye d'acc�der � une zone m�moire qui n'a pas �t� allou�e.

    Je n'ai pas encore regard� ton code dans le d�tails. Mais tu peux peut �tre rajouter des tests te permettant de voir si tes pointeurs ne sont pas � NULL avant de les utiliser. C'est une premi�re piste de recherche.

    Apr�s, lorsque tu copie des pointeurs d'objets je te conseil d'utiliser des constructeurs par recopie prenant en param�tre le pointeur vers l'objets � copier.

    As-tu essay� de faire du pas-�-pas � l�ex�cution pour isoler les lignes qui posent probl�me ?

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    C�est quoi la d�finition de Element, et notamment de tabSequenceInST ?

    C�est un bon candidat : tu �cris dedans, il n�est jamais allou�.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    R�ponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    R�ponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    R�ponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    R�ponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    R�ponses: 10
    Dernier message: 15/03/2005, 11h18

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