Pointeurs et tableaux de structures
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Pointeurs et tableaux de structures



  1. #1
    khalid tounoussi

    Exclamation Pointeurs et tableaux de structures


    ------

    bonjour à tous , voilà je tombe dans une difficulté que je souhaite la fixer , voila mon programme , tout marche bien les structures , la fonction de saisie , sauf que la dernier fonction d'affichage "affiche" ne marche pas , ce que je cherche c'est pas de trouver autre solutions ou méthodes .. mais je cherche de faire l'affichage avec un pointeur ( la fonction affiche recevoir l'adresse du poiteur p qui est dans la fonction main ) apres la saisie de tous les infos , est ce que je peux afficher le contenu ? et comment ?
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct {
                int jours;
                int mois;
                int annees;
                }date;
    typedef struct{
        char nom[30];
        char prenom[20];
        int age;
        int poids ;
         date dt;  
                    }et;
    main(){
        void etudEst(et* ,int );
        void affiche(et* ,int );
        int i,n;
        et *p;
        printf("Entrez la taille N de votre tableau \n");
        scanf("%d",&n);
        p=(et*)malloc(n*sizeof(et));
        etudEst(p,n);
        affiche(p,n);
    }
    void etudEst(et* pt,int m){
             
        int i;
        for(i=0;i<m;i++){
                printf("[entrez votre nom]\n");
                scanf("%s",(pt+i)->nom);
                 
                printf("[entrez votre prnom]\n");
                scanf("%s",(pt+i)->prenom);
                 
                printf("[entrez votre age]\n");
                scanf("%d",&(pt+i)->age);
             
                printf("[entrez votre poids]\n");
                scanf("%d",&(pt+i)->poids);
             
                printf("[entrez votre date de naissance : jj/mm/yyyy ]\n ");
                scanf("%d",&(pt+i)->dt.jours);
                scanf("%d",&(pt+i)->dt.mois);
                scanf("%d",&(pt+i)->dt.annees);
            }
    }
    void affiche(et* ptt,int p){
        int i ;
        for(i=0;i<p;i++){
            printf("L element [%d]\n",i);
            printf("[nom]:\t%s\n",*(ptt+i)->nom);
            printf("[Prenom]:\t%s\n",*(ptt+i)->prenom);
            printf("[Age]:\t%d\n",(*(ptt+i))->age);
            printf("[Poids]:\t%d\n",(*(ptt+i)->poids));
            printf("[date]: \n [jours ] :  %d \t [mois ] :   %d \t [annees]  :  %d  \t  ",*(ptt+i)->dt.jours,*(ptt+i)->dt.mois,*(ptt+i)->dt.annees))
        }
    }

    -----

  2. #2
    pm42

    Re : Pointeurs et tableaux de structures

    J'ai regardé vite fait et tu ne penses pas que * et -> font 2 déréférencements du pointeur quand il n'en faudrait qu'un ?

  3. #3
    polo974

    Re : Pointeurs et tableaux de structures

    et en plus, attention à la précédence... (bien faire attention à l'ordre ET à l'associativité )

    les parenthèses explicites sont disons de priorité 0... (voir plus bas)

    *(ptt+i)->dt.mois est interprété comme:

    *((ptt+i)->dt).mois)
    le * en dernier ! ! ! (mais, bon, ici, on s'en fout, il est en trop...


    (ptt+i)->dt.mois sera interprété comme: ((ptt+i)->dt).mois)
    donc
    (ptt+i) je somme ptt et i, c'est un pointeur sur une structure
    (... -> dt) je vais voir dans l'élément dt de la structure pointée ci-dessus
    (...).mois et je prends l'élément mois de la structure date

    bref, de toute façon, en cas de doute, hop un niveau de parenthèse (si on a un doute, le suivant qui lira le code en aura peut-être 2...).

    en passant, et juste pour le plaisir de lire:
    une date contient un jour au singulier et une année au singulier aussi...
    Code:
    typedef struct {
                 int jour;
                 int mois;
                 int annee;
                 }date;
    serait donc plus compréhensible... (au pluriel, on pense à une durée, pas à une date...)
    Jusqu'ici tout va bien...

  4. #4
    CM63

    Re : Pointeurs et tableaux de structures

    C'est surtout &(pt+i)->dt qui n'est pas bon. Cela équivaudrait à faire (pt+i).dt , or (pt+i) est un pointeur et donc cela ne peut marcher. Je suppose que ce que tu veux faire c'est (*(pt+i)).dt, et pour cela il suffit de faire (pt+i)->dt . La fleche est là pour ça, c'est un raccourci qui permet d'éviter cette accumulation de parenthèses.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Structures de données et tableaux dynamique. "Triangle Rectangle"
    Par myoui dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/05/2016, 14h16
  2. Mécanique des structures / structures en nid d'abeille
    Par V_456 dans le forum TPE / TIPE et autres travaux
    Réponses: 3
    Dernier message: 12/10/2015, 07h12
  3. Quel est le rapport entre les pointeurs et les tableaux ?
    Par Bladejo95 dans le forum Programmation et langages, Algorithmique
    Réponses: 57
    Dernier message: 09/10/2012, 10h34
  4. ?les pointeurs & les structures()
    Par invite5c6a01fc dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 08/12/2009, 22h14
  5. C : Initialisation de structures/tableaux de structures
    Par invitef1d0ad93 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 12/08/2008, 10h57