[C] TD5 - EX14

Page 1 sur 2 1, 2  Suivant

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

resolu [C] TD5 - EX14

Message  Madrid le Mer 03 Nov 2010, 13:04

salut les amis,

voici l'énoncé de l'exercice:

Cette fois c'est tout le texte d'origine qui a été inversé avant d'être découpé en morceaux.
De plus, les morceaux ont été mélangés ! La fonction getTexte03, qui ne doit être appelée
qu'une seule fois, range à l'adresse fournie en paramètre, l'adresse d'un tableau de
InfoMorceau (tableau alloué dynamiquement par la fonction), et retourne le nombre
d'éléments de ce tableau (donc le nombre de morceaux). La structure InfoMorceau est définie
comme suit :
typedef
struct { char * morceau ; unsigned char posMorceau ; }
InfoMorceau ;

morceau est l'adresse de la chaîne contenant le morceau (aussi allouée dynamiquement par la fonction);
posMorceau est la position du morceau dans le texte inversé (1 pour le 1ier)
Le but de l'exercice est de reconstituer le texte d'origine en une chaîne dont la taille aura la
taille minimale suffisante. La chaîne construite sera ensuite affichée. N'oubliez pas également
de libérer toutes les zones mémoires allouées par la fonction.
Prototype : unsigned int getTexte03 (InfoMorceau **) ;

et voici mon code:
Code:

int compare(const void *info1, const void *info2) {

   if ((int) ((InfoMorceau*) info1)->posMorceau
         < (int) ((InfoMorceau*) info2)->posMorceau)
      return -1;
   if ((int) ((InfoMorceau*) info1)->posMorceau
         > (int) ((InfoMorceau*) info2)->posMorceau)
      return 1;
   else
      return 0;
}

void getText03() {
   int nbMorc;
   InfoMorceau * zone, *text, *pMorc, *saveZone;
   char *pDebutTxt, *pFinTxt;
   int i;
   nbMorc = getTexte03(&zone);
   text = malloc(nbMorc * sizeof(InfoMorceau));
   saveZone = zone;
   pMorc = text;
   for (i = 0; i < nbMorc; i++) {
      *pMorc = *zone;
      pMorc++;
      zone++;
   }
   qsort(text, nbMorc, sizeof(InfoMorceau), compare);
   pMorc = text;
   pDebutTxt = pMorc->morceau;
   for (i = 0; i < nbMorc; i++) {
      for (pFinTxt = pDebutTxt + strlen(pDebutTxt) - 1; pFinTxt >= pDebutTxt; pFinTxt--) {
         printf("%c", *pFinTxt);
      }
      pMorc++;
      pDebutTxt = pMorc->morceau;
   }
   pMorc = saveZone;
   for (i = 0; i < nbMorc; i++) {
      free(pMorc->morceau);
      pMorc++;

   }
   free(saveZone);
}

je trie bien après avoir extrais les informations de ma zone et j'affiche et voila un dès résultats :


ne.
L'homme de droite estime qu'on devrait en arrêter quelques-uns en route.
L'homme de gauche voudrait qu'ils finissent tous premier.
(Oscar Wilde)
e démocrate exige que tous les citoyens prennent le départ sur la même ligL

Merci pour votre aide si vous avez le temps de regarder mon code.


Dernière édition par Madrid le Dim 14 Nov 2010, 12:53, édité 1 fois

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  smb le Mer 03 Nov 2010, 14:19

