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 :

Structure en C


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2010
    Messages : 28
    Par défaut Structure en C
    Bonjour,

    J'ai crée une structure comme ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct
    {char nom[MAX], prenom[MAX];
     float moyenne;
    } etudiant;
    typedef etudiant *p_etudiant;
    int main()
    {
      p_etudiant p1;
      p1->moyenne=2;
      return 0;
    }
    Et lors de la compilation j'ai ce warning :
    Nom : 1.png
Affichages : 230
Taille : 6,2 Ko
    Savez vous comment initialiser P1 d'après le message de warning ? Merci par avance

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    p1 est un pointeur, donc avant de le déréférencer (c'est à dire accéder où il pointe), il faut l'initialiser.
    C'est à dire le faire pointer vers un espace mémoire valide. (soit pointer sur une structure etudiant existante ou vers un bloc mémoire alloué sur le tas avec malloc).


    En passant, c'est une mauvaise idée de cacher un type pointeur avec typedef.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par gsxr100045 Voir le message
    Savez vous comment initialiser P1 d'après le message de warning ?
    Comme toute variable : en écrivant p1=valeur_a_initialiser.
    Et comme p1 est un pointeur (et là on se demande bien pourquoi) donc destiné à stocker une adresse, ben tu dois lui mettre une adresse correcte et là à toi de te débrouiller (mais c'est bien de ta faute, après-tout c'est toi qui l'a créé ce pointeur).
    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]

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2010
    Messages : 28
    Par défaut
    Citation Envoyé par CGi Voir le message
    p1 est un pointeur, donc avant de le déréférencer (c'est à dire accéder où il pointe), il faut l'initialiser.
    C'est à dire le faire pointer vers un espace mémoire valide. (soit pointer sur une structure etudiant existante ou vers un bloc mémoire alloué sur le tas avec malloc).


    En passant, c'est une mauvaise idée de cacher un type pointeur avec typedef.
    Bonjour,
    P1 pointe vers la structure puisque j'avais écris
    typedef etudiant *p_etudiant;
    p_etudiant p1;
    donc quand j'écris
    p1->moyenne=2;
    C'est une façon d'initialiser non ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gsxr100045 Voir le message
    P1 pointe vers la structure puisque j'avais écris
    typedef etudiant *p_etudiant;
    Oui et encore une fois on se demande tous pourquoi. Quand tu as besoin d'un int, tu déclares aussi un pointeur sur int???

    Citation Envoyé par gsxr100045 Voir le message
    donc quand j'écris
    p1->moyenne=2;
    C'est une façon d'initialiser non ?
    Le compilateur t'a déjà répondu. Mais si tu veux plus de détail, est-ce que l'instruction p1->moyenne=valeur correspond à l'instruction p1=valeur???
    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
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Tu as défini un modèle, (un type) pour ta structure, mais tu n'as pas défini d'objet (de variable) du type de ta structure, elle n'existe pas encore.
    Le pointeur p1 attend l'adresse d'une variable du type de ta structure : p1 = adresse d'un objet (variable) etudiant;
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2010
    Messages : 28
    Par défaut
    Citation Envoyé par CGi Voir le message
    Tu as défini un modèle, (un type) pour ta structure, mais tu n'as pas défini d'objet (de variable) du type de ta structure, elle n'existe pas encore.
    Le pointeur p1 attend l'adresse d'une variable du type de ta structure : p1 = adresse d'un objet (variable) etudiant;
    Désolé, je ne sais pas comment faire, j'avais vu un exemple sur internet et j'ai essayé et cela ne correspond pas vraiment à ce qu'ils disent. Mais je vais y réfléchir (dans 1 jour ou 2). Merci pour les conseils

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gsxr100045 Voir le message
    Désolé, je ne sais pas comment faire
    Lire un tuto d'apprentissage du C semble déjà un bon point de départ...

    Citation Envoyé par gsxr100045 Voir le message
    j'avais vu un exemple sur internet et j'ai essayé
    Alors soit
    • l'exemple que tu as vu est incomplet/faux
    • tu l'as mal retranscrit

    Je sais déjà vers quelle hypothèse je m'oriente. Mis à part, taper un exemple sans avoir les bases pour le comprendre ne mène jamais très loin.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define MAX			(20)
     
    typedef struct {
    	char nom[MAX+1];
    	char prenom[MAX+1];
    	float moyenne;
    } t_etudiant;
     
    int main() {
    	t_etudiant e1;
    	e1.moyenne=2;
    	return 0;
    }
    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]

  9. #9
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Salut gsxr100045,

    Lorsqu'on débute avec les struct, le fait d'utiliser typedef avec les struct complique souvent la compréhension.

    Ci-dessous un exemple sans typedef.

    Un pointeur sur struct, comme tout pointeur, est une variable. Cette variable présente la particularité que son contenu doit être une adresse mémoire valide te permettant d'accéder indirectement à des données du type pointé.

    Lorsque tu déclares un pointeur sur struct, tu dois initialiser cette variable avec une telle adresse mémoire avant d'utiliser ce pointeur. Dans ton code, ton pointeur p1 n'était pas initialisé et contenait n'importe quoi. Tu ne peux donc pas t'en servir avec l'opérateur -> pour accéder indirectement à un espace valable te permettant de stocker un int.

    En pratique, on va souvent déclarer un pointeur sur struct pour initialiser une zone mémoire avec malloc permettant de stocker plusieurs struct dans cette zone contiguë de mémoire, par exemple une classe de 35 étudiants.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX 256
     
    /* définition d'un type struct etudiant */
    struct etudiant {
            char nom[MAX];
            char prenom[MAX];
            float moyenne;
    };
     
    void set_etudiant(struct etudiant * e, char * nom, char * prenom, float moyenne) {
            strcpy(e->nom,    nom);
            strcpy(e->prenom, prenom);
            e->moyenne = moyenne;
    }
     
    int main(void) {
            /* déclaration d'une variable de type pointeur sur struct etudiant */
            struct etudiant * etudiants;
     
            /* initialisation du pointeur avec malloc permettant de stocker
             * 35 étudiants dans la zone mémoire réservée */
            etudiants = malloc(35 * sizeof(struct etudiant));
     
            /* initialisation du premier étudiant, l'opérateur crochets
             * opère le déréférencement et on accède au membre avec
             * l'opérateur . simplement */
            strcpy(etudiants[0].nom,    "Chaplin");
            strcpy(etudiants[0].prenom, "Charlie");
            etudiants[0].moyenne = 20.0;
     
            /* initialisation au moyen d'une fonction dédiée */
            set_etudiant(&etudiants[1], "Harold", "Lloyd", 20.0);
            set_etudiant(&etudiants[2], "Buster", "Keaton", 20.0);
     
            /* afficher les étudiants */
            // TODO
     
            /* lorsqu'on n'a plus besoin de l'espace mémoire pointé par
             * etudiants, on le libère avec free */
            free(etudiants);
     
            return 0;
    }

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

Discussions similaires

  1. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  2. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  3. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 11h09
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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