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

  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut erreur de segmentation
    Bonsoir à tous,
    J'ai une erreur de segmentation ici à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        *(population+i*nbVilles)=vDepart;
    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 creerIndividus (struct ville *v, const long vDepart, const long nbVilles, const long nbIndividu, long *population)
    {
    int i, j, tempVerif;
     
    //Tableau où l'on mettra 1 si la ville a déja été positionnée.
    long verifDoublon[nbIndividu][nbVilles];
     
    //Initialisation du tableau de vérifications à 0.
    for (i=0 ; i<nbIndividu ; i++)
    {
        for (j=0 ; j<nbVilles ; j++)   verifDoublon[i][j]=0;
    }
     
    //    //On place la ville de départ en première position de l'individu.
        for (i=0 ; i<nbIndividu ; i++)
        {
            *(population+i*nbVilles)=vDepart;
         //   verifDoublon[i][vDepart]=1;
        }
    }
    Déclaration de la structure population :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //La population sera un tableau à 2dim de taille [nbIndividu][nbVilles].
        long population[nbIndividus][dimension];
    Appel dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      creerIndividus(v,indexVille,dimension,nbIndividus,*population);
    Une idée svp pour ca?
    merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    J'ai l'impression que choux et carottes sont un peu mélangées :
    population est un tableau de tableau, or il est considéré comme un simple tableau (passage pas pointeur) dans la fonction creerIndividus.

    On peut faire ça plus simplement : au lieu de faire de l'algorithme de pointeur, on passe par l'opérateur [].
    Une fois que ce code fonctionnera, on pourra remplacer les [] par des *().

    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
    #define NB_INDIVIDUS 15
    #define NB_VILLES 10
     
    /*La population sera un tableau à 2dim de taille [nbIndividu][nbVilles].*/
    long population[INDIVIDUS][VILLES];
     
    /*A noter : la prototype a changé : population est un pointeur de pointeur*/
    void creerIndividus(struct ville *v, const long vDepart, const long nbVilles, 
                        const long nbIndividu, long **population)
    {
        int i, j, tempVerif;
     
        /*Tableau où l'on mettra 1 si la ville a déja été positionnée.*/
        long verifDoublon[nbIndividu][nbVilles];
     
        /*Initialisation du tableau de vérifications à 0.*/
        for (i=0 ; i<nbIndividu ; i++) {
            for (j=0 ; j<nbVilles ; j++) {
                verifDoublon[i][j]=0;
            }
        }
     
        /*On place la ville de départ en première position de l'individu.*/
        for (i=0 ; i<nbIndividu ; i++) {
            population[i][vDepart] = 1;
        }
    }

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci Mabu, mais ca me semble bizarre cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        /*On place la ville de départ en première position de l'individu.*/
        for (i=0 ; i<nbIndividu ; i++) {
            population[i][vDepart] = 1;
        }
    On veut mettre la ville de départ qui est une chaine à la 1ere position

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    [...]On veut mettre la ville de depart à la 1ere position
    Ok, dans ce ca, il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i=0 ; i<nbIndividu ; i++) {
            population[i][0] = vDepart;
        }
    Citation Envoyé par étoile de mer Voir le message
    [...]depart qui est une chaine
    Attention, dans ce cas, une partie de ton code est à revoir, tu dis que la ville de départ est une chaine, mais tu passes un const long à la fonction.

    Si on doit travailler avec des chaines de caractères, le problème sera un peu plus ardu.

    Peux tu nous expliquer ce que doit stocker le tableau population ?
    Dernière modification par Invité(e) ; 04/01/2010 à 13h23. Motif: oublie balises code

  5. #5
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    c'est un peu compliqué
    En fait j'explique :
    j'ai un tableau de structure vile: v1,v2,v3,v4
    cette fonction va genere des instances de chemein entre les ville, sachante que l'utilisateur a deja choisi une ville de depart
    par exemple il a choisi comme vile de depart v2, donc cette fonction va creer des instances de trajet:
    comme ca par exmple
    v2->v1->v3->v4
    v2->v3->v4->v1
    ...
    le trajet commence toujours par la ville chosi par l'utilisateur et ne contient 2 meme ville
    Je pense qu'on peut se baser un peu de cette idée http://www.developpez.net/forums/d85...s/#post4892985

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    là j'ai modifié uun peu: j'ai declaré dans le main une matrice d'entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int population[nbIndividus][dimension];
    et encore dans le main j'ai fait un appel de la fonction qui va remplir cette matrice par des entier de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    creerIndividus(v,indexVille,dimension,nbIndividus, population);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void creerIndividus (struct ville *v, const long vDepart, const long nbVilles, const long nbIndividu, int   population[nbVilles][nbIndividu])
    {
    int i, j, tempVerif;
     
    //Tableau où l'on mettra 1 si la ville a déja été positionnée.
    long verifDoublon[nbIndividu][nbVilles] = {{ 0 }};
     
    ////    //On place la ville de départ en première position de l'individu.
        for (i=0 ; i<nbIndividu ; i++)
        {
           population[i][0] = vDepart;
           verifDoublon[i][vDepart]=1;
        }
    }
    mais là ya une erreur à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     long verifDoublon[nbIndividu][nbVilles] = {{0}};
    |erreur: un objet de taille variable peut ne pas être initialisé|

  7. #7
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bon comme ca etait ca fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    long verifDoublon[nbIndividu][nbVilles];
     
    for (i=0 ; i<nbIndividu ; i++)
    {
        for (j=0 ; j<nbVilles ; j++)   verifDoublon[i][j]=0;
    }
    mais pour remplir la matrice ca genere une autre 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
    ////    //Tirage aléatoire des villes suivantes des individus.
        for (i=0 ; i<nbIndividu ; i++)
        {
            for (j=1 ; j<nbVilles ; j++)
            {
                do
                {
                    tempVerif = tirage(nbVilles);
                }
                while (verifDoublon[i][tempVerif]!=0);
     
                 population[i][j]=tempVerif;
     
                verifDoublon[i][tempVerif]=1;
            }
        }
    l'erreur est à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    population[i][j]=tempVerif;

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    Merci Mabu, mais ca me semble bizarre cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        /*On place la ville de départ en première position de l'individu.*/
        for (i=0 ; i<nbIndividu ; i++) {
            population[i][vDepart] = 1;
        }
    On veut mettre la ville de départ qui est une chaine à la 1ere position
    Il y a une petite confusion, on ne place pas la ville elle meme, mais son indice !

    Par exemple, v1 a l'indice 0, v2 a l'indice 1 ...

  9. #9
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci SoftEvans,
    mais l'erreur persiste encore

  10. #10
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Si je comprend bien ce que tu as marqué (beaucoup) plus haut tu veux avoir une ville de départ vDepart et ensuite tirer le reste des villes au hasard. C'est bien ça ?

    Si c'est ça le plus simple c'est tout mettre dans un tableau, avec vDepart à l'indice 0. Ensuite tu mélanges ton tableau
    Tu fais une boucle en partant de l'indice le plus élevé, jusqu'à l'indice 1.
    Et à chaque fois tu tires un nombre au hasard compris entre 1 et l'indice (inclus). Et tu échanges ces 2 valeurs.

    Si ce n'est pas ça j'ai pas compris ce que tu veux faire

  11. #11
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Si je comprend bien ce que tu as marqué (beaucoup) plus haut tu veux avoir une ville de départ vDepart et ensuite tirer le reste des villes au hasard. C'est bien ça ?

    Si c'est ça le plus simple c'est tout mettre dans un tableau, avec vDepart à l'indice 0. Ensuite tu mélanges ton tableau
    Tu fais une boucle en partant de l'indice le plus élevé, jusqu'à l'indice 1.
    Et à chaque fois tu tires un nombre au hasard compris entre 1 et l'indice (inclus). Et tu échanges ces 2 valeurs.

    Si ce n'est pas ça j'ai pas compris ce que tu veux faire
    Oui mais dans l'enoncé on ma indiqué d'utilisé rand()
    je vois pas trop

  12. #12
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    Oui mais dans l'enoncé on ma indiqué d'utilisé rand()
    Citation Envoyé par Pouet_forever
    Et à chaque fois tu tires un nombre au hasard compris entre 1 et l'indice (inclus). Et tu échanges ces 2 valeurs.
    Où est le souci ?

  13. #13
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    c'est pas trop clair coté algorithme
    desolée

  14. #14
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Je ré-explique

    Tu as un tableau de N cases (donc N villes).
    Tu demandes à l'utilisateur de choisir une case (donc une ville).
    Tu places cette ville à la première place de ton tableau [0] (donc tu échanges les valeurs entre la ville à la place 0 et celle que l'utilisateur à choisi).
    Une fois que tu as fait ça tu vas mélanger ton tableau. Pour mélanger ton tableau le mieux c'est de partir de l'indice de fin (N-1) et d'aller jusqu'à l'indice 1 (0 exclus tu as la ville choisie).
    Tu tires un nombre aléatoire entre 1 et l'indice en cours (les 2 inclus) et tu échanges les valeurs.
    Tu décrémentes ton indice, et tu recommences jusqu'à arriver à 1.
    Une fois que tu es arrivée là, ton tableau est mélangé sauf la première case

    Voili voilou

  15. #15
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Je ré-explique

    Tu as un tableau de N cases (donc N villes).
    Tu demandes à l'utilisateur de choisir une case (donc une ville).
    Tu places cette ville à la première place de ton tableau [0] (donc tu échanges les valeurs entre la ville à la place 0 et celle que l'utilisateur à choisi).
    Une fois que tu as fait ça tu vas mélanger ton tableau. Pour mélanger ton tableau le mieux c'est de partir de l'indice de fin (N-1) et d'aller jusqu'à l'indice 1 (0 exclus tu as la ville choisie).
    Tu tires un nombre aléatoire entre 1 et l'indice en cours (les 2 inclus) et tu échanges les valeurs.
    Tu décrémentes ton indice, et tu recommences jusqu'à arriver à 1.
    Une fois que tu es arrivée là, ton tableau est mélangé sauf la première case

    Voili voilou
    Merci, mais là je vais determiner plusieurs possibilitées de trajets pas un seul

  16. #16
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu ne mélangeras ton tableau qu'une seule fois, donc un seul trajet possible !
    A moins que tu le mélanges plusieurs fois :p

  17. #17
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Oui mais le probleme ici c'est qu'un trajet ne doit pas avoir deux meme villes (le voyageur par une ville une seule fois)

  18. #18
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Je ne vois pas bien où tu bloques
    Si au départ tu as un tableau ne contenant que des villes différentes, que tu mets une ville en première position et que tu mélanges ton tableau.
    Où est-ce que tu auras des doublons ?

  19. #19
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Voilà un essai
    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
    void creerIndividus (struct ville *v, int vDepart,int dimension)
    {
        int i,j,res;
        struct ville temp;
    //On place la ville de départ en première position de l'individu.
        temp=v[vDepart];
        v[vDepart]=v[0];
        v[0]=temp;
        for(i=dimension-1;i>0;i--)
        {
            res=tirage(1,i);
     
            temp=v[res];
            v[res]=v[i];
            v[i]=temp;
            for(j=0;j<dimension-1;j++)
            {
                printf("%s",v[j].nom);
                printf("\n");
            }
     
        }
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tirage(int min, int max){
    return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
    }

  20. #20
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Bah écoute ça m'a l'air correct
    Juste un truc, ce serait mieux de mettre 1 dans ton for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=dimension-1;i>1;i--)
    Bah oui parce qu'une fois qu'il te reste un seul nombre à trier tu tireras un nombre aléatoire égal à lui même. Donc ça ne sert à rien

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