Il faut que tu proteges tes .h
Bien sur tu dois changer le nom HEADER_H selon le headerCode:
1
2
3
4
5
6
7 #ifndef HEADER_H #define HEADER_H [...] #endif
Version imprimable
Il faut que tu proteges tes .h
Bien sur tu dois changer le nom HEADER_H selon le headerCode:
1
2
3
4
5
6
7 #ifndef HEADER_H #define HEADER_H [...] #endif
Re
Que veux tu dire pars
Voici les erreur.Citation:
Bien sur tu dois changer le nom HEADER_H selon le header
A+Citation:
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.)
Ben si ton header s'appelle puissance.h tu metsCitation:
Envoyé par argon
#ifndef PUISSANCE_H
Enfin le nom change selon le nom de ton fichier.
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."Citation:
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
Que veut tu dire aussi tu définis ta variable dans ton main.c.
Voici les erreur.
A+Citation:
[Linker error] undefined reference to `e'
La variable e n'est pas définie. Il faut la définir quelque part, par exemple dans main.c.Citation:
Envoyé par argon
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: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...Code:static struct element e;
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.Code:
1
2struct element e;
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+
Il ne faut pas faire comme ca.Citation:
Envoyé par argon
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?
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)
MerciCitation:
Ensuite dans les autres fichiers .c, il faut inclure un header dans lequel se trouvera
extern struct element e
A+
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.
Re
Bon je souhaite revoir ca depuis le début une derniere fois, et c'est tout
Voici structu.h
ici element.hCode:
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 main.cCode:
1
2
3 #include "element.h" extern struct element e
ici jeux1j.cCode:
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; }
Là j'ai un probleme la compile ne ce fait pas, on dirait quel tourne en rond.Code:
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; }
Pourquoi
A +
Dans le fichier element.h tu inclus element.h tu ne vois pas comme un soucis...
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.Citation:
Envoyé par argon
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 :
- Définition
- Conception
- 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 :
ce qui semble être l'objet de tout projet informatique...
- interfaces d'entrées
- traitements
- interfaces de sorties
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.
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:
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
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).Code:
1
2
3
4
5
6 +------------------+ +------------------+ | | | | A_in() -> process()---> B_in() -> process()---> etc. | | | | +------------------+ +------------------+
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) :
avecCode:
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"); } /* ... */
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.Code:
1
2
3
4
5
6
7
8 #ifndef H_IHM #define H_IHM /* ihm.h */ /* public */ void ihm_init(void); #endif
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...