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 :

Création d'une structure, erreur de segmentation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Par défaut Création d'une structure, erreur de segmentation
    Hello, j'ai un souci avec la création de la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct ligne_MTE
    {
    int terminal; // terminal associé a la table
    int ElementListSize; //nombre d'elements associé a la ligne
    int MultiplexTableEntryNumber; //numero inclus dans l'entree 
    int NumeroLCN; // logical channel associé
    std::string RepeatCount; // RC (UCF ? chiffre ?)
    std::string type; // audio / video / both
    };
    En effet, lorsque, dans une fonction j'effecture la commande :

    Le programme n'a aucune erreur de compilation, mais plante sur ce point précis (erreur de segmentation).
    S'agit-il d'un problème d'allocation mémoire ? comment le prévenir ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Avec si peu d'information, je ne vois rien qui pourrait faire planter là-dedans...
    L'erreur doit venir d'autre part.
    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.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est aussi bon pour moi, ce code n'a pas de souci. Essaie d'élaguer ton code pour trouver le problème.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Par défaut
    Effectivement, ce code ne posait aucun problème sous environnement dev-cpp/windows, mais son adaptation sous Solaris est plus problématique.

    La partie du main concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //--------------------------------------GENERER LA MTE-------------------------------------//
    
    cout << "GENERATION DE LA MTE ..."<< endl;
    
    
    MTE table1;int index_balayage=0;int row = 0;
    //while(1){
    table1.recup_tableau_vals(tableau_valeurs);
    int temp = index_balayage;
    table1.set_index(index_balayage);
    table1.recup_ligne(row);
    table1.affichetable_MTE();
    std::cout << "FIN AFFICHAGE DE LA TABLE" << std::endl;
    Le début du code de "recup_ligne" :

    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
    void MTE::recup_ligne(int &row){
    
    std::cout <<  "fonction recup lignes" << std::endl;
    std::cout <<  "creation de l iterateur" << std::endl;
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + index +1 ;
    
    int nombre_desc = 0;
    ligne_MTE resultat;
    std::cout <<  "creation de la ligne MTE resultat" << std::endl;
    
    std::cout << "debut de la boucle while pour balayer le tableau" << std::endl;
    while (iter != tableau_vals.end ()) {
    
    int SNrep;int SNreq;
    	  if(iter -> correspondance.find("multiplexEntrySend (6)") != -1)
    	  {std::cout << "MES trouve" << std::endl;
    	   		  
    //                                    MES ACQUITTE PAR L'AUTRE TERMINAL ?                         //
        
    	  int terminalreq = iter ->num_terminal;
    	  std::istringstream iss(((iter+1)->correspondance).substr(0,1));
    	  iss>>SNreq;
          //std::vector<struct ligne_valeurs>::iterator iter2 = tableau_vals.begin() + std::distance(tableau_vals.begin(), iter) ;	  
    	  std::vector<struct ligne_valeurs>::iterator iter2 = tableau_vals.begin();
    	  
    	  while (iter2 != tableau_vals.end ()) {
    	  		std::cout << "(iter2->correspondance) : " << (iter2->correspondance) << std::endl;
    	  if((iter2->correspondance).find("multiplexEntrySendAck")!=-1)
    	  {
    	   															   
          int terminalrep = iter2 -> num_terminal;
    	  //std::cout <<  "Terminal Req : " << terminalreq << " et Terminal Rep : " << terminalrep <<std::endl;
    	  if(terminalrep == terminalreq){break;}
    
    	  std::cout <<  "MESAck Trouve" << std::endl; 															   
          std::istringstream iss(((iter2+1)->correspondance).substr(0,1));
    	  iss>>SNrep;
    	  std::cout <<  "SNReq vaut : " << SNreq << " et SNRep vaut : " << SNrep << std::endl;
    	  if(SNrep == SNreq){break;}
    	  }
    	  iter2++;
    	  }
    	  std::cout <<  "Fin balayage tableau pour verif d'Ack" << std::endl;
    	  int ack =1;
    	  //VALEUR A MODIFIER POUR OUTREPASSER L'ACQUITTEMENT MES
    	  if(SNrep == SNreq){
    	  		     ack =1;
    				 std::cout <<  "TRAME ACQUITTEE => MTE VALABLE"<<std::endl;
    				 }
    	  
    	  if(ack==0){
      			 std::cout <<  "TRAME NON ACQUITTEE => MTE NON VALABLE"<<std::endl;
    	  			 break;}
    	  
    	  std:: cout << "Fin ACK" << std::endl;
    
    //                                              MES ACQUITTEE                               //
    Le truc, c'est que la méthode plante au début, sur la création de la structure, ce qui est très étonnant, a priori. Comment s'assurer qu'il n'y a pas un problème lié à la mémoire ?

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Je me poserai plus de questions avec l'itérateur qu'avec cette structure qui n'a rien de particulier. Tu as essayé en la supprimant ? au fait, pourquoi passer row en argument référence ?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Par défaut
    Le passage en référence est effectivement inutile, je le supprime de ce pas.

    Pour ce qui concerne l'itérateur, il est nécessaire pour le "balayage" d'un tableau de valeurs. Supprimer la structure ? pour la remplacer par ?

    La méthode rajoute des éléments dans une structure créée au départ (ici la structure "resultat"), puis rajoute la structure dans un tableau de structures (vector de variables différentes).

    Si je supprime la structure créée au départ, je ne peux plus faire fonctionner la méthode.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/07/2011, 14h20
  2. Incrémentation d'un élément de structure : erreur de segmentation
    Par BOByTOX dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 27/04/2011, 18h37
  3. Pointeurs et structures: erreur de segmentation
    Par Skize dans le forum Débuter
    Réponses: 7
    Dernier message: 07/10/2010, 08h43
  4. Création d'une structure dynamique
    Par jbat dans le forum API, COM et SDKs
    Réponses: 17
    Dernier message: 14/04/2008, 15h55
  5. Réponses: 11
    Dernier message: 05/01/2006, 12h55

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