Aide sur les structures

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour,
il y a peu de ten j'ai débuté en programmation en C. J'en suis actuellement a aprendre les structures. Un de mes code sources bug lors de l'execution , le voici:

Dans le fichier h:

#ifndef STRUCTURE2_H_INCLUDED
#define STRUCTURE2_H_INCLUDED

struct Pers
{
long age;
char prenom[1000];
};


#endif // STRUCTURE2_H_INCLUDED



Dans mon fichier C:

#include <stdio.h>
#include <stdlib.h>
#include "structure2.h"

int main()
{
long i;
struct Pers joueur[2];
for(i=0;i<2;i++)
{
printf("Votre age?");
scanf("%ld", joueur[i].age);
printf("Nom?");
scanf("%s", joueur[i].prenom);
}

printf("Joueur 1 : %s, %ld ans\n", joueur[0].age,joueur[0].prenom );
printf("Joueur 2 : %s, %ld ans\n", joueur[1].age,joueur[1].prenom );
return 0;
}

J'ai executé ceci avec code blocks 8.02.
Je voudré ke on demande le nom et l'age puis kon les ressorte au moyen d'une structure.
Je sais on peut faire autrement mais j'aimerai fer comme ça pour bien aprendre : aidez moi svp!!!!!!!!!

5 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Merci de faire un effort sur l'orthographe.

Premier conseil que je te donne, ça ne sert à rien d'utiliser des variables disproportionnées (par exemple un long pour compter jusqu'à 2 faut quand même pas pousser, un int suffit largement. Idem pour un prénom de longueur 1000). Dans le cas de l'âge il serait plus logique de stocker un unsigned (parce qu'un âge négatif c'est mauvais signe) qu'un long (je doute qu'il y ait des vénérables joueurs de plusieurs milliers d'années).

Ensuite tes problèmes viennent d'une mauvaise utilisation de scanf. Il faut que tu gardes à l'esprit qu'en C un paramètre de fonction est une recopie de la variable passée en paramètre. Ainsi une fonction ne peut modifier une variable déclarée en dehors de son scope (sa paire d'accolade) qu'au travers d'un pointeur. Il faut donc passer l'adresse de cette valeur à modifier (par exemple le champ age dans ta structure. Dans le cas d'une chaîne (ou buffer), le champ prenom est déjà une adresse (un char [ ] peut être vu comme un char *) donc on passe bien joueur[0].prenom et pas &joueur[0].prenom.

Dans tes printf tu as permuté les paramètres.

Je signale également que ton compilateur a dû t'envoyer une palanquée de warning, la première chose à faire c'est de les résoudre ! Ainsi ton programme corrigé ressemble à ça :

Pour le header :
struct Pers
{
    unsigned age;
    char prenom[1000];
};

Pour le fichier source :
#include <stdio.h>
#include <stdlib.h>

int main()
{
    long i;
    struct Pers joueur[2];
    for(i=0;i<2;i++)
    {
        printf("Votre age? ");
        scanf("%d",&joueur[i].age);
        printf("Nom? ");
        scanf("%s",joueur[i].prenom);
    }

    printf("Joueur 1 : %s, %d ans\n",joueur[0].prenom,joueur[0].age);
    printf("Joueur 2 : %s, %d ans\n",joueur[1].prenom,joueur[1].age);
    return 0;
}

Bonne chance
3
Utilisateur anonyme
 
Merci pour tout ,

Cependant, je ne suis pas arriver à recompiler ce programme.
En effet une de mes ereur venait notament de la modification d'une variable hors de la fonction où elle avait été déclarer.Mais sans succés.

Je ne comprend pas pourquoi...
Voici la liste des warnings :

In function `main':|
warning: int format, long int arg (arg 2)|
warning: int format, long int arg (arg 3)|
warning: int format, long int arg (arg 3)|
||=== Build finished: 0 errors, 3 warnings ===|

Merci quand meme.
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Copie colle ton code source actuel, celui que je t'ai donné compile sans problème sous linux. J'ai d'ailleurs oublié de changer le type de i (dans main) de long vers unsigned.
0
Utilisateur anonyme
 
Re,

Merci, je m'étais trompé..excuse et merci encore..vraiment merci beaucoup..

@ +

Greg
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Ok bonne continuation !
0

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

Posez votre question
Utilisateur anonyme
 
Merci!
0