TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

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

resolu TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Mer 12 Oct 2011, 18:41

bonsoir

j'ai une erreur d'execution dans l'exercise EX15 : Retrouvez les morceaux en pagaille dans la zone…
bon j'ai pas terminer cette exercise ( seulement une partie de cette exercise )
dans cette exercise je parcour la zone memoir et je recupère les nombre de morceau dans cette zone memoire
(apres je vais parcourir 2 ième fois pour afficher les morceaux )
Code:

int main(void) {

        void *ptr_g = getTexte04();
   unsigned short *ptr_off, offset;
   unsigned char *ptr_pos,position;
        int nbMorceau=1;
   
        ptr_off = (unsigned short *)ptr_g;
   offset = *ptr_off;

      while(offset != 0)    {
      printf("\nLa offset vaut : %d",offset);
      ptr_off++;
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
      if(position > nbMorceau )   {
         nbMorceau = position;
      }
      ptr_off = (unsigned short *)ptr_g;
      ptr_off = ptr_off+offset;
      offset = *ptr_off;

   }
   return EXIT_SUCCESS;
}


le printf("\nLa offset vaut : %d",offset); affiche

La offset vaut : 896
La offset vaut : 672
La offset vaut : 22615

et j'ai sais bien que je dépasse la zone memoir mais ..
j'arrive pas comment Sad


Dernière édition par didi le Sam 15 Oct 2011, 14:40, édité 1 fois

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Jeu 13 Oct 2011, 09:35

L'offset signifie dans l'énoncé le nombre d'octets qu'il faut ajouter à l'adresse de base pour obtenir l'adresse de la séquence à traiter.

L'adresse de base est obtenue lors du 1ier appel à la fonction getTexte04, qui est également l'adresse de la première séquence. Au début de cette séquence se trouve l'offset de la deuxième séquence, etc...

Le problème est que tu fais jouer l'arithmétique des pointeurs dans ton code

ptr_off = ptr_off+offset;


... comme ptr_off est un unsigned short * tu obtiens une adresse incorrecte !

C'est un des problèmes de ton code.

Attention qu'à chaque exécution de ton programme, les offsets ne sont pas les mêmes !

Enfin, qu'est-ce qui te dit que le TD_C5 contiendra encore cet exercice ?

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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Jeu 13 Oct 2011, 20:53

Problem solved merci pour l'aide .. Smile et je viens de corriger
mais maintenant c'est un autre probleme..


Code:

int main(void) {
void *ptr_g = getTexte04();
   unsigned short *ptr_off,offset;
   unsigned char *ptr_pos,position;
   char *ptr_c,*ptr_depart;
   unsigned char nbMorceau=1,j,i;
   unsigned char *ptr_long,longuer;


   ptr_depart = (char*) ptr_g;
   ptr_off = (unsigned short *)ptr_depart;
   offset = (*ptr_off);
   ptr_off++;

            while(offset != 0)    {
      ptr_c = ptr_depart;
      ptr_c = ptr_c+offset;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_off++;
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
      if(position != 0)   {
         nbMorceau++;
         }

   }

        printf("\nLe nbMorceau vaut : %d\n",nbMorceau);
   for(i = 1; i <= nbMorceau; i++)   {
      
      while((offset != 0) && (position != i))   {
         ptr_c = ptr_depart+offset;
         ptr_off = (unsigned short *)ptr_c;
         offset = (*ptr_off);
         ptr_off++;
         ptr_pos = (unsigned char *)ptr_off;
         position = *ptr_pos;
      }
            printf("\nLe position vaut : %d",position);
         ptr_pos++;
         ptr_long = ptr_pos;
         longuer = *ptr_long;
         ptr_long++;
         ptr_c = (char *)ptr_long;
         for(j = 0; j < longuer;j++)   {
         /*   printf("%c",*(ptr_c+j)); */
         }
                ptr_c = ptr_depart;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
      }


   return EXIT_SUCCESS;
}

je n'ai pas de erreur d'execution mais .. le resultat n'est pas correct .. Sad

si j'affiche rien que le printf("\nLe position vaut : %d",position);

resultats est :

Le position vaut : 0
Le position vaut : 2
Le position vaut : 3
Le position vaut : 4
Le position vaut : 5
Le position vaut : 6
Le position vaut : 7
Le position vaut : 8
Le position vaut : 9
Le position vaut : 10
Le position vaut : 11
Le position vaut : 12
Le position vaut : 0
Le position vaut : 14
Le position vaut : 15
Le position vaut : 16
Le position vaut : 17
Le position vaut : 18
Le position vaut : 19
Le position vaut : 20
Le position vaut : 21
Le position vaut : 0
Le position vaut : 23
Le position vaut : 24
Le position vaut : 25



si j'affiche rien que le printf("%c",*(ptr_c+j));

le resultat est :

ied droit est jaloux de mon pied gauche.
Quand l'un avance l'autre veut le dépasser.
Et moi, comme un imbécile, je marche!
(Raymond


Attention qu'à chaque exécution de ton programme, les offsets ne sont pas les mêmes !

oui ça j'ai bien compris et comme je suis un doubleur je fais les exercises
de l'année precedente pour exercer pour les interos .. Smile

merci




Dernière édition par didi le Sam 15 Oct 2011, 14:37, édité 1 fois

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Jeu 13 Oct 2011, 21:30

didi a écrit:merci pour l'aide .. Smile et je viens de corriger
mais maintenant c'est un autre probleme..
(...)
je n'ai pas de erreur d'execution mais .. le resultat n'est pas correct .. Sad
(..)
le resultat est :

ied droit est jaloux de mon pied gauche.
Quand l'un avance l'autre veut le dépasser.
Et moi, comme un imbécile, je marche!
(Raymond



Tu n'es pas loin du résultat puisqu'il manque le début et la fin !
Mon p
Devos)

Cherche dans ce sens.

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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Jeu 13 Oct 2011, 22:05

oui ça je comprends (je n'ai pas le premier morcea et la dernier )
comme par hazard je suis tombé sur cette resultats
sinon les autre resultats sonts pas correct
par example :

printf("\nLe position vaut : %d",position);

Le position vaut : 16
Le position vaut : 2
Le position vaut : 3
Le position vaut : 16
Le position vaut : 5
Le position vaut : 6
Le position vaut : 7
Le position vaut : 8
Le position vaut : 9
Le position vaut : 10
Le position vaut : 11
Le position vaut : 12
Le position vaut : 16
Le position vaut : 14
Le position vaut : 15
Le position vaut : 16
Le position vaut : 17
Le position vaut : 18
Le position vaut : 19
Le position vaut : 20
Le position vaut : 21
Le position vaut : 16
Le position vaut : 23
Le position vaut : 24
Le position vaut : 25


et

Le position vaut : 8
Le position vaut : 2
Le position vaut : 3
Le position vaut : 4
Le position vaut : 5
Le position vaut : 6
Le position vaut : 7
Le position vaut : 8
Le position vaut : 9
Le position vaut : 10
Le position vaut : 11
Le position vaut : 12
Le position vaut : 13
Le position vaut : 14
Le position vaut : 15
Le position vaut : 8
Le position vaut : 8
Le position vaut : 18
Le position vaut : 8
Le position vaut : 20
Le position vaut : 8


et printf("%c",*(ptr_c+j));
Une heure d'ascension dans les montagnes fait d'un gredin et d'un saint deux
créatures à peu près semblables. La fatigue est le plus court chemin vers
l'égalité, vers la fraternité. Et durant le sommeilUne heure d'ascensis'ajoute la liberté.
(Nietzsche)


et
rien ne fonctiquand on sait tout et que rien ne fonctionne.
La pratique c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne,
... et personne ne sait pourquoi !rien ne fonctirien ne foncti
(Arien ne fonctilbrien ne foncti



épasied droit est jaloux de mon pied gauche.
Quand l'un avance l'autre veut le dépasépasser.
Et moi, comme un imbécile, je marche!
(Répasayépasnd


comme vous voyez il y a un morceau qui repète à plusieur endroit
je le cherche l'erreur mais pas toujour réussi Smile
vous avez une idée ..?

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Jeu 13 Oct 2011, 22:50

didi a écrit:
(...)
vous avez une idée ..?
Oui !

Spoiler:

Tu devrais commencer par :
o-bien comprendre l'énoncé,
o-mettre ton code en ordre, à savoir :
-- une bonne indentation ;
-- une instruction par ligne ;
-- un commentaire pour expliquer ce que l'instruction est sensée faire.

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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Jeu 13 Oct 2011, 23:32

Merci pour la (idée) remarque Smile

Code:

void *ptr_g = getTexte04();
unsigned short *ptr_off,offset; /*ptr_of : pointer pour pointer vers
                                          @ d'offset et  offset : pour conserver le contenu de  ptr_off */
unsigned char *ptr_pos,position; /*ptr_pos : pointer pour pointer vers 
                                          @d'position et  position : pour conserver le contenu de  ptr_pos*/
char *ptr_c,*ptr_depart;  /*ptr_c : pour avancer dans les mot  et
                                    ptr_depart : pour conserver le @ de depart*/
int nbMorceau=1,j,i; :resolu:
unsigned char *ptr_long,longuer;

        /*  ici je parcour la zone memoir (usqu' à la fin c-à-d jusqu'a ce qu'il trouve un offset = 0)
            pour trouver combien de morceux qu'il a c-à-d les contenus de ptr_pos != 0
            et je compte donc j'incremente le nbMorceau */
           
        ptr_depart = (char*) ptr_g;
   ptr_off = (unsigned short *)ptr_depart;
   offset = (*ptr_off);
        while(offset != 0)    {
      ptr_c = ptr_depart;
      ptr_c = ptr_c+offset;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_off++;
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
      if(position != 0)   {
         nbMorceau++;
           }

   }

/* une fois que j'ai trouvé que combien de morceaux qu'il a je les affiche dans l'ordre
    c-à-d quand i = 1,2,3 ...,n je parcour la zone memoir jusqu'à ce que je trouve une position
    qui est égale à  i et je l'affiche
  chaque fois i est incrementé je parcour la zone memoir à partir son depart */
 
      for(i = 1; i <= nbMorceau; i++)   {
   while((offset != 0) && (position != i))   {
           ptr_c = ptr_depart+offset;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_off++;
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
   }
              /* quand je sort de la boucle while mnt la ptr_pos pointe bien
                  la position i que je doit afficher (i ième morceau
                  et j'vance dans les pointer pour recuperer les infos et j'affiche le mot */
                ptr_pos++;
      ptr_long = ptr_pos;
      longuer = *ptr_long;
      ptr_long++;
      ptr_c = (char *)ptr_long;
      for(j = 0; j < longuer;j++)   {
          printf("%c",*(ptr_c+j));
      }
        /* je parcour la zone à partir de son debut */
           ptr_c = ptr_depart;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
   }

   return EXIT_SUCCESS;
}

demandez encore si encore les explications qui manques
merci Smile


Dernière édition par didi le Sam 15 Oct 2011, 14:36, édité 1 fois

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Ven 14 Oct 2011, 09:28

Je répète : tu ne traites pas correctement la première séquence !

Il y a également des erreurs dans la boucle for qui suit et dans la boucle while incluse.

Attention ! Ce sera d'ailleurs modifié pour cette année. Les numéros de morceaux ne constituent pas une suite continue. En effet, les morceaux "vides" ont reçu un numéro qui a été remplacé par 0. On peut donc avoir une suite de numéros qui présente des "trous". Ce sera modifié pour cette année.


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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Ven 14 Oct 2011, 22:50

desolé monsieur j'arrive pas encore terminer cette exercise Sad Sad
je viens de corriger comme vous avez dit

nbMorceau doit être initialisé à 0 et pas à 1
- ton while initial n'est pas correct
- quand le pgm entre dans le for, offset vaut 0 donc le while inclus n'est pas exécuté la 1ière fois
et le code corrigé :

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "smb05.h"
#include "libStand.h"

int main(void) {
        void *ptr_g = getTexte04();
   unsigned short *ptr_off,offset;
   unsigned char *ptr_pos,position;
   char *ptr_c,*ptr_depart;
   int nbMorceau=0,j,i;
   unsigned char *ptr_long,longuer;


   ptr_depart = (char*) ptr_g;
   ptr_off = (unsigned short *)ptr_depart;
   offset = (*ptr_off);


   while(offset != 0)    {
      ptr_c = ptr_depart;
      ptr_c = ptr_c+offset;
      ptr_off = (unsigned short *)ptr_c;
      offset = (*ptr_off);
      ptr_off++;
      ptr_pos = (unsigned char *)ptr_off;
      position = *ptr_pos;
      if(position != 0)   {
         nbMorceau++;
           }

   }
   
   for(i = 1; i <= nbMorceau; i++)   {
      offset = 0;
      position = 0;
/* ici si je ne met pas de condition (offset != 0) il y un erreur d'execution */
      while((position != i))   {
         ptr_c = ptr_depart+offset;
         ptr_off = (unsigned short *)ptr_c;
         offset = *(ptr_off);
         ptr_off++;
         ptr_pos = (unsigned char *)ptr_off;
         position = *ptr_pos;
      }
      ptr_pos++;
      ptr_long = ptr_pos;
      longuer = *ptr_long;
      ptr_long++;
      ptr_c = (char *)ptr_long;
      for(j = 0; j < longuer;j++)   {
            printf("%c",*(ptr_c+j));
      }
   }
   return EXIT_SUCCESS;
}


au début du for
position=0;offset=0;
while((position != i)) {
etc...

ici si je ne met pas de condition (offset != 0) il y un erreur d'execution mais le resultat et correct et pas complet
si je met cette condition resultat n'est pas correct et je n'ai pas d'erreur d'execution ..

et le resultat sont :

La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne,
... et personne ne sait pourquoi !


et

Mon pied droit est jaloux de mon pied gauche.
Quand l'un avance l'autre veut le d


et enfin cette phrase est bien pas d'erreur d'execution
mais pour afficher la dernier morceau (Nietzsche) je doit modifier i comme : for(i = 1; i <= nbMorceau+1; i++)

Une heure d'ascension dans les montagnes fait d'un gredin et d'un saint deux
créatures à peu près semblables. La fatigue est le plus court chemin vers
l'égalité, vers la fraternité. Et durant le sommeil, s'ajoute la liberté.


et merci encore pour votre aide Smile

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Sam 15 Oct 2011, 09:38

didi a écrit:
(...)
et le resultat sont :

La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne,
... et personne ne sait pourquoi !


(...)

Il semblerait que tu n'aies pas utilisé la nouvelle libsmb05.a que je t'ai envoyée, car dans cette librairie, le mot Rien devient rien , qui commence par une minuscule !

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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  didi le Sam 15 Oct 2011, 13:15

enfin avec la nouvelle libsmb05.a ça le code fonctionne bien sans erreur d'execution et bon resultat
merci bcp monsieur SMB
(mais pourqoui mon code fonctionne pas avec la vielle librarie libsmb05.a ..? )

didi

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

Revenir en haut Aller en bas

resolu Re: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  smb le Sam 15 Oct 2011, 13:32

didi a écrit:enfin avec la nouvelle libsmb05.a ça le code fonctionne bien sans erreur d'execution et bon resultat
merci bcp monsieur SMB
(mais pourqoui mon code fonctionne pas avec la vielle librarie libsmb05.a ..? )

Parce que dans la librairie de l'année passée, pour cet exercice, les numéros de morceaux ne constituaient pas une suite arithmétique de raison 1 et commençant à 1. En effet, les morceaux "vides" qui avaient reçu un numéro de morceaux ont vu ce numéro remplacé par 0. On pouvait donc avoir une suite de numéros qui présentait des "trous". Ce qui a été modifié dans la librairie que tu as reçue. (déjà dit plus haut)

Si tu es satisfait, indique que ce sujet est résolu !

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: TDC_5 EX15 : Retrouvez les morceaux en pagaille dans la zone

Message  Contenu sponsorisé Aujourd'hui à 10:50


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