[LCP] TDC5 ex15

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

resolu [LCP] TDC5 ex15

Message  Anthoblack le Sam 21 Nov 2009, 16:26

Bonjour à tous et à toutes.

Je suis toujours bloqué sur cet exercice (on en a déjà parlé ici avec justblaze : http://pit-it.virtuaboard.com/langages-f3/tdc5-ex15-t2423.htm)

Si besoin de l'énoncé, une partie est au lien si dessus, sinon j'peux tjs rajouter sa totalité...

Mon soucis est le suivant :
Mon parcours s'arrête abruptement après un ou deux morceaux correctement identifiés. Ma boucle s'arrête car il n'y a plus d'offset à rajouter au pointeur du morceau en cours, et donc, en principe, plus de morceaux à lire. Mais cette boucle s'arrête beaucoup trop vite (l'offset est trop vite nul) et je n'ai pas la totalité de la phrase.
(Il y a aussi un texte qui plante complètement, sinon il n'y a pas d'erreur d'exécution).

Je planche dessus depuis qq heures et je ne trouve pas mes erreurs Sad

Voici mon code (je pense que tout le monde l'a déjà fait donc je ne donnerai pas de solution en le mettant ici)

Code:
   char * sequences = (char *)getTexte04(), * chaine = (char *) malloc(1), * saveP;
   unsigned short offset=1;
   unsigned char position, longueurM, nbMorceaux=0, i;
   unsigned int tMorceau, tailleTot=0;

   InfoMorceau * tab = (InfoMorceau *) malloc(sizeof(InfoMorceau));

   *chaine = '\0';

   while (offset)
   {
      saveP = sequences;

      offset = *((unsigned short *)sequences);
      sequences+=sizeof(unsigned short);

      position = *((unsigned char *)sequences);
      sequences+=sizeof(unsigned char);

      longueurM = *((unsigned char *)sequences);
      sequences+=sizeof(unsigned char);

      if (longueurM)
      {
         nbMorceaux++;

         tab = (InfoMorceau *)realloc(tab, sizeof(InfoMorceau)*nbMorceaux);

         tab[nbMorceaux-1].morceau = (char *)malloc(longueurM+1);
         tab[nbMorceaux-1].posMorceau = position;

         for(i=0;i<longueurM;i++)
         {
            tab[nbMorceaux-1].morceau[i] = *sequences;
            sequences++;
         }
         tab[nbMorceaux-1].morceau[i] = '\0';
      }

      sequences = saveP + offset;
   }

   qsort(tab, nbMorceaux, sizeof(tab[0]), fctTri);

   for (i=0; i<nbMorceaux; i++)
   {
      tMorceau = strlen(tab[i].morceau);
      tailleTot+=tMorceau;

      chaine = (char *)realloc(chaine,tailleTot+1);

      strcat(chaine, tab[i].morceau);
      chaine[tailleTot] = '\0';
   }
       
   printf("%s",chaine);

Notez que ma fonction tri fonctionne bien :
Code:
int fctTri(const void * a, const void * b)
{
   return ( ((InfoMorceau *)a)->posMorceau - ((InfoMorceau *)b)->posMorceau );
}

Voici l'affichage de l'exécution (avec les printf des différentes zones, les "+++" étant la position du pointeur sequences) avec les chaînes par morceau.
Code:
+++++ 00612680
offset(hex) 4a0
+++++ 00612682
position 0
+++++ 00612683
longueur 0
+++++ 00612684

+++++ 00612B20
offset(hex) 100
+++++ 00612B22
position 2
+++++ 00612B23
longueur 18
+++++ 00612B24

quand on sait tout

+++++ 00612C20
offset(hex) 340
+++++ 00612C22
position 8
+++++ 00612C23
longueur 9
+++++ 00612C24

personne

+++++ 00612F60
offset(hex) 0
+++++ 00612F62
position 0
+++++ 00612F63
longueur 0
+++++ 00612F64

--> quand on sait toutpersonne

J'apprécierai tout avis, toute remarque, même si cela ne résout pas mon problème mais aiderait à améliorer ma façon de coder.

Merci d'avance,
Antho


Dernière édition par Anthoblack le Dim 22 Nov 2009, 14:30, édité 1 fois

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  newu le Sam 21 Nov 2009, 19:28

J'ai lu vite en diagonale ton code, mais je ne comprends pas certaines choses,

pourquoi tu utilise dans ton code pour ex 15 des allocations,

moi j'ai fait cet ex sans aucune allocation et ça marche.

newu

Nombre de messages : 117
Prénom : Abdou
Statut : 3ème gestion
Localisation : Je dors à l'école.
Date d'inscription : 25/09/2009

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  nvs le Sam 21 Nov 2009, 20:46

@Anthoblack : tu confonds les notions de zone et de séquence :



en ajoutant l'offset à l'adresse de la séquence courante et non à celle de la zone. en apportant le petit changement correspondant, ton code fonctionne parfaitement... à l'exception de la libération de la mémoire allouée qui manque cruellement.

@newu : merci pour ton intervention constructive. par ailleurs, si tu n'alloues pas de mémoire dynamique (et n'utilises pas de tableaux statiques, comme indiqué dans l'énoncé), je suis curieux de savoir comment tu procèdes, en particulier combien de fois tu parcours la zone...







Idea

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  newu le Dim 22 Nov 2009, 00:35

En fait je trouve la sequence avec la position maximale tout d'abord avec une petite boucle while,

et ensuite je fait une boucle
for ( de pos min à la pos max ) {
while( qui parcours toutes les sequences jusqu'à trouver la position pos) { ... }
et ici j'affiche
attention, il faut un petit test, car les morceau vides ont la position qui vaut 0, de même que la taille
}

et c'est comme ça que je fais

newu

Nombre de messages : 117
Prénom : Abdou
Statut : 3ème gestion
Localisation : Je dors à l'école.
Date d'inscription : 25/09/2009

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  Anthoblack le Dim 22 Nov 2009, 10:14

nvs a écrit:@Anthoblack : tu confonds les notions de zone et de séquence :
(image)

en ajoutant l'offset à l'adresse de la séquence courante et non à celle de la zone. en apportant le petit changement correspondant, ton code fonctionne parfaitement... à l'exception de la libération de la mémoire allouée qui manque cruellement.
MERCI ! Je me doutais bien que c'était simple, mais là...

Je n'oublierai plus mes free, promis Wink (Faut-il faire un free de la zone des getTexte ? Ou pour n'importe quelle zone allouée dans une autre fonction ? Embarassed )

Encore merci I love you

@newu : Je comprends pas bien ce que tu fais mais je trouvais mon idée de tableau dynamique facile à utiliser Wink

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  nvs le Dim 22 Nov 2009, 10:21

Anthoblack a écrit:[...] Faut-il faire un free de la zone des getTexte ? [...]
c'est spécifié dans l'énoncé Smile

sinon, la solution de newu tient la route. et me plonge dans des abimes de perplexité quant aux efficacités comparées des deux (la tienne et la sienne) approches...







Rolling Eyes

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  newu le Dim 22 Nov 2009, 11:25

Et ma solution est-elle inefficace ou incorrecte, M Vanstenkiste ?

newu

Nombre de messages : 117
Prénom : Abdou
Statut : 3ème gestion
Localisation : Je dors à l'école.
Date d'inscription : 25/09/2009

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  nvs le Dim 22 Nov 2009, 12:03

quant à savoir si elle est correcte, tu affirmes que oui, donc elle doit l'être.

quant à son efficacité, avec une zone composée de n séquences, il faut faire la balance entre :

  • 1 parcours, n réallocations mémoire et 1 qsort ;
  • plus de n/2 parcours, 0 allocation mémoire et 0 qsort.
et jauger le plus gourmand : un parcours (avec au moins 2 accès mémoire à chaque fois plus des opérations arithmétiques et de comparaison) ou une allocation dynamique...







Question

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  Anthoblack le Dim 22 Nov 2009, 14:30

Encore merci --> Problem solved

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

resolu Re: [LCP] TDC5 ex15

Message  Contenu sponsorisé Aujourd'hui à 10:47


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