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 :

programmation modulair en C


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Il faut que tu proteges tes .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef HEADER_H
    #define HEADER_H
     
    [...]
     
    #endif
    Bien sur tu dois changer le nom HEADER_H selon le header

  2. #22
    Débutant  
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Points : 193
    Points
    193
    Par défaut
    Re

    Que veux tu dire pars

    Bien sur tu dois changer le nom HEADER_H selon le header
    Voici les erreur.

    projet puissance 4\main.c In function `begingame':

    projet puissance 4\main.c `e' undeclared (first use in this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    A+

  3. #23
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par argon
    Re

    Que veux tu dire pars
    Ben si ton header s'appelle puissance.h tu mets
    #ifndef PUISSANCE_H

    Enfin le nom change selon le nom de ton fichier.

  4. #24
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Dans element.h tu as mis
    extern struct element e;

    Mais ta variable n'est defini nulle part.

    En gros tu définis ta variable dans ton main.c et tu vires ton element.h

  5. #25
    Débutant  
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Points : 193
    Points
    193
    Par défaut
    Dans element.h tu as mis
    extern struct element e;

    Mais ta variable n'est defini nulle part.

    En gros tu définis ta variable dans ton main.c et tu vires ton element.h
    Je n'ai pas compris "Mais ta variable n'est defini nulle part."

    Que veut tu dire aussi tu définis ta variable dans ton main.c.

    Voici les erreur.

    [Linker error] undefined reference to `e'
    A+

  6. #26
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par argon
    Je n'ai pas compris "Mais ta variable n'est defini nulle part."

    Que veut tu dire aussi tu définis ta variable dans ton main.c.
    La variable e n'est pas définie. Il faut la définir quelque part, par exemple dans main.c.
    Et si tu ne l'utilises que là, tu n'as effectivement pas besoin d'exporter sa déclaration (extern) dans un .h. Tu peux donc même rendre cette variable privée (static)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static struct element e;
    Pour apprendre à maitriser tous ces mécanismes, tu devrais t'entrainer sur du code de quelques lignes qui ne fait que ça...

  7. #27
    Débutant  
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Points : 193
    Points
    193
    Par défaut
    Re

    Dsl de vous embêter avec ca mai on ne ma pas enseigné ca à la fac, je n'ai fais qu'une initiation en C.

    j'ai mis ce code dans chaque fichier. c qui font appel à la strutu.h
    il ne lance plus aucune erreur par rapport à ca.

    je vais recherche des faq qui parle de ce sujet, car pendant les vacances scolaire je dois m'initier seule au c++, j'ignore si ce sera la même chose pour les class.

    P.S pardon d'avoir parler d'une chose qui ne concerne pas le forum de c.

    Avant de mêttre la mention résolu sur ce post avez que chose de plus à m'expliquer.

    Merci.

    A+

  8. #28
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par argon
    Re

    Dsl de vous embêter avec ca mai on ne ma pas enseigné ca à la fac, je n'ai fais qu'une initiation en C.

    j'ai mis ce code dans chaque fichier. c qui font appel à la strutu.h
    il ne lance plus aucune erreur par rapport à ca.
    Il ne faut pas faire comme ca.
    Il faut mettre dans un seul fichier .c la declaration
    struct element e

    Ensuite dans les autres fichiers .c, il faut inclure un header dans lequel se trouvera
    extern struct element e

    C'est clair ou pas?

  9. #29
    Débutant  
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Points : 193
    Points
    193
    Par défaut
    Re

    Je commence un peu à m'embrouiller là.

    Exemple dans main.c j'ai mis struct element e

    Le message ci-dessous, je ne les pas assimillé (je ne comprend pas)


    Ensuite dans les autres fichiers .c, il faut inclure un header dans lequel se trouvera
    extern struct element e
    Merci

    A+

  10. #30
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Bon...

    Il faut que tu declares une variable donc dans ton main.c tu mets
    struct element e

    La tu a defini une variable qui s'appelle e et qui est de type struct element

    On est d'accord.

    Maintenant tu as dans ton projet tu as, imaginons, un fichier nommé fichier.c qui utilise cette fameuse variable globale qui s'appelle e.

    Tu ne vas donc pas la redefinir car cela provoquerait une erreur à la compilation, tu va juste creer un fichier header.h qui va contenir (entre autres)
    extern struct element e

    Ce fichier tu l'inclus via #include dans fichier.c et si par hasard tu crée un autre fichier nommé fonction.c qui comme de par hasard à lui aussi besoin de la variable nommée e qui est de type struct element ben tu inclus a nouveau header.h dans le fichier fonction.c

    Si tu ne comprends pas toujours pas, je laisse la place à quelqu'un d'autre.

  11. #31
    Débutant  
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Points : 193
    Points
    193
    Par défaut
    Re

    Bon je souhaite revoir ca depuis le début une derniere fois, et c'est tout

    Voici structu.h
    Code : 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
     
    /*
    Ici déclaration de la structure du programme
     
    */
     
    #ifndef strutu_H
    #define strutu_H
     
     
    typedef enum {FALSE = 0, TRUE = 1} bool;
     
    struct element
    {
     
    char pseudo1[20];
    char pseudo2[20];
    int choix;
    int k,l;
    char p4[7][7];
    char game;
    bool quitter; 
    };
    #endif
    ici element.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "element.h"
    extern struct element e
    ici main.c
    Code : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "strutu.h"
     
     
    /*
    Ici nous sommes dans le fichier principal du jeux.
     
    */
     
                                                /*
    Cette fonction est le début du programme
     
                                                */
     
    struct element e;                                            
     
    int begingame()
    {
    printf("Bienvenue sur le jeux puissance 4\n"); 
    printf("\n");
    printf("Developpe par Debailleul vincent\n");
    printf("\n");
    printf("Voulez faire une partie à 2 joueur, ou jouer contre l'ordinateur\n");
    printf("Pour une partie à deux, taper 1, contre l'ordinateur taper 2\n");
    scanf("%d",&e.choix);
     
    if(e.choix==1 ||e.choix==2)
     
    {
              if(e.choix==1)
    {
        deuxgamer();
    }
     
        else if(e.choix==2)
             {
             vscomputeur();
             }
    }        
    else
    {
         printf("tempis vous avez fait le mauvais choix\n");
    }
    }
     
    int main(int argc, char *argv[])
    {
     
    begingame();  
     
     
      return 0;
    }
    ici jeux1j.c
    Code : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    #include <stdio.h>
    #include "strutu.h"
    #include "element.h"
    /*
    Dans cette partie du code nous verrons le jeux un joueur contre l'ordinateur.
     
     
    */
     
     
     
    int vscomputeur()
    {
     
     
    printf("Bonjour je suis le terminator, vous allez m'affronter\n");    
    printf("Cher adverssaire entrer votre nom.\n");    
    scanf("%s",&e.pseudo1);
    printf("\n");
     
     
     
    printf("Vous aurrez les jetons Rouge: R, %s\n " , e.pseudo1);  
    printf("\n");
     
    printf("Moi, j'aurai les jeton bleu: B\n");
     
    printf("\n");
    printf("Le jeux debute, Choississe une colonne %s\n " , e.pseudo1);    
     
    printf("\n");
     
     
    onegamer();
     
    }
     
    int onegamer()
    {
    e.p4;
    e.game;
     
    int i,j;
     
    e.k=2;
    e.l=1;
    e.p4[0][1]='A';
    e.p4[0][2]='B';
    e.p4[0][3]='C';
    e.p4[0][4]='D';
    e.p4[0][5]='E';
    e.p4[0][6]='F';
    e.p4[0][7]='G';
     
     
     
     
    printf("%c",e.p4[0][1]);
     
    printf("%c",e.p4[0][2]);
     
    printf("%c",e.p4[0][3]);
     
    printf("%c",e.p4[0][4]);
     
    printf("%c",e.p4[0][5]);
     
    printf("%c",e.p4[0][6]);
     
    printf("%c\n\n",e.p4[0][7]);
     
     
    for(i=1;i<7;i++)
     
    {
     
    for(j=0;j<7;j++)
     
    {
     
    e.p4[i][j]='*';
    }
    printf("%s",e.p4[i]);
    printf("\n");
     
     
    }
     
    jeux1();
    return (0);
    }
     
    int jeux1()
    {
     
    int i,j;   
    i=2;
    j=1;
     
     
    scanf("%c\n",&e.game);
    printf("\n");
     
     
    printf("\n");
     
    printf("%c",e.p4[0][1]);
     
    printf("%c",e.p4[0][2]);
     
    printf("%c",e.p4[0][3]);
     
    printf("%c",e.p4[0][4]);
     
    printf("%c",e.p4[0][5]);
     
    printf("%c",e.p4[0][6]);
     
    printf("%c\n\n",e.p4[0][7]);
     
     
     
     
     
    if(e.game=='a')
    {
     e.p4[i][j]='R';
     
     if(e.p4[i+1][j]=='*')
     {
     e.p4[i][j]='*';
     e.p4[i+1][j]='R';
     }
     
     
     
     
     
     
     
     
    }
     
    for(i=1;i<7;i++)
    {
     
    for(j=0;j<7;j++)
     
    {
     
    }
    printf("%s",e.p4[i]);
    printf("\n");
    }
    consience();
     
    gagnantunjoueur();
    }
    /*
     
    */
    int consience()
    {
     
    e.p4;
    e.k;
    e.l;
     
     
     
    }
    Là j'ai un probleme la compile ne ce fait pas, on dirait quel tourne en rond.

    Pourquoi

    A +

  12. #32
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Dans le fichier element.h tu inclus element.h tu ne vois pas comme un soucis...

  13. #33
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par argon
    Re

    Bon je souhaite revoir ca depuis le début une derniere fois, et c'est tout

    ici element.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "element.h"
    extern struct element e
    <...>
    Là j'ai un probleme la compile ne ce fait pas, on dirait quel tourne en rond.
    Malgré mes conseils, tu t'obstines à faires des choses trop complexes alors que tu ne les maitrises pas. Résultat, tu inclus un fichier d'en-tête (header) dans lui-même et c'est le drame.

    Je recommence.

    Quand on est en phase d'apprentissage, on tombe tous les jours sur un nouveau problème. C'est normal. Ici, tu as un problème de programmation modulaire. C'est pas compliqué, mais il faut y aller pas à pas. Mais avant tout, il y a plusieurs notions qu'il faut bien distinguer :

    • A quoi sert la programmation modulaire ?
    • Sur quels critères découpe-t-on un programme en modules ?
    • Comment découpe-t-on un programme en modules ?


    A quoi sert la programmation modulaire ?
    Lorsqu'on veut réaliser un programme, on doit suivre une démarche de constructon du projet qui comporte au minimum 3 étapes :
    1. Définition
    2. Conception
    3. Réalisation

    • La définition (ou spécification, cahier des charges...) consiste à définir les buts à atteindre, les interfaces avec le monde extérieur, les comportements visibles, les contraintes, mais pas les moyens.
    • La conception reprend les éléments de la définition en cherchant les moyens de les réaliser. Matériel ou logiciel, découpages fonctionnels, algorithmes, machines à états, blocs fonctionnels, objets, échanges de données.
    • La réalisation consiste à concrétiser les blocs fonctionnels sous la forme de modules logiciels composés de 1 ou plusieurs fichier sources et de leurs fichiers d'en-tête.

    Sur quels critères découpe-t-on un programme en modules ?
    Il n'est pas facile de donner de réponse ou de méthode infaillible. L'expérience joue un rôle, mais aussi le bon sens. En lisant la spécification, on va commencer à 'sentir' les grands blocs fonctionnels. Il est difficile de donner un exemple sans un cas d'étude réel. En gros, on a au moins :
    • interfaces d'entrées
    • traitements
    • interfaces de sorties
    ce qui semble être l'objet de tout projet informatique...
    ensuite, il faut évidemment raffiner au cas par cas...

    Comment découpe-t-on un programme en modules ?
    Le principe est simple. Un programme est consitué de différents blocs fonctionnels (BF) réalisant une fonction bien précise. Chaque BF concentre les moyens nécessaire à la réalisation selon le shéma bien connu
    Entrée -> Traitement -> Sortie

    Les entrées sont soit des flux entrants, (appels de fonctions de lecture) soit des fonctions du BF appelés de l'extérieur. Ces fonctions sont appelées "points d'entrée". Elles sont publiques et bénificient donc d'une interface (prototype) dans un fichier d'entête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* bf.h */
    #ifndef H_BF
    #define H_BF
     
    /* points d'entree */
    int bf_in (T data);
     
    #endif
    Les traitements sont les corps des fonctions. Les données recues en paramètre sont analysées, ce qui provoque soit un simple compte rendu (OK, ERR...), soit une sortie vers un flux (stdout, fichier), soit l'appel d'un point d'entré d'un autre module.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     +------------------+   +------------------+
     |                  |   |                  |
    A_in() -> process()---> B_in() -> process()---> etc.
     |                  |   |                  |
     +------------------+   +------------------+
    Un module est donc constitué d'un fichier source (.c) comprenant un certain nombre de fonctions publiques et de leur interfaces. Il peut aussi comporter des fonctions privées (invisibles de l'extérieur).

    En principe, les fonction privées n'ont pas de préfixe particulier, par contre les fonctions publiques ont le préfixe de 2 ou 3 lettres désignant le module. Par exemple ihm (Interface Homme Machine) :
    Code : 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
    29
     
    /* ihm.c */
    #include "ihm.h"
     
    /* prive */
    static effacer_ecran (void)
    {
       /* ... */
    }
     
    static positionner (int x, int y)
    {
       /* ... */
    }
     
    static ecrire (char const *texte)
    {
       /* ... */
    }
     
    /* public  */
    void ihm_init()
    {
       effacer_ecran ();
       positionner (30, 1);
       ecrire ("Bienvenu");
    }
     
    /* ... */
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef H_IHM
    #define H_IHM
    /* ihm.h */
     
    /* public  */
    void ihm_init(void);
    #endif
    Pour les variables publiques (globales), c'est pareil. Une défintion inuque dans un .c, une déclaration unique dans un .h, et l'inclusion de ce .h dans le fichier de définition et dans tous les fiochers qui ont accès à cette globale.

    http://emmanuel-delahaye.developpez....s.htm#globales

    Verifie tout ça sur des petits programmes de quelques lignes. Pas dans une application. trop lourd, trop complexe...

Discussions similaires

  1. programmation modulaire sur devc++
    Par lity7 dans le forum C
    Réponses: 1
    Dernier message: 23/02/2007, 18h40
  2. L'interet de la programmation modulaire.
    Par giggs dans le forum C
    Réponses: 3
    Dernier message: 01/11/2006, 12h35
  3. programmation modulaire en C
    Par lastrecrue dans le forum GTK+ avec C & C++
    Réponses: 11
    Dernier message: 28/06/2006, 21h03
  4. programmation modulaire
    Par barbarello dans le forum C++
    Réponses: 2
    Dernier message: 19/02/2006, 13h04
  5. [Projet] Programmation modulaire d'un projet.
    Par loverdose dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 18/11/2005, 21h59

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