Probleme : Tableau de pointeurs sur structure

Probleme : Tableau de pointeurs sur structure - C - Programmation

Marsh Posté le 01-02-2013 à 12:36:37    

Bonjour, voila mon problème :
j'ai comme outil un fichier texte contenant des livres sous la forme:
-un numero
-un titre
-un auteur
 
Une structure livre est donc créer comme ceci :  
 

Code :
  1. typedef struct livre{
  2. char *titre;
  3. char *auteur;
  4. int num;
  5. }Livre;


 
On m a donc demander de creer une fonction utilisant un tableau de pointeurs sur struc et permettant de lire n lignes du fichier pour les stockées dans la structure de données.
Des fonctions de lecture de texte m'ont été données pour lire les données du texte.
J'ai donc procédé ainsi :
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include "entree_sortie.h"
  6. #define TAILLEMAX 32
  7. #define TMAX 1024
  8. typedef struct livre{
  9. char *titre;
  10. char *auteur;
  11. int num;
  12. }Livre;
  13. void affiche(int n, char* nomfichier){
  14. FILE  *f= fopen(nomfichier,"r" );
  15. if(f==NULL){
  16.  fprintf(stderr,"ERREUR_OUVERTURE_FICHIER" );
  17.  exit(1);
  18. }
  19. char Titre[TAILLEMAX];
  20. char Auteur[TAILLEMAX];
  21. int j,k;
  22. Livre** Tab=(Livre **)malloc(sizeof(Livre *)*TMAX);
  23. if(Tab==NULL){
  24.  fprintf(stderr,"ERREUR_ALLOCTAB" );
  25.  exit(1);
  26. }
  27. for(j=0;j<TMAX;j++){
  28.  Tab[j]=NULL;
  29. }
  30. int ligne=0;
  31. while(ligne<n){
  32.  int entier;
  33.  entier= GetEntier(f);
  34.  Skip(f);
  35.   GetChaine(f,TAILLEMAX,Auteur);
  36.   Skip(f);
  37.   GetChaine(f,TAILLEMAX,Titre);
  38.   SkipLine(f);
  39.   Tab[ligne]=(Livre *)malloc(sizeof(Livre));
  40.   if(Tab[ligne]==NULL){
  41.    fprintf(stderr,"ERREUR_ALLOCTABLIGNE" );
  42.    exit(1);
  43.   }
  44.   Tab[ligne]->titre=strdup(Titre);
  45.   printf("%s ",Tab[ligne]->titre);
  46.   Tab[ligne]->auteur=strdup(Auteur);
  47.   printf("%s ",Tab[ligne]->auteur);
  48.   Tab[ligne]->num=GetEntier(f);
  49.   printf("%d\n",Tab[ligne]->num);
  50.   ligne++;
  51. }
  52. fclose(f);
  53. }
  54. int main(){
  55. affiche(19,"GdeBiblio.txt" );
  56. return 0;
  57. }


 
 
Ce code compile et m'affiche les 19 entrées du fichier, cependant je dois maintenant creer une fonction qui recherche en fonction du numéro, apres plusieurs essai je ne trouve pas le bon protoype de fonction.
Merci de votre aide

Reply

Marsh Posté le 01-02-2013 à 12:36:37   

Reply

Marsh Posté le 01-02-2013 à 16:46:07    

Moi j'y connais pas grand grand chose, je te répond juste rapidement.
 
T'aurait pas besoin de calculer les adresses des élément du tableau ?

Si non une truc du genre
 
livre ieme(int i);
 
 
Si tu veux passer le tableau  
 
plutôt je pense. d'après ce que tu as écrit.
 
livre ieme(int i,livre ** tab);
 
 
Je sis con.  :o


Message édité par Profil supprimé le 01-02-2013 à 16:47:28
Reply

Marsh Posté le 01-02-2013 à 16:46:38    

Un truc du style?
 

Code :
  1. Livre * getLivre (int num)
  2. {
  3. return Tab[num];
  4. }

Reply

Marsh Posté le 03-02-2013 à 01:04:50    

ecrire un programme qui permet d'entré une chaine de caractère et dire si celle si est un palyndrome ou pas


---------------
yvo
Reply

Marsh Posté le 03-02-2013 à 11:00:55    

champions a écrit :

ecrire un programme qui permet d'entré une chaine de caractère et dire si celle si est un palyndrome ou pas


 
Joly post, qui fait ci bien avancé le schmylblyck !  [:moundir]  
 
Si avec ça le problème initial n'est pas résolu ...
 

Code :
  1. Livre * getLivre (int num)
  2. {
  3.     return Tab[num];
  4. }


Plus sérieusement, et sans fautes (enfin, j'espère ...), la solution proposée ci-dessus suppose que le num en question est l'indice dans le tableau et pas le champ "num" de la structure (cote du livre ?), ce qui me paraît incorrect.
Je vous propose plutôt de garder le prototypage proposé et de boucler sur le tableau de pointeurs tant que : la valeur de l'élément n'est pas NULL (cela signifierait que l'on n'a pas trouvé le numéro recherché -> on renvoie NULL) ou que l'on atteigne le nombre maximum d'éléments du tableau (même cause et même conséquences) ou que le champ "num" de l'élément vaille la valeur passée en paramètre -> on renvoie le pointeur.
 
PS : Dans votre fonction "affiche", vous devriez tester que le paramètre n est bien inférieur à TMAX (ce serait dommage de planter pour si peu :) ). Par ailleurs, vous testez le retour de "malloc" (ce qui est tout à votre honneur !), mais pas celui de "strdup", ce qui n'est pas très cohérent.
 

Reply

Marsh Posté le 03-02-2013 à 11:05:04    

champions a écrit :

ecrire un programme qui permet d'entré une chaine de caractère et dire si celle si est un palyndrome ou pas


 
Il y a des milliers de solutions deja codees si tu te donnes la peine de faire une recherche google. T'es _un peu_ un boulet sur ce coup la.

Reply

Marsh Posté le 03-02-2013 à 11:28:59    

Je ne peux qu'être d'accord, si on rajoute le piratage de post, cela fait vraiment boulet :(

Reply

Marsh Posté le 03-02-2013 à 11:34:55    

j'ai pas compri?
 

Reply

Marsh Posté le 03-02-2013 à 11:49:11    

Étant de bonne humeur en ce beau dimanche ensoleillé, je vais préciser :  
 
Comme indiqué dans les règles de ce forum, il faut d'abord rechercher par soi-même (et dans le cas indiqué, ce ne sont pas les solutions qui manquent sur Google ...) et une bonne règle de savoir-vivre est de créer son propre post, au lieu de s'incruster au beau milieu d'une discussion.
 
Avez-vous l'impression d'avoir respecté ces règles élémentaires ?
 
En cadeau Bonux, je vous invite à lire la partie des règles concernant l'orthographe ...


Message édité par Farian le 03-02-2013 à 11:50:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed