[C] Problème d'erreur de segmentation
o00gourou00o
Messages postés
7
Statut
Membre
-
Mahmah Messages postés 497 Statut Membre -
Mahmah Messages postés 497 Statut Membre -
B'jour les gens!
Voilà voilà, je programme un p'tit peu en C et je suis face à une erreur de segmentation qui refuse de se casser... J'ai jeté un oeil aux autres messages sur le sujet mais j'ai pas trouvé mon bonheur et ça marche toujours pas!
Le but est de lire un fichier dans lequel se trouve sous forme de texte un niveau pour un labyrinthe et de le mettre dans un tableau pour pouvoir l'utiliser...
Voici mon code:
Si vous pouviez me filer un petit coup de main ce serait sympa ^^ (y'a rien à faire les mallocs ont toujours été une source d'embrouilles pour moi)
Merci d'avance pour vos réponses!
Voilà voilà, je programme un p'tit peu en C et je suis face à une erreur de segmentation qui refuse de se casser... J'ai jeté un oeil aux autres messages sur le sujet mais j'ai pas trouvé mon bonheur et ça marche toujours pas!
Le but est de lire un fichier dans lequel se trouve sous forme de texte un niveau pour un labyrinthe et de le mettre dans un tableau pour pouvoir l'utiliser...
Voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#define max 128
#define taille 128
//Voilà une fonction qui prend en paramètre un fichier et un tableau de chaînes de caractères et qui copie toutes les lignes du fichier dans le tableau.
char **FichierDansTableau (char *fichier, char *tableau[])
{
char buf[1], tmp[1024];
int a=0;
int b=0;
int i, j, file1;
//On alloue de la memoire pour le tableau, assez pour 128 lignes et 128 colonnes, pour l'instant.
tableau = (char **)malloc(sizeof(char)*taille);
for (i=0; i<taille; i++)
{
tableau[i]=(char *)malloc(sizeof(char)*max);
}
strcpy(tmp, "");
//On ouvre le fichier qui contient les informations
if ((file1=open(fichier, O_RDONLY))<0)
{
printf("Erreur lors de l'ouverture du fichier %s\n",fichier);
exit(0);
}
//Et voila la boucle qui sert a placer le texte dans le tableau: tant que le fichier n'a pas atteint sa fin (EOF), si le caractere lu n'est pas un saut de ligne, on le recopie a la suite de la ligne temporaire.
//Si le caractere est un saut de ligne, on verifie si on a pas atteint le maximum de lignes du tableau (a savoir 128). Si c'est le cas on realloue de la memoire pour 128 autres lignes de 128 caracteres.
//Une fois qu'on est assure d'avoir de la memoire, on recopie la ligne temporaire dans le tableau, on la vide et on retourne a la premiere colonne.
//Une fois sorti de la boucle, on met NULL a la fin du tableau.
while (read(file1, buf, 1)>0)
{
if (buf[0]!='\n')
{
tmp[b]=buf[0];
b++;
}
else
{
strncpy(tableau[a], tmp, b);
strcpy(tmp,"");
b=0;
a++;
}
}
tableau[a]=NULL;
close(file1);
return tableau;
}
int main(void)
{
char **tableau;
int i, j;
//On place le contenu de "lvl1.txt" dans un tableau de chaînes de caractères
tableau = FichierDansTableau ("lvl1.txt", tableau);
//Et on affiche le tableau histoire de tester...
for (i=0; i<128; i++)
{
for (j=0; j<128; j++)
{
printf("%c", tableau[i][j]);
}
}
return 0;
}
Si vous pouviez me filer un petit coup de main ce serait sympa ^^ (y'a rien à faire les mallocs ont toujours été une source d'embrouilles pour moi)
Merci d'avance pour vos réponses!
A voir également:
- [C] Problème d'erreur de segmentation
- Erreur 0x80070643 - Accueil - Windows
- Erreur de lecture reconnecté en 3s - Forum TV & Vidéo
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
3 réponses
Salutations,
Seg Fault c'est la délicate manière qu'a linux pour te prévenir que tu as déconné avec sa mémoire.
Je n'ai pas pu tester vraiment ton programme puisqu'il n'est pas en C standard et moi sous Windows. : /
Ceci dit, l'initialisation est boiteuse.
tableau = (char **) malloc( sizeof( char ) * taille );
Le cast semble vouloir dire que le malloc est une zone mémoire destinée à contenir des char *. Le sizeof n'a pas l'air du même avis.
Je dirais bien que les conditions sont ici réunies pour faire un bon seg fault.
M.
Hmmm ? Bizarre, je n'ai pas vu les frees correspondants aux mallocs.
Seg Fault c'est la délicate manière qu'a linux pour te prévenir que tu as déconné avec sa mémoire.
Je n'ai pas pu tester vraiment ton programme puisqu'il n'est pas en C standard et moi sous Windows. : /
Ceci dit, l'initialisation est boiteuse.
tableau = (char **) malloc( sizeof( char ) * taille );
Le cast semble vouloir dire que le malloc est une zone mémoire destinée à contenir des char *. Le sizeof n'a pas l'air du même avis.
Je dirais bien que les conditions sont ici réunies pour faire un bon seg fault.
M.
Hmmm ? Bizarre, je n'ai pas vu les frees correspondants aux mallocs.
:-(
Merci !
M.