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 :

Listes simplement chainees - problème de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 26
    Par défaut Listes simplement chainees - problème de pointeurs
    Bonjour,

    Je débute en C et j'ai du mal avec les pointeurs enclus dans les "Typedef struct".

    On doit réaliser un programme qui va gérer une collection de BD.

    Les typesdef struct suivants nous sont donnés:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    typedef struct _un_element_series *P_un_element_series;
     
     
    typedef struct _un_element_series {
      char mot[30];
      struct Serie_s * element;
      P_un_element_series suivant;
    } Un_element_series;
     
    typedef struct _un_element_tomes *P_un_element_tomes;
     
     
    typedef struct _un_element_tomes {
      char mot[30];
      struct Tome_s * element;
      P_un_element_tomes suivant;
    } Un_element_tomes;
     
    typedef struct _un_element_auteurs *P_un_element_auteurs;
     
    typedef struct _un_element_auteurs {
      char mot[30];
      char * nom;
      P_un_element_auteurs suivant;
    } Un_element_auteurs;
     
    typedef struct Serie_s {
      char *titre;
      char *pays_parution;
      int nb_parus;
      P_un_element_tomes tomes;
    } Une_serie;
     
    typedef struct Tome_s {
      char *titre;
      P_un_element_auteurs scenaristes;
      P_un_element_auteurs dessinateurs;
      int no_serie;
    } Un_tome;

    Il est d'abord demandé d'écrire deux fonctions qui creent une serie et un tome, ce que j'ai fait:

    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
    Une_serie *creer_serie(char *nom_serie, char *pays_parution, int nb_parus) {
    Une_serie *serie = (Une_serie *)malloc(sizeof(Une_serie));
        serie->titre=strdup(nom_serie);
        //serie->pays_parution=strdup(pays_parution);
        strcpy(serie->pays_parution, pays_parution);
        serie->nb_parus=nb_parus;
    	return serie;
    }
     
     
    Un_tome *creer_tome(char *titre, P_un_element_auteurs scenaristes, 
    P_un_element_auteurs dessinateurs, int no_serie) {
       Un_tome *tome = (Un_tome *)malloc(sizeof(Un_tome));
        tome->titre=strdup(titre);
        tome->scenaristes=scenaristes;
        tome->dessinateurs=dessinateurs;
        tome->no_serie=no_serie;
    	return tome;
    }

    Est-ce correct?

    Mon probleme est au niveau de la fonction ajouter_serie_a_collection:

    code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ajouter_serie_a_collection(P_un_element_series *collectionSeries, P_un_element_series *serie) {
    assert(collectionSeries);
    assert(serie);
    Une_serie *serie_test=NULL;
    serie_test=chercher_serie(collectionSeries,serie->element->titre);
    //if(serie_test) return NULL;
    //inserer_element_fin_series(collectionSeries,serie);
    }


    J'essais de récupérer la valeur du titre (serie->element->titre) contenue dans le struct serie avec appel via la liste serie ramenée en 2eme argument de ajouter_serie_a_collection. La fonction chercher_serie necessite un char en deuxieme argument ainsi le titre de la serie. J'obtiens cette erreur : "request for member ‘element’ in something not a structure or union". Il y a tellement de pointeurs que je suis perdue et je ne sais pas comment retrouver la valeur titre.

    J'ai egalement essayer *(serie.element)->titre et &(*(serie.element)->titre) mais rien ne marche.

    Pouvez-vous m'aider?

    Merci par avance

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    J'en ai vu des codes dégueulasses écrits par les équipes pédagogiques mais alors celui-ci c'est limite du trolling.

    Tu es larguée parce que ce qu'on t'as donné est imbitable et ni fait, ni à faire. Quoiqu'il en soit va falloir que tu te débrouilles avec alors voici quelques pistes en vrac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _un_element_series *P_un_element_series; // ici on déclare 'P_un_element_series' comme alias d'un pointeur de type 'struct _un_element_series'
     
    P_un_element_series ptr1; // ptr1 est donc de type 'struct _un_element_series *'
     
    P_un_element_series *ptr2 = &ptr1; // ptr2 est de type 'struct _un_element_series **' (pointeur de pointeur de ...) et est initialisé à l'adresse de ptr1
     
    *ptr1 = **ptr2; // la 'struct _un_element_series' pointée par ptr1 est initialisée à celle pointée par le pointeur pointé par ptr2 (capice ? ^^)
    Calmes-toi, comptes les astérisques et souviens-toi de celles dissimulées par les typedef du prof. Ajoutes un commentaire pour chaque variable et paramètre s'il le faut.

    serie_test=chercher_serie(collectionSeries,serie->element->titre); : ici le compilateur ne trouve pas element car serie n'est pas un P_un_element_series, c'est un P_un_element_series *. Modifies la signature de ta fonction, tu n'as sans doute pas besoin du niveau d'indirection supplémentaire.


    Une petite erreur que j'ai notée en passant : pourquoi as-tu commenté le second strdup de la première fonction ? Tu ne peux pas faire un strcpy vers un buffer non alloué ça va péter. Utilises malloc avant ou fais comme pour le champ titre, c'était bien.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 26
    Par défaut
    Ok merci Matt,

    Je me suis debarrassée du pointeur sur l'element serie et ça marche.

    Citation Envoyé par Matt_Houston Voir le message

    Une petite erreur que j'ai notée en passant : pourquoi as-tu commenté le second strdup de la première fonction ? Tu ne peux pas faire un strcpy vers un buffer non alloué ça va péter. Utilises malloc avant ou fais comme pour le champ titre, c'était bien.
    Et oui, la version correcte de la fonction creer serie est bien:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Une_serie *creer_serie(char *nom_serie, char *pays_parution, int nb_parus) {
    Une_serie *serie = (Une_serie *)malloc(sizeof(Une_serie));
        serie->titre=strdup(nom_serie);
        serie->pays_parution=strdup(pays_parution);
        strcpy(serie->pays_parution, pays_parution);
        serie->nb_parus=nb_parus;
    	return serie;
    }
    Merci encore pour ton aide!

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    N'oublies pas de vérifier les valeurs de retour des fonctions de bibliothèque ! malloc peut échouer, strdup aussi et pour les mêmes raisons.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 26
    Par défaut
    Bonjour Matt,

    Peux tu me guider comment faire cette verification? je peux maintenant compiler mais quand j'essais de lancer le programme j'obtiens au bus error au niveau de la fonction chercher serie. Cela pourrait-il venir du malloc?

    Merci par avance

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Pour commencer un simple assert fera l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <assert.h>
     
    // ...
     
    foo *ptr = malloc(sizeof(foo));
    assert(ptr != NULL); // si ptr != NULL n'est pas vérifié, l'exécution du programme est immédiatement interrompue
    Dans ton cas je pencherais pour une erreur de programmation qui a entraîné une corruption de mémoire ou un truc du même style. Peux-tu nous donner plus d'information sur l'erreur (comportement du programme en détail, sortie exacte sur le terminal...) ? Est-ce que ton code compile sans warnings ? Si tu utilises GCC, ajoutes -Wall -Wextra aux options de compilation.

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 639
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    J'en ai vu des codes dégueulasses écrits par les équipes pédagogiques mais alors celui-ci c'est limite du trolling.
    N'hésite pas à montrer à Audinet comment tu l'aurais écrit. C'est toujours instructif de voir du bon code écrit par un vrai pro.

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

Discussions similaires

  1. problème liste simplement chainée
    Par cyrill.gremaud dans le forum C
    Réponses: 9
    Dernier message: 04/12/2012, 15h40
  2. tri par insertion, list simplement chainee
    Par Maf77 dans le forum C
    Réponses: 24
    Dernier message: 12/11/2008, 19h30
  3. Réponses: 2
    Dernier message: 12/10/2007, 11h32
  4. Réponses: 20
    Dernier message: 22/03/2006, 14h00
  5. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46

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