Include et headers en langage C
Résolu
Maknash
Messages postés
701
Statut
Membre
-
Maknash Messages postés 701 Statut Membre -
Maknash Messages postés 701 Statut Membre -
Bonjour,
Dans le cadre d'un projet pour l'école, je dois créer un programme de gestion d'un camping.
J'ai donc créé un main contenant des appels à des fonctions dont les prototypes font partie d'un header.
Dans le main, j'ai mis un #include "header.h" et dans le header.h, il y a aussi 2 includes (myconio.h et stdio.h).
Quand je fais appel à une fonction à partir du main, il va rechercher dans le header le prototype et ensuite il appel la fonction.
Mais le myconio n'est pas reconnu dans le source contenant les fonctions, donc il me dit que les fonctions genre MYclrwin ne sont pas reconnues.
Si je mets un #include <myconio.h> dans le source des fonctions, il râle car il est déjà placé dans le header.h.
Le pire, c'est que ça fonctionnait très bien avant, et je ne sais pas ce que j'ai changé pour qu'il plante comme ça.
Pouvez-vous m'aider svp?
Merci d'avance
Dans le cadre d'un projet pour l'école, je dois créer un programme de gestion d'un camping.
J'ai donc créé un main contenant des appels à des fonctions dont les prototypes font partie d'un header.
Dans le main, j'ai mis un #include "header.h" et dans le header.h, il y a aussi 2 includes (myconio.h et stdio.h).
Quand je fais appel à une fonction à partir du main, il va rechercher dans le header le prototype et ensuite il appel la fonction.
Mais le myconio n'est pas reconnu dans le source contenant les fonctions, donc il me dit que les fonctions genre MYclrwin ne sont pas reconnues.
Si je mets un #include <myconio.h> dans le source des fonctions, il râle car il est déjà placé dans le header.h.
Le pire, c'est que ça fonctionnait très bien avant, et je ne sais pas ce que j'ai changé pour qu'il plante comme ça.
Pouvez-vous m'aider svp?
Merci d'avance
A voir également:
- Header c
- Langage ascii - Guide
- Langage binaire - Guide
- Langage visual basic - Télécharger - Langages
- Que veut dire pdf en langage sms ✓ - Forum Programmation
- Pascal langage - Télécharger - Édition & Programmation
13 réponses
Salut
Il te faut utiliser dans les fichiers où tu dois utiliser myconio.h
#ifndef MYCONIO
#define MYCONIO
#include <myconio.h>
#endif
Voir : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15954-le-preprocesseur#ss_part_4 : #ifndef pour éviter les inclusions infinies.
Salutations
cornalin
Il te faut utiliser dans les fichiers où tu dois utiliser myconio.h
#ifndef MYCONIO
#define MYCONIO
#include <myconio.h>
#endif
Voir : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15954-le-preprocesseur#ss_part_4 : #ifndef pour éviter les inclusions infinies.
Salutations
cornalin
fiddy
Messages postés
11653
Statut
Contributeur
1 847
Non. Il faut plutôt utiliser #ifndef MYCONIO... dans le header myconio.h.
Maknash
Messages postés
701
Statut
Membre
184
>
fiddy
Messages postés
11653
Statut
Contributeur
Il y est déjà il me semble, de toute façon je ne peux pas modifier le myconio.h...
Merci pour ta réponse rapide.
Je viens d'essayer et de lire ce que tu m'as donné.
Ca me met toujours les mêmes erreurs.
Si j'ai bien compris, j'ai mis dans mon fichier design.c
et dans header.h
Ai-je mal compris ou fait quelque chose de travers?
Je viens d'essayer et de lire ce que tu m'as donné.
Ca me met toujours les mêmes erreurs.
Si j'ai bien compris, j'ai mis dans mon fichier design.c
#ifndef MYCONIO #define MYCONIO #include <myconio.h> /* mon code */ #endif
et dans header.h
#ifndef MYCONIO #define MYCONIO #include <myconio.h> /* mes prototypes */ #endif
Ai-je mal compris ou fait quelque chose de travers?
Ca me génère de toute façon l'erreur aussi.
Code::Blocks devient fou, je ne comprends vraiment pas, au début ça ne faisait pas ça...
Code::Blocks devient fou, je ne comprends vraiment pas, au début ça ne faisait pas ça...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir,
Que contient myconio.h ? C'est toi qui l'as écris ?
Sinon il s'agit peut-être d'une inclusion infinie, dans ce cas, il faut mettre :
#ifndef NOMDUFICHIER_H
#define NOMDUFICHIER_H
/*tout ton code*/
#endif
Et tu le fais pour tous tes header.
Par exemple, pour ton fichier myconio.h
#ifndef MYCONIO_H
#define MYCONIO_H
...
#endif
Bien sûr, tu peux choisir ta propre convention de nommage.
Je te conseille avant tout de mettre poster le message d'erreur que tu obtiens. Le message d'erreur indique une bonne piste généralement.
Que contient myconio.h ? C'est toi qui l'as écris ?
Sinon il s'agit peut-être d'une inclusion infinie, dans ce cas, il faut mettre :
#ifndef NOMDUFICHIER_H
#define NOMDUFICHIER_H
/*tout ton code*/
#endif
Et tu le fais pour tous tes header.
Par exemple, pour ton fichier myconio.h
#ifndef MYCONIO_H
#define MYCONIO_H
...
#endif
Bien sûr, tu peux choisir ta propre convention de nommage.
Je te conseille avant tout de mettre poster le message d'erreur que tu obtiens. Le message d'erreur indique une bonne piste généralement.
Je viens de voir que c'est pas MYCONIO mais _MYCONIO_H qu'il est mis dans le myconio.h.
Quand je remplaces avec ça, ça me met des autres erreurs, me disant que je n'ai pas déclaré les LIGHTGRAY etc...
Quand je remplaces avec ça, ça me met des autres erreurs, me disant que je n'ai pas déclaré les LIGHTGRAY etc...
Non non le myconio.h est téléchargé sur le net. On utilise ça à l'école donc je ne peux rien modifier là-dedans...
Voici le myconio.h :
Voici le myconio.h :
// Nom du fichier : myconio.h
// Auteur : prof.geii37@laposte.net
// Version : Novembre 2004
// Objectif : remédier à l'absence de certaines fonctions conio sous DevC++
/* Remarques :
- Dev-C++ possède déjà une bibliothèque conio dans laquelle les fonctions
« getch », « getche », « kbhit », « putch » et « ungetch » sont codées.
- « textmode n'a pas été réécrite car les modes d'affichage prévus sous DOS
n'ont pas de sens dans une fenêtre console Windows.
- « window » n'a pas pu être écrite... seule une fonction « MYclrwin » a été
codée pour remplacer l'appel de « window » suivi d'un « clrscr ».
Toutefois la zone d'écriture à l'écran n'est pas limitée.
- « MYwindow » redimensionne la fenêtre de la console.
A noter : le comportement de cette fonction n'a aucun rapport avec celui
de « window » de conio.
*/
#ifndef _MYCONIO_H_
#define _MYCONIO_H_
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <wincon.h>
#ifdef __cplusplus
extern "C" {
#endif
struct text_info {
unsigned char winleft;
unsigned char wintop;
unsigned char winright;
unsigned char winbottom;
unsigned char attribute;
unsigned char normattr;
unsigned char currmode;
unsigned char screenheight;
unsigned char screenwidth;
unsigned char curx;
unsigned char cury;
};
enum COLORS { BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,
DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED,
LIGHTMAGENTA, YELLOW, WHITE } ;
#define _NOCURSOR 0
#define _SOLIDCURSOR 1
#define _NORMALCURSOR 2
#define C40 1
void _setcursortype(int type);
char *cgets(char *str);
void clreol();
void clrscr();
void delline();
#define cprintf printf
#define cscanf scanf
/* Les fonctions « cprintf » et « cscanf » n'ont pas été réécrites, ceci est
peut-être une erreur...
En effet, « scanf » lit les données à partir de « stdin » et les fonctions
d'entrée de la console lisent les données à partir de « STD_INPUT_HANDLE ».
Or il semblerait que « fflush(stdin) ; » n'ait pas le même effet que
« FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)) ; »...
A suivre... */
int cputs(const char *str) ;
int Gettext(int left, int top, int right, int bottom, void *destin) ;
#define gettext Gettext
/* Cette astuce a dû être utilisée car la ligne
« int gettext(int left, int top, int right, int bottom, void *destin) ; »
produit un message d'erreur (sous Dev-C++) ! */
void gettextinfo(struct text_info *_r);
int MYgetch(void) ;
int MYgetche(void) ;
/* « getch », « getche » sont déjà définies dans <conio.h> (mingw). Cependant,
au même titre que « getchar » (stdio) ne consomme pas le caractère <CR>,
elles ne consomment pas le caractère saisi par l'utilisateur (c'est à dire :
elles n'enlèvent pas le caractère du buffer d'entrée). « MYgetch »,
« MYgetche » vident le buffer. Attention, « MYgetch » et « MYgetche »
n'enlèvent pas un caractère, mais tous les caractères disponibles. Grâce
aux directives « #define » inclus dans MYconio.cpp, ce sont les fonctions
« MYgetch » et « MYgetche » qui seront appelées si dans un source on fait
appel à « getch » ou « getche ». */
void gotoxy(int x, int y);
void highvideo();
void insline();
// kbhit : OK déjà défini dans <conio.h> (mingw)
void lowvideo();
int movetext(int left, int top, int right, int bottom, int destleft, int desttop);
void normvideo();
// putch : OK déjà défini dans <conio.h> (mingw)
int puttext(int left, int top, int right, int bottom, void *source);
void textattr(int _attr);
void textbackground(int _color);
void textcolor(int _color);
/* BLINK (clignotement) ne fonctionne pas ! Par contre, il est possible
d'utiliser les oucleurs LIGHT pour le fond d'écran, ce qui n'est pas le cas
pour une application DOS.*/
/* « void textmode(int _mode); » n'a pas été réécrite, car les modes
d'affichage DOS n'ont aucun sens dans une application console Windows. */
// ungetch : OK déjà défini dans <conio.h> (mingw)
int wherex();
int wherey();
void MYclrwin(int left, int top, int right, int bottom); // efface une zone
/* La fonction « window » de conio est fréquemment utilisée (suivi de
« clrscr ») pour effacer une zone de l'écran et modifier sa couleur en
fonction des attribus mis à jour par « textcolor » ou « textbackground ».
« MYclrwin » permet cela, mais elle n'interdit pas d'écrire en dehors
de cette zone.*/
void MYwindow(int left, int top, int right, int bottom);
/* « MYwindow » permet de redimensionner la fenêtre de la console. Cependant,
ce comportement, n'est pas celui de la fonction « window » de conio */
// void window(int left, int top, int right, int bottom);
#ifdef __cplusplus
}
#endif
#include <myconio.cpp>
#endif //_MYCONIO_H_
Effectivement, il ne faut pas le modifier (c'est pour ça que je te demandais sa provenance).
De toute façon, tu constates qu'il y a bien le #ifndef #define ... #endif. Je rinsiste pour te dire que tu peux mettre le nom que tu veux (à toi de choisisr ta convention).
Par contre, sauf erreur de ma part, tu n'as toujours pas mis le message d'erreur retourné par ton compilateur...
De toute façon, tu constates qu'il y a bien le #ifndef #define ... #endif. Je rinsiste pour te dire que tu peux mettre le nom que tu veux (à toi de choisisr ta convention).
Par contre, sauf erreur de ma part, tu n'as toujours pas mis le message d'erreur retourné par ton compilateur...
En fait, je ne vois pas trop pourquoi mais le define du myconio.h se trouvant dans le header.h porte sur le main mais pas sur le design.c.
Voici les messages d'erreurs :
Voici les messages d'erreurs :
D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:5: warning: implicit declaration of function `textbackground' D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:5: warning: implicit declaration of function `MYclrwin' D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:6: warning: implicit declaration of function `textcolor' D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:13: error: `LIGHTGRAY' undeclared (first use in this function) D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:13: error: (Each undeclared identifier is reported only once D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:13: error: for each function it appears in.) D:\Documents and Settings\Kevin\Mes documents\Informatique\ISAT\Projet C\2010\camping\design.c:13: warning: implicit declaration of function `gotoxy' :: === Build finished: 3 errors, 4 warnings ===
Voici mes sources si besoin est :
Le main:
Le design:
Le header.h
Voilà, tout n'est pas complet évidement vu que c'est seulement le début pour le moment...
Le main:
#include "headers\header.h"
#define N 5
int main(void)
{
int i, ok, lig;
char car, pass[N];
design(1,1,80,25, DARKGRAY, WHITE);
printf("Coucou beuh!");
design(1,5,80,23, WHITE, BLACK);
affichPassword();
for(i=0;i<N && (car=getch())!='\r';i++) { pass[i]=car; printf("*"); }
pass[i]='\0';
ok=password(pass);
switch(ok)
{
case -1 : textcolor(LIGHTGREEN); printf("\nBienvenue root"); break;
case 0 : textcolor(LIGHTRED); printf("\nErreur : Mauvais mot de passe. Vous n'etes pas autorise a entrer !"); break;
case 1 : textcolor(LIGHTBLUE); printf("\nBienvenue user");
}
return 0;
}
Le design:
#include <stdio.h>
void design(unsigned short l, unsigned short t, unsigned short r, unsigned short b, unsigned short bgcolor, unsigned short txtcolor)
{
textbackground(bgcolor); MYclrwin(l,t,r,b);
textcolor(txtcolor);
}
void affichPassword(void)
{
int i, lig;
textcolor(LIGHTGRAY); gotoxy(10,9); printf("%c",218);
for(i=0;i<60;i++) printf("%c",196);
printf("%c",191);
for(i=0, lig=10;i<8;i++,lig++)
{
gotoxy(10,lig); printf("%c",179);
}
gotoxy(10,18); printf("%c",192);
printf("Entrez le mot de passe svp : ");
}
Le header.h
#include <stdio.h> #include <myconio.h> void design(unsigned short l, unsigned short t, unsigned short r, unsigned short b, unsigned short bgcolor, unsigned short txtcolor); void affichPassword(void); short password(char pass[5]);
Voilà, tout n'est pas complet évidement vu que c'est seulement le début pour le moment...
Dans ton design.c, tu utilises des fonctions définies dans myconio.h et pourtant tu ne l'inclues pas dans ton design.h. D'où les avertissements que tu as reçus.
De plus (ça ne règlera pas le problème), l'astuce du #ifndef NOMDUFICHIER doit être faite sur tous les fichiers header, c'est une bonne habitude à prendre. Relis mon post #7 qui explique ceci.
Et reposte tes éventuels messages d'erreur s'il en reste.
De plus (ça ne règlera pas le problème), l'astuce du #ifndef NOMDUFICHIER doit être faite sur tous les fichiers header, c'est une bonne habitude à prendre. Relis mon post #7 qui explique ceci.
Et reposte tes éventuels messages d'erreur s'il en reste.
Non justement.
Tu dois mettre les .h utiles dans chacun de tes fichiers sources. Sinon le compilateur n'aura pas connaissance des fonctions définies dans les autres fichiers .c. Donc tu dois bien mettre #include <myconio.h> dans ton design.c.
C'est d'ailleurs pour cette raison que l'astuce #ifndef ... est nécessaire pour chacun des headers.
Tu dois mettre les .h utiles dans chacun de tes fichiers sources. Sinon le compilateur n'aura pas connaissance des fonctions définies dans les autres fichiers .c. Donc tu dois bien mettre #include <myconio.h> dans ton design.c.
C'est d'ailleurs pour cette raison que l'astuce #ifndef ... est nécessaire pour chacun des headers.
J'ai testé un autre truc, j'ai créé un fichier design.h et j'ai mis les #ifndef et tout ça dedans, y compris dans le header.h.
Et voici les messages d'erreurs maintenant :
Et voici les messages d'erreurs maintenant :
:C:\MinGW\include\myconio.cpp:20: multiple definition of `_setcursortype' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:20: first defined here :C:\MinGW\include\myconio.cpp:30: multiple definition of `cgets' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:30: first defined here :C:\MinGW\include\myconio.cpp:54: multiple definition of `clreol' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:54: first defined here :C:\MinGW\include\myconio.cpp:71: multiple definition of `clrscr' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:71: first defined here :C:\MinGW\include\myconio.cpp:93: multiple definition of `cputs' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:93: first defined here :C:\MinGW\include\myconio.cpp:98: multiple definition of `delline' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:98: first defined here :C:\MinGW\include\myconio.cpp:135: multiple definition of `MYgetche' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:135: first defined here :C:\MinGW\include\myconio.cpp:147: multiple definition of `Gettext' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:147: first defined here :C:\MinGW\include\myconio.cpp:174: multiple definition of `gettextInfo' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:174: first defined here :C:\MinGW\include\myconio.cpp:197: multiple definition of `highvideo' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:197: first defined here :C:\MinGW\include\myconio.cpp:204: multiple definition of `insline' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:204: first defined here :C:\MinGW\include\myconio.cpp:230: multiple definition of `lowvideo' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:230: first defined here :C:\MinGW\include\myconio.cpp:237: multiple definition of `movetext' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:237: first defined here :C:\MinGW\include\myconio.cpp:259: multiple definition of `normvideo' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:259: first defined here :C:\MinGW\include\myconio.cpp:264: multiple definition of `puttext' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:264: first defined here :C:\MinGW\include\myconio.cpp:293: multiple definition of `textbackground' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:293: first defined here :C:\MinGW\include\myconio.cpp:299: multiple definition of `textcolor' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:299: first defined here :C:\MinGW\include\myconio.cpp:319: multiple definition of `MYclrwin' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:319: first defined here :C:\MinGW\include\myconio.cpp:346: multiple definition of `MYwindow' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:346: first defined here :C:\MinGW\include\myconio.cpp:289: multiple definition of `textattr' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:289: first defined here :C:\MinGW\include\myconio.cpp:190: multiple definition of `gotoxy' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:190: first defined here :C:\MinGW\include\myconio.cpp:311: multiple definition of `wherey' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:311: first defined here :C:\MinGW\include\myconio.cpp:305: multiple definition of `wherex' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:305: first defined here :C:\MinGW\include\myconio.cpp:123: multiple definition of `MYgetch' obj\Debug\main.o:C:\MinGW\include\myconio.cpp:123: first defined here :: === Build finished: 48 errors, 0 warnings ===