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 :

Comment passer un tableau de structure à une fonction


Sujet :

C

  1. #1
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut Comment passer un tableau de structure à une fonction
    bonsoir,

    tout est dans le titre
    merci pour votre aide.

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Le passage d'un tableau de structures se fait de la même façon que tout autre tableau. Rien de spécial.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mackla Voir le message
    tout est dans le titre
    On ne lit pas les titres :

    "comment passer un tableau de structure à une fonction"

    La réponse a été donnée. Fait de ton mieux et poste ton code si tu as un problème.

  4. #4
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    Bonjour,
    j'ai esseyé tous les cas possibles mais cela ne marche pas.
    mon programme compile sans erreurs mais l'exécution est fausse
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LONG 30
     
     
    typedef struct{
                    char nom[LONG+1];
                    char prenom[LONG+1];
                    char ville[LONG+1];
     
    }personne;
    personne per[5];
     
    main()
    {
     
    void red(personne per, int n);
     
     FILE *ptr;
     int i;
     
     ptr=fopen("fichier.txt", "a+");
     
     if (ptr==NULL)
       {
         printf("erreur lors de création du fichier\n");
       }
       else
          {
           while(!feof(ptr))
             {
    	   for (i=0; i<=5; i++);
    	    {
    	         fscanf(ptr, "%s %s %s", per[i].nom, per[i].prenom, per[i].ville);
    		 fprintf(stdout, "%s\n%s\n%s\n\n", per[i].nom, per[i].prenom, per[i].ville);
    	    }
     
             }
          }
          red(per, 5);
          }
     }
     
    void red(personne perl[], int n)
    {
     
     char *chaine="mackla";
     
        for(i=0; i<=n; i++)
          {
            if (strcmp(chaine, per[i].prenom) == 0)
           {   
    	  strcpy(chaine, per[i].nom);
    	  fprintf(stdout, "%s\n", chaine);
    	}
           fprintf("elle n’existe pas\n");  
    }
    il n'affiche pas le prenom "mackla", pourtant il existe.

    merci pour votre aide

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mackla Voir le message
    Bonjour,
    j'ai esseyé tous les cas possibles mais cela ne marche pas.
    mon programme compile sans erreurs mais l'exécution est fausse
    Ah ! Etrange, car en compilant le code que tu as fourni la compilation ne se passe pas bien :

    -------------- Build: Release in test_DVP ---------------

    Compiling: main.c
    E:\projet\test_DVP\main.c:16: warning: return type defaults to `int'
    E:\projet\test_DVP\main.c: In function `main':
    E:\projet\test_DVP\main.c:41: error: incompatible type for argument 1 of `red'
    E:\projet\test_DVP\main.c: At top level:
    E:\projet\test_DVP\main.c:43: error: syntax error before '}' token
    E:\projet\test_DVP\main.c:46: error: conflicting types for 'red'
    E:\projet\test_DVP\main.c:18: error: previous declaration of 'red' was here
    E:\projet\test_DVP\main.c: In function `red':
    E:\projet\test_DVP\main.c:50: error: `i' undeclared (first use in this function)
    E:\projet\test_DVP\main.c:50: error: (Each undeclared identifier is reported only once
    E:\projet\test_DVP\main.c:50: error: for each function it appears in.)
    E:\projet\test_DVP\main.c:57: warning: passing arg 1 of `fprintf' from incompatible pointer type
    E:\projet\test_DVP\main.c:57: error: too few arguments to function `fprintf'
    E:\projet\test_DVP\main.c:58: error: syntax error at end of input
    Process terminated with status 1 (0 minutes, 0 seconds)
    9 errors, 2 warnings
    Il faut corriger ces problèmes avant d'essayer d'aller plus loin.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mackla Voir le message
    j'ai esseyé tous les cas possibles mais cela ne marche pas.
    Le codage, c'est pas du hasard... Il faut faire ce qui est correct et ça découle d'une réflexion préalable...
    mon programme compile sans erreurs
    Euh, non...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:16: warning: return type defaults to `int'
    main.c:16: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:41: error: incompatible type for argument 1 of `red'
    main.c: At top level:
    main.c:43: error: syntax error before '}' token
    main.c:46: error: conflicting types for 'red'
    main.c:18: error: previous declaration of 'red' was here
    main.c: In function `red':
    main.c:48: warning: initialization discards qualifiers from pointer target type
    main.c:50: error: `i' undeclared (first use in this function)
    main.c:50: error: (Each undeclared identifier is reported only once
    main.c:50: error: for each function it appears in.)
    main.c:57: warning: passing arg 1 of `fprintf' from incompatible pointer type
    main.c:57: error: too few arguments to function `fprintf'
    main.c:58: error: syntax error at end of input
    Process terminated with status 1 (0 minutes, 2 seconds)
    9 errors, 4 warnings
    Il faut faire un copié/collé et non recopier le code à la main...

    Beaucoup d'erreurs basiques.
    • Pourquoi utiliser "a+" pour lire un fichier ?
    • feof() ne fait pas ce que tu crois. Il faut tester la valeur retournée par fscanf()
    • Il ne faut pas de ';' après un for (ici, le fichier n'est jamais lu, mais de toutes façon la méthode de lecture est fausse...)
    • Il faut fermer le fichier après usage.
    • Certains identificateurs sont incompréhensibles...
    • fprintf (stdout, ...); est une façon compliquée d'écrire printf (...);
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
         for (i = 0; i <= n; i++)
    • Les indices valides d'un tableau de N éléments vont de 0 à N-1

    Voici une version corrigée.
    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
     
    #include <stdio.h>
    #include <string.h>
     
    #define LONG 30
     
    typedef struct
    {
       char nom[LONG + 1];
       char prenom[LONG + 1];
       char ville[LONG + 1];
    }
    personne;
     
    void rechercher (personne per[], int n, char const *chaine)
    {
       int i;
       int trouve = 0;
       /* Parcours du tableau. */
       for (i = 0; !trouve && i < n; i++)
       {
          /* Si on a trouvé , on arrete. */
          if (strcmp (chaine, per[i].prenom) == 0)
          {
             printf ("%s\n%s\n%s\n\n", per[i].nom, per[i].prenom, per[i].ville);
             trouve = 1;
          }
       }
     
       /* si on a pas trouve */
       if (!trouve)
       {
          printf ("'%s' est introuvable\n", chaine);
       }
    }
     
    int main (void)
    {
       char const *fname = "fichier.txt";
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          int i = 0;
          personne per[5] = { {"", "", ""} };
     
          /* chargement du tableau */
          while (i < 5
                 && fscanf (fp, "%s %s %s", per[i].nom, per[i].prenom,
                            per[i].ville) == 3)
          {
             printf ("%s\n%s\n%s\n\n", per[i].nom, per[i].prenom, per[i].ville);
             i++;
     
          }
          fclose (fp), fp = NULL;
          rechercher (per, 5, "mackla");
       }
       else
       {
          perror (fname);
       }
     
       return 0;
    }
    Je n'ai pas de fichier pour tester, alors ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fichier.txt: No such file or directory
     
    Press ENTER to continue.
    Tu peux poster une copie de ton "fichier.txt" ?

  7. #7
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    Envoyé par Emmanuel Delahaye
    Beaucoup d'erreurs basiques.
    Pourquoi utiliser "a+" pour lire un fichier ?
    j'ajoute à chaque fois sur mon fichier (donc lecture/ecriture)
    Il ne faut pas de ';' après un for (ici, le fichier n'est jamais lu, mais de toutes façon la méthode de lecture est fausse...).
    Il faut fermer le fichier après usage
    une erreur de frappe (vous avez raison pour le copier/coller)

    concernant le fichier.txt il est structuré comme suit
    mackla toto paris
    joseph titi bordeaux
    franck tata evry
    j'ai compiler votre code, il est sans erreur ; mais l'exécution est fausse
    la voici:

    mackla
    toto
    paris

    joseph
    titi
    bordeaux

    franck
    tata
    evry

    'mackla' est introuvable
    pourtant mackla existe.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mackla Voir le message
    j'ai compiler votre code, il est sans erreur ; mais l'exécution est fausse

    pourtant mackla existe.
    Pas de :roll: STP. C'est extrêment mal poli...

    Normal. 'mackla' est un nom et tu cherches dans les prénoms...

    Ceci fonctionne :
    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
     
    #include <stdio.h>
    #include <string.h>
     
    #define LONG 30
     
    typedef struct
    {
       char nom[LONG + 1];
       char prenom[LONG + 1];
       char ville[LONG + 1];
    }
    personne;
     
    void rechercher (personne per[], int n, char const *chaine)
    {
       int i;
       int trouve = 0;
       /* Parcours du tableau. */
       for (i = 0; !trouve && i < n; i++)
       {
          /* Si on a trouvé , on arrete. */
          if (strcmp (chaine, per[i].nom) == 0)
          {
             printf ("%s\n%s\n%s\n\n", per[i].nom, per[i].prenom, per[i].ville);
             trouve = 1;
          }
       }
     
       /* si on a pas trouve */
       if (!trouve)
       {
          printf ("'%s' est introuvable\n", chaine);
       }
    }
     
    int main (void)
    {
       char const *fname = "fichier.txt";
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          int i = 0;
          personne per[5] = { {"", "", ""} };
     
          /* chargement du tableau */
          while (i < 5
                 && fscanf (fp, "%s %s %s", per[i].nom, per[i].prenom,
                            per[i].ville) == 3)
          {
             printf ("'%s', '%s', '%s'\n", per[i].nom, per[i].prenom, per[i].ville);
             i++;
     
          }
          fclose (fp), fp = NULL;
          rechercher (per, 5, "mackla");
       }
       else
       {
          perror (fname);
       }
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'mackla', 'toto', 'paris'
    'joseph', 'titi', 'bordeaux'
    'franck', 'tata', 'evry'
    mackla
    toto
    paris
     
     
    Press ENTER to continue.

  9. #9
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    Pas de STP. C'est extrêment mal poli...
    désolé, mais je ne voulai en aucun cas insinuer quoi que ce soit, juste étonner de l'exécution.
    if (strcmp (chaine, per[i].nom) == 0)
    on cerche dans les noms.
    dans la structure de mon fichier:
    les nom sont : mackla, joseph et franck.
    les prenom : toto, titi et tata

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 946
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 946
    Points : 5 659
    Points
    5 659
    Par défaut
    Fao,
    Citation Envoyé par mackla Voir le message
    désolé, mais je ne voulai en aucun cas insinuer quoi que ce soit, juste étonner de l'exécution.
    on cerche dans les noms.
    dans la structure de mon fichier:
    les nom sont : mackla, joseph et franck.
    les prenom : toto, titi et tata
    Oui, mais dans le code, il y avait bien
    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
    void rechercher (personne per[], int n, char const *chaine)
    {
       int i;
       int trouve = 0;
       /* Parcours du tableau. */
       for (i = 0; !trouve && i < n; i++)
       {
          /* Si on a trouvé , on arrete. */
     
          // ici, c'est bien dans les prénoms qu'on cherche. :)
     
          if (strcmp (chaine, per[i].prenom) == 0)
          {
             printf ("%s\n%s\n%s\n\n", per[i].nom, per[i].prenom, per[i].ville);
             trouve = 1;
          }
       }
     
       /* si on a pas trouve */
       if (!trouve)
       {
          printf ("'%s' est introuvable\n", chaine);
       }
    }

  11. #11
    Membre régulier Avatar de mackla
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 140
    Points : 120
    Points
    120
    Par défaut
    merci à vous Emmanuel Delahaye pour votre aide

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 040
    Points
    31 040
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pas de STP. C'est extrêment mal poli...
    <mode troll>
    <mode humour>
    Quand on voit ton code, il a raison de mettre du roll
    </mode humour>
    </mode troll>

    Désolé pour la vanne, c'était trop tentant. Bon, maintenant il faut payer, j'attends ma sanction...

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Quand on voit ton code, il a raison de mettre du roll
    Beuh, pas compris...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/12/2009, 16h45
  2. Passage de tableau de structure à une fonction
    Par Kefass dans le forum Débuter
    Réponses: 2
    Dernier message: 18/08/2009, 19h07
  3. Comment passer un tableau en argument de fonction
    Par Winnyls dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2009, 17h36
  4. Réponses: 1
    Dernier message: 18/11/2005, 11h38

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