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

  1. #1
    Nouveau membre du Club
    utilisation de tableau dans cette structure
    Bonjour a toutes et a tous,
    Je souhaiterai modifier ce code afin d'utiliser non pas "menbre1, menbre2 etc... mais plutot un tableau qui contiendrai chacun de mes menbres . 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
    #include <stdio.h>
    #include <string.h>
     
    typedef struct famille
    { int age;
      char surnom[20];
      char nom[20];
    }famille;
    /*-----------------------*/
    void changement(famille *m)
    { m->age=18;
      strcpy(m->surnom,"plouf");
      strcpy(m->nom,"plaf");
    }
    /*-----------------------*/
    int main(void){
     
    famille menbre1={0,"",""};
    changement(&menbre1);
    printf("Le surnom de %s est %s\n",menbre1.nom,menbre1.surnom);
    return 0;
    }


    J'ai essayé quelques tentatives qui sont resté infructueuse , je ne sais pas comment m'y prendre . Merci de votre aide .

  2. #2
    Expert confirmé
    Bonjour,

    Il faudrait peut-être aller plus loin pour voir ce qui te bloque. Si on utilise un tableau ça donne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define NB_MEMBRES 20
     
    int main(void) {
        famille  membres[NB_MEMBRES] = {{0,"",""}};
     
        for ( int i = 0 ;  i < NB_MEMBRES ;  i++ ) {
            changement(&membres[i]);
            printf("Le surnom de %s est %s\n" , membres[i].nom, membres[i].surnom);
        }
        return  0;
    }

  3. #3
    Nouveau membre du Club
    Merci , bien compris !
    Par contre pourquoi les doubles accolades pour l'initialisation du tableau ?

  4. #4
    Expert confirmé
    Pour initialiser une structure, on utilise une paire d'accolades (et on fournit dedans la liste des champs à affecter, il faut au moins le premier champ)
    Pour initialiser un tableau, on utilise une paire d'accolades (et on fournit dedans la liste des éléments du tableau, il faut au moins un élément)
    Pour initialiser un tableau de structures, on a donc des accolades dans des accolades. C'est facultatif, mais je pense plus explicite.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Le minimum ici serait
    famille  membres[NB_MEMBRES] = {{0}};
    // Le maximum serait
    famille  membres[NB_MEMBRES] = {{1,"a","b"},{2,"a","b"},{3,"a","b"},{4,"a","b"},{5,"a","b"},{6,"a","b"},{7,"a","b"},{8,"a","b"},{9,"a","b"},{10,"a","b"},{11,"a","b"},{12,"a","b"},{13,"a","b"},{14,"a","b"},{15,"a","b"},{16,"a","b"},{17,"a","b"},{18,"a","b"},{19,"a","b"},{20,"a","b"}};

  5. #5
    Nouveau membre du Club
    Ok . Merci d'avoir pris le temps de me repondre .

  6. #6
    Expert éminent sénior
    Bonjour
    Citation Envoyé par chris7522 Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*-----------------------*/
    void changement(famille *m)
    { m->age=18;
      strcpy(m->surnom,"plouf");
      strcpy(m->nom,"plaf");
    }
    /*-----------------------*/
    int main(void){
    ...
    changement(&menbre1);
    }


    J'ai essayé quelques tentatives qui sont resté infructueuse , je ne sais pas comment m'y prendre .
    En tout cas, question pointeurs maintenant tu sembles bien à l'aise...
    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

  7. #7
    Nouveau membre du Club
    Pas complètement . J'ai retenu que le pointeur permettait par envoi d'adresse de modifier directement plusieurs variables au sein d'une meme fonction . Dans le cas contraire , on travaille sur une copie et on ne peut retourner qu'une seule valeur.
    Je cherche en vain des exercices pratiques mais je ne trouve pas grand chose malheureusement . Si vous avez des sites ,livres a me conseiller , je suis preneur .

  8. #8
    Expert éminent sénior
    Citation Envoyé par chris7522 Voir le message
    J'ai retenu que le pointeur permettait par envoi d'adresse de modifier directement plusieurs variables au sein d'une meme fonction
    Permet à une fonction de modifier une variable qui se trouve dans une autre fonction

    Citation Envoyé par chris7522 Voir le message
    Dans le cas contraire , on travaille sur une copie
    En réalité on travaille toujours sur une copie. Soit tu passes une variable à une fonction (ex int toto=5; fct(toto)) et la fonction reçoit une copie de "5" ; soit tu passes l'adresse d'une variable à une fonction (ex int toto=5; fct(&toto)) et la fonction reçoit une copie de cette adresse. Mais ça reste toujours une copie.
    Toutefois une adresse étant unique pour tout le programme, dans le second cas, fct() peut aller y taper et modifier "toto" par ricochet.

    Citation Envoyé par chris7522 Voir le message
    Je cherche en vain des exercices pratiques mais je ne trouve pas grand chose malheureusement . Si vous avez des sites ,livres a me conseiller , je suis preneur .
    Non, pas d'idée. Essaye de recoder les fonctions usuelles (strcpy, strlen, strcmp). Cela s'y prête bien car une chaine étant à la base un tableau, et un tableau ne pouvant se transmettre à une fonction que par son adresse, ça te fait rentrer direct dans le monde du pointeur...
    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

  9. #9
    Nouveau membre du Club
    C'est tres claire cette fois-ci . Y a plus qu'a ..
    Merci