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 :

accéder à un champ pointer dans une structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut accéder à un champ pointer dans une structure
    bonjour je suis débutant en programmation en c je dois réaliser ce programme
    1- définir le type ville qui contient le nom et le nombre d'habitants
    moi j'ai fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct 
    { 
      char *nom;
       long int nbr;
    }ville;
    est ce que c'est juste ?

    2-écrire la fonction ville creervil(char *nom,long int population)
    la j'ai trouvé un problème, je sais pas comment accéder au champ nom vu que c'est un pointeur et je sais pas comment une fonction retourne une structure. J'ai essaye ça même si je sais que c'est faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ville creervil(char *nom,long int population)
    {
      ville c; /*déclarer c de type ville*/
      c->nom=   /*je sais pas comment y'accéder*/
      c.nbr= 1255; 
      return c;
    }
    aidez moi s.v.p

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    1)
    Il faut utiliser les balises code (le #)
    ainsi
    on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct {
      char *nom;
      long int nbr;
    }vile;
    C'est plus lisible

    2) ce code (cette structure) compile
    Bon, moi, j'aurais mis 2 lettres l à ville. Mais bon...

    3) Pour créer une donnée, deux façons:
    - la gestion statique de données: simple: il faut créer un tableau (ici en l'occurrence un tableau de structures ville). Le problème est qu'un tableau à une taille donnée dés la compilation et que lorsque votre tableau est plein, vous ne pouvez pas augmenter sa taille.
    - la gestion dynamique de donnée: là je vous à lire les tutoriels à cet effet. La fonction malloc() allocation de mémoire étant un bon début.

    Bon courage.
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par grodashe Voir le message
    1- définir le type ville qui contient le nom et le nombre d'habitants. Moi, j'ai fait ça :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
        char *nom;
        long int nbr;
    } ville;

    est-ce que c'est juste ?
    Oui.
    À ceci près que pour le nom, tu utilises effectivement un pointeur char *, ce qui est tout à fait correct en soi, mais qui t'oblige à allouer de la mémoire quand tu crées une ville et à penser à la désallouer quand tu la détruis.

    À la place, tu peux utiliser un tableau : « char nom [40]; ». De cette manière, ta structure embarquera son propre espace pour ta chaîne. L'inconvénient est que, comme çà, le nom de ta ville ne pourra jamais excéder la taille que tu as prévue au départ.

    Là, j'ai trouvé un problème : je sais pas comment accéder au champ « nom » vu que c'est pointeur et je sais pas comment une fonction retourne uns structure. j'ai essaye ça même si je sais que c'est faux :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ville creervil(char *nom,long int population)
    { ville c; /*déclarer c de type ville*/
      c->nom=   /*je sais pas comment y'accéder*/
     
    c.nbr= 1255; 
    return c;}
    Non, c'est tout-à-fait juste. À partir du moment où la taille de ta structure est connue du compilateur, rien ne l'empêche de la retourner en un seul bloc comme n'importe quel type natif. À la place de « 1255 », mets ce que tu reçois en paramètre :


    Pour la chaîne, c'est la même chose, mais il faudra d'abord en faire une copie. Soit tu restes avec ce que tu as déjà écrit et tu regardes du côté de strdup(), soit tu fais un tableau et tu utilises strncpy().

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Oui.
    À ceci près que pour le nom, tu utilises effectivement un pointeur char *, ce qui est tout à fait correct en soi, mais qui t'oblige à allouer de la mémoire quand tu crées une ville et à penser à la désallouer quand tu la détruis.
    -



    -mais c'est ça comment allouer un espace dans une fonction

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    mais c'est ça comment allouer un espace dans une fonction
    En utilisant le mécanisme de base :

    - Allouer de la mémoire en utilisant la fonction standard malloc() et ranger la valeur retournée par malloc(), c'est à dire l'adresse de la zone allouée, dans le pointeur.
    malloc() demande en argument le nombre de bytes qu'on veut. Pour une chaine de caractères, le nombre de caractères peut être obtenu avec la fonction standard strlen(). Il faut allouer 1 caractère de plus parce que strlen() ne compte pas le zéro terminal.

    - Si la valeur retournée par malloc() est différente de NULL, alors la mémoire a été allouée et il ne reste plus qu'à copier la chaine dedans avec la fonction standard strcpy()
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/12/2012, 20h02
  2. [Débutant] Savoir si un champs est présent dans une structure
    Par bibou1234 dans le forum MATLAB
    Réponses: 1
    Dernier message: 25/10/2011, 11h49
  3. champs de bits dans une structure - option de gcc pour bon fonctionnement
    Par matdakillah dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 08/10/2008, 13h44
  4. accéder aux champs contenus dans une iFrame
    Par toome dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/01/2008, 20h45
  5. ordre des champs dans une structure
    Par oussema dans le forum C
    Réponses: 8
    Dernier message: 08/03/2007, 19h42

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