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 :

Problème de Pointeur avec une structure pointée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut Problème de Pointeur avec une structure pointée
    Bonjour

    Voila, dans le but de mes cours, je dois essayer de faire de l'allocation dynamique d'un pointeur sur une structure pointée... enfin si je m'exprime bien

    Voici le 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    // Pointeur Structure.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX 2
     
     
    typedef struct personne
    {
     char nom[40];
     char sexe;
     int age;
     
    } ELEVE;
     
    void ajouterEleve (ELEVE **, int *);
    void afficherEleve (ELEVE **, int *);
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	 ELEVE ** ptab_eleve=NULL,*p;
    	 char nomT [40];
    	 char **pnomT;
     
     
    	int taille=1,i=0;
     
     //ajouterEleve(ptab_eleve,&taille);
     
    // printf("\n taille: %d\n",taille);
    	ptab_eleve=(ELEVE**) malloc(sizeof (ELEVE));
    	p=(ELEVE*) malloc(sizeof (ELEVE));
    	strcpy(p->nom,"gaston");
    	if( ptab_eleve == NULL )
    {
         printf("Allocation impossible");
    }
    	strcpy((*(ptab_eleve)+i)->nom, p->nom); /* Voila mon problème car je ne sais pas comment je dois faire pour accéder au paramètre nom de ma structure ELEVE avec ptab_eleve*/
     
     
     
     
    // afficherEleve (ptab_eleve,&taille);
     
     
    /* for (i=0;i<taille;i++)
     {
         free(ptab_eleve[i]);
         
     } */
     
    	return 0;
    }
    si quelqu'un pouvait éclairer ma lanterne, ce sera sympa car la, je cale

    Merci pour votre aide

  2. #2
    Expert confirmé
    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
    Par défaut
    Si je comprend (?), il faut un tableau d'ELEVE alloué par allocation dynamique. Celle-ci va renvoyer l'adresse du premier élément du tableau alloué, soit un type ELEVE*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ELEVE * ptab = malloc(N* sizeof *ptab);
    if(ptab!= NULL)...
    où N est le nombre d'ELEVE dans le tableau

    Les différents ELEVE du tableau sont accessible par ptab[i] et leur nom par ptab[i].nom (i=0..N-1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(ptab[i].nom,"gaston");

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut
    heu... à la base dans mon code, j'ai ELEVE ** ptab_eleve = NULL;

    quand je lis l'exemple que tu donnes, il n'y est plus... mon code serait il si mauvais :-s

    car oui, je dois allouer mon tableau de manière dynamique d'ou une double étoile

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Non c'est la "première étoile" qui indique qu'il s'agit d'un pointeur, et que tu souhaites utiliser comme tableau.
    La seconde étoile indique que son contenu sera des ELEVE*

    Et dans ton cas, l'utilisation d'un pointeur sur pointeur, la double étoile, traduit un manque de connaissance des pointeurs, vu l'utilisation que tu souhaites. Un tableau dynamique d'objet te suffira. Sinon, tu devras aussi allouer chaque ELEVE* contenu dans celui-ci.

    D'ailleurs,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ELEVE** ptab_eleve=(ELEVE**) malloc(sizeof (ELEVE));
    	ELEVE* p=(ELEVE*) malloc(sizeof (ELEVE));
    tu alloues 2 variables qui n'ont pas le même type avec la même taille.
    Rien ne te choque ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Par défaut
    Mince, au départ, j'avais mis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          ELEVE** ptab_eleve=(ELEVE**) malloc(sizeof (ELEVE*));
    	ELEVE* p=(ELEVE*) malloc(sizeof (ELEVE));
    mais je supose que cela ne change pas grand chose...

    sinon pour répondre à la question pourquoi une double étoie, c'est mon prof qui me l'a demandé :/

    car par la suite, je dois utiliser la fonction realloc pour agrandir dynamiquement mon tableau de pointeurs.

  6. #6
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par misterlagaffe Voir le message
    mais je supose que cela ne change pas grand chose...
    Dans ce code, tu n'alloues qu'un seul pointeur dans ton tableau de pointeur ptab_eleve.

    Et si ce dernier exemple que tu donne change parceque il y a une différence entre sizeof(ELEVE) et sizeof(ELEVE *). L'un te donne la taille d'une structure élève, l'autre te donne la taille d'un pointeur vers une telle structure.

    Citation Envoyé par Bousk
    Un tableau dynamique d'objet te suffira
    C'est peut-être un exercice pédagogique pour apprendre les pointeurs de pointeurs.

    Si tu veux donc travailler avec un tableau de pointeur il faut plutot faire un truc comme cela :
    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
     
    /* allocation de ton tableau de pointeurs */
    ptab_eleve = (ELEVE**) malloc(N * sizeof (ELEVE *));
    if(ptab_eleve == NULL)
    {
         printf("Allocation impossible");
    }
     
    /* allocation d'un eleve */
    p = (ELEVE*) malloc(sizeof (ELEVE));
    if(p == NULL)
    {
         printf("Allocation impossible");
    }
    /* renseignement des champs de la structure élève */
    strcpy(p->nom,"gaston");
    p->age = 12;
    /* etc */
     
    /* on met l'élève dans le tableau par une simple affectation de pointeur. */
    /* i < N */
    ptab_eleve[i] = p;

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

Discussions similaires

  1. Problème std::set avec une structure
    Par DeathMixer dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2009, 01h05
  2. Problème sur un pointeur dans une structure
    Par steph_1 dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2007, 18h59
  3. Problème avec une structure
    Par titux dans le forum C
    Réponses: 5
    Dernier message: 22/07/2007, 16h26
  4. Problème avec une structure
    Par Pierre.g dans le forum C
    Réponses: 4
    Dernier message: 30/12/2006, 12h22
  5. Probléme avec une structure
    Par astragoth dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2006, 20h31

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