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

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

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 59
    Points
    59
    Par défaut
    OK... c'est bien ce que je pensais !

    par contre cette ligne la et ce quelque soit le compilateur, elle est refusée:


    *Ptab = p //erreur d'assignation

    si je fais par contre ceci :

    **ptab = p, pas d'erreur à la compil mais il plante à l’exécution, ce qui est logique

    donc je me suis dit que j'allais faire ceci :

    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
     
    void ajouterEleve (ELEVE *** ptab, int *nb)
    {
    	int i;
    	char reponse;
    	ELEVE *p, **pat;
     
     
    	i= *nb;
     
    	 p = realloc (*ptab, (i+1)*sizeof (ELEVE));
     
            if (p==NULL)
            {
                printf("\n probleme d'allocation de memoire\n");
                free (*ptab);
            }
            else
            {
                printf("\nVeuillez introduire le nom SVP : ");
                fgets (p->nom,sizeof p->nom, stdin);
                 viderBuffer();
                *(pat+i) =p;
                *ptab = pat;            
                i++;
            }
        *nb = i;
    }

    Ceci fontionne pour ajouter UN élève, dès qu'il y en a DEUX ou plus, le programme accepte mais quand je fais appel à mon fonction pour afficher les données, ca plante.

    Au cas ou, voilà mes fonctions pour afficher les données :

    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
     
     
    void afficher (ELEVE *pel)
    {
            printf("\nNom: %s", pel->nom);
            /*printf("\nSexe: %c", pel->sexe) ;
            printf("\nAge: %d", pel->age) ;*/
    }
     
    void afficherEleve (ELEVE **ptab, int n) {
        int i ;
     
        printf("\n:%d: eleve(s)",n);
        for (i = 0; i < n; i++)
        {
            afficher (*(ptab+i)) ;
            printf("\ni: %d", i) ;
        }
     
    }

  2. #22
    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
    Il faut se décider : tu fais un tableau d'ELEVE ou un tableau de pointeurs sur ELEVE, parce que ton code mélange les deux : la déclaration de la fonction penche pour la deuxième solution et le corps de la fonction plutôt vers la première

    Alors, décide et informe nous de ta décision, parce que là, on perd notre temps
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

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

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 59
    Points
    59
    Par défaut
    c'est bon ca fonctionne...

    Désolé de te faire perdre ton temps mais sache que j'ai écouté les conseils mais qu'hélas cette ligne :
    ne fonctionne pas

    alors oui, je dois certainement mélanger les deux mais comme tout débutant qui a des faiblesses et qui patauge avec les pointeurs, il faut que je fasse des erreurs de manip, que j'essaie des choses pour progresser...

    et pour répondre à la question, c'est un pointeur de pointeurs de tableau mais comme mon professeur me le dit: joué avec des pointeurs, ce n'est pas toujours évidemment mais il faut bien passer par là pour les maitriser par la suite.

    Bonne soirée

  4. #24
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @misterlagaffe
    tu dois réfléchir à ce qui crée la confusion dans ta pensée. tu n'es pas le seul dans ce cas. tout le monde est passé par là. en C, l'origine du problème est que les pointeurs viennent très tôt, comme en assembleur. voici un petit bout de code qui devrait te faire voir la différence entre un pointeur (une variable) et une adresse (une valeur).
    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
    #include <stdio.h>
    char p[1]; 		 //p est le symbole d'une adresse fixée par le compilateur
    char * q;			//q est le symbole d'une variable pouvant contenir une adresse
    int main(void){
    	puts("on peut distinguer les adresses des variables :");
    	printf("adresse :\n     %p -> %p (valeurs identiques)\n", &p, p);
    	q = p;
    	printf("variable contenant une adresse :\n     %p -> %p (valeurs differentes)\n", &q, q);
    	return 0;
    }
    exécution :
    on peut distinguer les adresses des variables
    adresse :
         00402170 -> 00402170 (valeurs identiques)
    variable contenant une adresse :
         00402174 -> 00402170 (valeurs differentes)
    p n'est pas une variable. c'est simplement le symbole d'une adresse.
    q est une variable dont le contenu est une adresse.

    nb. j'ai connu des compilateurs qui utilisent des pointeurs pour stocker les adresses, même quand elles sont calculables à la compilation mais je n'en ai pas sous la main...
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  5. #25
    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
    Si c'est un tableau de pointeurs qui est construit, alors les éléments sont des pointeurs sur ELEVE : ELEVE *
    L'adresse du premier élément de ce tableau est du type "Adresse d'un ELEVE *" soit ELEVE**.

    L'allocation de ce tableau est alors suivant le modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ELEVE **p;
     p = realloc (*ptab, (i+1)*sizeof (ELEVE *));
    Ceci va créer de la place pour un pointeur sur ELEVE, mais ne va pas créer l'ELEVE.
    Il faut donc aussi créer un ELEVE, mettre les informations dedans, et mettre son adresse dans la case nouvellement allouée du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            if (p==NULL)
            {
              ...
            }
            else
            {
                *ptab = p;
                // Créer un ELEVE et mettre son adresse dans le tableau
                p[i] = malloc(sizeof(ELEVE));
                if(p[i] != NULL)
                {
                  // initialiser le nouvel ELEVE               
                  ....
            }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

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

    Informations forums :
    Inscription : Juin 2010
    Messages : 73
    Points : 59
    Points
    59
    Par défaut
    Merci à vous pour toutes vos réponses :-)

    Effectivement, Diogone, j'ai relu mon petit script et j'ai pris cette voie la par la suite. Du coup, ca m'a fait plaisir en voyant ta proposition sur ton dernier message car j'avais écrit la meme chose :-)

    Bon hé bien , je peux mettre, enfin, cette discussion comme résolue et compter le nombre de cheveux qu'il me reste sur ma tête

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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