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 :

[débutant] Erreur à la compilation - listes chaînées


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut [débutant] Erreur à la compilation - listes chaînées
    Bonjour,

    Je me remets doucement au C et aux listes chaînées, et j'ai qqs petits soucis. En effet, j'ai défini, dans un fichier .h, la structure des éléments de ma liste chaînée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct element {
        char nom[MAX_STR];     
        int profession;
        struct element* suivant;
    } *Element;
    ainsi que tous les prototypes des fonctions que je vais utiliser dans mon programme.
    Ensuite, dans un fichier .c je mets le code des fonctions ... et c'est quand je compile que j'ai des erreurs du style :
    46 D:\Mes Documents\home\tp3.c request for member `nom' in something not a structure or union
    Je n'ai pourtant po oublier d'inclure dans mon .c le .h en y mettant :
    Si qqn aurait une solution, qu'il me fasse signe !!!

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Et si tu nous montrez la ligne 46 de tp3.c et meme la fonction qui contient cette ligne par la meme occasion.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Il eût été plus facile de t'aider avec la ligne 46...

    Ne serait-ce pas un problème d'utilisation du point au lieu d'une flèche, ou vice-versa ?

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Oupsss, toutes mes excuses ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct element* NouveauNoeud(char* nouvNom, int nouvProfession){
    	struct element* nouveau;
       nouveau = (struct element*) malloc(sizeof(struct element));
    	nouveau.nom = nouvNom;     // la fameuse ligne 46 !!!
    	nouveau.profession = nouvProfession;
    	nouveau.suivant = NIL;
    	return(nouveau);
    }

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Starb : en effet, si je change les points en flêches, cela me fait moins d'erreurs mais j'ai une erreur qui persiste à la ligne 46 :
    46 D:\Mes Documents\home\tp3.c incompatible types in assignment

  6. #6
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Il faut savoir que ce que tu fais à la ligne 46 te fait perdre la mémoire allouée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char nom[MAX_STR];
    Mieux vaut déclarer
    De plus, avec la ligne 46, tu peux par exemple allouer 10 caractères à nouvNom alors que MAX_STR = 16. Comme l'utilisateur de la structure va se base sur le .h, il pensera qu'il y a toujours 16 éléments dans nom, ce qui n'est pas le cas si tu suis mon exemple. Je pense que l'erreur est une protection du compilateur pour empêcher ce genre d'erreurs. Tu ne l'auras plus en déclarant nom comme un pointeur.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par LaseLiep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct element* NouveauNoeud(char* nouvNom, int nouvProfession){
    	struct element* nouveau;
       nouveau = (struct element*) malloc(sizeof(struct element));
    	nouveau.nom = nouvNom;     // la fameuse ligne 46 !!!
    	nouveau.profession = nouvProfession;
    	nouveau.suivant = NIL;
    	return(nouveau);
    }
    C'est pas la peine de compliquer inutilement le code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	struct element* nouveau = malloc(sizeof*nouveau);
    Par contre malloc() peut échouer et il manque donc un test...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       if (nouveau != NULL)
       {
    ensuite, c'est pas '.' puisque nouveau est un pointeur, mais '->' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	nouveau->nom = nouvNom;     // la fameuse ligne 46 !!!
    mais évidemment, ça ne fonctionne pas, car 'nouveau->nom' est un tableau de char. Utilise strcpy() si tu es sûr de la taille. Sinon strncat() ... sans te planter...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    En effet, en déclarant en char *nom; je n'ai plus l'erreur, mais je ne comprends po trop : si je déclare ma variable nom comme tel, je déclare un pointeur sur un tableau de caractères, mais il faut bien que je dise combien de caractères se trouvent dans ce tableau, non? C'est pour cela que je dois mettre char nom[16]; par exemple, non?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Strab
    Il faut savoir que ce que tu fais à la ligne 46 te fait perdre la mémoire allouée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char nom[MAX_STR];
    Mieux vaut déclarer
    Pas forcément. On peut avoir besoin d'une copie si la source est statique et donc unique...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par LaseLiep
    En effet, en déclarant en char *nom; je n'ai plus l'erreur, mais je ne comprends po trop
    Ben oui. Le but n'est pas, en soi, de ne plus avoir d'erreur, mais d'écrire du code correct. Je rappelle qu'un pointeur est une variable qui contient une adresse. On peut récupérer l'adresse d'une chaine de caractères si sa durée de vie est garantie, sinon, il peut y avoir des problèmes si
    - l'adresse est celle d'une variable locale qui a disparu après l'appel d'une fonction
    - l'adresse d'une variable statique unique d'une fonction, qui est ecrasée à chaque appel de cette fonction.
    : si je déclare ma variable nom comme tel, je déclare un pointeur sur un tableau de caractères, mais il faut bien que je dise combien de caractères se trouvent dans ce tableau, non? C'est pour cela que je dois mettre char nom[16]; par exemple, non?
    Pour les raisons évoquées ci-dessus, la copie peut être indispensable. Mais pas forcément dans un tableau de char. Ca peut être aussi une copie 'dynamique' dont on récupère l'adresse dans un pointeur. (avec strdup(), par exemple, qui n'est pas standard C, mais POSIX, donc très portable.)

    Evidemment, comme avec toute allocation dynamique, il faut ensuite libérer le bloc avec free() quand on en a plus besoin.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Quelle est la différence entre le point et la flêche : element.nom et element->nom ???

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par LaseLiep
    Quelle est la différence entre le point et la flêche : element.nom et element->nom ???
    Qu'en pense ton livre de C ? On ne répond pas aux questions aussi basiques.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Qu'en pense ton livre de C ? On ne répond pas aux questions aussi basiques.
    Rahhh, j'ai po de livre(s) de C, mais j'ai des profs de C qui ne m'ont jamais parlé de la différence, mais je vais me documenter avec mon ami google.
    Merci pour votre aide !!!

  14. #14
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Le club met à ta disposition bon nombre de cours de C :
    http://c.developpez.com

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par LaseLiep
    Rahhh, j'ai po de livre(s) de C
    http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C.html
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Je vous remercie.

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

Discussions similaires

  1. [VBA-E]{Débutant} Erreurs de compilation
    Par kenny49 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/04/2007, 08h15
  2. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31
  3. [MASM32][Débutant] Erreur de compilation
    Par Priest dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 02/10/2005, 02h06
  4. Réponses: 12
    Dernier message: 26/08/2005, 10h02
  5. [Débutant]Erreur de compilation inconprehensible
    Par @r$£~%[ dans le forum C++
    Réponses: 15
    Dernier message: 14/08/2005, 20h04

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