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++

  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 392
    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 392
    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.

  7. #7
    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
    Ben fais-le une fois pour voir si c'est bien la structure qui cause ton erreur.

  8. #8
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Heu je voudrais pas dire de bétises, mais a aucun moment tu fait une allocation memoire pour ta structure ? meme pô un p'tit malloc() ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Par défaut
    Le malloc() n'est-il pas propre au C et non au C++ ?

  10. #10
    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
    Si si, mais parfois, certaines personnes l'utilisent encore.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Mais là n'est pas la question, puisque la structure est directement sur la pile ici.

    Edit: J'ai un peu réindenté le code, car on n'y comprenait rien:
    Code C++ : 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
    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                               //
    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.

  12. #12
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    oui en C++ il est sensé allouer la mem en meme temps que l'instanciation mais bon ca coute rien de l'alouer d'abord pouis de la remplir...pour voir
    oui oui.... (fiouuu fatigué moua)


    mais tu code sous win ou linux car avec un debogueur ce serait plus precis pour trouver l'erreur

  13. #13
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Et avec un :

    ligne_MTE* resultat;

    ?

  14. #14
    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
    A quoi ça servirait ?

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Au fait, c'est normal que resultat ne soit pas utilisé dans le code posté ?
    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.

  16. #16
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Citation Envoyé par Miles
    A quoi ça servirait ?
    Ben comme ca il pourrait utiliser le pointeur vers cette structure, ca serait plus propre question gestion de memoire, ustement parceque la dans ce code il n'est apparement pas utilisé, c'est qu'il doit servir ailleur et peut etre que ailleur il s'en sert justement comme un pointeur vers cette structure...ouf

    Moi je m'arrange toujours pour utliser des pointeurs, c'est plus chiant mais plus "propre", en fin je dit ca mais ca n'engage que moi

  17. #17
    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
    Ah, OK
    Je n'utilise des pointeurs que lorsque la ressource doit être partagée entre plusieurs instances de classe. Et alors, j'utilise aussi des pointeurs intelligents - cf ma signature -

  18. #18
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    D'ailleur si cette structure est vraiment utilisée j'en ferai un "vrai" objet, puisque tu utilise le C++ autant en utliser les avantages !
    grace au new() et au delete() pas de probleme de mémoire !

    ps: a oui ca a l'air sympa les pointeur inteligents, j'en avais entendu parler mais pas encore utilisé, merci Miles !

  19. #19
    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
    Citation Envoyé par SnakemaN
    ps: a oui ca a l'air sympa les pointeur inteligents, j'en avais entendu parler mais pas encore utilisé, merci Miles !
    Je t'en prie, on est là pour partager

  20. #20
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    NB: malloc n'est pas compatible avec des classes. La construction n'est pas réalisée.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

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