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 :

[Pointeur structure] char *nom


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut [Pointeur structure] char *nom
    Yo,

    Je rencontre un petit problème avec une structure et un pointeur.

    Voici mes 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
    typedef struct compagnie Compagnie;
    typedef struct cellule_compagnie Cellule_compagnie;
    typedef Cellule_compagnie *Liste_compagnie;
     
    struct compagnie
    {
      char *nom;
      char acronyme[3];
      Liste_avion avion_compagnie;
    };
     
    struct cellule_compagnie
    {
      Compagnie comp;
      struct cellule_compagnie* suivant;
    };
    Dans un fichiers de code, j'initialise la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Cellule_compagnie *initialisationCompagnie()
    {
      Cellule_compagnie *cellule = malloc(sizeof(*cellule));
      Liste_compagnie liste = malloc(sizeof(*liste));
    
      if(liste == NULL || cellule == NULL)
        exit(EXIT_FAILURE);
    
      cellule->comp.nom = 'A';
      cellule->suivant = NULL;
      liste = cellule;
    
      return liste;
    }
    La ligne rouge me pose problème, voici le message du shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    In function ‘initialisationCompagnie’:
    gestion_liste_compagnie.c:22:21: attention : assignment makes pointer from integer without a cast [enabled by default]
    J'ai essayé quelques modifs de syntaxe mais ça me fait même des erreurs après, du cou je sais pas si c'est un bug ou qu'il y a vraiment un souci.

    Merci à vous et bonne soirée !

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir,

    le problème est exactement ce que le compilateur te dit : tu donnes une valeur entière (le code ascii du caractère 'A') à une variable qui attend un pointeur, un char* en l’occurrence.
    'A' est un caractère, "A" est la chaîne composée du caractère 'A' suivi du 0 terminal. Je pense que tu voulais utiliser une chaîne plutôt qu'un caractère.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Ah.

    En fait les structures sont ainsi et je ne peux les modifier.
    Donc si je te suis bien, le char *nom est en fait un char nom[], c'est bien ça ?
    Ah ben oui ce serait stupide sinon d'avoir le nom d'une compagnie qui ne fait qu'une lettre. Autant pour moi je n'ai pas suffisamment réfléchit.

    Merci de m'avoir éclaircit.

    Krieg

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Je t'en prie, mais attention aux différences entre un char* (allocation mémoire, pointeurs) et un char [] (tableau). Réfère toi aux tuto de base pour ne pas tomber dans les pièges traditionnels

    Bonne continuation.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Par contre je n'arrive pas à écrire la bonne syntaxe. Du coup j'avais modifié en faisant ça :

    cellule->comp.nom[5] = "AB";
    Pourtant l'erreur est toujours présente.

    Je pense que je ne comprend pas quelque chose d'essentiel en fait.

  6. #6
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Pour faire court, cellule->comp.nom[5] permet d'accéder aux sixième caractère de la chaine cellule->comp.nom. Tu peux par exemple faire cellule->comp.nom="blabla" ...
    cf. Les chaines de caractères et tableaux et pointeurs en C.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    D'accord merci, en effet ma détresse me fait écrire n'importe quoi.

    Merci et passes une bonne soirée !

    Krieg

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    attention tout de même.
    Bien que déclaré comme un char*, si tu fais ton cellule->comp.nom="blabla", tu risque d'avoir de très gros problème.

    Essaie de changer pour un const char*. "blabla" est une chaine de caractères constant. (un const char *, presque mais pas tout à fait un const char[]).

    Tenter d'en modifier un caractère est une erreur. (nom[1]='c' échouerait avec une segmentation fault)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    D'ailleurs, le compilateur devrait émettre un warning pour dire que les qualificatifs ne sont pas en accord. Par exemple avec MinGW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D:\...\main.c|19|warning: assignment discards 'const' qualifier from pointer target type [enabled by default]|

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    L'idéal serait d'allouer un espace pour ta chaîne après tu peux faire ce que tu veux, sans oublier bien sûr de libérer la mémoire une fois que tu n'en a plus besoin.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Mhh étrange lors de la compilation tout se passe bien, même avec les extension -Wall et -ansi, il n'y a ni warnings ni erreurs.
    Mais je n'ai pas le droit de modifier les composants des structures dans cet exercice.

    Par contre après je n'arrive pas à afficher le nom en mettant un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n",cellule->comp.nom)
    C'est bizarre on dirait que ça le saute en fait.

    J'ai vraiment du mal avec les pointeur en fait là... concernant l'acronyme...

    Je veux l'initialiser pour qu'il contienne la chaîne "AFR"

    Du coup je saisir la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cellule->comp.acronyme = "AFR"
    Mais ça me met l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: incompatible types when assigning to type ‘char[3]’ from type ‘char *’

  12. #12
    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 : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    "AFR" est un pointeur "char*".

    acronyme est de type "char[3]", c'est à dire un tableau.

    Pour réaliser ton opération, tu dois copier le contenu du pointeur dans le tableau !
    strcpy fait cela !

    Mais ton tableau de 3 caractère est risqué, car on n'a pas la place de mettre le '\0' final !
    Il faudrait mettre un char[4] ou faire très très attention et ne travailler qu'avec les strN* (strncpy, strnlen, etc... au lieu des versions classiques strcpy, strlen...)
    --
    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

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bizarre je croyais que char c* voulait dire la même chose que char c[].

    Car si je remplace le :

    par :

    ça fonctionne en initialisant avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cellule->comp.acronyme = "..."
    Donc le seul moyen d'initialiser le tableau écrit en char c[] dans la structure est de se servir de strcpy ?

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    http://gradot.wordpress.com/2012/08/...ointeurs-en-c/

    Peut-être qu'un jour je reprendrais la réaction de la version longue de cet article pour Developpez...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    J'ai réussi à écrire dans le chaîne avec strcpy, maintenant j'aimerai pouvoir l'afficher, mais je n'y arrive pas avec un simple printf("%s\n", ...) comment pourrais-je l'afficher autrement ?

  16. #16
    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 : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Quel est le printf exact que tu entres ?
    --
    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

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n", cellule->comp.nom);

  18. #18
    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 : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    On est bien d'accord que ton code ressemble à quelquechose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Cellule_compagnie *cellule = malloc(sizeof(*cellule));
     
      cellule->comp.nom = malloc(42 * sizeof (char));
      cellule->comp.nom = strcpy(cellule->comp.nom, "Metalman");
      // OU 
      //cellule->comp.nom = strdup("Metalman");
      strncpy(cellule->comp.acronyme, "Me");
      cellule->suivant = NULL;
     
      printf("nom : %s\nacronyme : %s\n", cellule->comp.nom, cellule->comp.acronyme);
    --
    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

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Je n'avais pas exactement ça mais en copiant ton code le printf ne s'effectue pas non plus, je ne comprends pas pourquoi. Et j'ai bien appelé ma fonction dans mon main.

  20. #20
    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 : 35
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Je viens de voir une TERRIBLE erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cellule_compagnie *cellule = malloc(sizeof(*cellule));
    Est à remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cellule_compagnie *cellule = malloc(sizeof(cellule));
    --
    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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/12/2012, 19h02
  2. Réponses: 14
    Dernier message: 22/04/2006, 21h59
  3. Réponses: 12
    Dernier message: 03/01/2006, 17h23
  4. Pointeurs, Structures etc....
    Par kameha dans le forum C
    Réponses: 9
    Dernier message: 26/11/2005, 19h11
  5. Sizeof d'un pointeur sur char ...
    Par Mike888 dans le forum C
    Réponses: 8
    Dernier message: 03/11/2005, 13h04

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