Problème pour faire liaison entre main.c et header.h

Problème pour faire liaison entre main.c et header.h - C - Programmation

Marsh Posté le 25-04-2012 à 00:48:39    

Bonjour,
 
Je ne parviens pas à faire la liaison entre mon fichier "main.c" et le "header.h" que j'ai créé.
 
Pour alléger le main.c j'ai déplacé logiquement une partie du contenu dans le header.h
Voici le main.h  

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5. #include <string.h>
  6. #define LONGUEURMAXDUMOT 20
  7. #include "headerfichier.h"
  8. int main(int argc, char* argv[])
  9. {
  10.      lafonction();
  11.      return 0;
  12. };


 
Et voici un résumé du header.h

Code :
  1. #ifndef HEADERFICHIER_H_INCLUDED
  2. #define HEADERFICHIER_H_INCLUDED
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <ctype.h>
  6. #include <time.h>
  7. #include <string.h>
  8. void lafonction(test)
  9. ICI 80 lignes de code que je vous épargne
  10. #endif // HEADERFICHIER_H_INCLUDED


 
Le programme se lance correctement. Je souhaite maintenant "importer" dans le main.c une chaine de caractère qui résulte des 80 lignes qui ne sont pas présentes.
Il s'agit d'un

Code :
  1. char chaine[LONGUEURMAXDUMOT]="";

 
 
Quels sont les problèmes ?  :lol:

Reply

Marsh Posté le 25-04-2012 à 00:48:39   

Reply

Marsh Posté le 25-04-2012 à 01:59:01    

oui mais elle fait quoi ta fonction ? ( et tes includes de strings time et co ça sert a rien, ils seront inclus lors du #include "headerfichier.h" )


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 25-04-2012 à 02:12:59    

Normal. Tu inclus "headerfichier.h" alors que ton header s'appelle header.h.

 
Il y a autre chose: tu n'es pas censé implémenter de fonction dans des headers (saufs des fonctions très courtes en static inline).
 
Il te faut créer autre .c avec le code de ta fonction et ne laisser dans ton header que le prototype de ladite fonction.
 
Pour résoudre ton problème, une solution propre:
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     char chaine[LONGUEURMAXDUMOT];
  4.     lafonction(chaine, sizeof(chaine));
  5. }


 
Dans ton header:
 

Code :
  1. void lafonction(char *chaine, int taille);


 
Dans ton implémentation:
 

Code :
  1. void lafonction(char *chaine, int taille)
  2. {
  3. ...
  4. }


 
Puis une solution sale:
 
Dans ton header:
 

Code :
  1. extern char chaine[LONGUEURMAXDUMOT];


 
Dans ton implémentation
 

Code :
  1. char chaine[LONGUEURMAXDUMOT];
  2. void lafonction(...)
  3. {
  4. ...
  5. }


 
Et là, normalement, tu pourra utiliser chaine dans ton main.


Message édité par __werz le 25-04-2012 à 02:24:23
Reply

Marsh Posté le 25-04-2012 à 02:23:52    

ok werz je vais voir ce que je peux faire pour améliorer tout ça, en attendant voici la fonction complète :

