Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1458 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2138878
caps lock
Posté le 25-04-2012 à 00:48:39  profilanswer
 

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:

mood
Publicité
Posté le 25-04-2012 à 00:48:39  profilanswer
 

n°2138879
Terminapor
I'll see you rise.
Posté le 25-04-2012 à 01:59:01  profilanswer
 

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
n°2138880
__werz
Posté le 25-04-2012 à 02:12:59  profilanswer
 

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
n°2138882
caps lock
Posté le 25-04-2012 à 02:23:52  profilanswer
 

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

n°2138884
__werz
Posté le 25-04-2012 à 03:06:30  profilanswer
 

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
n°2138885
caps lock
Posté le 25-04-2012 à 03:17:11  profilanswer
 

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!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[HTML/CSS/Javascript] probleme checkForm is not definiedProblème Run-time library configuration error sous GNAT GPS Ada
Wordpress Problème d'accent : d'un --> d/'unProblème de réécriture avec Arfooo
Problème largeur colonne d'un tableau PHP/CSS[javascript] problème sur fonction SWITCH
[PERL] problème avec variable de session PHPproblème de passage de C au C++
Probleme de champProblème : tokenizer.nextToken
Plus de sujets relatifs à : Problème pour faire liaison entre main.c et header.h


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR