lecture tableau texte 2D erreur de segmentation

Voir le sujet précédent Voir le sujet suivant Aller en bas

lecture tableau texte 2D erreur de segmentation

Message  Aurel le Sam 15 Oct 2011 - 21:02

Bonjour,

Je n'arrive pas à faire tourner ce code.

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
main()
{
int i=1;
int j=1;
int k=0;

int ligne=0;
int colonne=0;
char *c=0;
char***mots;
char***motstmp;
int index=0;


i=(int)malloc(sizeof(int));
j=(int)malloc(sizeof(int));
k=(int)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
ligne=(int)malloc(sizeof(int));
colonne=(int)malloc(sizeof(int));
index=(int)malloc(sizeof(int));
mots=(char***)malloc(2*sizeof(char**));

FILE *fp=fopen("C:/Users/Invité/Desktop/tt.txt","r");


for(i=1;i<=1625;i++){
if(feof(fp)!=0)break;

*c=fgetc(fp);
printf("%c",c);

    if (*c == '\n') {
        // On est à la fin d'une ligne
        ++ligne;
        colonne = 0;
    }
 
    else if (isspace(*c)) {
        // On a lu un caractère d'espacement, donc on est à la fin d'un mot
       
        ++colonne;
        index = 0;
    }
 
    else {
        // On a lu un caractère normal, on le place à la fin de la chaîne temporaire
        motstmp[ligne][colonne]=(char *) realloc(mots[ligne][colonne],(index + 2) * sizeof(char));
        mots[ligne][colonne] =  motstmp[ligne][colonne]; // Allocation de la mémoire nécessaire dans le tableau => ne pas oublier de désallouer en fin de programme !
        sprintf(mots[ligne][colonne], "%s%c",mots[ligne][colonne],c);
        strcat(
        ++index;
    }
 
   
}
fclose(fp);

printf("%s",mots[5][2]);
printf("(%d",j);
printf("/%d)",k);



return 0;
}

Les données on la forme
fhkgg fhjjkkk hjjkkll
ghhj jjkk illll
jh ddddd fjkkll

colonnes séparées par un espace.

Merci d'avance pour votre aide.


Aurel

Messages : 1
Date d'inscription : 15/10/2011

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: lecture tableau texte 2D erreur de segmentation

Message  watchinofoye le Mar 28 Mai 2013 - 12:07

Bonjour.

Tout d'abord, les malloc que vous faites sur vos variables int ne servent pour ainsi dire à rien puisque un int à sa déclaration a déjà la taille d'un int.

Ensuite, dans printf("%c",c);, le c ayant été déclaré comme une chaîne de caractères, il faut soit changer %c par %s soit indiquer un caractère au lieu d'une chaîne (soit en faisant c[indice], soit en changeant le type de c (char au lieu de char*).

Plus tard dans le code, il y a un strcat ouvert, vide et qui n'est jamais fermé. Ce qui perturbe grandement la compilation du programme.

Cordialement,

Watchi~

watchinofoye

Messages : 6
Date d'inscription : 27/03/2013

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: lecture tableau texte 2D erreur de segmentation

Message  Matt... le Mar 28 Mai 2013 - 23:05

Bonsoir,

I) la fonction malloc sert à allouer de la mémoire et retourne un pointeur sur cet espace si la fonction à réussi.

soit tu fais :
Code:
int i = 0;
Avec ceci, tu réserves l'espace nécessaire pour stocker un int, pas besoin de malloc

soit tu fais :
Code:
int *i = NULL;
i = (int*)malloc(sizeof(int));

// Ton code

free(i);
i = NULL.
et ici, tu alloues un espace mémoire pour stocker un int et tu récupères le pointeur sur cet espace. Bien vérifier le retour de la fonction et aussi libérer la mémoire allouée avec free.

II) Vérifies aussi le retour des fonctions que tu utilises afin d'éviter des soucis. (malloc, fopen, ...)

Repostes ton code avec les modifications et on verra pour la suite.

Matt...

Matt...

