[C] Variable perdant sa valeur

Résolu/Fermé
Arcord Messages postés 24 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 13 février 2012 - 13 févr. 2012 à 14:31
Arcord Messages postés 24 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 13 février 2012 - 13 févr. 2012 à 14:54
Bonjour,

Je fais un petit projet pour mes cours où je dois faire la structure d'une école mais quand je sors de la fonction "remplirecole" qui initialise les classes avec quelques étudiants, ma variable ecole.classe[x].num en sort vide, pourtant j'ai vérifié au moyen de printf, elle est bien initialisée (J'ai ensuite vérifié dans la fonction main si j'utilisais la bonne manière pour l'afficher, tout porte à croire que oui ... ). Ce n'est pas un problème de pointeur je pense car tout le reste de ma structure garde les valeurs initialisées ...

Voici mon code

typedef struct{
char matricule[LGMAT];
char nom[LGTXT];
char prenom[LGTXT];
double cote[MAXNBCOTE];
double pourcent;
int echec;
} Tetu;

typedef struct{
Tetu ClasseEtu[MAXETU];
int nbEtu;
char nom[4];
char num[2];
} Tclasse;

typedef struct{
Tclasse Classe[NBCLASSE];
int nbclasse;
}Tecole;

void remplirEcole(Tecole* ecl)
{
    //1Tl1
    strcpy(ecl->Classe[0].ClasseEtu[0].matricule,"00-1TL1-1");
    strcpy(ecl->Classe[0].ClasseEtu[0].nom,"Eleve1");
    strcpy(ecl->Classe[0].ClasseEtu[0].prenom,"Prenom1");

    strcpy(ecl->Classe[0].ClasseEtu[1].matricule,"00-1TL1-2");
    strcpy(ecl->Classe[0].ClasseEtu[1].nom,"Eleve2");
    strcpy(ecl->Classe[0].ClasseEtu[1].prenom,"Prenom2");

    strcpy(ecl->Classe[0].ClasseEtu[2].matricule,"00-1TL1-3");
    strcpy(ecl->Classe[0].ClasseEtu[2].nom,"Eleve3");
    strcpy(ecl->Classe[0].ClasseEtu[2].prenom,"Prenom3");
    
    ecl->Classe[0].nbEtu=3;
    strcpy(ecl->Classe[0].num,"0");
    strcpy(ecl->Classe[0].nom,"1TL1");

    //1TL2
    strcpy(ecl->Classe[1].ClasseEtu[0].matricule,"01-1TL2-1");
    strcpy(ecl->Classe[1].ClasseEtu[0].nom,"Eleve1");
    strcpy(ecl->Classe[1].ClasseEtu[0].prenom,"Prenom1");

    strcpy(ecl->Classe[1].ClasseEtu[1].matricule,"01-1TL2-2");
    strcpy(ecl->Classe[1].ClasseEtu[1].nom,"Eleve2");
    strcpy(ecl->Classe[1].ClasseEtu[1].prenom,"Prenom2");

    strcpy(ecl->Classe[1].ClasseEtu[2].matricule,"01-1TL2-3");
    strcpy(ecl->Classe[1].ClasseEtu[2].nom,"Eleve3");
    strcpy(ecl->Classe[1].ClasseEtu[2].prenom,"Prenom3");
    
    ecl->Classe[1].nbEtu=3;
   // La variable est initialisée ici
    strcpy(ecl->Classe[1].num,"1");
   // La variable s'affiche normalement
    printf("dans remplirecole : %s\n",ecl->Classe[1].num);
    strcpy(ecl->Classe[1].nom,"1TL2");
    getch();

    //1TM1
    strcpy(ecl->Classe[2].ClasseEtu[0].matricule,"02-1TM1-1");
    strcpy(ecl->Classe[2].ClasseEtu[0].nom,"Eleve1");
    strcpy(ecl->Classe[2].ClasseEtu[0].prenom,"Prenom1");

    strcpy(ecl->Classe[2].ClasseEtu[1].matricule,"02-1TM1-2");
    strcpy(ecl->Classe[2].ClasseEtu[1].nom,"Eleve2");
    strcpy(ecl->Classe[2].ClasseEtu[1].prenom,"Prenom2");

    strcpy(ecl->Classe[2].ClasseEtu[2].matricule,"02-1TM1-3");
    strcpy(ecl->Classe[2].ClasseEtu[2].nom,"Eleve3");
    strcpy(ecl->Classe[2].ClasseEtu[2].prenom,"Prenom3");
    
    ecl->Classe[2].nbEtu=3;
    strcpy(ecl->Classe[2].num,"2");
    strcpy(ecl->Classe[2].nom,"1TM1");

    //1TM2
    strcpy(ecl->Classe[3].ClasseEtu[0].matricule,"03-1TM2-1");
    strcpy(ecl->Classe[3].ClasseEtu[0].nom,"Eleve1");
    strcpy(ecl->Classe[3].ClasseEtu[0].prenom,"Prenom1");

    strcpy(ecl->Classe[3].ClasseEtu[1].matricule,"03-1TM2-2");
    strcpy(ecl->Classe[3].ClasseEtu[1].nom,"Eleve2");
    strcpy(ecl->Classe[3].ClasseEtu[1].prenom,"Prenom2");

    strcpy(ecl->Classe[3].ClasseEtu[2].matricule,"03-1TM2-3");
    strcpy(ecl->Classe[3].ClasseEtu[2].nom,"Eleve3");
    strcpy(ecl->Classe[3].ClasseEtu[2].prenom,"Prenom3");
    
    ecl->Classe[3].nbEtu=3;
    strcpy(ecl->Classe[3].num,"3");
    strcpy(ecl->Classe[3].nom,"1TM2");

    ecl->nbclasse=NBCLASSE;


}

int main()
{

    Tecole ecole;
    remplirEcole(&ecole); // La variable est censée être initialisée ici
    printf("apres remplirecole : %s\n",ecole.Classe[1].num); // Ici elle est vide
    strcpy(ecole.Classe[1].num,"1"); // Ici je lui redonne une valeur
    printf("final : %s\n",ecole.Classe[1].num); // La valeur redonnée s'affiche


    return 0;
}



Comme vous pouvez le voir, elle s'initialise bien, elle s'affiche correctement mais on dirait que quelques part entre son initialisation et quand je la demande dans le main, elle disparait ... Si quelqu'un à une idée, merci d'avance :-)

