Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de fonction et de struct

    28 mai 2021 à 22:21:28

    MAIN:

    #include <stdio.h>
    #include <stdlib.h>
    
    #include "Header.h"
    
    int main()
    {
        Personne Joueur[4];
    
        printf("Joueur crée");
    
        initialiser(&Joueur, 4);
    
        return 0;
    }


    HEADER

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    #include <string.h>
    
    typedef struct Personne
    {
        char nom[100];
        char prenom[100];
        char adresse[1000];
    
        int age;
        int sexe;
    }Personne;
    
    void initialiser(Personne *Pointeur, int taille);
    void affiche(Personne *Personne, int taille);
    
    #endif

    Fonction

    void initialiser(Personne *Personne, int taille)
    {
        int i;
    
        for(i=0; i<taille; i++)
        {
            strcpy(Personne[i]->nom,"\0");
            strcpy(Personne[i]->prenom,"\0");
            strcpy(Personne[i]->adresse,"\0");
    
            Personne[i]->age=0;
            Personne[i]->sexe=0;
        }
    }
    
    void affiche(Personne *Personne, int taille)
    {
        int i;
    
        for(i=0; i<taille; i++)
        {
            printf("%s", Personne[i]->nom);
            printf("%s", Personne[i]->prenom);
            printf("%S", Personne[i]->adresse);
    
            printf("%d", Personne[i]->age);
            printf("%d", Personne[i]->sexe);
        }
    }

    Bonjour tout le monde,


    J'aurais vraiment besoin d'aide, ça fait une demi-journée que je cherche la solution à mon problème sans rien trouver.

    Mon but est de créer une fonction qui initialise des structures.


    -
    Edité par Goupil 117 28 mai 2021 à 22:22:22

    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2021 à 22:27:36

      Goupil 117 a écrit:

      J'aurais vraiment besoin d'aide, ça fait une demi-journée que je cherche la solution à mon problème sans rien trouver.

      Tu aurais du essayer l'opérateur . à la place de ->

      • Partager sur Facebook
      • Partager sur Twitter
        29 mai 2021 à 2:42:15

        #include "Header.h"
        
        void initialiser(Personne *Personne, int taille)
        {
            int i;
        
            for(i=0; i<taille; i++)
            {
                strcpy((*Personne[i]).nom,"\0");
                strcpy((*Personne[i]).prenom,"\0");
                strcpy((*Personne[i]).adresse,"\0");
        
                (*Personne[i]).age=0;
                (*Personne[i]).sexe=0;
            }
        }
        
        void affiche(Personne *Personne, int taille)
        {
            int i;
        
            for(i=0; i<taille; i++)
            {
                printf("%s", (*Personne[i]).nom);
                printf("%s", (*Personne[i]).prenom);
                printf("%S", (*Personne[i]).adresse);
        
                printf("%d", (*Personne[i]).age);
                printf("%d", (*Personne[i]).sexe);
            }
        }

        J'ai essayé, mais ça ne marche toujours pas
        • Partager sur Facebook
        • Partager sur Twitter
          29 mai 2021 à 9:02:07

          Le point tout seul !

          Personne[i].nom



          • Partager sur Facebook
          • Partager sur Twitter
            29 mai 2021 à 9:50:44

            Il ne faudrait pas allouer de la mémoire pour le tableau des personnes ? Il me semble que ça devrait être ça, le rôle de la fonction d'initialisation, non ?

            -
            Edité par robun 29 mai 2021 à 9:52:29

            • Partager sur Facebook
            • Partager sur Twitter
              29 mai 2021 à 10:33:02

              robun a écrit:

              Il ne faudrait pas allouer de la mémoire pour le tableau des personnes ?

                  Personne Joueur[4];

              Ce n'est donc pas une allocation mémoire cela ?! Tu va l'embrouiller là !

              Il y a par contre une autre erreur dans la fonction main, c'est qu'il ne faut pas l'esperluette & pour envoyer l'adresse du premier élément du tableau ligne 12.

              -
              Edité par rouloude 29 mai 2021 à 10:35:15

              • Partager sur Facebook
              • Partager sur Twitter
                29 mai 2021 à 11:32:11

                Donner le même nom à

                • une structure,
                • une variable,
                • et qu'en plus la variable ne soit pas du type de la structure mais un pointeur,

                y en a quand même qui cherchent à se retrouver dans les emmerdements.

                J'ai une idée. Et si la fonction, on l'appelait aussi Structure ?

                -
                Edité par michelbillaud 29 mai 2021 à 11:34:35

                • Partager sur Facebook
                • Partager sur Twitter
                  29 mai 2021 à 11:55:53

                  rouloude a écrit:

                  robun a écrit:

                  Il ne faudrait pas allouer de la mémoire pour le tableau des personnes ?

                      Personne Joueur[4];

                  Ce n'est donc pas une allocation mémoire cela ?! Tu va l'embrouiller là !

                  Argh, tu as raison ! Je me suis fait avoir par la définition

                  void initialiser(Personne *Personne, int taille)

                  J'ai cru que le but était de créer un tableau dynamique à partir d'un pointeur (sinon je ne voyais pas l'intérêt de l'initialiser à des valeurs nulles)... C'est parce que ça m'embrouille que je préfère toujours la notation :

                  void initialiser(Personne Personne[], int taille)

                  Là ça dit que 'Personne' (la variable, pas le type) est un tableau − pas besoin de le créer. (Mais bien sûr ce n'est pas une raison de faire comme moi, c'est juste que je ne suis pas tout à fait à l'aise avec les pointeurs donc je fais peut-être un peu trop attention aux notations...)

                  -
                  Edité par robun 29 mai 2021 à 12:00:30

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mai 2021 à 15:37:04

                    Pendant qu'on y est,

                    appeler son fichier Header.h, c'est pas non plus une bonne idée. Il regroupe visiblement des déclarations à propos des Personnes, alors il devrait s'appeler Personne.h

                    et commencer par

                    #ifndef PERSONNE_H_INCLUDED
                    

                    bref, une variable avec un nom correspondant au fichier. Pas un nom genérique.


                    Le principe, c'est d'avoir un peu de méthode pour nommer les choses, pour qu'il y ait une logique. Ce qui ensuite est reposant pour programmer.

                    Pour désigner un tableau, par exemple, on peut décider de mettre le nom de la variable au pluriel

                    void ma_fonction(Personne personnes[]) {
                       ...
                    } 

                    Comme ça, partout dans le code, il est bien clair que ça désigne DES personnes.

                    PS techniquement, *personnes ou personnes[] dans une déclaration de paramètres, en C, ça signifie exactement la même chose. Mais comme rouloude, je prèfère écrire [] quand c'est un tableau, c'est une indication de plus.



                    -
                    Edité par michelbillaud 29 mai 2021 à 15:44:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 juin 2021 à 15:53:42

                      Merci pour toutes vos réponses, qui ont été fort instructive, le but de ce programme était de m'entraîner sur le C étant jeune étudiant de 1re année.

                      Je suis au courant que nommé un fichier header en header.h n'est pas la meilleure idée qui soit, mais témoigne de ma paresse par rapport au nommage des fichiers et des variables, la preuve mon projet s'appelle 9: :)

                      Au risque de passé pour le plus grand abrutis d'openclassroom, après à voir appliquées les corrections sur mon programme, je n'arrive pas à faire afficher le contenu du tableau joueur. Est-ce parque les chaînes de caractères commence par "\0" ?


                      Désoler, si mes réponses sont tardives, mais je suis en ce moment débordé de boulot. 


                      MAIN:

                      #include <stdio.h>
                      #include <stdlib.h>
                      
                      #include "Header.h"
                      
                      int main()
                      {
                          Personne Joueur[4];
                      
                          printf("Joueur crée");
                      
                          initialiser(Joueur, 4);
                          affiche(Joueur, 4);
                      
                      
                      
                          return 0;
                      }


                      Fonction:

                      #include "Header.h"
                      
                      void initialiser(Personne Personne[], int taille)
                      {
                          int i;
                      
                          for(i=0; i<taille; i++)
                          {
                              strcpy(Personne[i].nom,"\0");
                              strcpy(Personne[i].prenom,"\0");
                              strcpy(Personne[i].adresse,"\0");
                      
                              Personne[i].age=0;
                              Personne[i].sexe=0;
                          }
                      }
                      
                      void affiche(Personne Personne[], int taille)
                      {
                          int i;
                      
                          for(i=0; i<taille; i++)
                          {
                              printf("%s", Personne[i].nom);
                              printf("%s", Personne[i].prenom);
                              printf("%S", Personne[i].adresse);
                      
                              printf("%d", Personne[i].age);
                              printf("%d", Personne[i].sexe);
                          }
                      }
                      


                      Header:

                      #ifndef HEADER_H_INCLUDED
                      #define HEADER_H_INCLUDED
                      
                      #include <string.h>
                      
                      typedef struct Personne
                      {
                          char nom[100];
                          char prenom[100];
                          char adresse[1000];
                      
                          int age;
                          int sexe;
                      }Personne;
                      
                      void initialiser(Personne Pointeur[], int taille);
                      void affiche(Personne Personne[], int taille);
                      
                      #endif
                      


                      Build Messages:



                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 juin 2021 à 16:36:21

                        Goupil 117 a écrit:

                        je n'arrive pas à faire afficher le contenu du tableau joueur. Est-ce parque les chaînes de caractères commence par "\0" ?

                        Oui, ce sont des chaînes vide, le '\0' indiquant la fin de la chaîne de caractère.

                        Pour que ton affichage soit plus lisible et tu comprendras mieux ce que tu affiches, mets des saut à la ligne '\n' ou des séparation à la fin de chaque ligne d'affichage.

                        Pour tes Warning met l'include stdio.h dans le fichier fonction.c (En fait mets les includes dans les fichiers où ils sont nécessaires par exemple l'include string.h n'a rien à faire dans ton fichier entête).  

                        Aussi ligne 26, c'est %s et non pas %S

                        -
                        Edité par rouloude 1 juin 2021 à 17:01:06

                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 juin 2021 à 21:37:48

                          Goupil 117 a écrit:

                          ma paresse par rapport au nommage des fichiers et des variables,



                          On a tous le même problème.

                          Il se trouve qu'au bout d'un certain temps, on finit par réaliser que bien nommer les choses, c'est un "investissement" modeste qui économise beaucoup de travail à court terme (écriture, mise au point) autant qu'à long terme (maintenance).

                          Ca vient une fois qu'on a accepté la dure réalité : on n'est pas infaillibles, et le programme qu'on est en train d'écrire va commencer son existence en n'arrêtant pas de bugger. Donc il va falloir le relire pour chercher où est le problème. Et c'est plus fatigant de relire que d'écrire.

                          Mais le débutant s'imagine qu'une fois corrigés les point-virgules et les fautes de frappe, son programme va marcher du premier coup ou presque...

                          -
                          Edité par michelbillaud 1 juin 2021 à 21:42:03

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème de fonction et de struct

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown