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 avec les pointeurs et les structures


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Problème avec les pointeurs et les structures
    Bonjour,
    J'ai un problème avec les pointeur, j'ai vraiment du mal a les manipuler.
    Voila j'ai un code avec 1 fonction et 2 procédures ainsi qu'une structure (individu).
    Le but est de saisir un individu en indiquant son nom et son age.
    Mon problème ce trouve au niveau de la procédure "plusJeunePlusVieux" qui permet de retourner l'individu le plus jeune et le plus vieux.

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
     
    typedef struct Sind
    {
    	char nom[15];
    	int age;
    }individu;
     
    individu saisirindividu()
    {
    	individu ind;
    	printf("Saisir nom : ");
    	scanf("%s", &ind.nom);
    	printf("Saisir age : ");
    	scanf("%d", &ind.age);
     
    	return ind;
    }
     
    void saisirTabloInds() //saisir un tableau d'individus
    {
    	char rep;
    	int i=0;
    	individu *Tablo=(individu*)malloc(sizeof(individu));
    	printf("Saisiser les individus\n");
    	do
    	{
    		Tablo[i]=saisirindividu();
    		printf("Vouler vous continuer (o\\n) : ");
    		fflush(stdin);
    		scanf("%c", &rep);
    		i++;
    		Tablo=(individu*)realloc(Tablo,sizeof(individu)*(i+1));
     
    	}
    	while(rep=='o');
     
    }
     
    void plusJeunePlusVieux(individu *jeune, individu *vieux, individu *Tablo)
    {
     
     
    	jeune.age=Tablo[0].age;
    	for(int i=1 ; i<20 ; i++)
    	{
    		if(jeune.age>Tablo[i].age)
    			jeune.age=Tablo[i].age;
    	}
    	vieux.age=Tablo[0].age;
    	for(i=1 ; i<20 ; i++)
    	{
    		if(vieux.age<Tablo[i].age)
    			vieux.age=Tablo[i].age;
    	}
    }
     
     
     
     
    void main()
    {
    	individu jeune;
    	individu *pjeune=&jeune;
    	individu vieux;
    	individu *pvieux=&vieux;
     
    	saisirTabloInds();
    	plusJeunePlusVieux(pjeune, pvieux, Tablo);
    	printf("Le plus jeune : %s", *pjeune.nom);
    	printf("Le plus vieux : %s", *pvieux.nom);
     
    }
    Le blème c'est la procédure "plusJeunePlusVieux", je passe en paramètre les pointeurs de type individu, et je voudrais recupérer sur ces pointeurs l'élément "age" de la structure individu.
    Comment faire lorsque que l'on donne l'adresse d'une structure de récupérer un élément de la structure ?

    Les autres fonctions marche impec mais dite moi si la méthode est bonne et si j'ai pas fait de truc qui sert a rien.

    Merci de votre aide.

    PS: a oui autre petit soucis comment utiliser dans le void main le tableau (Tablo) que j'ai saisis dans la procédure "saisirTabloInds" pour le mettre en paramétre dans "plusJeunePlusVieux".

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    j'ai corrigé une partie :

    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
    void plusJeunePlusVieux(individu* jeune, individu* vieux, individu* Tablo)
    {
     
     
    	(*jeune).age=Tablo[0].age;
    	for(int i=1 ; i<20 ; i++)
    	{
    		if((*jeune).age>Tablo[i].age)
    			(*jeune).age=Tablo[i].age;
    	}
    	(*vieux).age=Tablo[0].age;
    	for(int j=1 ; j<20 ; j++)
    	{
    		if((*vieux).age<Tablo[j].age)
    			(*vieux).age=Tablo[j].age;
    	}
    }

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 338
    Points
    2 338
    Par défaut
    Oula, il y a enormement d'erreur grave.

    Lorsque tu fais un programme, je te conseille de compiler tres regulierement. Ca a deux avantages : Ca t'indique tes erreurs (si tu rajoute 30 lignes et que ca plante, ta pas a chercher bien loin), et si c'est bon ca enregistre ton travail.

    Dans ton cas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void main()
    {
    	individu jeune;
    	individu *pjeune=&jeune;
    	individu vieux;
    	individu *pvieux=&vieux;
     
    	saisirTabloInds();
    	plusJeunePlusVieux(pjeune, pvieux, Tablo);
    	printf("Le plus jeune : %s", *pjeune.nom);
    	printf("Le plus vieux : %s", *pvieux.nom);
     
    }
    main ne retourne pas void, la norme specifie deux type d'ecriture conventionnel :
    int main (void)
    int main (int argc, char *argv[])

    Cela implique que tu dois faire un return. return EXIT_SUCCESS; convient tres bien.

    Dans le cas de ton main, tes pointeurs pjeune et pjvieux ne servent a rien.
    Tu peux tres bien faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	individu jeune;
    	individu vieux;
     
    	plusJeunePlusVieux(&jeune, &vieux, Tablo);
    	printf("Le plus jeune : %s", jeune.nom);
    	printf("Le plus vieux : %s", vieux.nom);
    Autre chose, ceci n'est pas valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	printf("Le plus jeune : %s", *pjeune.nom);
    	printf("Le plus vieux : %s", *pvieux.nom);
    Il faut forcer l'association :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	printf("Le plus jeune : %s", (*pjeune).nom);
    	printf("Le plus vieux : %s", (*pvieux).nom);
    Cependant, cette ecriture est lourde. Un "raccourci" a donc été créé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	printf("Le plus vieux : %s", (*pvieux).nom);
    	printf("Le plus vieux : %s", pvieux->nom);
    Les deux ligne du dessus sont strictement equivalente.

    Ton main, avec mes remarque precedente devient donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(void)
    {
    	individu jeune, vieux;
     
    	saisirTabloInds();
    	plusJeunePlusVieux(&jeune, &vieux, Tablo);
    	printf("Le plus jeune : %s", jeune.nom);
    	printf("Le plus vieux : %s", vieux.nom);
     
    	return EXIT_SUCCESS;
    }



    Ensuite :

    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
     
    void plusJeunePlusVieux(individu *jeune, individu *vieux, individu *Tablo)
    {
    	jeune.age=Tablo[0].age;
    	for(int i=1 ; i<20 ; i++)
    	{
    		if(jeune.age>Tablo[i].age)
    			jeune.age=Tablo[i].age;
    	}
    	vieux.age=Tablo[0].age;
    	for(i=1 ; i<20 ; i++)
    	{
    		if(vieux.age<Tablo[i].age)
    			vieux.age=Tablo[i].age;
    	}
    }
    Il y a la aussi des erreurs, il faut utiliser '->' et non '.' car tu utilise des pointeurs vers des structure ('->' etant un raccourci decrit plus haut).

    Tu as deux boucle for identique, donc tu peux un peu condenser.

    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
     
    void plusJeunePlusVieux(individu *jeune, individu *vieux, individu *Tablo)
    {
        int i;
     
        jeune->age = Tablo[0].age;
        vieux->age = Tablo[0].age;
        for(i=1 ; i<20 ; i++)
        {
            if(jeune->age > Tablo[i].age)
    	    jeune->age = Tablo[i].age;
     
    	if(vieux->age < Tablo[i].age)
    	    vieux->age = Tablo[i].age;
        }
    }



    Ensuite, dans la fonction saisirTabloInds()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		printf("Vouler vous continuer (o\\n) : ");
    		fflush(stdin);
    Il ne faut pas utiliser fflush sur stdin, car ce n'est pas standart.
    Si tu veux forcer la vidange, il faut utilser une fonction (a voir dans la faq).



    Dernier petit reproche : Tu utilise dans main le tableau 'Tablo' sans jamais l'avoir declarer. Il va falloir faire quelque chose.

    Soit tu le passe en retour de la fonction saisirTabloInds(), soit tu le passe en argument.
    A retenir aussi, il faut faire autant de free que de malloc/realloc, sinon fuite de memoire !

    Voila, je pense que deja tu as a faire.

    Une derniere chose, tu ne peux pas savoir la taille de ton tableau dynamique Tablo. En faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        for(i=1 ; i<20 ; i++)
        {
            if(jeune->age > Tablo[i].age)
    	    jeune->age = Tablo[i].age;
     
    	if(vieux->age < Tablo[i].age)
    	    vieux->age = Tablo[i].age;
        }
    C'est la porte grande ouverte a un tas de bug impossible. Il faut retenir le nombre d'individu present dans le tableau.

    A toi de jouer

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    ok merci beaucoup !
    Je vais analysé tout ça

Discussions similaires

  1. Problème avec la recursivité et les pointeurs en C
    Par mohsenuss91 dans le forum Débuter
    Réponses: 5
    Dernier message: 16/12/2013, 09h46
  2. Problèmes avec les thread et les pointeurs
    Par raspac dans le forum POSIX
    Réponses: 2
    Dernier message: 22/10/2006, 17h35
  3. Problème avec l'unicode et les exceptions
    Par Rafy dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 00h52
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08

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