[C] Problème d'erreur de segmentation

o00gourou00o Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   -
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:

#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!

3 réponses

mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
vous arrivez 1 an et demi trop tard...
1
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
Humph, m'a suis encore fait eu !

:-(

Merci !
M.
0
zizou741
 
fai voir a ton close(file);
0
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
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.
0