[C/C++] Problème de tableaux et pointeurs
Résolu
ibac001
Messages postés
230
Date d'inscription
Statut
Membre
Dernière intervention
-
link15 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
link15 Messages postés 15 Date d'inscription Statut Membre Dernière intervention -
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 :
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 :
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]; };
A voir également:
- [C/C++] Problème de tableaux et pointeurs
- Tableaux croisés dynamiques - Guide
- Fusionner deux tableaux excel - Guide
- Les tableaux word - Guide
- Barbara veut calculer automatiquement son budget dans un tableau. citez un des logiciels lui permettant de faire des calculs sur des tableaux de nombres (tableur). - Forum Musique / Radio / Clip
- Tableau de combinaison loto 5/90 - Forum Excel
6 réponses
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)"
Bonjour,
Pour ton if, tu a meilleur temps de le laisser là où il est, même si un
Comme l'a dit link15, une fonction
Cordialement
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
Salut !
Exemple !
Mettez en résolu quand c'est résolu -.- ... ...
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 -.- ... ...
(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
Et quand je l'appelle je fait
Je ne comprend vraiment pas...
De plus, j'aimerai créer une fonction qui contiendrai
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...
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...
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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)
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)
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!!!!!
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!!!!!
#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;
}
#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;
}