#1 Le 18/05/2007, à 17:45
- Sysko le prospecteur
[c] transfet des caractere d'un fichier dans tableau variable[resolu]
re bonjour ( vous commencez à être habitué à me voir )
donc alors je suis toujours avec le même programme ( pour ceux qui ont vu les épisodes précédent, aux autres je dit bienvenu et asseyez vous car c'est pas triste )
donc j'ai un fichier texte qui se présente comme ce-ci
0000011111
2222233333
( pour le moment je test juste ne me demandez pas l'interet de ces 0 ces 1 ces 2 et ces 3 , il n'y en pas , c'est juste pour voir d'ou viennent les problèmes
donc je veux mettre tout ces chiffres un par un dans un tableau ainsi que les saut de lignes
je fait donc un
for ( i = 0 ; i < nombreDeLigne ; i++) // on remplit le tableau en relisant le fichier
{
// depuis le debut en mettant dans chaque case un chiffre
for ( j = 0 ; j < tailleLigne ; j++ )
{ (*quadrillageNiveau)[i][j] = fgetc( fichierNiveau ) ;
printf ( " %c " ,(*quadrillageNiveau)[i][j] ) ;
}
}
ou quadrillage niveau est un pointeur sur un tableau à deux dimensions ( vu qu'on est dans une focntion et que je me sert dans ce tableau autre part , mais la n'est pas le problème )
ici tailleLigne vaut 11 ( on compte le saut de ligne qui vaut \n et
nombre de ligne vaut 2
le printf ici me redonne correctement le contenu du fichier avec les saut de ligne et tout
jusqu'ici pas de problème
le problème est quand j'affiche le tableau ensuite ( que ce soit dans la fonction ou en dehors )
ainsi si je fait un
for ( i = 0 ; i < nombreDeLigne ; i++)
{
for ( j = 0 ; j < tailleLigne ; j++ )
{
printf ( " %c " ,(*quadrillageNiveau)[i][j] ) ;
}
}
j'obtient ceci
2222233333
2222233333
ce qui indique clairement qu'il m'affiche deux fois le contenu de la seconde ligne
si quelqu'un à une explication ou un piste je suis preneur car la je comprend rien
merci d'avance
Sysko
Dernière modification par Sysko le prospecteur (Le 19/05/2007, à 21:37)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#2 Le 18/05/2007, à 19:22
- abetsic
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
Bonjour,
Tu utilises un tableau d'int alors que tu ne stockes que des char, pourquoi ne pas utiliser un tableau de char ? quitte à transtyper plus tard si tu as besoin de tes données en tant que int.
J'ai jeté un oeil à ton code, je n'ai pas vu d'erreur évidentes. Dans tes printf, n'hésites pas à mettre les index i et j de ton tableau pour être sûr de la case de ton tableau qui est affichée.
Bon courage.
Hors ligne
#3 Le 19/05/2007, à 19:34
- Sysko le prospecteur
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
le problème viendrait du bout de code d'allocation de la memoire du tableau qui est erroné
car si j'augmente le nombre de ligne par exemple
:
0000011111
2222233333
4444455555
6666677777
8888899999
et bien il m'affiche
nombreDeLigne = 5
longueur = 55
tailleLigne = 11remplissageDutableau :
0 0 0 0 0 1 1 1 1
2 2 2 2 2 3 3 3 3segmentation fault ( core dumped )
press enter to continue
en rapellant que les chiffres issus du fichier sont afficher via
for ( i = 0 ; i < nombreDeLigne ; i++)
{
for ( j = 0 ; j < tailleLigne ; j++ )
{
printf ( " %c " ,(*quadrillageNiveau)[i][j] ) ;
}
}
( d'ailleurs le seul truc logique c'est que si dans le remplissage dutableau je me limite à aux deux premières lignes ( en remplaçant dans le bout de code ci dessus nombreDeLigne par deux ) et que j'affiche ensuite les deux lignes il me refait le coup du " je t'affiche deux fois la deuxième ligne "
dernière question : pourquoi sa m'arrive des truc foireux comme sa ? lol
au moins on se fait avoir une fois, puis dès que c'est résolu on se fait plus avoir
sauf que la c'est mal barré pour que je resolve le problème lol
ps : je rapelle que j'alloue le tableau comme suit :
char*** quadrillageNiveau ( qui est transmis comme argument )
*quadrillageNiveau = malloc( nombreDeLigne*sizeof(char*) );
for (i=0; i<nombreDeLigne; i++)
quadrillageNiveau[i] = malloc( tailleLigne * sizeof(char));
Dernière modification par Sysko le prospecteur (Le 19/05/2007, à 19:49)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#4 Le 19/05/2007, à 19:57
- abetsic
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
Tu peux mettre le code complet de ton programme avec le makefile si t'en as un pour que je puisse tester ça chez moi.
A priori l'erreur vient des malloc qui sont mal fait...
Normalement tu dois avoir quelque chose du genre :
tableau = malloc(nombre_de_ligne*sizeof(int*));
for (i=0; i<nombre_de_ligne; i++)
tableau[i] = malloc(taille_ligne*sizeof(int));
Vérifies que les malloc renvoient bien un pointeur (différent de NULL)
Hors ligne
#5 Le 19/05/2007, à 20:08
- Sysko le prospecteur
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
ouaip pas de pbr je te file le code ( par contre compilant via un IDE je ne pourrait pas te filer le makefile )
le main :
#include <stdio.h>
#include <stdlib.h>
#include "fonctionJeu.h"
int main ()
{
int i = 0 ;
int valeurHauteur = 0 , valeurLargeur = 0;
char** tableauNiveau = NULL ;
chargementNiveau( &tableauNiveau , &valeurHauteur , &valeurLargeur ) ;
printf ( " youpi tralala lonlère itou \n " ) ;
for ( i = 0 ; i < valeurHauteur ; i++)
{
free ( tableauNiveau[i]);
}
free ( tableauNiveau ) ;
return EXIT_SUCCESS ;
}
le fonctionjeu.h
#ifndef FONCTIONJEU_H
#define FONCTIONJEU_H
int chargementNiveau ( char*** quadrillageNiveau , int* hauteur, int* largeur );
#endif // FONCTIONJEU_H_INCLUDED
le fonctionjeu.c
#include <stdio.h>
#include <stdlib.h>
#include "fonctionJeu.h"
int chargementNiveau ( char*** quadrillageNiveau , int* hauteur, int* largeur )
{
FILE* fichierNiveau = NULL;
int i = 0, j = 0 ;
int finComptage = 0 ;
int longueur = 0 , nombreDeLigne =0 , tailleLigne =0 ;
fichierNiveau = fopen ( "niveau.txt" , "r" ); // on l'ouvre ne lecture seul
if ( fichierNiveau == NULL ) // revnoi une erreur si le fichier ne s'ouvre pas et quitte la fonction
{
printf ( " erreur sur niveau.txt ");
return 1;
}
while (finComptage == 0 )
{
switch ( fgetc ( fichierNiveau )) // on lit fichier caractère par caracère
{
default :
// on ne compte que la taille de la première ligne
longueur++; // les autres lignes étant censé être de même taille)
break;
case '\n' : // on compte le nombre de ligne
longueur++;
nombreDeLigne ++ ;
break;
case EOF : // à EOF on a atteint la fin du fichier donc on peut quitter
finComptage = 1;
break;
}
}
tailleLigne= longueur / nombreDeLigne;
*quadrillageNiveau = malloc( nombreDeLigne*sizeof(char*) );
for (i=0; i<nombreDeLigne; i++)
{
quadrillageNiveau[i] = malloc( tailleLigne * sizeof(char));
if ( quadrillageNiveau[i] == NULL )
printf ( " problème à la ligne %d " , i );
}
printf ( "%d " , nombreDeLigne ); // simple test
printf ("%d " , tailleLigne ) ;
rewind ( fichierNiveau);
for ( i = 0 ; i < nombreDeLigne ; i++) // on remplit le tableau en relisant le fichier
{ // depuis le debut en mettant dans chaque case un caractère
for ( j = 0 ; j < tailleLigne ; j++ )
{ (*quadrillageNiveau)[i][j] = fgetc( fichierNiveau ) ;
printf ( " %c " ,(*quadrillageNiveau)[i][j] ) ;
}
}
*hauteur = nombreDeLigne ; // pour récupérer les dimensions du tableau
*largeur = tailleLigne;
return 0;
}
pour ce qui est du fichier texte je ne te fait l'affront de le mettre ;-)
ce n'est bien sur que le code problèmatique , mais vu que d'autr partie du projet utilise des images et de la sdl ce serait plus embêtant à tout te filer
Dernière modification par Sysko le prospecteur (Le 19/05/2007, à 20:31)
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#6 Le 19/05/2007, à 21:14
- abetsic
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
Effectivement, le problème venait bien des malloc (en tout cas c'est ce que j'ai changé pour que ça marche), c'est probablement ma faute, j'avais du donné un bout de code erroné dans le précédent thread.
voilà l'allocation correcte :
*quadrillageNiveau = malloc( nombreDeLigne*sizeof(char*) );
for (i=0; i<nombreDeLigne; i++)
{
(*quadrillageNiveau)[i] = malloc( tailleLigne * sizeof(char));
}
quadrillageNiveau étant un pointeur vers le pointeur de tableau il faut utiliser *quadrillageNiveau et non pas quadrillageNiveau.
Tu peux utiliser un alias pour *quadrillageNiveau :
char **pointeur_vers_tableau = *quadrillageNiveau
après tu pourras utiliser pointeur_vers_tableau[i][j] comme bon te semble (si je ne fais pas d'erreur
Voilà le makefile que j'ai fait si jamais ça t'intéresse
sysko : fonctionjeu.o main.o
gcc $^ -o sysko
%.o : %.c
gcc -c -o $@ $<
clean :
rm -f *.o
.PHONY : clean
Bonne chance pour la suite de ton programme
ps : chez moi, le code ne passait pas la première affectation dans le tableau suite à la lecture d'un caractère dans le fichier. Mais c'est normal puisque l'erreur venait d'un malloc... donc écriture n'importe où en mémoire !
Hors ligne
#7 Le 19/05/2007, à 21:53
- Sysko le prospecteur
Re : [c] transfet des caractere d'un fichier dans tableau variable[resolu]
une seul chose à dire
MERCI !
et à la prochaine lol
maintenant y a plus qu'à finir , c'était sa le plus dur ( normalement )
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne