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 :

retourner plusieurs tableaux créés dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut retourner plusieurs tableaux créés dans une fonction
    Bonjour,

    j'apprend le langage C et j'ai un "exercice" à réaliser. L'intitulé est:

    Créez des tableaux de type structure et demandez les infos de chaque joueur grâce à une boucle (qui se répète tant qu'il y a des joueurs). Faites un petit tableau de 2 joueurs pour commencer, mais si ça vous amuse, vous pourrez agrandir la taille du tableau plus tard.
    Affichez à la fin du programme les infos que vous avez recueillies sur chacun des joueurs.



    alors voilà le code est quasiment fini mais j'ai un souci que l'intitulé explique bien.


    la structure Personne est créé dans un header:
    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
    #ifndef structure_tableau_personne_structure_h
    #define structure_tableau_personne_structure_h
     
    void demandeDeRenseignementsJoueurs();
    void afficheRenseignement();
     
    typedef struct Personne Personne;
    struct Personne
    {
        char nom[100];
        char prenom[100];
        int age;
        int sexe;
    //    char nomDeRue[1000]; //parce que soucis avec les espaces
        int numeroDeMaison;
        char ville[100];
        int codePostal;
    };
     
     
    #endif
    puis 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "structure.h"
     
    int main(int argc, const char * argv[])
    {
        int nombreDeJoueur=0;
        printf("combien y a t'il de joueur(s)?");
        scanf("%d",&nombreDeJoueur);
        demandeDeRenseignementsJoueurs(nombreDeJoueur);
        afficheRenseignement(nombreDeJoueur);
    }
     
     
    void demandeDeRenseignementsJoueurs(combienJoueur) //création de tableaux remplis des renseignements des joueurs
    {
        int i;
        for (i=0; i<combienJoueur; i++)
        {
            Personne joueur[i];
            printf("Quel est le prenom du joueur%d?\n",i+1);
            scanf("%s",joueur[i].prenom);
            printf("Quel est le nom de %s?\n",joueur[i].prenom);
            scanf("%s",joueur[i].nom);
            printf("Quel est l'âge de %s?\n",joueur[i].prenom);
            scanf("%d",&joueur[i].age);
            printf("Quel est le sexe de %s?\nTapez 1 pour garçon ou 2 pour fille:",joueur[i].prenom);
            scanf("%d",&joueur[i].sexe);
    //        printf("Quel est le nom de la rue de %s?\n",joueur[i].prenom);    //soucis avec les espaces
    //        scanf("%s",joueur[i].nomDeRue);
            printf("A quel numéro?\n");
            scanf("%d",&joueur[i].numeroDeMaison);
            printf("Dans quel ville habite %s?\n",joueur[i].prenom);
            scanf("%s",joueur[i].ville);
            printf("Dont le code postal est:\n");
            scanf("%d",&joueur[i].codePostal);
        }
    }
     
    void afficheRenseignement(combienJoueur) // affiche les renseignements recueillis à l'aide de la fonction demandeDeRenseignementJoueurs
    {
        int i;
        for (i=0; i<combienJoueur; i++)
        {
            printf("Renseignements du joueur %d:\n\n",i+1);
            printf("%s ",joueur[i].prenom);
            printf("%s\n",joueur[i].nom);
            printf("%d",joueur[i].age);
            printf("%s ",joueur[i].numeroDeMaison);
            printf("%d %s",joueur[i].codePostal,joueur[i].ville);
        }
    }


    Le soucis arrive à la ligne 11 quand je fais appelle à la fonction afficheRenseignement. C'est dans cette fonction que l'on va afficher les différents renseignements contenus dans les tableaux créé dans la fonction demandeDeRenseignementsJoueurs (ligne 15). En effet dans cette fonction c'est comme si on n'avait pas créé les tableaux ou plutôt comme s'ils avaient disparus une fois la fonction terminée.

    Je pense qu'avec un return le problème pourrait être résolu mais j'ai pas réussi à le mettre en pratique. Plus je teste de chose plus j'ai des erreurs.

    Ou alors, il faut que je m'y prenne autrement.



    Merci à ceux qui pourront me filer un coup de patte.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ligne 49 de ton 2nd code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s ",joueur[i].numeroDeMaison);
    numeroDeMaison est de type int, tu devrais donc avoir %d.

    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i=0; i<combienJoueur; i++)
        {
            Personne joueur[i];
    crée à chaque itération un tableau de Personne de taille i. Ce n'est pas ce tu souhaites faire à mon humble avis

    Enfin, ta fonction afficheRenseignement() ne connait pas ta variable joueur si tu ne lui passes pas en paramètre.

  3. #3
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    joueur existe seulement dans ta fonction demandeDeRenseignementsJoueurs(). C'est une variable locale.

    Tu vas devoir créer ton tableau disont dans le main() le passer en paramètre à ta fonction demandeDeRenseignementsJoueurs() et ensuite le passer à la fonction afficheRenseignement(). Dans le premier cas le passer par adresse.

    Ou encore créer joueur dans demandeDeRenseignementsJoueurs() avec malloc() et le retourner à la fin de la fonction ensuite le passer en paramètre à afficheRenseignement() et libèrer la mémoire à la fin.

    Ou et c'est le mal tout faire avec une variable globale.


  4. #4
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Merci pour vos réponses les gars.

    A winjerome: en fait je veux créer une structure par joueur donc en notant Personne joueur[i], si il y a par exemple 3 joueurs, cela va créer joueur0, joueur1 et joueur2. Je crois que je peux gérer le problème comme cela.

    A moins1: je pense que je vais placer la fonction demandeDeRenseignementsJoueurs dans la fonction main. Je voulais pas trop en mettre dans le main pour rendre le programme plus clair mais j'ai pas encore appris malloc et j'ai bien compris que la variable globale est à bannir.

    Je refais mon code et je reviens donner des news.

  5. #5
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Bon en fait j'ai tout mis dans la fonction main car je pense que je n'ai pas encore les connaissances necessaires pour faire autrement.

    Mais j'ai toujours un soucis:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "structure.h"
     
    int main(int argc, const char * argv[])
    {
        int i=0;
        int nombreDeJoueur=0;
        printf("combien y a t'il de joueur(s)?");
        scanf("%d",&nombreDeJoueur);
     
        Personne joueur[i];
     
        for (i=0; i<nombreDeJoueur; i++)
        {
            printf("Quel est le prenom du joueur%d?\n",i+1);
            scanf("%s",joueur[i].prenom);
            printf("Quel est le nom de %s?\n",joueur[i].prenom);
            scanf("%s",joueur[i].nom);
            printf("Quel est l'âge de %s?\n",joueur[i].prenom);
            scanf("%d",&joueur[i].age);
            printf("Quel est le sexe de %s?\nTapez 1 pour garçon ou 2 pour fille:",joueur[i].prenom);
            scanf("%d",&joueur[i].sexe);
            printf("Quel est le nom de la rue de %s? Ne pas mettre d'espace, il faut les remplacer par des _\n",joueur[i].prenom);    //soucis avec les espaces
            scanf("%s",joueur[i].nomDeRue);
            printf("A quel numéro?\n");
            scanf("%d",&joueur[i].numeroDeMaison);
            printf("Dans quel ville habite %s?\n",joueur[i].prenom);
            scanf("%s",joueur[i].ville);
            printf("Dont le code postal est:\n");
            scanf("%d",&joueur[i].codePostal);
        }
     
        for (i=0; i<nombreDeJoueur; i++)
        {
            printf("Renseignements du joueur %d:\n\n",i+1);
            printf("%s ",joueur[i].prenom);
            printf("%s\n",joueur[i].nom);
            printf("%d",joueur[i].age);
            printf("%d ",joueur[i].numeroDeMaison);
            printf("%d %s",joueur[i].codePostal,joueur[i].ville);
        }
    }
    Le code s'arrête à la ligne 18 en mettant le message:

    Thread 1:EXC_BAD_ACCESS (code=1, address=0x7fff007565c0)

    Si je ne met qu'une seule lettre dans le prenom, ca passe, si je met un prenom normal ca plante. Comme ci la case prenom ne pouvait pas contenir plus d'une case.

  6. #6
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Après avoir demander le nombre de joueur tu déclares ton tableau avec i.
    C'est avec nombreDeJoueur que tu dois déclarer ton tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne joueur[nombreDeJoueur];
    Pour continuer avec les fonctions, c'est quand même mieux, et sans malloc(), tu pourrais faire quelque chose dans le genre.
    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
    #include <stdio.h>
    #define TAILLE 5
     
    struct TOTO         // Pas de typedef parce que beurk!
    {
        int a;
        int b;
    };
     
    void fonc1(struct TOTO toto[], int taille);
    void fonc2(struct TOTO toto[], int taille);
     
    int main(void)
    {
        struct TOTO titi[TAILLE];
     
        fonc1(titi, TAILLE);
        fonc2(titi, TAILLE);
        return 0;
    }
     
    void fonc1(struct TOTO toto[], int taille)
    {
        int i;
     
        for(i = 0; i < taille; i++)
        {
            toto[i].a = 10 * (i + 10); // Petit calcul juste pour avoir des donnees :)
            toto[i].b = 10 * (i + 20);
        }
    }
     
    void fonc2(struct TOTO toto[], int taille)
    {
        int i;
     
        for(i = 0; i < taille; i++)
        {
            printf("a -> %d    b -> %d\n", toto[i].a, toto[i].b);
        }
    }
    C'est à adapter à ton code.


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

Discussions similaires

  1. Plusieurs classes CSS dans une fonction JavaScript
    Par Lillie CHARLOTTE dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 25/05/2015, 15h29
  2. Réponses: 51
    Dernier message: 20/08/2013, 16h44
  3. Réponses: 4
    Dernier message: 21/09/2008, 01h24
  4. Réponses: 1
    Dernier message: 27/01/2008, 17h15
  5. [Tableaux] erreur dans une fonction
    Par eclipse012 dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2007, 09h58

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