[C] TD5 - EX15

Page 1 sur 2 1, 2  Suivant

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

[C] TD5 - EX15

Message  Aftab007 le Ven 12 Nov 2010, 12:51

Bonjour

Dans cette exercice j'essaye de creer un tableau que j'aloue de facon dynamique au fur et a mesure que je rajoute une Sequence.
Mais jai une segmenttion fault a la ligne ou j utilise realloc d'après le debuger.
Je ne vois pas ce que je fais de mal ou de facon mauvaise .
Si vous s'avez m aider merci Smile

Code:

typedef struct {
   unsigned short offset ;
   unsigned char posMorceau ;
   unsigned char longMorceau;
   char * chaine;
}
Sequence ;


Code:


   int i,nbElem;
   void * laZone;
   unsigned short offset;
   Sequence * lesSequences;
   Sequence uneSequence;

   unsigned short * ptrOffset = NULL;

   laZone = getTexte04();
   lesSequences = malloc(sizeof(Sequence));

   if (lesSequences != NULL ){

      ptrOffset = (unsigned short *)laZone;
      offset = *ptrOffset;
      nbElem = 1;

      while (offset != 0 && lesSequences != NULL ){
         uneSequence.offset  = offset; /* je recup un à un les info de La Sequnce */
         uneSequence.posMorceau =  ptrOffset[1];/* Pour les placer ensuite*/
         uneSequence.longMorceau =  ptrOffset[2];/*Dans le tableau*/
         uneSequence.chaine = (char *)ptrOffset[3];
         lesSequences[nbElem] = uneSequence;

         ptrOffset = (unsigned short *)laZone + offset; /* recup @ new offset*/
         offset = * ptrOffset;   /* recup valeur du new offset*/
         lesSequences = realloc(lesSequences, sizeof(Sequence));
         /*alloue de la mem supl pour mon tableau de Sequence*/
         nbElem++;
      }



Il me semble que je fais sa de façon correcte , vu que je demande de allouer de la memoire à partir de ' lesSequences' et je lui demande de m' allouer autant de mémoire via la taille de Sequence.



merciii bien Smile


Dernière édition par Aftab007 le Dim 14 Nov 2010, 17:00, édité 2 fois

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Terminatour le Ven 12 Nov 2010, 12:55

j'ai pas tout lut, mais à vue de nez je dirai, que déjà tu dois dupliquer dans ton réalloc:
lesSequences = realloc(lesSequences, (sizeof(Sequence) * nombre));
où nombre est le nombre d'éléments sinon tu alloue toujours la taille d'une séquence !

Terminatour

Nombre de messages : 344
Age : 25
Prénom : Louis-Julien
Statut : statutaire
Localisation : localisée
Date d'inscription : 04/10/2009

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Aftab007 le Ven 12 Nov 2010, 12:59

Hello ,

Justement je n' ai pa mis de multiplication car je demande de m'allouer de la memoire que pour une sequence a chaque fois.
Donc a chaque fois je demande d allouer de la memoire pour une autre sequence.
Je pensse pas que dans ce cas là je doit mettre
sizeof (Sequence) * 1


Enfin voila si ce que j ai en tête c bien sa ? ou je me trompe totallement? :p

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Terminatour le Ven 12 Nov 2010, 13:07

je te dis d'avance je suis pas prof.
mais comment je vois cette abomination tu fais en fait:

tu as une structure séquence sur lequel tu assigne des variables.
après chaque itération de boucle tu modifie les valeurs de cette même variable.

Ensuite
tu fais un realloc, donc tu redéfinis la taille de ton tableau de séquences toujours vers une même taille qui est la taille d'une structure (toujours la même en somme).
relis une fois realloc, je pense que ta pigé ce que c'est !

je pense qu'il vaudrait mieux:
faire une sauvegarde de laZone pour un futur free.
seulement garder lesSéquences qui sera ton tableau de séquences avec lequel tu vas assigner.
correctement réallouer, créer une variable pour itérer à chaque passage de boucle


Terminatour

Nombre de messages : 344
Age : 25
Prénom : Louis-Julien
Statut : statutaire
Localisation : localisée
Date d'inscription : 04/10/2009

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Ven 12 Nov 2010, 15:36

Terminatour a raison en ce qui concerne ta mauvaise utilisation du realloc.

En plus, tu ne vas pas chercher les bonnes valeurs de la position du morceau et de sa longueur car tu sembles oublier que ces valeurs sont contenues dans des unsigned char et non dans des unsigned short. Donc utiliser un pointeur de type unsigned short (ptrOffset), avec un indice (ptrOffset[1]) n'est pas du tout une bonne idée !

Evil or Very Mad

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

Re: [C] TD5 - EX15

Message  Aftab007 le Ven 12 Nov 2010, 18:33

Bonssoir Smile

suite a vos remarques , jai corriger mon realloc et modifier le transtypage lié a ptrOffset.
Cela fonctionne du tonnère maintenant
Je peux m'attaquer au TD6 ^^

Merci bien encore Smile

Aftab007

Nombre de messages : 85
Age : 28
Prénom : Aftab
Date d'inscription : 27/11/2008

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 15:56

Bonsoir tout le monde,

j'ai également un problème avec ce code!

quand je lance le debugger, il stop à la ligne où se trouve realloc mais il n'affiche pas de message il stop directement.
Donc j'ai fais plusieurs modif mais le résultat est toujours il même il stop à cette ligne!!!

ma structure Morceau je n'ai repris que 2 éléments pour ne pas allouer trop de mémoire.

Code:
 typedef struct { char * morceau ; unsigned char tailleMorc ; } Morceau ; 

Code:
 int i = 0, nbSeq = 1;
   unsigned short offset = 0;
   unsigned short * ptrOffset = NULL;
   unsigned char tailleSeq = 0;
   void * chaine;
   char * ptrChaine;
   Morceau * tab;

   chaine = getTexte04();
   ptrChaine = (char *) chaine;

   if (ptrChaine != NULL) {

      tab = malloc(sizeof(Morceau));
      ptrOffset = (unsigned short*) ptrChaine;
      offset = *ptrChaine;

      while (offset != 0) {
         tailleSeq = *((unsigned char*) ptrOffset + (sizeof(unsigned short)
               + (sizeof(unsigned char))));

         tab[i].morceau = (char *) ptrOffset + ((sizeof(unsigned short)) + (2
               * (sizeof(unsigned char))));

                        tab[i].tailleMorc = tailleSeq;

         offset = *(ptrOffset);
         ptrOffset = (unsigned short*) (ptrChaine + offset);

         i++;
         nbSeq++;
         tab = realloc(tab, nbSeq * sizeof(Morceau));
      }


Merci d'avance pour votre aide!
Bonne soirée à tous.

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Dim 14 Nov 2010, 18:13

J'ai testé ce code et il me semble fonctionner !
Bizarre !

Juste une petite chose:
le premier offset = *ptrChaine; ne devrait-il pas être plutôt offset = *ptrOffset; ?

Place ceci au bon endroit pour voir ce que ça donne :

printf("%.*s\n",tailleSeq,tab[i].morceau);

N'aurais-tu pas plutôt un problème d'utilisation de ton debugger ?

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

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 18:24

C'est vraiment bizarre, car lorsque je l'exécute il m'affiche : " tdc5.exe à cessé de fonctionner" Neutral

pour le debugger je tape sur F11 ensuite F5!
A moins qu'il y ait autre chose à faire pour le debugger?

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Dim 14 Nov 2010, 18:48

As-tu inséré le printf pour voir comment les morceaux s'affichent ?
Fais le run plutôt que le debugging pour voir.

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

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 19:49

j'ai inséré le printf juste après avoir initialiser tab dans le while,
mais ne s'exécute toujours pas!!!

pour le run je le ferai dès que je rentre.! Wink

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 20:38

Voilà je suis de retour^^
j'ai fais le test et sa ne passe pas!!!
même le printf ne s'affiche pas.

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 21:16

haaaaaaaaaa, j'ai un affichage maintenant!
Bizarre mais j'ai un affichage, du genre:


QRuaymond, candied Deépasser.
che.
Mon pvos)
Et moi l'autre pied gau veut le d droit estomme un imbé l'un avance jaloux de moncile, je marche!

je suis sur que dans mon code je rempli bien mon tableau, donc le problème doit venir du tri ou de l'affichage,
mais je suis quasi sur de mon affichage donc sa doit venir du tri???scratch
mais le tri vient de qsort donc sa doit être bon???Shocked

alors le problème vient d'où?? Very Happy

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Dim 14 Nov 2010, 21:19

Bizarre !

Exporte ton projet en .zip et envoie le moi pour voir.

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

Re: [C] TD5 - EX15

Message  smb le Dim 14 Nov 2010, 22:09

Tu tries ton tableau sur la longueur des morceaux ?!?
Bizarre, non !

Ne serait-ce pas sur la position du morceau dans le texte qu'il faudrait faire le tri ?

Neutral

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

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 22:16

effectivement, se serait plus logique!!!

je vais voir ça tout de suite!

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 22:21

j'ai changé le tri, l'affichage a changé mais toujours pas le bon affichage.

int cmpSeq(const void *a, const void *b) {
return (int) (*(Morceau *) a).morceau
- (int) (*(Morceau *) b).morceau;
}

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Dim 14 Nov 2010, 22:28

Que fais-tu de l'information qui donne dans la séquence la position du morceau dans le texte ?

Réfléchis un peu svp !

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

Re: [C] TD5 - EX15

Message  Athénien le Dim 14 Nov 2010, 23:08

à force de rester sur le même code on fini par ne plus réfléchir comme il faut!

voilà j'ai ajouter ce qu'il fallait, c-à-d:

un élément dans ma structure posSeq

Code:
typedef struct {
   char * morceau;
   unsigned char tailleMorc;
   unsigned char posSeq;
} Morceau;

et dans mon code je fais ceci :
Code:
 while (offset != 0) {

         tab[i].posSeq = *((unsigned char*) ptrOffset
               + ((sizeof(unsigned short))));

         tab[i].morceau = (char *) ptrOffset + ((sizeof(unsigned short))
               + (2 * (sizeof(unsigned char))));

         tab[i].tailleMorc = *((unsigned char*) ptrOffset
               + (sizeof(unsigned short) + (sizeof(unsigned char))));

         ptrOffset = (unsigned short*) (ptrChaine + offset);
         offset = *(ptrOffset);

         i++;
         nbSeq++;
         tab = realloc(tab, nbSeq * sizeof(Morceau));
      }

et pour le tri :
Code:
int cmpSeq(const void *a, const void *b) {
   return (int) (*(Morceau *) a).posSeq - (int) (*(Morceau *) b).posSeq;
}

ça fonctionne super bien maintenant, merci monsieur de m'avoir remit dans le bon chemin cheers
mais est-ce normal que des fois il saute un caractère???
c'est rare qu'il le fait, mais il le fait?!?

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Lun 15 Nov 2010, 00:05

Effectivement !
Permute un peu ces deux instructions pour voir si ça ne pas pas mieux !

ptrOffset = (unsigned short*) (ptrChaine + offset);
offset = *(ptrOffset);


Wink

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

Re: [C] TD5 - EX15

Message  Athénien le Lun 15 Nov 2010, 20:01

Effectivement c'était bien çà l'erreur!

Encore merci monsieur Very Happy

ps : comme quoi des petits détails sa peut changer beaucoup ^^

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Lun 15 Nov 2010, 20:08

Tu comprends pourquoi au moins, car c'est plus important que d'avoir les bons résultats !

cheers

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

Re: [C] TD5 - EX15

Message  Athénien le Lun 15 Nov 2010, 20:18

Oui oui, j'ai bien compris.
Ce que je ne comprend pas c'est pourquoi je l'ai mit dans cette ordre?!?
J'ai surement dû inverser lors de mes tests!

Athénien

Nombre de messages : 30
Prénom : Stavros
Statut : 2ième réseau
Localisation : bxl
Date d'inscription : 14/03/2010

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  didi le Mer 17 Nov 2010, 00:23

bonsoir moi aussi un problem en td5 ex 15
avant tous j'ai une question de comprehension par rapport ua ennoncé

Le but de l'exercice consiste à parcourir toutes les séquences contenues dans la zone pour
y extraire les informations nécessaires à l'affichage du texte d'origine. Pour résoudre cet
exercice vous essayerez de ne pas utiliser de tableaux non dynamiques et vous essayerez
également d'allouer le minimum de mémoire possible.

ça signifie je ne suis pas obliger d'allouer la mémoire dynamique ...?
car dans cette excercise je n'ai pas allouer la memoire dynamique


et la question de l'excercise :

Code:
unsigned int taille;
   unsigned short offset,offsetSuiv;
   unsigned char posCour;
   unsigned char posSuiv;
char *ptr_c ,*ptrSuiv_c,*ptrCour;
 
.....


                        ptrCour = ptr_c;
         while(offset != 0)   {
            ptrSuiv_c  = ptrSuiv_c + offset;
            offsetSuiv = (unsigned short ) (*ptrSuiv_c);
            while(offsetSuiv != 0)   {
               posSuiv = (unsigned short ) (*(ptrSuiv_c + sizeof(offsetSuiv)));
               if(posCour > posSuiv)   {
                  posCour = posSuiv;
                  ptrCour = ptrSuiv_c;
               }
               ptrSuiv_c  = ptrSuiv_c + offsetSuiv;
               offsetSuiv = (unsigned short ) (*ptrSuiv_c);
            }
            taille = (unsigned char)(*(ptrCour + sizeof(offset)+sizeof(posCour)));
            ptrCour = (ptrCour + sizeof(offset)+sizeof(posCour)+sizeof(taille));

            for(i = 0; i < taille ; i++)   {
               printf("%c",(*(ptrCour+i)));
            }
            ptr_c = ptr_c + offset;
            offset = (unsigned short ) (*ptr_c);
            posCour = (unsigned char)(*(ptr_c+sizeof(offset)));
            ptrCour = ptr_c;
            ptrSuiv_c = ptr_c;

         }

j'ai une erreur d'execution ( ou une boucle d'infini .. ?)
mais je ne sais pas correctement où car des fois il affiche
un ptit morceaux , une morceau de carecter bizare , parfois rien
merci de me corriger bonne soirée


didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: [C] TD5 - EX15

Message  smb le Mer 17 Nov 2010, 11:24

didi, soit tu donnes tout le code, soit tu ne donnes rien !

C'est quoi ..... Question

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

Re: [C] TD5 - EX15

Message  Contenu sponsorisé Aujourd'hui à 14:45


Contenu sponsorisé


Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivant

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