A voir également:

2 réponses

Arcord Messages postés 24 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 13 février 2012 1
13 févr. 2012 à 14:48
J'ai réduit le champ d'investigation :

    ecl->Classe[1].nbEtu=3;
    printf("dans remplirecole 1: %s\n",ecl->Classe[1].num);
    strcpy(ecl->Classe[1].num,"1");
    printf("dans remplirecole 2: %s\n",ecl->Classe[1].num);
    strcpy(ecl->Classe[1].nom,"1TL2");
    printf("dans remplirecole 3: %s\n",ecl->Classe[1].num);


Affichement 1 => vide (normal, c'est avant l'initialisation);
Affichement 2 => 1 (Juste après l'initialisation;
Affichemement 3 => vide ... POURQUOI ?

Entre le 2 et le 3, j'ai juste fait une nouvelle affectation ... si vous voyez une idée, merci d'avance ;)
0
Arcord Messages postés 24 Date d'inscription jeudi 25 février 2010 Statut Membre Dernière intervention 13 février 2012 1
13 févr. 2012 à 14:54
Encore moi :D

J'ai trouvé, la variable "nom" pour TClasse est déclarée avec 4 caractères, alors qu'elle doit toujours avoir un caractère en plus de ceux prévu. Du coup la variable nom écrasait l'espace de la variable "num".

Voila, vous n'avez pas aidé, je ne vous en ai pas laissé le temps, mais poster ici m'a aidé à comprendre ma faute :-)

Bonne journée
0