[Langage C] td5, exercice 14

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

resolu [Langage C] td5, exercice 14

Message  jabberwok le Sam 12 Nov 2011, 19:10

Bonjour/Bonsoir,

J'ai un problème d'accès aux InfoMorceau du tableau renvoyé par la méthode getTexte03, je ne m'occupe pas encore de la résolution du problème, dans mon code ci-dessous je tente d'afficher toutes les chaines ainsi que leur emplacement.
Voilà mon code :

Spoiler:
Code:
InfoMorceau * * tabMorceau = (InfoMorceau **) malloc( sizeof(InfoMorceau*) );
   int i = 0, j;
   unsigned char numberChaine;
   char * recuChaine;
   unsigned int nbElement = getTexte03(tabMorceau);

   for(i = 0; i < nbElement; i++){
      recu = (*(tabMorceau+i))->morceau;
      number = (*(tabMorceau+i))->posMorceau;
      printf("\n\n chaine : ");
      for(j = (strlen(recu) - 1) ; j > 0; j--){
         printf("%c", *(recu + j));
      }
      printf("\n");
      printf("-> morceau : %d \n-> taille morceau : %d\n\n", number, strlen(recu));
   }
   free(tabMorceau);

En "débugant" j'arrive à afficher le premier, mais quand "i" est incrémenté il me met une "segmentation fault" (si j'ai bien compris j'essaye d'accéder à une zone mémoire protégée), j'ai essayé d'incrémenter "i" de manière différente : ex : i = i + sizeof(InfoMorceau *); => Ce qui ne donne rien non plus =x
Quelqu'un pourrait me dire où se trouve mon erreur ^^'

Merci d'avance !


Dernière édition par jabberwok le Dim 13 Nov 2011, 11:19, édité 1 fois

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  karemkadidola le Sam 12 Nov 2011, 21:19

jabberwok a écrit:Bonjour/Bonsoir,


Spoiler:
Code:
InfoMorceau * * tabMorceau = (InfoMorceau **) malloc( sizeof(InfoMorceau*) );
   
   for(i = 0; i < nbElement; i++){
      recu = (*(tabMorceau+i))->morceau;
      
      for(j = (strlen(recu) - 1) ; j > 0; j--){
         printf("%c", *(recu + j));
      }
      
   free(tabMorceau);

j'ai selectionné dans ton code juste les parties qui posent problèmes dans ton code
primo c le problème de pointeur de pointeur et c ça fait tout planter n'oublie pas que tabMorceau n'est qu'une adresse où tu stocke un pointeur vers une zone des infoMorceau. toi au lieu de bouger avec le contenu tu bouges avec le contenant (*(tabMorceau+i)) c'est normal qu'à partir de i vaut (plus que Zéro) tu te rétouves dans une zone où on ne sait ce qu'il y a . en plus tu as fait une allocation dynamique pour ton tabMorceau ce qui n'est absolument pas nécessaire n'oublie pas on a besoin juste pour stocker un pointeur c tout. à ta place je ferais une simple déclaration d'un pointeur vers infomorceau et je donnerai sont adresse à getTexte(3) et tu peux te ballader avec ce pointeur vers infomorceau et pas de risque de se ballader avec "son adresse" comme tu le fais

deuxio dans ton for j= .... essaye d'aller jusque "j>=0" sinon tu n'afficheras jamais le premier char au pire si "recu" a une taille de 1 tu n'affichera rien.

Finalement ton Free n'est pas bien fait car tu "free" un pointeur de pointeurs ...la logique veux que tu free d'abord les pointeurs contenus dans ce pointeur par une boucle "for" par exemple et seulement tu peux liberer ce dernier
bon en espérant avoir aidé bon TD

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  jabberwok le Sam 12 Nov 2011, 22:33

Déjà merci d'avoir répondu,

J'ai effectué quelques changements, je pense ne pas m'être trompé dans les corrections que tu m'as suggéré, pourtant j'ai toujours ce problème de segmentation fault Mad (je n'ai pas encore mis de free).

Code:
InfoMorceau * * tabMorceau;
   int i = 0, j = 0;
   unsigned char numberChaine;
   char * recuChaine;
   unsigned int nbElement = getTexte03(tabMorceau);

    while( j < nbElement ){
      recuChaine = (*tabMorceau)->morceau;
      numberChaine = (*tabMorceau)->posMorceau;
      printf("Numero de la chaine : %d\n", numberChaine);
      printf("Chaine : ");
      for(i = (strlen(recuChaine) - 1); i >=0; i--){
         printf("%c", *(recuChaine+i));
      }
      printf("\n\n");
      tabMorceau++;
      j++;
   }

edit :
Problem solved !!!
J'incrémentais mal mon pointeur, si j'ai bien compris, j'essayais d'accéder à une donnée suivant le premier pointeur InfoMorceau pointé par le pointeur général, alors que ces pointeurs d'InfoMorceau sont dispatché dans la mémoire. Par contre les InfoMorceau sur lesquels ils pointent sont contigus.
Solution => *tabMorceau = *tabMorceau + 1;

Me reste encore la libération de la mémoire à comprendre.


Dernière édition par jabberwok le Dim 13 Nov 2011, 00:01, édité 1 fois

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  karemkadidola le Sam 12 Nov 2011, 23:48

Non ali tu n'as pas changé l'essentiel car tu continue à faire "tabMorceau++" alors que tu l'as déclaré comme ceci "InfoMorceau * * tabMorceau;"

moi c que je t'ai proposé c ça "déclaration:" " infoMorceau * tabMorceau; (une étoile et pas deux) ensuite "unsigned int nbElement = getTexte03(&tabMorceau);" et là seulement tu peux bouger "tabMorceau" avec "tabMorceau++" ou encore tu gardes ce que tu as fait mais au lieu de faire "tabMorceau++" (tu vois avant la fin de chaque itération) fais plutot (*tabMorceau)++ bon entre nous je prefère la première alternative..question de clarté..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  karemkadidola le Dim 13 Nov 2011, 00:23

jabberwok a écrit:
Me reste encore la libération de la mémoire à comprendre.

Bon pour faire très simple: chaque infoMorceau possède un pointeur vers UNE AUTRE zone de mémoire où est stocké le texte. tout à l'heure tu pourcourais chaque infoMorceau et grace à ce pointeur tu accedais à cette zone mémoire pour aller lire ce qu'il y avait
je colle ici une partie de ton code "
while( j < nbElement ){
recuChaine = (*tabMorceau)->morceau; et avant de finir cette boucle tu fais (après correction) (*tabMorceau)++)
} ben de cette manière tu vas réparcourir ta zone de infoMoceau non pas pour lire cette fois-ci mais pour "libérer" la mémoire pointée cela va se traduire par
while( j < nbElement ){
free (*tabMorceau)->morceau; et avant de finir cette boucle tu fais (*tabMorceau)++)
} après ça tu peux maintenant faire un "free (tabMorceau); si tu lui as fais un malloc comme avant sinon pas nécessaire
en espèrant avoir été clair...

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  karemkadidola le Dim 13 Nov 2011, 00:44

