[C/C++] Problème de tableaux et pointeurs

Résolu/Fermé
ibac001
Messages postés
230
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
9 mai 2015
- 22 mai 2012 à 16:00
link15
Messages postés
15
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
6 juin 2012
- 6 juin 2012 à 00:48
Bonjour,
Je me suis mis à la programmation il y a peu...
J'arrive plutôt bien à maîtriser les bases, notamment les pointeurs en ce qui concernent les variables basiques...
Mais voilà, dès que je tente d'envoyer un tableau ou une valeur de case d'un tableau a une fonction différente de main, je ne sais jamais si j'envoie l'adresse de la première case du tableau, sa valeur, ou autre chose...
Voilà mon code qui fonctionne :

#include <stdio.h>
#include <stdlib.h>
#include "Structure.h" // On inclue le fichier contenant les structures et prototypes

int main()
{
    int nombre_de_joueur = 0;
    utilisateur joueur[4];
    printf ("\n Combien de joueurs? (4 au maximum)\n\t\t");
    scanf ("%d", &nombre_de_joueur);
    printf ("\n\n");
    if (nombre_de_joueur == 1 || nombre_de_joueur == 2 || nombre_de_joueur == 3 || nombre_de_joueur == 4)
    {
     int i;
     for (i=0; i<nombre_de_joueur; i++)
     {
         printf (" Joueur %d, quel est ton prenom?\t\t", i+1);
         scanf ("%s", joueur[i].prenom);
         printf ("\n Et ton nom de famille?\t\t\t");
         scanf ("%s", joueur[i].nom);
         printf ("\n Enfin, dans quelle ville habites-tu?\t");
         scanf ("%s", joueur[i].ville);
         printf ("\n Quel age as-tu?\t\t\t");
         scanf ("%d", &joueur[i].age);
        printf ("\n--------------------------------------------------------\n");
     }
     int j;
   for (j=0; j<nombre_de_joueur; j++)
   {
       printf ("\nLe joueur %d s'appelle %s %s habite %s et a %d ans\n", j+1, joueur[j].prenom, joueur[j].nom, joueur[j].ville, joueur[j].age );
   }

     }
    else {printf ("\n\tTrop de joueur\n\n");}


    return 0;
}


J'aimerai en fait pouvoir faire en sorte que le "if" soit calculé dans une autre fonction, et qu'ensuite le printf de la dernière boucle s'exécute dans le main ou dans une troisième fonction...

Voilà la structure que j'utilise :

typedef struct utilisateur utilisateur;
struct utilisateur
{
    char prenom[100];
    char nom[100];
    int age;
    char ville[100];
};






6 réponses

link15
Messages postés
15
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
6 juin 2012

22 mai 2012 à 16:28
tu envoie une structure dans ta fonction, du genre "void ma_fonction(utilisateur *joueur)" et dans ton main son appel sera plus du genre "ma_fonction(joueur)"
0
LeChikito
Messages postés
1589
Date d'inscription
lundi 19 mars 2012
Statut
Membre
Dernière intervention
3 août 2012
319
22 mai 2012 à 16:37
Bonjour,
Pour ton if, tu a meilleur temps de le laisser là où il est, même si un
if (nbjoueurs >=1 && nbjoueurs <= 4)
est plus "beau".


Comme l'a dit link15, une fonction
void fonction(utilisateur *joueur)
{
   printf ("\nLe joueur %d s'appelle %s %s habite %s et a %d ans\n", j+1, 
   joueur.prenom, joueur.nom, joueur.ville, joueur.age );
}
que tu appelle via
fonction(joueur[j])
te satisferas grandement.
Cordialement
0
JooS
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
Modifié par JooS le 22/05/2012 à 17:33
Salut !
Exemple !

