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 :

Liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Liste chainée
    Je suis débutant en C , et j'ai un projet à faire mais malheuresement j'ai eu beaucoup de problème.
    Pour commencer , j'ai fait une fonction qui initialise une liste chainée V par les c premiers éléments d'une autre liste chainée X .
    Lorsque j'exécute le programme , il me signale l'erreur " a cessé de fonctioner" (windows 8)


    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
    void initialisation_clusters(personne *X, clusters *V ,int c)
    {
     
     
    clusters *first,*p,*precedV;
    personne *tmpoX ;
    tmpoX = (personne *)malloc(sizeof(personne));
    tmpoX=X;
     
    double num1, num2; int i ;first=precedV=NULL;
    num1=tmpoX->perso.taille;
    num2=tmpoX->perso.poids;
    for (i=1;i<c;i++)
    {p=(clusters *) malloc( sizeof(struct clusters) );
    p->centre.taille = num1;
    p->centre.poids = num2;
    if (first==NULL) first=p;
    else precedV-> next =p;
    precedV=p;
    tmpoX=tmpoX->next;
    num1=tmpoX->perso.taille;
    num2=tmpoX->perso.poids;
    }
    }
    Quelqun peut m'aider S.V.P ?

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Si Windows te dit "a cessé de fonctionner", ça signifie en général que c'est un segfault sur Windows....
    Donc un problème de pointeur/malloc...

    Aère un peu ton 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
    void initialisation_clusters(personne *X, clusters *V ,int c)
    {
      clusters *first,*p,*precedV;
      personne *tmpoX ;
      double num1, num2;
      int i ;
     
      tmpoX = (personne *) malloc(sizeof (personne));
      tmpoX = X;
      first = precedV = NULL;
      num1 = tmpoX->perso.taille;
      num2 = tmpoX->perso.poids;
      for (i = 1; i < c; i++)
      {
        p = (clusters *) malloc(sizeof (struct clusters));
        p->centre.taille = num1;
        p->centre.poids = num2;
        if (first == NULL)
          first = p;
        else
           precedV->next = p;
        precedV = p;
        tmpoX = tmpoX->next;
        num1 = tmpoX->perso.taille;
        num2 = tmpoX->perso.poids;
      }
    }
    EDIT : en plus... on comprend pas trop ton problème....
    On n'a aucune structure... tu essayes de transtyper personne et cluster...
    Bref
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Désolé
    voila les structures
    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
    typedef struct coordonnees coordonnees;
    struct coordonnees
    {
        double taille ;
        double poids ;
    };
     
    typedef struct personne personne;
    struct personne
    {
        coordonnees perso;
        personne* next;
    };
     
    typedef struct clusters clusters;
    struct clusters
    {
        coordonnees centre ;
        clusters *next;
    };

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Bon alors....
    Il y a tellement de choses à dire...

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      tmpoX = (personne *) malloc(sizeof (personne));
      tmpoX = X;
    Tu n'as pas l'air d'avoir compris les pointeurs avec ça...
    Pourquoi tu demandes de l'espace mémoire ?...
    Parce que ta variable, tu la remplis "après" avec une adresse différente....
    Donc ça leak !... et ça ne sert à rien !

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      num1 = tmpoX->perso.taille;
      num2 = tmpoX->perso.poids;
    Mouais... tu peux stocker temporairement ces valeurs...
    Mais pourquoi ne pas directement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p->centre.taille = tmpoX->perso.taille;
        p->centre.poids = tmpoX->perso.poids;
    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (i = 1; i < c; i++)
    Et dans le cas où c vaut 0 ?

    4) SEGFAULT (à coup sûr...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        tmpoX = tmpoX->next;
        num1 = tmpoX->perso.taille;
        num2 = tmpoX->perso.poids;
    Tu ne vérifies jamais si ta liste a la même taille ou est plus courte que le chiffre que tu donnes...
    Du coup tu avances... tu récupères NULL sur le dernier élément... et tu essayes de le déréférencer....

    Voir le point 2) pour améliorer le code et retirer le segfault.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mrwnsllm Voir le message
    Dsl
    T'as la flemme de dire "bonjour" et d'écrire "désolé" en entier ? T'étonne pas si on a la flemme de t'aider !!!

    Citation Envoyé par mrwnsllm Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void initialisation_clusters(personne *X, clusters *V ,int c)
    {
      clusters *first,*p,*precedV;
      personne *tmpoX ;
      double num1, num2;
      int i ;
     
      tmpoX = (personne *) malloc(sizeof (personne));
      tmpoX = X;
      ...
    Ouais ben après ça t'étonne plus de rien.

    Citation Envoyé par mrwnsllm Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct coordonnees coordonnees;
    struct coordonnees
    {
    double taille ;
    double poids ;
    };
    Juste pour ta culture perso
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        double taille ;
        double poids ;
    } t_coordonnees;
    Voilà. Ca t'évite de retaper 15 fois les mêmes définitions. Et si tu précises qu'un type est un "type" (avec un "t_") tout le monde s'y retrouvera bien mieux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Bonjours mes amis , merci pour les remarques et merci énormément pour les conseils .
    Comme vous l'avez constater je suis non seulement nouveau dans ce forum (1er fois dans un forum français) mais aussi je suis débutant en C .

    La bonne nouvelle c'est que le programme compile , mais dommage il ne fait pas la tache
    Je vais faire des petites modifications et espérant que ça marche .
    MERCI encore une fois.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mrwnsllm Voir le message
    mais aussi je suis débutant en C .
    Quand on débute c'est osé de s'attaquer de suite aux listes chainées...

    En relisant tes structures je n'arrive pas à comprendre à quoi sert le type "cluster" ? En quoi sa nature est-elle différente du type "personne" ? Tous deux contiennent une coordonnée et un pointeur vers l'élément suivant...

    Citation Envoyé par mrwnsllm Voir le message
    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
    void initialisation_clusters(personne *X, clusters *V ,int c)
    {
      clusters *first,*p,*precedV;
      personne *tmpoX ;
      double num1, num2;
      int i ;
     
      tmpoX = (personne *) malloc(sizeof (personne));
      tmpoX = X;
      first = precedV = NULL;
      num1 = tmpoX->perso.taille;
      num2 = tmpoX->perso.poids;
      for (i = 1; i < c; i++)
      {
        p = (clusters *) malloc(sizeof (struct clusters));
        p->centre.taille = num1;
        p->centre.poids = num2;
           if (first == NULL)
       first = p;
        else
           precedV->next = p;
        precedV = p;
        tmpoX = tmpoX->next;
        num1 = tmpoX->perso.taille;
        num2 = tmpoX->perso.poids;
      }
    }
    Il devient quoi ce "first" qui est rempli dans la fonction mais qui n'est ni utilisé ni renvoyé ? Et comment peux-tu regarder s'il vaut ou ne vaut pas NULL vu qu'il n'est pas non plus initialisé ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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