labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

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

resolu labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Jeu 10 Nov 2011, 17:32

j'ai fait l'exercice 15 ce qui est bizarre ce qu'il marche on va dire une fois sur 8 ou à peu près et sans que j'aie changé quoi que ça soit
bref souvent ça marche pas et parfois ça marche.
les 3 differents textes que j'ai su voir après plusieurs séries de "clean projet" "build projetct" sont ceux ci (remarquez la bizarrerie à la fin du deuxième texte que je n'ai vu qu'une seule fois)

Mon pied 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 Devos]

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 !
[Albert Einstein]
LOCALAPPDATA=C:\Users\aimedollar\AppData\Local

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é.
[Nietzsche]

Quelqu'un a une idée de ce comportement bizarre? personnellement je pense que lorsque getTexte04() renvoie un pointeur vers une zone de texte autre ceux là (zone de texte façon de parler mais vous me comprenez) c là que j'ai un problème......???



Dernière édition par karemkadidola le Sam 12 Nov 2011, 03:37, édité 1 fois

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  smb le Jeu 10 Nov 2011, 17:41

Ils sont beaux ces textes, non ?

Mais ce n'est pas en voyant les résultats qu'on devinera le problème que tu rencontres !

[edt]
Tiens, on dirait qu'il manque un texte, car il y a en fait 4 textes possibles pour getTexte04 !

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: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Ven 11 Nov 2011, 01:22

Les textes sont magnifiques en effet..

voici la partie du code qui traite l'exercice 15

j'ai ajouté dans smb05.h cette structure

typedef struct {
unsigned char position;
unsigned char longueur;
char* ptrchar;
} infoSequence ;


Code:

        int i,j,cpt;
   unsigned char*ptrpos;
   unsigned short *ptroffset,offset;
   infoSequence *ptrInfoSequence,*refptrinfseq;
   char *refptrdep,*ptrdepart,*ptrcharinfseq;
   void *ptrgenerique;
     
        cpt=1; // au minimun j'aurais une sequence

   ptrgenerique = getTexte04();

   ptrdepart=(char*)ptrgenerique;

   refptrdep=ptrdepart;/*ici je sauvegarde mon pointeur depart (debut de la zone)*/

   ptroffset=(unsigned short*)refptrdep; // pour pourvoir lire les deux premiers byte contenant l'offset

   offset= *ptroffset;

   while (offset!=0){

      refptrdep=ptrdepart; // je retourne au départ

      refptrdep+=offset; // je vais au premier byte de la sequence suivante

      ptroffset=(unsigned short*)refptrdep; //je caste pour lire les deux premiers byte contenant l'offset

      offset= *ptroffset;

      cpt++; //j'incremente le nombre de sequence
   }

   ptrInfoSequence= malloc (cpt*sizeof(infoSequence)); //j'alloue la mémoire
        nécessaire pour la zone contenant les struct infosequence//

        if(ptrInfoSequence==NULL)

                exit(1);

   refptrinfseq=ptrInfoSequence;//je sauvergarde le début de cette zone

   for (i=0;i<cpt;i++){
      refptrdep=ptrdepart; //je retourne au debut de la zone contenant les sequences

      refptrdep+=offset; //quand i vaut 1 offset vaut 0 mais après ça ne sera pas le cas

      ptrpos=(unsigned char*)refptrdep;// je caste en unsigned char* pour pouvoir lire la position et la longueur

      ptrpos+=2;//j'avance de deux bytes pour me retrouver exactement où se trouve la position du morceau de texte

      ptrInfoSequence->position=*ptrpos;

      ptrpos++;// j'avance encore d'un byte pour être à l'endroit où il y a la longueur du morceau de texte

      ptrInfoSequence->longueur=*ptrpos;

      if ((*ptrpos!=0)){ //si position est different de zéro j'alloue la mémoire où je vais aller stocket le morceau texte

         ptrInfoSequence->ptrchar= malloc ((*ptrpos)*sizeof(char)+1);//j'ajoute un byte en plus pour mettre le '\0'

                        if(ptrInfoSequence->ptrchar==NULL)
         
                                      exit(1);

         ptrcharinfseq=(char*)ptrpos;//je caste en ptr de char* pour lire les char

         ptrcharinfseq++;//comme j'étais encore à la zone longueur j'avance d'un byte pour etre sur le premier char

         for (j=0;j<ptrInfoSequence->longueur;j++){

            ptrInfoSequence->ptrchar[j]=*ptrcharinfseq;//je remplis la zone de texte au fur à mesure

            ptrcharinfseq++;

         }
         ptrInfoSequence->ptrchar[j]='\0';//quand je quitte la boucle j'ajoute mon backslash 0
      }

      ptrInfoSequence++;//je passe à la case suivante de ma zone infosequence

      refptrdep=ptrdepart;//je retourne au début de la zone des sequences

      refptrdep+=offset;//j'avance de autant d'offset

      ptroffset=(unsigned short*)refptrdep;

      offset=*ptroffset;//ici je sauvergarde l'offset de la prochaine sequence
   }
   ptrInfoSequence=refptrinfseq; //retour au debut de la zone infosequence

   for (i=1;i<cpt-1;i++){

      while (ptrInfoSequence->position!=i){ //tant que je n'ai pas encore le numéro adéquat du morceau à afficher je boucle

         ptrInfoSequence++;
      }
      printf("%s",ptrInfoSequence->ptrchar);//j'affiche le morceau

      ptrInfoSequence=refptrinfseq;// je retourne au debut de la zone

   }
   ptrInfoSequence=refptrinfseq;//retour au debut de la zone

   for (i=0;i<cpt;i++){je libère d'abord toutes les zones où j'ai sauvegarder les morceaux de texte

      free(ptrInfoSequence->ptrchar);

      ptrInfoSequence->ptrchar=NULL;

      ptrInfoSequence++;
   }
   free(ptrInfoSequence);// je libère enfin infosequence

   ptrInfoSequence=NULL;

   free(ptrgenerique);//je libère la zone que getTexte04() crée

   ptrgenerique=NULL;

   return EXIT_SUCCESS;
}

comme vous le constatez j'ai rajouté les commentaires juste ici sur le forum pour la clarté sinon sous cette forme là rien ne compile evidemment..


Dernière édition par karemkadidola le Ven 11 Nov 2011, 02:20, édité 2 fois

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Ven 11 Nov 2011, 02:04

smb a écrit:
[edt]
Tiens, on dirait qu'il manque un texte, car il y a en fait 4 textes possibles pour getTexte04 !

en réalité je dirais que c'est deux textes qui ne veulent pas s'afficher chez moi en tout cas car sur plus de 100 essaies que j'ai fait pour voir s'afficher parfois un texte parfois un plantage c'est chaque fois le texte de raymond Davos et Nietzsche qui sont apparues et juste une seule fois celui d'albert einstein qui d'ailleurs s'est vu rajouter des choses en plus (de mon système)..bref je crois que c'est les deux textes restants qui posent problème si ce n'est mon code bien entendu..
P.S pour compiler et tester le code il faut juste virer les commentaires...

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  smb le Ven 11 Nov 2011, 08:20

As-tu réfléchi à la possibilité qu'il n'y ait qu'une seule séquence Question
Que fait ton code dans ce cas Question

Le texte qui te manque tombera bien à propos ! 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: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Ven 11 Nov 2011, 13:28

J'ai pensé à ce cas en effet c pour ça que j'initialise "cpt" (sensé me donner le nombre d séquences) à 1 donc si il y a juste une séquence je ne rentre pas dans le "tant que offset != 0" puisqu il sera à 0 à ce moment là et coe cpt est à 1 je saurai que j ai juste une séquence et le reste du code continue normalement...

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  smb le Ven 11 Nov 2011, 16:13

Ah bon !

Et le code du for après ce test

Code:
for (i=1; i<cpt-1; i++)

il est exécuté quand cpt vaut 1 ?

Si cpt traduit bien exactement le nombre de séquences reprises dans ton tableau je doute de l'exactitude du test !

[edt]
Je dirais même plus : je doute de l'exactitude du contenu du code contenu dans le bloc qui suit ce for !

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: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Ven 11 Nov 2011, 23:14

Vous avez entièrement raison seulement si cpt vaut 1 au pire de cas il ne rentre pas dans le for et il n'affiche aucun texte néanmoins j'ai essayé de traiter ce cas séparément et j'ai pu voir un petit texte en plus
"Eurêka!
[Archimède]"
je crois ce mon code qui a un problème quelque part, je vais le revoir encore tranquillement. sinon merci pour toute l'aide.

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Ven 11 Nov 2011, 23:57

smb a écrit:

Code:
for (i=1; i<cpt-1; i++)

Si cpt traduit bien exactement le nombre de séquences reprises dans ton tableau je doute de l'exactitude du test !

[edt]
Je dirais même plus : je doute de l'exactitude du contenu du code contenu dans le bloc qui suit ce for !

sinon pour clore ce sujet jugez plutot de ce résultat et vous compredrez le pourquoi de ce for qui je vous l'accorde semble être faux..
j'explique:
Le tout premier chiffre tout en haut est la valeur du cpt (nombre de sequence/morceaux de texte) et ce que je fais c'est qu'avant d'afficher un morceau j'affiche d'abord sa position par un " pos:%d " vu que j'ai ma struct infosequence qui stocke "longueur, position, et le morceau de texte en soi
voici le resultat;

27
pos:1 Une heure d'ascensi pos:2 on dans les montagn pos:3 es fait d'un gredin pos:4 et d'un saint deux pos:5
créatures à peu pos:6 près semblables. pos:7 La fatigue est le pos:8 plus court chemin pos:9 vers
l'égalité, pos:10 vers la fraterni pos:11 té. Et pos:12 durant pos:13 le pos:14 sommeil pos:15 , pos:16 s' pos:17 a pos:18 j pos:19 oute pos:20 la pos:21 l pos:22 i pos:23 be pos:24 rté.
pos:25 [Nietzsche]

27
pos:1 Mon p pos:2 ied pos:3 droit est pos:4 jaloux de mon pos:5 pied gau pos:6 che.
pos:7 Q pos:8 u pos:9 and pos:10 l'un avance pos:11 l'autre pos:12 veut le d pos:13 épas pos:14 ser.
pos:15 Et moi pos:16 , c pos:17 omme un imbé pos:18 cile, je marche!
pos:19 [ pos:20 R pos:21 ay pos:22 mo pos:23 nd pos:24 De pos:25 vos]

1
pos:1 Eurêka!
[Archimède]

Voilà pour 27 sequences il n'y a que 25 morceaux de texte (comme je test avec un "tant que ptrInfoSequence->position!=i" pour avoir l'affichage des morceaux en ordre) il suffit que i arrive à 26 qu'il ne trouvera jamais la position correspondante et va cycler, j'ai remarqué ça en débuggant c'est pour cela que j'ai "traffiquer" le for..Au vu de tout ceci n'y a t il pas possibilité que le problème vienne plutot "des morceaux de texte"???





karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Sam 12 Nov 2011, 03:30

je viens de trouver la source de mon problème (c'est moi même) en effet je ne faisais rien quand la séquence était de longuer 0 et position 0 le texte que je ne voyais pas par exemple a 27 séquences dont 6 de longueur 0 et dans mon "tant que ptrInfoSequence->position!=i " il suffisait que i atteigne 22 pour que ça crash la plus grande position du moreau étant à 21 Merci mr smb de m'avoir mis sur la voie, maintenant tout marche nickel Laughing

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  smb le Sam 12 Nov 2011, 09:12

Super !

Mais n'as-tu pas oublié d'éviter de libérer des espaces non alloués lorsque la longueur est 0 ?

Code:
free(ptrInfoSequence->ptrchar);

... ne peut se faire que lorsqu'un malloc a bien eu lieu (sauf si mise préliminaire à NULL).

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: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  karemkadidola le Sam 12 Nov 2011, 15:45

au fait ce que j'ai du refaire c'est si longueur !=0 j'allouais l'espace nécessaire pour stocker le morceau (bon ça je le faisais déjà avant) j'ai rajouté un "sinon" j'allouais quand même un espase de 5 fois la taille d'un char" et dedans je mettais le string "VIDE" pour chaque "si" j'incrementais un compteur et pour chaque "sinon" j'incrementais un autre compteur c'est comme ça qu'à la fin je pouvais savoir combien y a de morceau vide et non vide et construire "mon printf()" en conscéquence bref le "free" marche bien puisque pour autant de séquence "vide ou pas" j'alloue quand même la mémoire... sinon la remarque était très bien vu...comme vos remarques précèdentes d'ailleurs...moralité de l'histoire "Vous êtes très bon.." cheers

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: labo C td 5 exercice 15 COMPORTEMENT TRES BIZARRE

Message  Contenu sponsorisé Aujourd'hui à 20:42


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