Annonce

Réduire
Aucune annonce.

Cours langage C n°9 - Bibliothèques et fichiers d'en-tête

Réduire
Ceci est une discussion importante.
X
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Cours langage C n°9 - Bibliothèques et fichiers d'en-tête

    Bibliothèques et fichiers d'en-tête

    Souvenez-vous, les prototypes ! Ils permettent de donner le plan de votre programme... Cependant très souvent, on écrira beaucoup de lignes de codes, et la visibilité de ce plan devient difficile à lire. Imaginez que vous en êtes à plus de 15 000 lignes écrites, il faudrait remonter en haut de la page afin de voir vos prototypes, voir d'en rajouter, ça serait lourd, très lourd.

    Pour résoudre cet inconvénient, on a trouvé un moyen propre, les fichiers d'en-tête !

    Qu'est-ce qu'un fichier d'en-tête ?

    Un fichier d'en-tête est un fichier texte, avec l'extension .h

    Exemple: fonctions.h

    Il permettra d'y placer tous les prototypes de notre programme C.

    Exemple:

    Un fichier avec l'extension .c contenant mon programme program.c

    d'habitude on faisait ceci

    bib1.jpg

    Maintenant on aura cela

    bib2.jpg

    Avec program.h contenant ce code

    Code:
    #ifndef PROGRAM_H_INCLUDED
    #define PROGRAM_H_INCLUDED
    
    void swap(int *a, int *b); /* prototype de fonction */
    
    #endif
    Remarques:

    Dans program.c on a inclut la bibliothèque program.h, mais attention on met des guillemets " " et non des chevrons <>
    Dans program.h, on a ajouté notre prototype de la fonction swap
    Dans program.h, des choses bizarres sont écrites, mais on s'en préoccupe pas, code::blocks va le générer pour nous (on en parlera plus tard)

    Comment créer un fichier d'en-tête avec Code::Blocks ?

    Suivez les démarches ci-dessous, ça va tout seul

    Menu File -> New -> File...

    Choisissez C/C++ Header, puis cliquez sur Go

    bib3.jpg

    Cliquez sur Next, puis le bouton ...

    image_4.png

    Choisissez votre répertoire, et insérer votre nom de bibliothèque program.h, puis terminer par Finish

    Vous devriez voir cela

    bib5.png

    Il vous suffira par la suite d'insérer vos prototypes entre ces 2 lignes
    • #define PROGRAM_H_INCLUDED
    • #endif // PROGRAM_H_INCLUDED


    Code:
    #ifndef PROGRAM_H_INCLUDED
    #define PROGRAM_H_INCLUDED
    
    void swap(int *a, int *b);
    
    #endif // PROGRAM_H_INCLUDED
    Pas compliqué n'est-ce pas ?

    Bibliothèques Standards

    Heureusement pour nous, tout n'est pas toujours à refaire

    Copier une chaîne de caractères
    Connaître la taille d'une chaîne de caractères
    Rechercher un caractère dans une chaîne de caractères
    ...

    Bref tout ce genre de boulot vous pouvez le faire à la mimine, mais on vous évite ce mal à l'aide des bibliothèques standards... Il en existe plusieurs, mais les plus importantes restent celles ci-dessous.

    Pour inclure une bibliothèque standard, n'oubliez pas que c'est entre chevrons <bibliothèque>

    stdio.h -> fonctions d'affichage, lecture/écriture de fichiers, input utilisateur, etc...
    stdlib.h -> fonctions pour quitter un programme, allocations dynamiques (on verra cette joyeuseté très bientôt), nombres aléatoires, etc...
    string.h -> manipulations des chaînes de caractères

    Pour les autres, vous aurez bien le temps de les découvrir, vous pouvez le faire dès à présent...

    EXERCICES

    Exercice n°1:

    Déterminer la longueur de la chaîne "Hello World !" en utilisant la fonction strlen, compléter le code ci-dessous.

    Code:
    /* Ajouter juste les bibliothèques que vous avez besoin, ni plus ni moins */
    
    /* prototype de fonction len dans un fichier d'en-tête */
    
    int main(void)
    {
        const char hello[] = "Hello World !";
    
        int length = len(hello);
    
        printf("longueur : %d lettres", length); /* longueur : 13 lettres */
    
        return 0;
    }
    
    size_t len(const char *chaine)
    {
        /* Utilisation de strlen, retourne un type size_t */
    }
    Les fichiers présentés seront nommés functions

    Il faudra présenter le contenu de:
    • functions.c
    • functions.h


    Dans functions.h, vous supprimerez la ligne // FUNCTIONS_H_INCLUDED, afin que le test se passe sans accroc (on en reparlera, histoire de commentaires compatibles)

    Merci de m'avoir lu et à bientôt pour le prochain cours
    Dernière modification par fred, 07 juillet 2014, 11h19.

  • #2
    Code:
    #ifndef PROGRAM_H_INCLUDED
    #define PROGRAM_H_INCLUDED
    
    size_t len(const char *strlen);
    
    #endif
    Code:
    #include <stdio.h>
    #include <string.h>
    #include "functions.h"
    
    
    int main(void)
    {
        const char hello[] = "Hello World !";
    
        int length = len(hello);
    
        printf("longueur : %d lettres", length); /* longueur : 13 lettres */
    
        return 0;
    }
    
    size_t len(const char *chaine)
    {
        
        return 0;
    }
    Bon il marche pas mais je le met quand même.J'ai compris le include un en tête.Cela ressemble beaucoup au principe des autres langages.Mais comme toujours suis à la ramasse pour ce qui est de la création d'un prototype et les instructions qui en découlent. Plus j'avance plus je perd pied et comprend de moins en moins.Je ne lacherais pas mais j'en arrive à plus savoir par quoi commencer. D'où mes réponses erronées et tardives.

    Désolé je fait de mon mieux.

    Commentaire


    • #3
      Si tu as créé le fichier header automatiquement avec code::blocks, tu devrais voir ceci plutôt

      Code:
      #ifndef FUNCTIONS_H_INCLUDED
      #define FUNCTIONS_H_INCLUDED
      
      size_t len(const char *strlen);
      
      #endif
      Dans mon exemple, le fichier se nommait program.h, alors que dans l'exercice il se nomme functions.h

      strlen selon la documentation a ce prototype : size_t strlen ( const char * str );

      donc strlen
      • renvoie une valeur de type size_t
      • prend en paramètre une chaîne de caractères


      donc... je te laisse continuer

      Commentaire


      • #4
        Bonjour,

        Code:
        //  [Fonction.c]
        
        #include <stdio.h>
        #include <string.h>
        #include "fonction.h"
        
        
        int main(void)
        {
            const char hello[] = "Hello World !";
        
            int length = len(hello);
        
            printf("longueur : %d lettres", length);
        
            return 0;
        }
        
        size_t len(const char *chaine)
        {
        
            return strlen(chaine);
        
        }
        
        //  [Fonction.h]
        
        #ifndef FONCTION_H_INCLUDED
        #define FONCTION_H_INCLUDED
        
        size_t len(const char *chaine);
        
        #endif
        deux et deux font cinq

        Commentaire


        • #5
          Exercice :
          Code:
          #include <stdio.h>
          #include <string.h>
          #include "program.h"
          
          /* program.c */
          
          int main(void)
          {
              const char hello[] = "Hello World !";
          
              int length = len(hello);
          
              printf("longueur : %d lettres", length); /* longueur : 13 lettres */
          
              return 0;
          }
          
          int len(const char *chaine)
          {
              return (int)strlen(chaine);
          }
          Code:
          #ifndef PROGRAM_H_INCLUDED
          #define PROGRAM_H_INCLUDED
          
          /* program.h */
          
          int len(const char *chaine);
          
          #endif
          J'ai du convertir en int, car avec size_t j'obtiens une erreur ("conflicting types for 'len'"), de plus length est déclaré en tant qu'int du coup... Cela reste correct ou non ?
          Mon blog : http://rootsheep.info

          Commentaire


          • #6
            J'ai du convertir en int, car avec size_t j'obtiens une erreur ("conflicting types for 'len'"), de plus length est déclaré en tant qu'int du coup... Cela reste correct ou non ?
            Non ce n'est pas ce qui est demandé

            Tu donnes de mauvais nom pour ta librairie et ton programme C (lire l'énoncé).

            Commentaire


            • #7
              Code:
              #include <stdio.h>
              #include <string.h>
              #include "functions.h"
              
              /* functions.c */
              
              int main(void)
              {
                  const char hello[] = "Hello World !";
              
                  int length = len(hello);
              
                  printf("longueur : %d lettres", length); /* longueur : 13 lettres */
              
                  return 0;
              }
              
              size_t len(const char *chaine)
              {
                  return strlen(chaine);
              }
              Code:
              #ifndef FUNCTIONS_H_INCLUDED
              #define FUNCTIONS_H_INCLUDED
              
              size_t len(const char *chaine);
              
              #endif

              Maintenant ça marche avec size_t... Mais je n'ai pas compris pourquoi ? Les noms des .h/.c sont importants ?
              Mon blog : http://rootsheep.info

              Commentaire


              • #8
                Non non, je ne voyais simplement pas la raison d'un dysfonctionnement, c'est tout... Peut-être un oubli de sauvegarde ?

                Commentaire

                Chargement...
                X