Tu oublies simplement que le texte d'origine a d'abord été inversé avant d'être découpé en morceaux !
Le morceau n°1 est le premier du texte inversé (et donc le dernier du texte d'origine).

Il n'y a vraiment pas grand chose à faire pour avoir les bons résultats.

Comprendiste ?

Cool

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: [C] TD5 - EX14

Message  Madrid le Mer 03 Nov 2010, 15:33

smb a écrit:Tu oublies simplement que le texte d'origine a d'abord été inversé avant d'être découpé en morceaux !
Le morceau n°1 est le premier du texte inversé (et donc le dernier du texte d'origine).

Il n'y a vraiment pas grand chose à faire pour avoir les bons résultats.

Comprendiste ?

Cool

ah comme ça je vois, suffit juste d'afficher du plus grand indice de la position dans le text si j'ai bien compris.

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  L@rgo_XIII le Mer 03 Nov 2010, 15:47

Madrid a écrit:
ah comme ça je vois, suffit juste d'afficher du plus grand indice de la position dans le text si j'ai bien compris.

Oui, comme on inverse la chaine AVANT de la découper, non seulement les caractères au sein d'une séquences sont inversés, mais les blocs eux même également. Razz

L@rgo_XIII

Nombre de messages : 80
Age : 30
Prénom : Lionel
Statut : Etudiant en 3e année Réseau & Télécommunicatio
Localisation : Uccle
Date d'inscription : 20/09/2010

http://largoxiii.wordpress.com

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  Madrid le Mer 03 Nov 2010, 23:00

Merci à tous.

Madrid

Nombre de messages : 187
Prénom : Noor
Statut : étudiant 2RET
Localisation : Woluwé-Saint-Lambert
Date d'inscription : 28/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 15:48

bonsoir,

J'ai aussi un problème concernant ce TD;
chez moi çà me fait des problème d'exécution quand je code ceci, pourquoi ?

Code:
   InfoMorceau ** tabMot;
   UINT nombre;
   nombre = getTexte03(tabMot);

et est-ce que dans ce cas ci un morceau d'un InfoMorceau est terminé par '\0', ou commencé par la taille ?

merci pour la réponse
Smile

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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 17:08

Aurais-tu fêté un peu trop ton anniversaire Terminatour ?

Que dis l'énoncé :

La fonction getTexte03, qui ne doit être appelée qu'une seule fois, range à l'adresse fournie en paramètre, l'adresse d'un tableau de InfoMorceau (tableau alloué dynamiquement par la fonction), (...)

Et toi, que lui fournis-tu comme paramètre lors de l'appel : tabmot (c'est-à-dire son contenu)

Et quel est ce contenu ? A ton avis ?

Crying or Very sad

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: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 17:21

si peu , si peu ... clown

je ne comprends pas.
Comment moi je vois l'énoncé, il va mettre dans mon tableau que je fournis en param les adresses des infosMorceau.
Vous entendez quoi par son contenu ? Pour l'instant c'est vide, mais c'est logique non, c'est pas moi qui vais pondre la phrase.

scratch

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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 17:26

Comment as-tu fait pour EX13 ?
Comment as-tu compris getTexte02 ?

C'est un peu la même chose, mutatis mutandis !

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

resolu Re: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 17:32

et bien genre, avec getTexte02, je reçois çà
"je pense" donc 2ej05esnep

qui se trouve dans un pointeur vers du void et moi j'ai tout casté dans un pointeur vers du char; çà ressemblait à:
phrase = (char *) getTexte02(&taille);

et en avant la musique, mais içi çà marche pas
mutatis mutandis !
oui mais eclipse avant de lancer mon programme de l'ex 14 me rétorque toujours "morituri te salutant" Mad

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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 17:49

Bon, on tourne en rond mais c'est pas grave, j'ai bien le temps.

Comment fais-tu l'appel de la fonction getTexte02 dans EX13 :

phrase = (char *) getTexte02(&taille);

Pourquoi comme ça ? Parce que ainsi, tu sais que tu fournis en paramètre à la fonction une adresse correcte dans laquelle elle viendra ranger la taille de la zone.

Je répète, qu'as-tu fournis à la fonction getTexte03 ? L'adresse contenue dans tabmot ! Et c'est à cette adresse que la fonction va placer l'adresse du tableau InfoMorceau. Si cette adresse est n'importe quoi ... patatras

Rolling Eyes

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: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 17:56

Bon, on tourne en rond mais c'est pas grave, j'ai bien le temps.

c'est en se perdant q'on se retrouve soi même ! pirat

Bon plus sérieusement,
par rapport à ce que vous avez dit, j'ai modifiez mon code et aie donc ceci; j'ai transmis à la fonction l'adresse (correcte) d'un InfoMorceau.
La grande présence de printf est pour les debugs.
çà commence avec reAssembleP142()

Code:
void afficheP14(char * phrase, UINT taillePhrase) {
   UINT cpt = 0;
   printf("Affichage P14 avec taillePhrase %i \n", taillePhrase);
   while (cpt < taillePhrase) {
      printf("%c", phrase[cpt]);
      cpt++;
   }
}

UINT rajout(char * phrase, char * mot, UINT taillePhrase) {

   UINT taille = strlen(mot);
   UINT cpt = 0;
   printf("rajout; début de fonction et de taillePhrase %i \n", taillePhrase);
   phrase = realloc(phrase, (taillePhrase + taille));
   printf("rajout; taille mot %i\n", taille);
   while (cpt < strlen(mot)) {
      phrase[cpt+taillePhrase] = mot[taille];
      taille--;
      cpt++;
   }
   taillePhrase += cpt;
   afficheP14(phrase, taillePhrase);
   return taillePhrase;
}

void reAssembleP142() {
   char * phrase = malloc(0);

   InfoMorceau * tabMot;
   InfoMorceau * tabMotSave;
   UINT num = 1;
   UINT nombre;
   UINT taillePhrase;


   printf("reAssembleP14; après déclarations \n");
   nombre = getTexte03(& tabMot);
   tabMotSave = tabMot;
   taillePhrase = 0;
   printf("reAssembleP14; Avant boucle, le nombre de morceau est %i \n", nombre);

   while (num < nombre) {
      printf("reAssembleP14; affichage du posMorceau %i \n", tabMot->posMorceau);
      if (tabMot->posMorceau == num) {
         printf("reAssembleP14; dans le if début\n");
         afficheP14(tabMot->morceau, strlen(tabMot->morceau));
         taillePhrase = rajout(phrase,tabMot->morceau, taillePhrase);
         num++;
         tabMot = tabMotSave;

      } else {
         tabMot++;
      }
   }
   afficheP14(phrase, taillePhrase);
   system("pause");
}




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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 18:03

Maintenant que tu as corrigé l'appel de la fonction getTexte03, tu montres du code et quoi, ... n c'est quoi ta 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

resolu Re: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 18:11

Et bien je voulais savoir si j'ai corrigé comme il le fallait ...
Mais çà me pose quand même soucis car il plante toujours au deuxième rajout() et je ne comprends pas pourquoi.

Mes nouvelles questions sont donc;
Auriez-vous une idée d'après la vue de mon code ?

Qu'est ce qui délimite la taille d'un morceau, de nouveau un unsigned int ?
Si la chaîne a été préalablement découpé avant d'être morcelé, est ce que la taille se trouves toujours en début de chaîne de chaque morceau ?

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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 18:52

Juste avant de passer à table :

while ( num < nombre ) ? ne serait-ce pas num<=nombre ?

La fonction rajout fait de la réallocation mais l'adresse obtenue du realloc n'est pas répercutée en dehors de la fonction, donc problème !

A+

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: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 19:55

smb a écrit:Juste avant de passer à table :

while ( num < nombre ) ? ne serait-ce pas num<=nombre ?

La fonction rajout fait de la réallocation mais l'adresse obtenue du realloc n'est pas répercutée en dehors de la fonction, donc problème !

A+

ce fut la CLÉ de TOUT !
Voilà j'ai Termined(), j'ai gâché mon dimanche là dessus, mais au moins je pourrait un jour dire "De mon temps çà compilait dur !"
Problem solved

post edit; pourvu que l'ex 15, soit esi !

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

resolu Re: [C] TD5 - EX14

Message  smb le Dim 07 Nov 2010, 20:17

... de rien !

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: [C] TD5 - EX14

Message  Terminatour le Dim 07 Nov 2010, 20:23

heu oui j'ai oublié d'#include le merci donc

merccciiiii Very Happy

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

resolu Re: [C] TD5 - EX14

Message  Dj x-fuse le Lun 08 Nov 2010, 16:21

Terminatour a écrit:j'ai Termined()
[...]
d'#include le merci
Trop de C tue le C... Wink

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  mvh le Lun 08 Nov 2010, 20:06

Dj x-fuse a écrit:
Terminatour a écrit:j'ai Termined()
[...]
d'#include le merci
Trop de C tue le C... Wink
Dj x-fuse ... jaloux de l'après-midi de chat privé smb/Terminatour ... Smile

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  Dj x-fuse le Mar 09 Nov 2010, 17:38

! snoyov ,tuot ud saP

A part cela, j'ai un soucis au niveau de mon code (toujours pour l'ex 14) : http://paste.pocoo.org/show/YDobASKleCfXhsECwLg4/
Les symptômes :
- Un caractère bizare en début de texte
- Un plantage 1 fois sur 2 à l'exécution. Le débugueur ne m'aide pas là-dessus :/

