[Langage C] td5, exercice 15

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

resolu [Langage C] td5, exercice 15

Message  jabberwok le Mer 16 Nov 2011, 18:35

Bonjour/Bonsoir,

J'ai un problème lors de l'exécution de mon programme, j'essaye de parcourir toute la zone et d'afficher toutes les chaines (pas dans l'ordre), mais 2x/3 je tombe sur une erreur d'exécution, je ne comprends pas pourquoi, avec le "débogger" ça ne bloque pas pourtant ...

Code:

char * zoneMemoire = (char*)getTexte04();
   char * zoneIndex = zoneMemoire;
   unsigned short offset;
   unsigned char numeroChaine, tailleChaine;
   int i;
   offset = (unsigned short)*zoneIndex;

   while(offset != 0){
      zoneIndex += offset;
      numeroChaine = (unsigned char)*zoneIndex;
      zoneIndex++;
      tailleChaine = (unsigned char)*zoneIndex;
      zoneIndex++;

      for(i = 0; i < tailleChaine; i++){
         printf("%c", *(zoneIndex+i));
      }

      zoneIndex += tailleChaine;
      offset = (unsigned short) *zoneIndex;
   }
   free(zoneMemoire);

edit : je précise, que ça m'affiche que des caractères bizarres ^^'.

Quelqu'un comprends pourquoi ?
Merci d'avance !


Dernière édition par jabberwok le Jeu 17 Nov 2011, 17:53, é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 15

Message  smb le Mer 16 Nov 2011, 19:08

Il faudrait commencer par revoir tes notes sur le casting des pointeurs.

Ceci
Code:
offset = (unsigned short)*zoneIndex;
n'est pas correct, et aussi beaucoup de choses par la suite ...

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 15

Message  jabberwok le Mer 16 Nov 2011, 20:00

J'ai fait quelques modifications par rapport à votre remarque, si j'ai bien compris, il fallait d'abord caster l'adresse pour pouvoir récupérer la bonne information.

Code:
char * zoneMemoire = (char*)getTexte04();
   char * zoneIndex = zoneMemoire;
   unsigned short offset;
   unsigned char numeroChaine, tailleChaine;
   int i;

   offset = *((unsigned short*)zoneIndex);

   while(offset != 0){
      zoneIndex = zoneMemoire + offset; 
      numeroChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      tailleChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      if( tailleChaine != 0){
         for(i = 0; i < tailleChaine; i++){
            printf("%c", *(zoneIndex+i));
         }
         zoneIndex += tailleChaine;
      }else{
         zoneIndex++;
      }


      offset = *((unsigned short *)zoneIndex);
   }
   free(zoneMemoire);

(Je veux juste afficher les chaines telles quels, dans un premier temps)

En espérant avoir un autre petit coup de pouce, parce que là je ne vois pas qu'elle est la raison de mon problème. ^^'

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 15

Message  smb le Mer 16 Nov 2011, 20:36

Relis d'abord l'énoncé. Tu verras que la zone mémoire dont tu reçois l'adresse a toujours en son début une séquence d'informations (la première en fait).
Ensuite, fais le schéma d'une séquence d'informations.
Enfin, relis ton code pour corriger tes bêtises.



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 15

Message  jabberwok le Mer 16 Nov 2011, 20:59

smb a écrit:Relis d'abord l'énoncé. Tu verras que la zone mémoire dont tu reçois l'adresse a toujours en son début une séquence d'informations (la première en fait).
Ensuite, fais le schéma d'une séquence d'informations.

Je respecte ça oO, une séquence est constituée d'un décalage à partir du début, du numéro de la chaine, de sa taille, et de la chaine.
Je récupère le premier décalage que j'additionne au début de la zone pour récupérer le numéro/la taille/la chaine en boucle. (tant que le décalage ne vaut pas 0).
Qu'est ce que j'ai mal compris ?

ps : Vous parlez de "bêtises" pourriez-vous être plus explicite svp ?

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 15

Message  smb le Mer 16 Nov 2011, 21:11

Comment obtient-on l'adresse de la première séquence ?
Comment obtient-on l'adresse de la deuxième séquence (s'il y en a une) ?
Comment obtient-on l'adresse de la troisième séquence (s'il y en a une) ?
...

Je répète :
- lis convenablement l'énoncé ;
- fait un dessin de la zone mémoire reçue par la fonction.

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 15

Message  karemkadidola le Jeu 17 Nov 2011, 14:05

Petit coup de pouce comme demandé cher ami

déjà j'abonde dans le sens de mr smb il n'y a que des petits dessins (pour mon cas en tout cas) qui aide à mieux saisir les questions et à mieux écrire son code néamoins voici d'où vient tes petits soucis voir commentaire des lignes d'une partie de ton code...