utilisateur * remplirTableau(int nombre_de_joueur) { 
    utilisateur *joueur = NULL; 
    int i; 

    if (nombre_de_joueur > 0 && nombre_de_joueur < 5) 
    { 
       joueur = (utilisateur *) malloc(sizeof(utilisateur)*nombre_de_joueur); 

       for (i=0; i<nombre_de_joueur; i++) 
       { 
         printf (" Joueur %d, quel est ton prenom?\t\t", i+1); 
         scanf ("%s", joueur[i].prenom); 
         printf ("\n Et ton nom de famille?\t\t\t"); 
         scanf ("%s", joueur[i].nom); 
         printf ("\n Enfin, dans quelle ville habites-tu?\t"); 
         scanf ("%s", joueur[i].ville); 
         printf ("\n Quel age as-tu?\t\t\t"); 
         scanf ("%d", &joueur[i].age); 
         printf ("\n--------------------------------------------------------\n"); 
       } 
     } 

     return joueur; 
} 

//------------------------------------- 

void main() { 
    utilisateur *liste; 
    int i; 

    liste = remplirTableau(2); // 2 étant le nombre d'utilisateur 

    if(liste == NULL) printf("Nombre d'utilisateur incorrect."); 
    else { 
      //AFFICHAGE DES DONNEES 
    } 
}


Mettez en résolu quand c'est résolu -.- ... ...
0
ibac001
Messages postés
230
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
9 mai 2015
29
22 mai 2012 à 20:30
(Re)Bonjour,
Tout d'abord merci à vous pour vos réponses rapide.
Alors voilà, j'ai testé globalement ce que vous m'avez proposé, mais j'ai un problème, le code fonctionne mais uniquement pour l'affichage du joueur1, au delà il ne me met que les adresses des variables... Et je ne comprend pas donc...

Ma fonction est
void info_joueur (utilisateur joueur[], int j)
{

       printf ("\nLe joueur %d s'appelle %s %s habite %s et a %d ans\n", j+1, joueur[j].prenom, joueur[j].nom, joueur[j].ville, joueur[j].age );

}


Et quand je l'appelle je fait
int j;
    for (j=0; j<nombre_de_joueur; j++)
    {
             info_joueur (&joueur[j], j) ;
    }


Je ne comprend vraiment pas...
De plus, j'aimerai créer une fonction qui contiendrai
int i;
     for (i=0; i<nombre_de_joueur; i++)
     {
         printf (" Joueur %d, quel est ton prenom?\t\t", i+1);
         scanf ("%s", joueur[i].prenom);
         printf ("\n Et ton nom de famille?\t\t\t");
         scanf ("%s", joueur[i].nom);
         printf ("\n Enfin, dans quelle ville habites-tu?\t");
         scanf ("%s", joueur[i].ville);
         printf ("\n Quel age as-tu?\t\t\t");
         scanf ("%d", &joueur[i].age);
        printf ("\n--------------------------------------------------------------------------\n");
     }


Et qui me renverrai mon tableau de joueur complet et près à être utilisé dans le main...
Merci d'avance!

PS : en effet, mon if est très moche XD mais j'avais la flemme...
0
JooS
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
23 mai 2012 à 00:39
t'as tester au moins ce que j'ai proposer !
0
ibac001
Messages postés
230
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
9 mai 2015
29
23 mai 2012 à 01:20
En fait pour tout dire, je me sens un peu con... Je ne comprend pas ton code à vrai dire... Je ne sais pas ce qu'est "malloc"... par exemple (Je suis novice!)
0
JooS
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
Modifié par JooS le 23/05/2012 à 17:35
joueur = (utilisateur *) malloc(sizeof(utilisateur)*nombre_de_joueur);

sizeof(utilisateur) = x : retourne le nombre d'octet que nécessite la structure utilisateur en mémoire.
malloc(sizeof(utilisateur)*nombre_de_joueur) : Alloue un espace de taille x * nbr de joueur !
(utilisateur *) : pour forcer la conversion du type de pointeur renvoyé par malloc.
joueur : Le pointeur ou on va stocker l'adresse du premier octet du bloc qu'on a allouer.

Tu pourrais me dire, pourquoi n'attons pas déclarer un tableau directement(statiquement), et travailler deçu !