Code :
  1. void lafonction(test)
  2. {
  3.             //ouverture du fichier texte
  4.              FILE *fichier=NULL;
  5.              fichier=fopen("dico.txt","r" );
  6.              if (fichier==NULL)
  7.              {
  8.                  printf("il y a un probleme avec le dictionnaire" ); // si le fichier ne s'ouvre pas
  9.              };
  10.              //definition du nombre total de caractere present dans le fichier
  11.              int curseur=0;
  12.              int i=0;
  13.              int nbmax=0;
  14.              curseur=fgetc(fichier);
  15.                 do
  16.                 {
  17.                    curseur=fgetc(fichier);
  18.                    if(curseur== EOF)
  19.                    {
  20.                       nbmax=ftell(fichier);    // quand le curseur arrive à la fin du fichier on attribue a nbmax la valeur
  21.                       i++;
  22.                    }
  23.                } while(curseur != EOF); // la condition s'éxécute jusqu'à la fin du fichier
  24.              nbmax=nbmax+1; // prise en compte du tout dernier caractère du fichier
  25.              // On rembobine le fichier car le curseur se trouve à la fin
  26.              rewind(fichier);
  27.              curseur=0;
  28.              curseur=fgetc(fichier);
  29.              // création d'un tableau dynamique pour récupération des valeurs des changements de ligne
  30.              long *tableau=NULL;
  31.              tableau=malloc(nbmax * sizeof(long));
  32.              i=0;
  33.              do
  34.              {
  35.                   curseur=fgetc(fichier);
  36.                   if(curseur=='\n')              // quand le curseur arrive sur un saut de ligne
  37.                      {
  38.                       tableau[i]=ftell(fichier);  // lorsque le curseur arrive sur une déclaration de changement de ligne, la fonction ftell() remplit le tableau
  39.                       i++;
  40.                      }
  41.              } while(curseur != EOF);          // on  boucle tant que la valeur est différente de la fin du fichier
  42.              rewind(fichier);                  // on peut rembobiner le fichier à nouveau
  43.              // récupération du nombre de ligne présentes dans le fichier
  44.              int nombredeligne=0;
  45.              for(i=0; i!=nbmax; i++)
  46.              {
  47.                 if(tableau[i]!=0)
  48.                 {
  49.                     nombredeligne=i+1;
  50.                 }
  51.              }
  52.             i=0;
  53.             for (i=0;i!=nombredeligne;i++)
  54.             {
  55.                 printf("A la ligne %d valeur de tableau[i]  : %d\n", i, tableau[i]);
  56.             }
  57.                 printf("\n nombre de ligne %d\n", nombredeligne);
  58.                 // definition d'une variable aléatoire correspondant uniquement a une fin de ligne
  59.                 srand(time(NULL));     //pour que la série de nombres pseudo aléatoire soit toujours différente
  60.                 int loto=tableau[rand()%nombredeligne]; // dans le tableau[] on prend la valeur qui correspond au random du nombre de ligne
  61.                 char chaine[LONGUEURMAXDUMOT]="";   //on placera le mot dans cette chaine de caractère
  62.                 rewind(fichier);   // on rembobine le fichier texte
  63.                 fseek(fichier, loto, SEEK_SET);  // on pointe le curseur sur un début de ligne aléatoire
  64.                 fgets(chaine, LONGUEURMAXDUMOT, fichier);   // fgets récupère la ligne à partir de l'emplacement du curseur
  65.                 chaine[strlen(chaine) - 1] = '\0';
  66.                 printf("\nle mot recupere est : %s \n", chaine);
  67.         fclose(fichier);
  68.         return chaine;
  69. };


Je cherche donc comment faire pour apporter la chaine de caractère "chaine" dans le main

Reply

Marsh Posté le 25-04-2012 à 03:06:30    

Wow!
 
Sans vouloir être méchant, ton code pique un peu les yeux mais bon...
 
Je pense que tu devrais revoir un peu ton algo, il y a plus efficace mais le plus simple serait sans doute ça:
 
1. Parcours une première fois le fichier pour trouver le nombre de lignes non vides et la taille max de chaque ligne. Exemple:
 

Code :
  1. do {                                                                                                 
  2.         c = fgetc(file);                                                                                 
  3.                                                                                                          
  4.         if ((c == '\n' || c == EOF) && line_len) {                                                       
  5.             line_count++;                                                                               
  6.             line_len = 0;                                                                               
  7.         }                                                                                               
  8.     } while (c != EOF);


 
2. Alloue avec malloc le nombre de caractères correspondant à cette taille max (+ 1 pour le '\0').
3. Tire la ligne à afficher au sort
4. Parcours une seconde fois le fichier mais arrête toi au début de la ligne que tu veux afficher.
5. Copie la ligne dans la mémoire précedemment allouée avec fgets.
6. Retourne le résultat.
 
Tu devrais aussi:
* Ne pas déclarer de variables au milieu du code
* Libérer la mémoire qui ne sera plus utilisée à la fin de l'appel de la fonction
* Sortir de la fonction en cas d'erreur à l'ouverture du fichier, exemple:
 

Code :
  1. file = fopen(filename, "r" );                                                                         
  2.     if (file == NULL) {                                                                                 
  3.         printf("failed to open file '%s'\n", filename);                                                 
  4.         return -1;                                                                                       
  5.     }


 
* Découper ta fonctions en sous-fonctions (exemple, une fonction pour compter les lignes, une fonction pour afficher une ligne d'index donné, ...).
* Homogénéiser ton code, par exemple en utilisant un guide de style (ex: http://www.kernel.org/doc/Documentation/CodingStyle)


Message édité par __werz le 25-04-2012 à 03:22:13
Reply

Marsh Posté le 25-04-2012 à 03:17:11    

Je me doutais que j'allais faire des grosses erreurs! J'ai commencé le C tout seul en autoformation il n'y a que 15 jours :D
Il m'a fallu 4 jours pour pondre cette fonction :lol:
Merci beaucoup pour ton aide!

Reply

Sujets relatifs:

Leave a Replay

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