IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Les Fonctions & les headers :)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Avatar de shana59
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Billets dans le blog
    1
    Par défaut Les Fonctions & les headers :)
    Bonsoir ,
    Vous allez rigolé mais je suis embêté avec comment dire un soucis de compréhension de syntaxe,
    D'après le tutoriel que je suit sur OPCR , il faut inclure chaque header dans sont fichier source correspondant , je ne comprend pas l’intérêt.
    Donc je crée un fichier arme.c et arme.h , chacun d'eux contienne source et l'autre prototype , quel intérêt de mettre le prototype dans le fichier source?
    En sachant que j'inclus également arme.h dans main.c afin de pouvoir utiliser les fonctions, enfin voilà tout sa n'est pas assez clair pour moi et ne voulant pas être perdu par la suite j'aimerais mieux comprendre si quelqu'un parviens à m'expliquer merci !

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    pour de multiples raisons … entre autre :
    • Parce que ça ne fait pas de mal et que c'est une bonne habitude
    • Parce qu'un header ne contient en général pas que des prototypes mais aussi les définitions (ou au moins les déclarations) des types, macros, etc. autant ne les mettre qu'à un endroit
    • Parce que le jour où tu modifies une fonction en changeant le type de retour en oubliant de changer le prototype le compilateur te le dira
    • Parce que si les dépendances sont bien gérées cela fonctionne mieux avec des outils comme make
    • ...

  3. #3
    Membre averti
    Avatar de shana59
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Billets dans le blog
    1
    Par défaut
    Oui je vois n'ayant que survolé le chapitre des directive de préprocesseur il y à longtemps je ne pouvais pas deviné,
    Il devrait l'évoqué lors du chapitre sur la programmation modulaire
    Merci

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Navré pour la rime pauvre mais.. les prototypes, c'est pas automatique ! Tu n'es pas forcé d'en écrire pour chaque fonction du .c, seulement pour définir l'interface que tu veux exposer. Lorsqu'il s'agit de fonctions utilitaires spécifiques au module en général on les marque static et on les regroupe dans un coin du .c.

    C'est d'ailleurs la même chose pour les types. Pour « dissimuler » les détails d'implémentation à l'utilisateur du module, on peut écrire certains types locaux dans les .c ou dans des en-têtes « privés ».

    Un petit exemple (un peu pourri) :

    Code circle.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #if !defined(INCL__CIRCLE_H)
      #define INCL__CIRCLE_H
     
     
    typedef struct point {
        float x, y;
    } point_t;
     
    struct circle;
    typedef struct circle *circle_t;
     
     
    circle_t circle_make(point_t centre, float radius);
    float    circle_area(const circle_t c);
     
     
    #endif // INCL__CIRCLE_H
    Code circle.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdlib.h>
    #include <assert.h>
    #include "circle.h"
     
     
    #define PI 3.141592653589793f
     
    struct circle {
        point_t centre;
        float radius;
    };
     
     
    static float pow2(float a) { return a * a; }
     
    circle_t circle_make(point_t centre, float radius) {
        assert(radius >= 0.f && "negative radius");
     
        circle_t c = malloc(sizeof(struct circle));
        assert(c && "allocation failed");
     
        c->centre = centre;
        c->radius = radius;
     
        return c;
    }
     
    float circle_area(const circle_t c) { return PI * pow2(c->radius); }

    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdlib.h>
    #include <stdio.h>
    #include "circle.h"
     
     
    static void point_print(point_t p) { printf("(%g, %g)", p.x, p.y); }
     
    int main(int argc, char *argv[]) {
        point_t p = { -1.f, 3.f };
        circle_t c = circle_make(p, 2.f);
     
     
        printf("coordinates of point: ");
        point_print(p);
     
        /* /!\ compilation error: dereferencing pointer to incomplete type
         *
         * printf("\ncoordinates of circle center: ");
         * point_print(c->centre);
         */
     
        printf("\ncircle area: %g\n", circle_area(c));
     
        free(c);
     
        return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/03/2015, 12h25
  2. Réponses: 3
    Dernier message: 06/08/2009, 17h09
  3. les procedures et les fonctions en java
    Par publicvoidmain dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2006, 14h24
  4. Comparaison entre les classes et les fonctions
    Par Ashgenesis dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 08/09/2005, 19h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo