Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon programme crash/plante...

23 mai 2017 à 19:26:01

Mon programme crash :

int main()
{
printf("Test1");
Tab(); // pour generer les lignes du tableau
printf("Test2");
}
   


Il va afficher Test1 puis cracher, il bug donc dans mon module Tab()! Voici ma fonction Tab() :

void Tab()
{
int i;
memset(ligneTab[i].nom, 0, 50); // créé une ligne du tableau pour les noms ( membre ) -- memset(*str, int c, size_t n) *str = ou ca va l'écrire, c = la valeur écrite, taille de ce qu'on écrit
memset(ligneTab[i].prenom, 0, 50); // créé une ligne du tableau pour les prénoms ( membre )
memset(ligneTab[i].CP_ville, 0, 50); // créé une ligne du tableau pour les villes ( membre )
memset(ligneTab[i].titre_livre, 0, 50); // créé une ligne du tableau pour les livres ( livres )
// création du tableau
strcpy(ligneTab[0].ID, "1. ");
strcpy(ligneTab[1].ID, "2. ");
strcpy(ligneTab[2].ID, "3. ");
strcpy(ligneTab[3].ID, "4. ");
strcpy(ligneTab[4].ID, "5. ");
strcpy(ligneTab[5].ID, "6. ");
strcpy(ligneTab[6].ID, "7. ");
strcpy(ligneTab[7].ID, "8. ");
strcpy(ligneTab[8].ID, "9. ");
strcpy(ligneTab[9].ID, "10. ");
strcpy(ligneTab[10].ID,"11. ");
strcpy(ligneTab[11].ID,"12. ");
strcpy(ligneTab[12].ID,"13. ");
strcpy(ligneTab[13].ID,"14. ");
strcpy(ligneTab[14].ID,"15. ");
}
   

-
Edité par williamvh7 23 mai 2017 à 19:27:46

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 19:38:41

Bonjour,

oui ça plante, car la variable i n'est pas initialisée. i vaut une valeur aléatoire qui n'est problablement pas compris entre 0 et 14, car tu as un tableau de 15 éléments(de mémoire). Et donc ligneTab[i].nom plante.

Quelle est le but de cette fonction Tab ??

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 19:45:50

Merci de ton aide!

Hein je me disais aussi!

j'ai donc fais ceci :

int i;
    for(i=1;1<=1;i++) // va tourner 1 seule fois
    {
        printf("1\n");
        memset(ligneTab[i].nom, 0, 50); // créé une ligne du tableau pour les noms ( membre ) -- memset(*str, int c, size_t n) *str = ou ca va l'écrire, c = la valeur écrite, taille de ce qu'on écrit
        printf("2\n");
        memset(ligneTab[i].prenom, 0, 50); // créé une ligne du tableau pour les prénoms ( membre )
        printf("3\n"); // la ligne en dessous
        memset(ligneTab[i].CP_ville, 0, sizeof(ligneTab[i].CP_ville)); // créé une ligne du tableau pour les villes ( membre )
        printf("4\n");
        memset(ligneTab[i].titre_livre, 0, 50); // créé une ligne du tableau pour les livres ( livres )
        printf("5\n");
        memset(ligneTab[i].resultat, 0, 100);
        system("pause");
    }

Les printf sont des test mais maintenant c'est la ligne indiquée ( en dessous de printf("3\n"); ) qui fait tout planter et je suppose que c'est parce que CP_ville est initialisé en int dans ma structure mais comment faire dès lors ? En sachant que si je met un "&" devant le ligneTab, la boucle tourne à l'infini.

Le but de ma fonction Tab est d'initialiser un tableau dans lequel je rentrerai des valeurs ( char[] ou int ).

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:00:27

La boucle tourne forcément à l'infini puisque la condition d'arrêt est 1<=1, qui est toujours vrai. Remplace-la par i<=1 (et sois moins distrait ! :p).

-
Edité par robun 23 mai 2017 à 20:00:50

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:00:41

exact, comme ID et CP_ville sont de type int inutile d'utiliser memset.

Un coup de pouce

ligneTab[i].ID = i + 1;
ligneTab[i].CP_ville = 0;
memset(ligneTab[i].nom, 0, 50);
pareil pour les autres tableaux de la structure




ensuite indice i, car il faut mettre le tout dans une boucle, préférence pour une boucle for

int i;

for(i = 0; i < 15; i++)
{
    .......
}



pour info un tableau de N éléments en C, le premier élément est l'indice 0, le dernier élément est l'indice N - 1

Si ta fonction Tab initialise ton tableau, change de nom en quelque chose de plus explicite, par exemple initTab.

-
Edité par cauld 23 mai 2017 à 20:02:24

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:05:44

D'accord merci beaucoup!

Mais à quoi servent ces deux lignes :

ligneTab[i].ID = i + 1;
ligneTab[i].CP_ville = 0;
Et est-ce que je dois laisser mes lignes strcpy ?

-
Edité par williamvh7 23 mai 2017 à 20:07:17

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:10:28

la première ligne lorsque i = 0, la variable i de la boucle

ligneTab[0].ID = 1

ligneTab[1].ID = 2

etc

c'est que tu veux, il me semble.

Ensuite l'autre ligne initialise ligneTab[i].CP_ville à 0, pour i = 0 à 14.

Ah oui, et je suppose que ta structure est la suivante (en espérant que tu ne l'as pas changé entre temps):

struct
{
    int ID;
    char nom[50];
    char prenom[50];
    char titre_livre[50];
    char resultat[100];
    int CP_ville;
 
} ligneTab;



  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:33:38

Oui c'est exactement ce que je veux!

Tu entends quoi par " pour i=0 à 14 " ?

Exactement ça sauf que j'ai mit " ligneTab[15]; "

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:39:16

comme dit avant ton tableau de structure à 15 éléments. Donc de indice 0 à 14.

Ce qui signifie que le code suivant, initialise tous les CP_ville à 0

int i;

for(i = 0; i < 15; i++) // i de 0 à 14
{
    ligneTab[i].CP_ville=0;
}



-
Edité par cauld 23 mai 2017 à 20:48:47

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2017 à 20:44:21

Ah bah oui c'est logique en fait... Un grand merci!
  • Partager sur Facebook
  • Partager sur Twitter