Code:

 offset = *((unsigned short*)zoneIndex);

  while(offset != 0){
      zoneIndex = zoneMemoire + offset; //tu ne traites pas la 1ere sequence tu vas direct au suivant.

      numeroChaine = *((unsigned char *)zoneIndex);//ça c le 1er byte de l'offset et non le "numeroChaine"
     
      zoneIndex++;

      tailleChaine = *((unsigned char *)zoneIndex);// çeci est plutot le deuxième byte de l'offset

      zoneIndex++;
     
      // après les erreurs d'en haut tout ton for aura un comportement imprevisible....
   
      if( tailleChaine != 0){
        for(i = 0; i < tailleChaine; i++){
            printf("%c", *(zoneIndex+i));
        }
solution quand tu arrives au début de la deuxième seq (de n'importe quelle séquence d'ailleurs) recupère d'abord l'offset avec un cast USHORT* puis tu fais un saut de deux bytes mais avant n'oublies pas de recaster en char* là seulement tu seras au bon endroit pour ton "numérochaine" qui seras suivi par "tailleChaine" en espèrant que ça t'aide pour avancer et attaquer le td6


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 15

Message  jabberwok le Jeu 17 Nov 2011, 16:33

Merci Monsieur, j'ai eu le "déclic" vers 22-23h.
un unsigned short donnant l'offset qu'il faut ajouter à l'adresse de la zone pour
trouver la séquence suivante

Il ne me reste plus qu'un problème mineur maintenant.
J'arrive à afficher la citation entière, mais quand j'éxecute, 2x/3 il me manque 1 séquence, c'est à dire le nom de l'auteur ou la fin de son nom.

Monsieur Beleho m'a dit qu'il avait eu la même erreur il y a 2 ans ...
Est-ce que quelqu'un aurait déjà eu ce problème ?


ps : merci quand même Karemkadidola j'ai réussis à trouver par moi même Smile


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 15

Message  LoopinG le Jeu 17 Nov 2011, 16:37

jabberwok a écrit:...
Il ne me reste plus qu'un problème mineur maintenant.
J'arrive à afficher la citation entière, mais quand j'éxecute, 2x/3 il me manque 1 séquence, c'est à dire le nom de l'auteur ou la fin de son nom.
...

j'ai également ce soucis ou peut-être que c'est fait exprès ?

LoopinG

Nombre de messages : 100
Prénom : Laurent
Statut : Étudiant en Réseaux et Télécoms
Localisation : L'hôpital de l'armée !
Date d'inscription : 24/03/2011

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 15

Message  smb le Jeu 17 Nov 2011, 17:08

jabberwok a écrit:Merci Monsieur, j'ai eu le "déclic" vers 22-23h.
un unsigned short donnant l'offset qu'il faut ajouter à l'adresse de la zone pour
trouver la séquence suivante

Il ne me reste plus qu'un problème mineur maintenant.
J'arrive à afficher la citation entière, mais quand j'éxecute, 2x/3 il me manque 1 séquence, c'est à dire le nom de l'auteur ou la fin de son nom.

Monsieur Beleho m'a dit qu'il avait eu la même erreur il y a 2 ans ...
Est-ce que quelqu'un aurait déjà eu ce problème ?

ps : merci quand même Karemkadidola j'ai réussis à trouver par moi même Smile


Pour se rendre compte du problème il faudrait voir ton code après les corrections que tu as faites...
... et si la librairie contient des erreurs, tous ceux qui ont terminé le TD auraient dû le remarquer, et apparemment ça roule pour ceux-là, et pour moi aussi d'ailleurs.

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 15

Message  smb le Jeu 17 Nov 2011, 17:09

LoopinG a écrit:
jabberwok a écrit:...
Il ne me reste plus qu'un problème mineur maintenant.
J'arrive à afficher la citation entière, mais quand j'éxecute, 2x/3 il me manque 1 séquence, c'est à dire le nom de l'auteur ou la fin de son nom.
...

j'ai également ce soucis ou peut-être que c'est fait exprès ?

... je crois que c'est plutôt ton code qui pose problème !

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 15

Message  jabberwok le Jeu 17 Nov 2011, 17:14

Voilà mon code, Monsieur Beleho et moi l'avons décortiqué pendant 1 heure, on a rien trouvé ^^'
Spoiler:

Code:
char * zoneMemoire = (char*)getTexte04();
   char * zoneIndex = zoneMemoire;
   unsigned char * tabInt = NULL;
   unsigned short offset;
   unsigned char numeroChaine, tailleChaine;
   int i, nbSequence = 0, cpt = 0, j;

   /* stock le prochain */
   offset = *((unsigned short*)zoneIndex);

   /* Récupere le nombre de séquences. */
   while( offset != 0 ){
      zoneIndex +=2;
      numeroChaine = *((unsigned char *) zoneIndex);
      zoneIndex++;
      tailleChaine = *((unsigned char *)zoneIndex);
      if(numeroChaine != 0 && tailleChaine != 0 ){
         nbSequence++;
      }
      zoneIndex = zoneMemoire + offset;
      offset = *((unsigned short *)zoneIndex);
   }

   printf("Nombre de Sequence : %d\n", nbSequence);

   tabInt = (unsigned char *) malloc(nbSequence * sizeof(unsigned char));

   zoneIndex = zoneMemoire;
   offset = *((unsigned short*)zoneIndex);

   j = 1;
   while( j <= nbSequence ){
      zoneIndex += 2;
      numeroChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      tailleChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      while(numeroChaine != j){
         zoneIndex = zoneMemoire + offset;
         offset = *((unsigned short *)zoneIndex);
         zoneIndex += 2;
         numeroChaine = *((unsigned char *)zoneIndex);
         zoneIndex++;
         tailleChaine = *((unsigned char *)zoneIndex);
         zoneIndex++;
      }
      *(tabInt + cpt) = numeroChaine;
      for(i = 0; i < tailleChaine; i++){
         printf("%c", *(zoneIndex + i));
      }
      j++;
      cpt++;
      zoneIndex = zoneMemoire + offset;
      offset = *((unsigned short *)zoneIndex);
   }
   if(nbSequence != 0){
      printf("\n\nNuméros des morceaux : \n");
      for(i = 0; i < nbSequence; i++){
         printf("%d ", *(tabInt+i));
      }
   }
   free(zoneMemoire);

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 15

Message  smb le Jeu 17 Nov 2011, 17:42

jabberwok a écrit:Voilà mon code, Monsieur Beleho et moi l'avons décortiqué pendant 1 heure, on a rien trouvé ^^'
Spoiler:

Code:
char * zoneMemoire = (char*)getTexte04();
   char * zoneIndex = zoneMemoire;
   unsigned char * tabInt = NULL;
   unsigned short offset;
   unsigned char numeroChaine, tailleChaine;
   int i, nbSequence = 0, cpt = 0, j;

   /* stock le prochain */
   offset = *((unsigned short*)zoneIndex);

   /* Récupere le nombre de séquences. */
   while( offset != 0 ){
      zoneIndex +=2;
      numeroChaine = *((unsigned char *) zoneIndex);
      zoneIndex++;
      tailleChaine = *((unsigned char *)zoneIndex);
      if(numeroChaine != 0 && tailleChaine != 0 ){
         nbSequence++;
      }
      zoneIndex = zoneMemoire + offset;
      offset = *((unsigned short *)zoneIndex);
   }

   printf("Nombre de Sequence : %d\n", nbSequence);

   tabInt = (unsigned char *) malloc(nbSequence * sizeof(unsigned char));

   zoneIndex = zoneMemoire;
   offset = *((unsigned short*)zoneIndex);

   j = 1;
   while( j <= nbSequence ){
      zoneIndex += 2;
      numeroChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      tailleChaine = *((unsigned char *)zoneIndex);
      zoneIndex++;
      while(numeroChaine != j){
         zoneIndex = zoneMemoire + offset;
         offset = *((unsigned short *)zoneIndex);
         zoneIndex += 2;
         numeroChaine = *((unsigned char *)zoneIndex);
         zoneIndex++;
         tailleChaine = *((unsigned char *)zoneIndex);
         zoneIndex++;
      }
      *(tabInt + cpt) = numeroChaine;
      for(i = 0; i < tailleChaine; i++){
         printf("%c", *(zoneIndex + i));
      }
      j++;
      cpt++;
      zoneIndex = zoneMemoire + offset;
      offset = *((unsigned short *)zoneIndex);
   }
   if(nbSequence != 0){
      printf("\n\nNuméros des morceaux : \n");
      for(i = 0; i < nbSequence; i++){
         printf("%d ", *(tabInt+i));
      }
   }
   free(zoneMemoire);

... pendant 1 heure ?

En fait, dans le décompte du nombre de séquences, tu oublies systématiquement de compter la dernière, celle dont le début contient la valeur 0 !

La preuve est qu'il y a un texte que tu ne trouves jamais [ Eurêka ! ... ] parce qu'il est découpé en une seule séquence !

La correction la plus simple à apporter dans ton code est d'initialiser nbSequence à 1. Plus proprement, il faut d'abord traiter la séquence avant de prendre l'offset en son début : faire un jusqu'à ce que est plus approprié !

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 15

Message  jabberwok le Jeu 17 Nov 2011, 17:52

Merci encore pour votre aide, j'ai pourtant lu l'énoncé plusieurs fois, je n'étais pas assez concentré apparament:

La zone contient toujours une séquence en son début.

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 15

Message  karemkadidola le Jeu 17 Nov 2011, 21:06

jabberwok a écrit: et moi l'avons décortiqué pendant 1 heure
moi je dis chapeau avouez qu'il y en a 1 ou 2 qui n'auraient pas accorder autant de temps sur le cas d'un seul étudiant...

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 15

Message  I.AM.BACK le Jeu 24 Nov 2011, 14:15

Je pense que c'est la méthode fourni qui déconne (void * getTexte04(void)), en faisant un test je me suis aperçu qu'il y a des trous (des séquences qui manquent, et par conséquent la positions des morceaux).
voici le code de mon test au cas où j'aurai fais une erreur.

Spoiler:
Code:
void test(void){
   int i;
   USHORT * offset;
   UCHAR * pos;
   UCHAR posPrec;
   void * ptr = getTexte04();
   int tailleChaine = 0;
   void * zone = ptr;
   int indices[50];

   for (i=0; i<50; i++){
      indices[i] = -1;
   }

   offset = ptr;
   ptr = (USHORT *)ptr +1;
   posPrec = 0;

   while (*offset!=0){
      pos = ptr;
      ptr = (UCHAR *)ptr + 1;
      if (*pos >= posPrec+1){
         tailleChaine = *pos;
         posPrec = (*pos)-1;
      }
      indices[(*pos)] = (*pos);
      ptr = zone;
      ptr = (UCHAR *)ptr + (*offset);
      offset = ptr;
      ptr = (USHORT *)ptr + 1;
   }


   for (i=0; i<tailleChaine; i++){
      printf("%d ",indices[i]);
   }
}

En exécutant ce code, on voit bien des '-1' qui apparaissent aux endroits où les positions (séquences) manquent.

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 15

Message  smb le Jeu 24 Nov 2011, 15:00

I.AM.BACK a écrit:Je pense que c'est la méthode fourni qui déconne (void * getTexte04(void)), en faisant un test je me suis aperçu qu'il y a des trous (des séquences qui manquent, et par conséquent la positions des morceaux).
voici le code de mon test au cas où j'aurai fais une erreur.

Spoiler:
Code:
void test(void){
   int i;
   USHORT * offset;
   UCHAR * pos;
   UCHAR posPrec;
   void * ptr = getTexte04();
   int tailleChaine = 0;
   void * zone = ptr;
   int indices[50];

   for (i=0; i<50; i++){
      indices[i] = -1;
   }

   offset = ptr;
   ptr = (USHORT *)ptr +1;
   posPrec = 0;

   while (*offset!=0){
      pos = ptr;
      ptr = (UCHAR *)ptr + 1;
      if (*pos >= posPrec+1){
         tailleChaine = *pos;
         posPrec = (*pos)-1;
      }
      indices[(*pos)] = (*pos);
      ptr = zone;
      ptr = (UCHAR *)ptr + (*offset);
      offset = ptr;
      ptr = (USHORT *)ptr + 1;
   }


   for (i=0; i<tailleChaine; i++){
      printf("%d ",indices[i]);
   }
}

En exécutant ce code, on voit bien des '-1' qui apparaissent aux endroits où les positions (séquences) manquent.

Pas de chance, la méthode getTexte04 ne déconne pas, c'est ton code qui déconne !

Relis tous les messages précédents sur les sujets se rapportant à cet exercice, tu trouveras peut-être une piste !

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 15

Message  I.AM.BACK le Jeu 24 Nov 2011, 15:32

smb a écrit:

Pas de chance, la méthode getTexte04 ne déconne pas, c'est ton code qui déconne !

Relis tous les messages précédents sur les sujets se rapportant à cet exercice, tu trouveras peut-être une piste !

Si vous faites allusion au fait que ma fonction ne traite pas le cas avec une seule séquence, je le sais et j'ai fais exprès de ne pas la prendre en compte dans cette fonction de test. Sinon je ne vois pas d'autre "piste" dans les messages précédent.

EDIT: Effectivement, c'est mon code qui déconnait Smile (parceque le morceau se trouvant dans la derniere sequence n'etait pas pris en compte dans mon while) merci beaucoup!

I.AM.BACK

Nombre de messages : 56
Age : 25
Prénom : Victor
Statut : étudiant indu 2ème année
Localisation : http://en.wikipedia.org/wiki/Armenia
Date d'inscription : 21/07/2011

Revenir en haut Aller en bas

resolu Re: [Langage C] td5, exercice 15

Message  Contenu sponsorisé Aujourd'hui à 10:51


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