Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 = 11

remplissageDutableau :
0 0 0 0 0 1 1 1 1
2 2 2 2 2 3 3 3 3

segmentation 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 hmm

Voilà le makefile que j'ai fait si jamais ça t'intéresse wink

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 wink

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 tongue )


Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles

Hors ligne