jabberwok a écrit:si j'ai bien compris, j'essayais d'accéder à une donnée suivant le premier pointeur InfoMorceau pointé par le pointeur général, alors que ces pointeurs d'InfoMorceau sont dispatché dans la mémoire. Par contre les InfoMorceau sur lesquels ils pointent sont contigus.
euhh ce n'est pas exactement ça..tu essayais tout simplement d'acceder à une donnée suivant le pointeur général comme tu l'appelles car " la donnée suivant le premier pointeur InfoMorceau pointé par le pointeur général comme tu le dis " c juste ((*tabMorceau)->posMorceau)+1 ...bref..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  smb le Dim 13 Nov 2011, 07:30

jabberwok, je t'invite à suivre les conseils de karemkadidola. La simplicité est préférable à la complication !

Code:
InfoMorceau * tabMorceau = NULL ;
unsigned int nbElement = 0 ;
...
nbElement = getTexte03 ( & tabMorceau ) ;
...
Par la suite tu peux choisir entre trois écritures pour accéder à l'élément i du tableau tabMorceau :
Code:
( *(tabMorceau+i) ) /*1*/
ou
Code:
(tabMorceau+i) /*2*/
ou
Code:
tabMorceau[i] /*3*/
... et pour accéder à un champ de la structure InfoMorceau, par exemple morceau, respectivement :
Code:
(*(tabMorceau+i)).morceau /*pour l'écriture 1*/
ou
Code:
(tabMorceau+i)->morceau /*pour l'écriture 2*/
ou
Code:
tabMorceau[i].morceau /*pour l'écriture 3*/

La dernière écriture n'est-elle pas la plus simple ? N'oublions pas qu'un pointeur non void accepte toujours l'écriture indexée (comme pour les tableaux).

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  jabberwok le Dim 13 Nov 2011, 11:19

Merci à vous 2 pour vos explications détaillés Smile
Mon programme fonctionne maintenant.

Bonne journée/soirée !

jabberwok

Nombre de messages : 90
Prénom : ali
Statut : Gediplomeerd =)
Date d'inscription : 27/09/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  Florent le Mer 23 Nov 2011, 13:49

Bonjour,

Je viens de terminer cette exercice mais il me reste le problème de la libération mémoire et du stockage dans le char,

si je fais un simple free (tabMorceau); a la fin de la boucle pour récupérer les morceaux est-ce suffisant? Ou il faut le faire à chaque adresse (tabMorceau++)


Pour le stockage dans un char si je déclare un simple char et que l'initialise en lui donnant la taille de tous les morceaux est-ce suffisant ou existe t il une manière plus propre?

Code:

   while (j <= nbElement){
      recuChaine = tabMorceau[l].morceau;
      tailleChar = tailleChar + (strlen(recuChaine));
      l++;
      j++;
   }

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  smb le Mer 23 Nov 2011, 14:47

Florent a écrit:Bonjour,
Je viens de terminer cette exercice mais il me reste le problème de la libération mémoire (...)
Il faut libérer

- le tableau et son contenu (toutes les zones "morceau" dans une boucle et ensuite la tableau lui-même);
- la chaîne que tu as dû construire pour y concaténer les morceaux.

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 14

Message  Contenu sponsorisé Aujourd'hui à 10:55


Contenu sponsorisé


Revenir en haut Aller en bas

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


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