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 ( violation d'acces) dans mon programme


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut erreur de segmentation ( violation d'acces) dans mon programme
    bonjour,

    Je suis en train de developper une application C++ pour resoudre un probleme d'optimisation avec les colonies de fourmis (m fourmis). La premiere fourmi cherche son chemin et calcule la solution...et puis après, erreur de violation d'accès... Ci-joint le code de mon application...Quelqu'un pourrait-il m'aider...c'est vrament urgent...merci beaucoup.

    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    // declaration de la classe fourmi
    class fourmi
    {
    public:
        std::vector<graphe::vertex_id> sommets_deja_visites, sommets_a_visiter, vecteur_visite;
        std::vector<float> solution_fourmi, table_decision, table_decision_nv;
        // A changer en fonction du nombre d'objectifs du probleme...
        inline fourmi();
    };
     
    inline fourmi::fourmi()
    {
        sommets_deja_visites.clear();
        sommets_a_visiter.clear();
        vecteur_visite.clear();
        solution_fourmi.clear();
    }
     
    // COEUR DE L'ALGORITHME
    void graphe::rechercher_solution()
    {
        std::vector<fourmi*> fourmis; // un vector de fourmis
     
        // génération des fourmis
        for (int i=0; i<nbfourmis; i++)
            fourmis.push_back(new fourmi());
     
        pair<vi, vi> vg;
        vg = vertices(g);
        sommet_depart = *vg.first;
     
        // remplir les sommets à visiter pour chaque fourmi
        vector<fourmi*>::iterator f = fourmis.begin();
        while (f != fourmis.end())
        {
            for (vg = vertices(g); vg.first != vg.second; ++vg.first)
            {
                if (g[*vg.first].ind_col != 0)
                    (*f)->sommets_a_visiter.push_back(*vg.first);
            }
            f++;
        }
        // FIN REMPLISSAGE
     
        {
            int nbre = 0;
            while (nbre < nbre_iterations)
            {
                //traiter chaque fourmi
                /*vector<fourmi*>::iterator f = fourmis.begin();*/
                int compte = 1;
                for (f=fourmis.begin(); f!=fourmis.end(); f++)
                {
                    //   while (f != fourmis.end()){
                    srand (compte);
                    pair<vi, vi> vg;
                    vg = vertices(g);
                    //sommet_depart = *vg.first;
                    sommet_courant = *vg.first;
                    (*f)->vecteur_visite.push_back(sommet_courant);
     
                    for (int i=0; i<(2*nbre_variable); i++)
                    {
                        bool vide = false;
                        sommets_non_visites.clear(); (*f)->table_decision_nv.clear();
                        sommets_out.clear(); (*f)->table_decision.clear();
                        sommet_initial = sommet_courant;
                        pair<ai,ai> a_cote = adjacent_vertices(sommet_courant, g);
                        ai suiv;
                        for (suiv = a_cote.first; suiv<a_cote.second; suiv++)
                            sommets_out.push_back(*suiv);
                        if (sommets_out.size() == 1)
                            sommet_courant = *a_cote.first;
                        else
                        {
                            (*f)->table_decision = table_decision_fourmi(sommet_courant, sommets_out);
                            vector<vertex_id>::iterator iter1 = (*f)-> sommets_a_visiter.begin();
                            vector<vertex_id>::iterator iter2 = sommets_out.begin();
                            //for(iter2 = sommets_out.begin(); iter2!= sommets_out.end(); iter2++)
                            //  {cout<<"\t\t\taprès"<<*iter2<<endl;system("pause");}
                            vector<float>::iterator iter3 = (*f)->table_decision.begin();
     
                            while (iter2 != sommets_out.end())
                            {
                                iter1 = find((*f)->sommets_a_visiter.begin(), (*f)->sommets_a_visiter.end(), *iter2);
                                if (iter1 != (*f)->sommets_deja_visites.end())
                                {
                                    sommets_non_visites.push_back(*iter2);
                                    (*f)->table_decision_nv.push_back(*iter3);
                                }
                                iter2++;iter3++;
                            }
                            if  (sommets_non_visites.empty())
                                vide = true;
                            float d=1.0/RAND_MAX;
                            q = rand()*d; //cout<<"\t\t\t"<<q<<endl;system("pause");
                            if((q <= q0) || (vide==true))
                                // intensification
                                sommet_courant = sommets_out[maximum ((*f)->table_decision)];
                            else if ((q > q0) && (vide==false))
                                // Diversification
                            {
                                float somme = 0;
                                for (vector<float>::iterator iter4 = (*f)->table_decision_nv.begin(); iter4 != (*f)->table_decision_nv.end(); iter4++)
                                    somme += *iter4;
                                float maxi = 0;
                                vector<float> divers;
                                for (vector<float>::iterator iter4 = (*f)->table_decision_nv.begin(); iter4 != (*f)->table_decision_nv.end(); iter4++)
                                    divers.push_back((float)*iter4 / (float)somme);
     
                                // Roulette russe sur sommets non visités......
                                float S = (float)maximum(divers)/RAND_MAX;
                                float russe = rand()*S;
                                vector<float>::iterator iter5 = divers.begin();
                                vector<vertex_id>::iterator iter6 = sommets_non_visites.begin();
                                while (iter5 != divers.end())
                                {
                                    if (*iter5 >= russe)
                                        break;
                                    iter5++;
                                    iter6++;
                                }
                                sommet_courant = *iter6;
                            }
                        }
                        sommet_final = sommet_courant;//cout<<"\t\t\t\tSALAM\t"<<sommet_courant<<endl;system("pause");
                        MAJ_locale(sommet_initial, sommet_final);
                        (*f)->vecteur_visite.push_back(sommet_final);
                        if(g[sommet_final].ind_col != 0)
                        {
                            vector<vertex_id>::iterator iter1 = (*f)->sommets_a_visiter.begin();
                            while (iter1 != (*f)->sommets_a_visiter.end())
                            {
                                iter1 = find((*f)->sommets_a_visiter.begin(), (*f)->sommets_a_visiter.end(), sommet_courant);
                                if (iter1!=(*f)->sommets_a_visiter.end())
                                {
                                    (*f)->sommets_a_visiter.erase(iter1);
                                    break;
                                }
                                iter1++;
                            }
                        }
                        (*f)->sommets_deja_visites.push_back(sommet_courant);
                    }
                    (*f)->solution_fourmi = calculer_objectif((*f)->vecteur_visite);
                    for(vector<float>::iterator s = (*f)->solution_fourmi.begin(); s!= (*f)->solution_fourmi.end(); s++)
                        cout<<*s<<endl;system("pause");
                    compte += 1;
                }
     
                // Recherche de la meilleure solution respectant les contraintes
                f = fourmis.begin();
                while (f != fourmis.end())
                {
                    if(   ((*f)->solution_fourmi[0]>=solution_contrainte[0])
                        &&((*f)->solution_fourmi[1]>=solution_contrainte[1])
                        &&((*f)->solution_fourmi[2]>=solution_contrainte[2])
                        &&((*f)->solution_fourmi[3]<=solution_contrainte[3])
                        &&((*f)->solution_fourmi[4]<=solution_contrainte[4]))
                    {
                        solution = (*f)->solution_fourmi;
                        meilleure_visite = (*f)->vecteur_visite;
                        solution_contrainte = solution;
                    }
                    f++;
                }

  2. #2
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    lance en mode debug

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    c deja fait mais j'arrive pas a localiser l'erreur

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    comme je l'ai deja annoncé, ca passe pour la premiere fourmi, mais pour la deuxieme, la variable "sommet_courant" prend une valeur aleatoire qui sort du cadre de mon graphe alors qu'elle devrait etre initialisée à *vg.first !

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    rajoute des log trace un peu partout en y indiquant la valeur des variables importantes et regarde où ton programme s'est coupé

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    ok, merci...je te tiens au courant

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour barakastop et bienvenu sur le forum

    Premièrement, avant de pouvoir commencer à t'aider, j'ai du complètement retravailler la présentation de ton code : pense aux balises CODE, ne mets pas des "..." partout, évite les commentaires contenant des lignes complète de * ou de =, fais attention à l’indentation...
    Bref, aides nous à pouvoir comprendre ton code (et par la même occasion toi aussi). Par exemple, utilises des typedef, donnes des noms moins loin, aère ton code, etc.

    Ensuite, il semblerait que le code complet n'y est pas (il manque des fermetures de bloc).

    De plus, un seule fonction de plus 140 lignes (après mise en forme), ça n'aide pas à comprendre, à corriger et à éviter les erreurs. On est loin de la programmation objet. Il faudrait corriger l'architecture des tes classes.

    Pour terminer, tu nous donnes un code non compilable et une erreur sans donner le numéro de ligne. Ça va être très dur de trouver une solution.

    Ton erreur provient souvent d'une tentative d'accès à un pointeur non initialisé. La seule chose que l'on peut te conseiller, c'est d'ajouter des tests et logs pour vérifier tes accès et trouver où ton code plante.

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Petites remarques supplémentaires :

    - inutile d'appeler clear() pour initialiser tes vector dans le constructeur
    - si tu n'utilises pas le polymorphisme d'héritage pour ta classe fourmi, tu n'as pas besoin (à priori) de créer des vecteurs de pointeurs de fourmi

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    voilà, pour la deuxieme fourmi, sommet_courant reste egale à "0" ce qui provoque une erreur au niveau de lappel de MAJ_locale( , )

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    je comprends ce que tu veux dire qbdivers...merci pour ta bienveillance; neanmoins, il m'est impossible de modifier mon code dans l'immediat car j'ai besoin de resultats de toute urgence. pour ce qui est de l'implementation de la cla sse "fourmi", j'ai juste besoin qu'une fourmi puisse se souvenir des sommets a visiter, de ceux qui ne l'ont pas encore été et de la derniere solution trouvée...Par contre, les fourmis se deplacent dans un graphe crée avec boost graph (liste d'adjacence). merci encore...

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Nota Bene
    le sommet "0" correspond à *vg.first.
    J'attends votre aide; merci

  12. #12
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Utilise un débuggeur, ça sera bien plus pratique pour voir ce qui se passe au fur et à mesure !

    Comme gbdivers te l'a indiqué, le code n'est pas complet, compilable, ... on peut donc te donner des pistes sur les outils les mieux adapter, mais c'est tout.

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    bonjour monsieur Mathieu, je vous connais très bien d'après vos tuto...voulez vous que je vous envoie le code complet ?

    P.S. J'utilise Dev-C++

  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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Malheureusement, je n'ai pas beaucoup de temps (et je passe mes journées de boulot à débugger du code //, pas trop envie de faire de même le week-end ).
    Si tu utilises dev-C++, tu devrais avoir un gdb, non ?

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    merci d'etre sincere. En fait, mon debugger sous dev-c++ se bloque en mode pas a pas avant meme d'atteidre l'endroit de l'erreur !!!

  16. #16
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En mode débug ? Si oui, tu as potentiellement un bug avant. Faut tout corriger, pas juste une partie

Discussions similaires

  1. [DLL] Violation d'acces dans msvbvm60.dll
    Par SubZero2 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/04/2006, 13h46
  2. [D7] Violation d'accès dans l'IDE
    Par paradise dans le forum Langage
    Réponses: 1
    Dernier message: 08/02/2006, 16h10
  3. Message de violation d'accès dans la dcc50.dll
    Par cchatelain dans le forum EDI
    Réponses: 17
    Dernier message: 29/11/2005, 18h28
  4. Violation d'accès dans l'EDI sur compo1 apres suppr de comp2
    Par RamDevTeam dans le forum Composants VCL
    Réponses: 2
    Dernier message: 31/05/2005, 15h02
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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