Une idée ?

EDIT : Je ne m'occupe pas encore de libérer la mémoire.

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  nvs le Mar 09 Nov 2010, 19:05

Dj x-fuse a écrit:Une idée ?
je n'ai pas lu attentivement tout le code, mais :
  • ligne 7 : es-tu sûr de la bonne taille de la zone pointée par texteFinal ;
  • ligne 3 : il sort d'où le 200 ? ;
  • ligne 14 : pour que strcat fonctionne bien, il faut que la chaîne destination (et la source, mais ce n'est pas le problème ici) termine par un caractère de code nul ;
  • ligne 16 : c'est quoi le but de ce strcat ?

pas sûr que je réponde à tes problèmes, mais voilà 4 problèmes qui me marquent. ceci dit, à mon avis mon 3e est lié à ton 1er et ton second à mon premier Smile





Neutral

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: [C] TD5 - EX14

Message  Dj x-fuse le Mar 09 Nov 2010, 19:48

nvs a écrit:je n'ai pas lu attentivement tout le code, mais :
  • ligne 7 : es-tu sûr de la bonne taille de la zone pointée par texteFinal ;
  • ligne 3 : il sort d'où le 200 ? ;
  • ligne 14 : pour que strcat fonctionne bien, il faut que la chaîne destination (et la source, mais ce n'est pas le problème ici) termine par un caractère de code nul ;
  • ligne 16 : c'est quoi le but de ce strcat ?

pas sûr que je réponde à tes problèmes, mais voilà 4 problèmes qui me marquent. ceci dit, à mon avis mon 3e est lié à ton 1er et ton second à mon premier Smile
* ligne 3 : J'alloue un espace suffisant en mémoire afin de stocker un nombre "indéterminé" de pointeur de char. Evidemment, je peux modifier ceci et faire une allocation dynamique par la suite. A voir.
* ligne 14 : Il me semble que justement, je passe en paramètre une chaîne de char terminée par le caractère nul ('\0')
* ligne 16 : Ne sachant pas si strcat fourni un caractère nul à la fin de la chaine, j'en rajoute un. Je l'admet, c'est en contradiction avec la ligne 14, je vais modifier cela.
Par contre, je ne comprends donc pas pourquoi j'ai un affichage "correcte" (donc dans caractères étrange entre les morceaux) à la ligne 17 (hormis ce que j'ai cité dans mon post précédent).

Je vais retravailler tout cela en fonction des remarques faites et je posterais un second message pour dire quoi.
Merci Smile

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  nvs le Mar 09 Nov 2010, 20:36

Dj x-fuse a écrit:* ligne 14 : Il me semble que justement, je passe en paramètre une chaîne de char terminée par le caractère nul ('\0')
à quelle ligne le caractère de code nul est-il placé en fin de chaîne destination ? ça va peut-être t'aider : malloc n'est pas calloc Smile

sinon, tu ne réponds pas à ma question concernant la ligne 7...





clown

_________________

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: [C] TD5 - EX14

Message  Dj x-fuse le Mar 09 Nov 2010, 22:43

J'ai modifié mon code (ou plutôt réécrit le début) et rien que dans le for, j'ai un plantage aléatoire... Alors là, je vois vraiment pas pourquoi Neutral
http://paste.pocoo.org/show/U7v6Q5f9WJinKeMatzMH/

A ce stade, j'y comprends plus rien...

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

resolu Re: [C] TD5 - EX14

Message  Contenu sponsorisé Aujourd'hui à 18:54


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