1 - Parce que une fois ton tableau rempli dans la fonction, tu ne pourra pas le renvoyer avec un return, car le langage C ne le permet pas.
2 - Parce que une fois ta fonction achevé, toutes les variables déclaré statiquement seront supprimé de la mémoire, donc ton tableau sera supprimé aussi.

-------------

Donc ce que la fonction fait !

- On alloue l'espace nécessaire (dynamiquement).
- On le rempli (nom, prenom ...).
- On renvoi l'adresse du premier octet de cet espace, or, un pointeur.

- On récupère(enregistre) ce pointeur dans le main, et on fait l'affichage normalement.
0
link15
Messages postés
15
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
6 juin 2012

23 mai 2012 à 21:03
ou alors on travaille directement sur la mémoire sans re-déclarer une structure à chaque fois.
0
JooS
Messages postés
2465
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
23 mai 2012 à 21:34
Comment ça ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
link15
Messages postés
15
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
6 juin 2012

23 mai 2012 à 02:00
Quand tu appelle ta fonction essaie ça:
int main()
{
for (j=0; j<nombre_de_joueur; j++)
{
info_joueur (&joueur, j) ;
}
}

void ma_fonction(utilisateur *joueur[], int j)
{
int i;
for (i=0; i<nombre_de_joueur; i++)
{
printf (" Joueur %d, quel est ton prenom?\t\t", i+1);
scanf ("%s", joueur[i]->prenom);
printf ("\n Et ton nom de famille?\t\t\t");
scanf ("%s", joueur[i]->nom);
printf ("\n Enfin, dans quelle ville habites-tu?\t");
scanf ("%s", joueur[i]->ville);
printf ("\n Quel age as-tu?\t\t\t");
scanf ("%d", joueur[i]->age);
printf ("\n--------------------------------------------------------------------------\n");
}
}

Je me demande comment ça ce fait que tu n'ai pas d'erreur d'ailleurs x)
0
ibac001
Messages postés
230
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
9 mai 2015
29
27 mai 2012 à 10:16
J'ai fini par trouvé... En refaisant quelques chose que mon IDE m'avait refusé la première fois... J'ai essayé toute les combinaisons possible avec l'appelle de ma fonction, et ça a fini par marcher en réutilisant l'astuce de link15 qui m'avait renvoyé des adresses la première fois.
Je garde dans un coin de ma tête l'idée de JooS qui pourrait m'être utile dans de futurs programme. Je posterai le code complet d'ici quelques jours, ça pourra peut-être un jour en aider d'autre ;)


MERCI A TOUS!!!!!
0
ibac001
Messages postés
230
Date d'inscription
samedi 20 juin 2009
Statut
Membre
Dernière intervention
9 mai 2015
29
5 juin 2012 à 15:41
#include <stdio.h>
#include <stdlib.h>
#include "Structure.h" // On inclue le fichier contenant les structures et prototypes

int main()
{
int nombre_de_joueur = 0;
utilisateur joueur[4];
printf ("\n Combien de joueurs? (4 au maximum)\n\t\t");
scanf ("%d", &nombre_de_joueur);
printf ("\n\n");
if (nombre_de_joueur == 1 || nombre_de_joueur == 2 || nombre_de_joueur == 3 || nombre_de_joueur == 4)
{
int i;
for (i=0; i<nombre_de_joueur; i++)
{
printf (" Joueur %d, quel est ton prenom?\t\t", i+1);
scanf ("%s", joueur[i].prenom);
printf ("\n Et ton nom de famille?\t\t\t");
scanf ("%s", joueur[i].nom);
printf ("\n Enfin, dans quelle ville habites-tu?\t");
scanf ("%s", joueur[i].ville);
printf ("\n Quel age as-tu?\t\t\t");
scanf ("%d", &joueur[i].age);
printf ("\n--------------------------------------------------------------------------\n");
}

int j;
for (j=0; j<nombre_de_joueur; j++)
{
info_joueur (joueur, j) ;

}

}
else {printf ("\n\tTrop de joueur\n\n");}


return 0;
}
0
link15
Messages postés
15
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
6 juin 2012

6 juin 2012 à 00:48
Je suis content si j'ai pu t'aider. :D
0