Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -20%
-20% Récupérateur à eau mural 300 ...
Voir le deal
79 €

lecture tableau texte 2D erreur de segmentation

4 participants

Aller en bas

lecture tableau texte 2D erreur de segmentation Empty lecture tableau texte 2D erreur de segmentation

Message  Aurel 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

Revenir en haut Aller en bas

lecture tableau texte 2D erreur de segmentation Empty Re: lecture tableau texte 2D erreur de segmentation

Message  watchinofoye 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

Revenir en haut Aller en bas

lecture tableau texte 2D erreur de segmentation Empty Re: lecture tableau texte 2D erreur de segmentation

Message  Matt... 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

http://mirabon.free.fr

Revenir en haut Aller en bas

lecture tableau texte 2D erreur de segmentation Empty Re: lecture tableau texte 2D erreur de segmentation

Message  -ed- 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;
}
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

lecture tableau texte 2D erreur de segmentation Empty Re: lecture tableau texte 2D erreur de segmentation

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

:) mieux vaut tard que jamais...

Matt...

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

http://mirabon.free.fr

Revenir en haut Aller en bas

lecture tableau texte 2D erreur de segmentation Empty Re: lecture tableau texte 2D erreur de segmentation

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser