interro n°1 : 24 novembre 2010[c]

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

interro n°1 : 24 novembre 2010[c]

Message  didi le Mer 16 Nov 2011, 22:33

voila j'ai commencé cette interro

La fonction const void * info(const void * *) réserve et remplit une zone mémoire.
Elle stocke dans le pointeur générique dont l'adresse lui est fournie en argument l'adresse du premier
octet de cette zone et retourne l'adresse du premier octet au delà de la zone.

Cette zone est constituée d'un certain nombre de sous-zones contigües. Au sein d'une sous-zone, il n'y
a pas de trou. Chacune reprend des données relatives à un livre traitant des langages C ou C++. De
manière plus précise, les sous-zones sont toutes construites selon le modèle :

1. un unsigned short pour indiquer la longueur du titre ;
2. des char pour fournir le titre : leur nombre est fourni par l'unsigned short précédent,
attention, il n'y a pas de '\0' final ;
3. un unsigned char pour indiquer le nombre d'auteurs ;
4. autant de const char * qu'il y a d'auteurs : chacun de ces pointeurs pointe vers une chaîne
de caractères qui correspond au nom d'un des auteurs, ces chaînes existent pendant toute la
durée du programme ;
5. une Date (voir typesCommuns.h) pour donner la date de publication ;
6. un ensemble de char qui représentent sous la forme d'une chaîne de caractères la nombre de
pages.


et je parcours la zone mémmoire en premier temps je fait que l'affichage (pour tester )


mais j'ai d'erreur d'execution ..
Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "bibliotheque.h"

int main(void) {
   const void *ptr_info,*ptr_zone;
   unsigned short *ptr_lTitre,longTitre;
   char *ptr_page,*fin,*courant;
   unsigned char *ptr_nbAut,nbAuteur;
   char **ptr_nomAuter;
   Date *date;
   int i,page;
   ptr_info = info(&ptr_zone);
   fin = (char *)ptr_info;
   courant = (char*)ptr_zone;
   ptr_lTitre = (unsigned short *)ptr_zone;
   while( &courant != &fin)   {
      ptr_lTitre = (unsigned short *)courant;
      longTitre = *ptr_lTitre;
      ptr_lTitre++;
      courant = (char *)ptr_lTitre;
      printf("\nLe titre de livre est  : ");
      for(i=0; i< longTitre;i++)   {
         printf("%c",*(courant+i));
      }
      courant = courant+i;
      ptr_nbAut = (unsigned char *)courant;
      nbAuteur = *ptr_nbAut;
      ptr_nbAut++;
      ptr_nomAuter = (char **)ptr_nbAut;
      printf("\nle nombre d'auter est : %d",nbAuteur);
      for(i=0;i < nbAuteur;i++)   {
         printf("\nLa Auteur est : %s",*ptr_nomAuter);
         ptr_nomAuter++;
      }
      date = (Date *)ptr_nomAuter;
      printf("\nla Date vaut : %02d / %02d / %d ",date->jour,date->mois,date->annee);
      date++;
      ptr_page = (char *)date;
      page = atoi(ptr_page);
      printf("\nLe nombre de pages vaut : %d",page);
      courant = ptr_page + strlen(ptr_page)+1;

   }
   ptr_info = info(NULL);
   return EXIT_SUCCESS;
}

ça m'affiche :

Le titre de livre est : C++ in a Nutshell
le nombre d'auter est : 1
La Auteur est : Ray Lischner
la Date vaut : 26 / 06 / 2003
Le nombre de pages vaut : 704
Le titre de livre est : The C++ Standard Library: A Tutorial and Reference
le nombre d'auter est : 1
La Auteur est : Nicolai M. Josuttis
la Date vaut : 12 / 08 / 1999
Le nombre de pages vaut : 832
Le titre de livre est : More Effective C++: 35 New Ways to Improve Your Programs and Designs
le nombre d'auter est : 1
La Auteur est : Scott Meyers
la Date vaut : 29 / 12 / 1995
Le nombre de pages vaut : 336
Le titre de livre est : Le langage C : Norme ANSI (2e édition)
le nombre d'auter est : 2
La Auteur est : Brian W. Kernighan
La Auteur est : Dennis M. Ritchie
la Date vaut : 11 / 10 / 2004
Le nombre de pages vaut : 280
Le titre de livre est : C++ GUI Programming with Qt 4 (2nd Revised edition)
le nombre d'auter est : 2
La Auteur est : Jasmin Blanchette
La Auteur est : Mark Summerfield
la Date vaut : 04 / 02 / 2008
Le nombre de pages vaut : 752
Le titre de livre est : The Book of Qt 4: The Art of Building Qt Applications
le nombre d'auter est : 1
La Auteur est : Daniel Molkentin
la Date vaut : 29 / 03 / 2007
Le nombre de pages vaut : 440
Le titre de livre est : Effective C++: 55 Specific Ways To Improve Your Programs And Designs (3rd Revised edition)
le nombre d'auter est : 1
La Auteur est : Scott Meyers
la Date vaut : 12 / 05 / 2005
Le nombre de pages vaut : 320
Le titre de livre est : Programmation Principes et pratique avec C++
le nombre d'auter est : 1
La Auteur est : Bjarne Stroustrup
la Date vaut : 17 / 07 / 2010
Le nombre de pages vaut : 1000
Le titre de livre est : Langage C (2e édition)
le nombre d'auter est : 1
La Auteur est : Claude Delannoy
la Date vaut : 11 / 12 / 2008
Le nombre de pages vaut : 936
Le titre de livre est : C in a Nutshell
le nombre d'auter est : 2
La Auteur est : Peter Prinz
La Auteur est : Tony Crawford
la Date vaut : 03 / 01 / 2006
Le nombre de pages vaut : 624
Le titre de livre est : Stl Tutorial and Reference Guide: C++ Programming With the Standard Template Library (2nd Revised edition)
le nombre d'auter est : 3
La Auteur est : David R. Musser
La Auteur est : Atul Saini
La Auteur est : Gillmer J. Derge
la Date vaut : 27 / 03 / 2001
Le nombre de pages vaut : 560
Le titre de livre est : Apprendre le C++
le nombre d'auter est : 1
La Auteur est : Claude Delannoy
la Date vaut : 02 / 10 / 2008
Le nombre de pages vaut : 759
Le titre de livre est : Le langage C++ (2nd Revised edition)
le nombre d'auter est : 1
La Auteur est : Bjarne Stroustrup
la Date vaut : 06 / 06 / 2004
Le nombre de pages vaut : 1100
Le titre de livre est : Effective Stl: 50 Specific Ways to Improve Your Use of the Standard Template Library
le nombre d'auter est : 1
La Auteur est : Scott Meyers
la Date vaut : 06 / 06 / 2001
Le nombre de pages vaut : 288
Le titre de livre est : (ici j'arrive pas les copier coller Very Happy )



merci d'avance Smile


Dernière édition par didi le Sam 19 Nov 2011, 10:38, édité 2 fois

didi

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  nvs le Mer 16 Nov 2011, 23:19

la condition de continuation du while est peut-être erronée...






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

Re: interro n°1 : 24 novembre 2010[c]

Message  didi le Mer 16 Nov 2011, 23:36

Merci encore Smile

j'ai modifier le while( courant != fin) ça marche et
j'ai encore besoin d'explication sur

1, remplissez un tableau dynamique de Livre
je doit declarer un Tableau de livre (donc j'ai besoin de connaitre sa taille (nombre d'element)) ou un pointer de Livre ..?


2,La taille du tableau doit être déduite au fur et à mesure de l'exploration de la zone
( .. .? je ne comprend pas bien Question bon si j'ai un *Livre .. j'alloue la mémoire au fur à mesure mais doit être déduite au fur et à mesure ..?

3, Les informations relatives aux auteurs ne doivent pas être clonées,
( .. .? je ne comprend pas bien Question )



merci de me repondre Smile

didi

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  pbt le Jeu 17 Nov 2011, 08:29

(N'oublie pas de ne pas crier dans le titre (crier = écrire en majuscule) et d'y indiquer le cours concerné entre []. Merci)

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Jeu 17 Nov 2011, 12:03

didi a écrit:Merci encore Smile

j'ai modifier le while( courant != fin) ça marche et
j'ai encore besoin d'explication sur

1, remplissez un tableau dynamique de Livre
je doit declarer un Tableau de livre (donc j'ai besoin de connaitre sa taille (nombre d'element)) ou un pointer de Livre ..?


2,La taille du tableau doit être déduite au fur et à mesure de l'exploration de la zone
( .. .? je ne comprend pas bien Question bon si j'ai un *Livre .. j'alloue la mémoire au fur à mesure mais doit être déduite au fur et à mesure ..?

3, Les informations relatives aux auteurs ne doivent pas être clonées,
( .. .? je ne comprend pas bien Question )
merci de me repondre Smile

1. et 2. vont de pair. Si tu utilises realloc pour le tableau dynamique chaque fois que tu explores une sous-zone concernant 1 livre c'est bon.

3. Tu ne peux pas faire des copies des noms des auteurs, tu dois juste conserver l'adresse des chaînes qui comme c'est dit dans l'énoncé "existent pendant toute la durée du programme ;"

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Ven 18 Nov 2011, 08:14

j'ai jetté un coup d'oeil sur cette intérro là mais c'est abusé dites moi comment on fait pour finir une interro comme ça en seulement deux heures (en situation de stress d'intérro) déjà pour lire et comprendre toute l'ennoncé ça vous prends Dieu seul sait combien de temps.... [Moralité] c'est vraiment pas encourageant tout ça....[/finMorarilé]

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Ven 18 Nov 2011, 09:17

karemkadidola a écrit:j'ai jetté un coup d'oeil sur cette intérro là mais c'est abusé dites moi comment on fait pour finir une interro comme ça en seulement deux heures (en situation de stress d'intérro) déjà pour lire et comprendre toute l'ennoncé ça vous prends Dieu seul sait combien de temps.... [Moralité] c'est vraiment pas encourageant tout ça....[/finMorarilé]

Je crois que ceux qui ont fait tous les TD individuellement et consciencieusement n'ont aucune crainte à avoir, d'autant qu'il est permis d'utiliser ses codes.

Il est vrai cependant que c'est parfois long.

Et puis, ne dit-on pas :

"A vaincre sans péril on triomphe sans gloire." [Pierre Corneille, Le Cid, II, 2]

Ou pour les guindailleurs :
"A vaincre sans baril, on triomphe sans boire !"

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Ven 18 Nov 2011, 19:57

smb a écrit:

" [Pierre Corneille, Le Cid, II, 2]
bon pour l'intérro on va essayer d'avoir du coeur [Pierre Corneille, Le Cid, Acte I, scène 5, vers 261 à 290 Rodrigue as tu du coeur? tout autre que mon père l'eprouverait sur l'heure...] cours, vole ,va et nous venge...

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Ven 18 Nov 2011, 20:38

karemkadidola a écrit:
smb a écrit:

" [Pierre Corneille, Le Cid, II, 2]
bon pour l'intérro on va essayer d'avoir du coeur [Pierre Corneille, Le Cid, Acte I, scène 5, vers 261 à 290 Rodrigue as tu du coeur? tout autre que mon père l'eprouverait sur l'heure...] cours, vole ,va et nous venge...

... les experts ont raison : il y a beaucoup de "qualité" à l'ESI Wink ...
... et question d'avoir du coeur, on verra ce qu'on peut faire Smile

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 09:21

Code:
   ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));
      if (ptrlivre==null){
         free((void*)ptrvoiddebutzone);
         free(saveptrlivre);
         saveptrlivre=null;
         ptrvoiddebutzone=null;
         exit (-1);
      }

voici un bout de code qui dans l'interro bibliotheque pose problème, je fais un realloc au fur à mesure que j'entamme une sous zone (dans un tant que) mon malloc ayant été fait avant le "tant que" mais en debuggant j'ai vu que je quitte le programme exit (-1); chaque fois quand i vaut 2 mon i débute à 0, quelqu'un aurait une idée..c curieux que la réallocation echoue seulement quand i vaut 2 Evil or Very Mad

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 09:57

si je fais ceci "Livre ptrlivre[150]" Tout marche bien...

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  nvs le Sam 19 Nov 2011, 11:08

karemkadidola a écrit:
Code:
   ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));
      if (ptrlivre==null){
         free((void*)ptrvoiddebutzone);
         free(saveptrlivre);
         saveptrlivre=null;
         ptrvoiddebutzone=null;
         exit (-1);
      }

voici un bout de code qui dans l'interro bibliotheque pose problème, je fais un realloc au fur à mesure que j'entamme une sous zone (dans un tant que) mon malloc ayant été fait avant le "tant que" mais en debuggant j'ai vu que je quitte le programme exit (-1); chaque fois quand i vaut 2 mon i débute à 0, quelqu'un aurait une idée..c curieux que la réallocation echoue seulement quand i vaut 2 Evil or Very Mad
d'une part, je suis étonné que cela compile avec null plutôt que NULL. d'autre part, realloc ne fonctionne bien, c'est-à-dire n'exhibe pas un comportement indéterminé, qu'avec NULL ou le résultat d'une allocation mémoire (retour de malloc, calloc ou realloc) en premier argument -- comme free en fait. dans l'extrait de code que tu montres, on ne voit pas ce que tu fais par ailleurs avec ptrlivre et qui, je suis prêt à le parier, est source de tes tourments Smile







alien

_________________

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 11:59

il y a un define null 0 (j'ai plus facile à écrire null que NULL)..voici le code complet qui pose problème juste quand i vaut 2 bizarre bizarre..

Code:
/*
 ============================================================================
 Name        : bibliotheque.c
 Author      : ponda mali
 Version    :
 Copyright  : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#define null 0
#include "typescommuns.h"
#include "bibliotheque.h"
#include "fctBibliotheque.h"
#include <string.h>

int main(void) {
   const void *ptrvoiddebutzone, *ptrvoidfinzone;
   Livre *ptrlivre = null,*saveptrlivre=null;
   USHORT *ptrushort = null, unushort;
   char *ptrchardebutsouszone=null,*ptrcharfinzone=null;
   UCHAR *ptruchar = null, unuchar;
   Date *ptrdate= null;
   int i=0,j=0,cpt=0;
   const char **ptrptrconstchar,*ptrconstchar;

   ptrvoidfinzone = info(&ptrvoiddebutzone);
   ptrcharfinzone=(char*)ptrvoidfinzone;
   ptrchardebutsouszone=(char*)ptrvoiddebutzone;

   ptrlivre = malloc (sizeof(Livre));/*1er malloc en dehors de la boucle TantQue*/
   if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
   }
   saveptrlivre=ptrlivre;/*je sauvegarde mon ptrlivre*/
   while ((ptrchardebutsouszone)!=(ptrcharfinzone)){
      ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));/*je fais des realloc dans la boucle*/
      if (ptrlivre==null){
         info(null);/*je libère la zone*/
         free(saveptrlivre);/*je libère aussi la zone mem saveptrlivre*/
         saveptrlivre=null;
         ptrvoiddebutzone=null;/*necessaire ou pas?? pas dit dans l'enoncé*/
         exit (-1);
      }
      ptrlivre=saveptrlivre+i;/*je vais au bon indice pour remplir les donnees*/
      ptrushort= (USHORT*)ptrchardebutsouszone;
      unushort=*ptrushort;
      ptrchardebutsouszone+=2;
      for (j=0;j<unushort;j++){
         ptrlivre->titre[j]=*ptrchardebutsouszone;
         ptrchardebutsouszone++;
      }
      ptrlivre->titre[j]='\0';/*je n'oublie pas la marque de fin de string*/
      ptruchar=(UCHAR*)ptrchardebutsouszone;
      unuchar=*ptruchar;
      ptrlivre->nbAuteur=unuchar;
      ptrchardebutsouszone++;
      ptrptrconstchar=(const char**)ptrchardebutsouszone;
      for(j=0;j<10;j++){/*j'initialise tous les 1O ptr à null*/
         ptrlivre->auteur[j]=null;
      }
      for(j=0;j<unuchar;j++){/*pas de clonage*/
         ptrlivre->auteur[j]=*ptrptrconstchar;
         ptrptrconstchar++;
      }
      ptrdate=(Date*)ptrptrconstchar;
      ptrlivre->datePublication.jour=ptrdate->jour;
      ptrlivre->datePublication.mois=ptrdate->mois;
      ptrlivre->datePublication.annee=ptrdate->annee;
      ptrdate++;
      ptrchardebutsouszone=(char*)ptrdate;
      ptrlivre->nbPage=(USHORT)atoi(ptrchardebutsouszone);
      ptrchardebutsouszone+=strlen(ptrchardebutsouszone)+1;
      i++;
      cpt++;
   }
   ptrconstchar="_Le tableau de livres non triés :_\n";
   afficheTabLivre (ptrconstchar,ptrlivre,cpt);

   ptrlivre=saveptrlivre;
   free(ptrlivre);
   ptrlivre=null;
   info(null);


   return EXIT_SUCCESS;
}

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Sam 19 Nov 2011, 12:23

karemkadidola a écrit:



Code:

...
  ptrlivre = malloc (sizeof(Livre));/*1er malloc en dehors de la boucle TantQue*/
  if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
  }
  saveptrlivre=ptrlivre;/*je sauvegarde mon ptrlivre*/
  while ((ptrchardebutsouszone)!=(ptrcharfinzone)){
      ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));/*je fais des realloc dans la boucle*/
      if (ptrlivre==null){
        info(null);/*je libère la zone*/
        free(saveptrlivre);/*je libère aussi la zone mem saveptrlivre*/
        saveptrlivre=null;
        ptrvoiddebutzone=null;/*necessaire ou pas?? pas dit dans l'enoncé*/
        exit (-1);
      }
      ptrlivre=saveptrlivre+i;/*je vais au bon indice pour remplir les donnees*/
...
Personnellement, j'initialiserais ptrlivre à NULL plutôt que de faire un malloc avant d'entrer dans ta boucle !
De plus, je crois que tu ne comprends pas bien comment fonctionne realloc (va donc revoir la documentation et des exemples).
Je t'invite à laisser tomber saveptrlivre et à utiliser directement (ptrlivre+i)-> ou ptrlivre[i].

Pour le test
Code:
while ((ptrchardebutsouszone)!=(ptrcharfinzone)){
par précaution je mettrais < plutôt que !=

[edt]
Es-tu certains qu'il y a chaque fois 10 auteurs par livre dans chaque sous-zone ???

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 13:38

[quote="smb"]
karemkadidola a écrit:
[edt]
Es-tu certains qu'il y a chaque fois 10 auteurs par livre dans chaque sous-zone ???

Non je n'en suis pas certain, ce dont je suis certain ce qu'un livre possède bien un tableau de 10 ptr de const char. je commence par tous les mettre à null (comme demandé dans l'interro) et selon qu'il y a X auteurs je modifie les X premiers pointeurs...le vrai problème viendrait comme vous le dites d'une mauvaise utilisation de "realloc" mais après je ne vois où est ce que je l'utilise mal d'autant qu'il fait bien le realloc de
Code:
ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));
1*sizeof(Livre) puis 2*sizeof(Livre) mais à partir de 3*sizeof(Livre) problème...
cela étant j'ai bien appliqué les suggestions proposées à savoir (ptrlivre+i)-> au lieu de me servir d'un saveptrlivre et ptrlivre à NULL plutôt que de faire un malloc avant d'entrer dans ta boucle et aussi la première fois j'invoque realloc avec un ptrlivre qui vaut null ,ce qui a un comportement equivalent à malloc mais malgré tout ça..... je n'ai pas oublié de modifier la condition de test..(inférieur au lieu de different)Evil or Very Mad

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 13:55

code retouché selon suggestion Bon je crois le mieux c'est de passer à une autre interro hélas...
Code:
/*
 ============================================================================
 Name        : bibliotheque.c
 Author      : ponda mali
 Version    :
 Copyright  : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#define null 0
#include "typescommuns.h"
#include "bibliotheque.h"
#include "fctBibliotheque.h"
#include <string.h>

int main(void) {
   const void *ptrvoiddebutzone, *ptrvoidfinzone;
   Livre *ptrlivre = null;
   USHORT *ptrushort = null, unushort;
   char *ptrchardebutsouszone=null,*ptrcharfinzone=null;
   UCHAR *ptruchar = null, unuchar;
   Date *ptrdate= null;
   int i=0,j=0,cpt=0;
   const char **ptrptrconstchar,*ptrconstchar;

   ptrvoidfinzone = info(&ptrvoiddebutzone);
   ptrcharfinzone=(char*)ptrvoidfinzone;
   ptrchardebutsouszone=(char*)ptrvoiddebutzone;

   ptrlivre = null;/*1er malloc en dehors de la boucle TantQue*/
   if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
   }
   /*saveptrlivre=ptrlivre;je sauvegarde mon ptrlivre*/
   while ((ptrchardebutsouszone)<(ptrcharfinzone)){
      ptrlivre = realloc (ptrlivre,((i+1)*sizeof(Livre)));/*je fais des realloc dans la boucle*/
      if (ptrlivre==null){
         info(null);/*je libère la zone*/
         /*free(saveptrlivre);je libère aussi la zone mem saveptrlivre
         saveptrlivre=null;*/
         ptrvoiddebutzone=null;/*necessaire ou pas?? pas dit dans l'enoncé*/
         exit (-1);
      }
      /*ptrlivre=saveptrlivre+i;je vais au bon indice pour remplir les donnees*/
      ptrushort= (USHORT*)ptrchardebutsouszone;
      unushort=*ptrushort;
      ptrchardebutsouszone+=2;
      for (j=0;j<unushort;j++){
         (ptrlivre+i)->titre[j]=*ptrchardebutsouszone;
         ptrchardebutsouszone++;
      }
      (ptrlivre+i)->titre[j]='\0';/*je n'oublie pas la marque de fin de string*/
      ptruchar=(UCHAR*)ptrchardebutsouszone;
      unuchar=*ptruchar;
      (ptrlivre+i)->nbAuteur=unuchar;
      ptrchardebutsouszone++;
      ptrptrconstchar=(const char**)ptrchardebutsouszone;
      for(j=0;j<10;j++){/*j'initialise tous les 1O ptr à null*/
         (ptrlivre+i)->auteur[j]=null;
      }
      for(j=0;j<unuchar;j++){/*pas de clonage*/
         (ptrlivre+i)->auteur[j]=*ptrptrconstchar;
         ptrptrconstchar++;
      }
      ptrdate=(Date*)ptrptrconstchar;
      (ptrlivre+i)->datePublication.jour=ptrdate->jour;
      (ptrlivre+i)->datePublication.mois=ptrdate->mois;
      (ptrlivre+i)->datePublication.annee=ptrdate->annee;
      ptrdate++;
      ptrchardebutsouszone=(char*)ptrdate;
      (ptrlivre+i)->nbPage=(USHORT)atoi(ptrchardebutsouszone);
      ptrchardebutsouszone+=strlen(ptrchardebutsouszone)+1;
      i++;
      cpt++;
   }
   ptrconstchar="_Le tableau de livres non triés :_\n";
   afficheTabLivre (ptrconstchar,ptrlivre,cpt);


   free(ptrlivre);
   ptrlivre=null;
   info(null);


   return EXIT_SUCCESS;
}

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Sam 19 Nov 2011, 14:23

karemkadidola a écrit:code retouché selon suggestion Bon je crois le mieux c'est de passer à une autre interro hélas...
Code:

...
   ptrlivre = null;/*1er malloc en dehors de la boucle TantQue*/
   if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
   }
...

Tu t'étonnes que ton code s'arrête directement ?
Allons, un peu de sérieux !

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

Re: interro n°1 : 24 novembre 2010[c]

Message  nvs le Sam 19 Nov 2011, 14:43

avant que stéphan monbaliu te mette dans le droit chemin, je lis dans ton code :
Code:
ptrlivre=saveptrlivre+i;
et voilà : j'ai gagné mon pari !




Basketball


Dernière édition par nvs le Sam 19 Nov 2011, 14:43, édité 1 fois

_________________

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 14:43

Eureka!! ça marche maintenant merci à mr nvs et mr smb

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 14:48

smb a écrit:
karemkadidola a écrit:code retouché selon suggestion Bon je crois le mieux c'est de passer à une autre interro hélas...
Code:

...
   ptrlivre = null;/*1er malloc en dehors de la boucle TantQue*/
   if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
   }
...

Tu t'étonnes que ton code s'arrête directement ?
Allons, un peu de sérieux !
comme vous le voyez je ne fesais plus de malloc avant la boucle seulement "ptrlivre = null" et quand j'ai enlevé cette ligne me rendant compte "qu'elle ne servait à rien" ptrlivre ayant déjà été assigné à null dans la déclaration (mais apparement c'était pire qu'elle ne servait à rien) là ça a marché

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

Message  smb le Sam 19 Nov 2011, 14:50

karemkadidola a écrit:
smb a écrit:
karemkadidola a écrit:code retouché selon suggestion Bon je crois le mieux c'est de passer à une autre interro hélas...
Code:

...
   ptrlivre = null;/*1er malloc en dehors de la boucle TantQue*/
   if (ptrlivre==NULL){
      info(null);/*si echec malloc je libère quand mm la zone crée*/
      ptrvoiddebutzone=null;/*je ne sais pas si ceci est necessaire mais bon*/
      exit (-1);
   }
...

Tu t'étonnes que ton code s'arrête directement ?
Allons, un peu de sérieux !
comme vous le voyez je ne fesais plus de malloc avant la boucle seulement "ptrlivre = null" et quand j'ai enlevé cette ligne là ça a marché

Evidemment !

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

Re: interro n°1 : 24 novembre 2010[c]

Message  karemkadidola le Sam 19 Nov 2011, 14:54

nvs a écrit:avant que stéphan monbaliu te mette dans le droit chemin, je lis dans ton code :
Code:
ptrlivre=saveptrlivre+i;
et voilà : j'ai gagné mon pari !
Basketball
en effet mr nvs suite à vos remarques à vous et mr smb (mr smb me l'a même dit mais de façon implicite en me suggerant de laisser tomber saveptrlivre) j'ai fini par comprendre que mon erreur était là. c à d que pour retourner au debut de la zone "ptrlivre" je me servais d'un saveptrlivre qui n'est en aucune façon un résultat d'un malloc (et compagnie) "comme vous me l'avez dit avant" du coup problème avec realloc...en tout cas j'espère que j'ai bien compris et que c'est vraiment ça mon erreur sinon eclaircissez moi encore davantage...

karemkadidola

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

Revenir en haut Aller en bas

Re: interro n°1 : 24 novembre 2010[c]

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