Messages : 6
Date d'inscription : 16/03/2009

Voir le profil de l'utilisateur http://mirabon.free.fr

Revenir en haut Aller en bas

Re: lecture tableau texte 2D erreur de segmentation

Message  -ed- le Lun 1 Sep 2014 - 2:02

Aurel a écrit:

Je n'arrive pas à faire tourner ce code. (-ed-)


Normal, il comporte de nombreuses erreurs ...

Je conseille de bien lire mes commentaires ...

Code:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
/* -ed- ajoute' type retourne' ... */
{
int i=1;
int j=1;
int k=0;

int ligne=0;
int colonne=0;
char *c=0;
char***mots;
char***motstmp;
int index=0;

#if 0
i=(int)malloc(sizeof(int));
j=(int)malloc(sizeof(int));
k=(int)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
ligne=(int)malloc(sizeof(int));
colonne=(int)malloc(sizeof(int));
index=(int)malloc(sizeof(int));
mots=(char***)malloc(2*sizeof(char**));

/* -ed- tous ces casts sont inutiles malloc() retourne un void * compatible avec tous les types pointeur connus. */
#else
// correction :
i=malloc(sizeof(int));
j=malloc(sizeof(int));
k=malloc(sizeof(int));
c=malloc(sizeof(char));
ligne=malloc(sizeof(int));
colonne=malloc(sizeof(int));
index=malloc(sizeof(int));
mots=malloc(2*sizeof(char**));
/* -ed- qui fait apparaire de nombreuses erreurs ! Attention, un cast n'est pas un cache misere destine'
a faire taire les erreurs detectees par le compilateur ...

Il convient dans un premier temps de corriger ses erreurs, ce qui signifie les analyser et les comprendre.

Ici, il est clair que de vouloir mettre une reference (valeur retournee par malloc()) dans un entier

int i=1;
int j=1;
int k=0;

int ligne=0;
int colonne=0;

...

i=malloc(sizeof(int));
j=malloc(sizeof(int));
k=malloc(sizeof(int));

ligne=malloc(sizeof(int));
colonne=malloc(sizeof(int));

est une erreur de conception grave. Bien relire son cours sur l'allocation dynamique avant d'aborder la suite ...

*/
#endif

FILE *fp=fopen("C:/Users/Invité/Desktop/tt.txt","r");


for(i=1;i<=1625;i++){
if(feof(fp)!=0)break;

*c=fgetc(fp);
printf("%c",c);

    if (*c == '\n') {
        // On est à la fin d'une ligne
        ++ligne;
        colonne = 0;
    }

    else if (isspace(*c)) {
        // On a lu un caractère d'espacement, donc on est à la fin d'un mot

        ++colonne;
        index = 0;
    }

    else {
        // On a lu un caractère normal, on le place à la fin de la chaîne temporaire
        motstmp[ligne][colonne]=(char *) realloc(mots[ligne][colonne],(index + 2) * sizeof(char));
        /* -ed- le compilateur signale que 'motstmp' est utilise' alors qu'il n'a pas ete' initialise'. Gros bug ! */

        mots[ligne][colonne] =  motstmp[ligne][colonne]; // Allocation de la mémoire nécessaire dans le tableau => ne pas oublier de désallouer en fin de programme !
        sprintf(mots[ligne][colonne], "%s%c",mots[ligne][colonne],c);
        // strcat(
        /* -ed- code incomplet */
        ++index;
    }


}
fclose(fp);

printf("%s",mots[5][2]);
printf("(%d",j);
printf("/%d)",k);



return 0;
}

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: lecture tableau texte 2D erreur de segmentation

Message  Matt... le Lun 1 Sep 2014 - 22:00

:) mieux vaut tard que jamais...

Matt...

Messages : 6
Date d'inscription : 16/03/2009

Voir le profil de l'utilisateur http://mirabon.free.fr

Revenir en haut Aller en bas

Re: lecture tableau texte 2D erreur de segmentation

Message  Contenu sponsorisé Aujourd'hui à 21:21


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum