Include et headers en langage C

Résolu/Fermé
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 - 10 mars 2010 à 20:33
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 - 10 mars 2010 à 22:46
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

13 réponses

cornalin Messages postés 6 Date d'inscription mardi 9 mars 2010 Statut Membre Dernière intervention 10 mars 2010
10 mars 2010 à 20:57
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:15
Non. Il faut plutôt utiliser #ifndef MYCONIO... dans le header myconio.h.
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
10 mars 2010 à 21:18
Il y est déjà il me semble, de toute façon je ne peux pas modifier le myconio.h...
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:03
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
#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?
0
cornalin Messages postés 6 Date d'inscription mardi 9 mars 2010 Statut Membre Dernière intervention 10 mars 2010
10 mars 2010 à 21:06
Salut


/*mon code*/

/*mes prototypes*/

doivent être après le #endif

Salutations.

cornalin
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:25
Non, le #endif se met bien tout à la fin.
La protection se fait au niveau du fichier, pas au niveau du define.
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:10
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:21
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.
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:22
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...
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:26
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 :
// 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_
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:33
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...
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:38
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 :
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 ===
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:43
Tu as bien enlevé le #ifndef... du design.c ?
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:46
Bah oui, la preuve dans mon source
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:45
Voici mes sources si besoin est :
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 mars 2010 à 21:51
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.
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 21:53
Je n'ai pas de design.h, le source que j'ai posté est un design.c, je n'ai donc pas de design.h, j'ai juste un header.h.
J'ai déjà essayé le ifndef, mais ça n'a rien changé du tout...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013
10 mars 2010 à 22:00
J'ai effectivement fait une coquille que t'aurais pu rectifier...
Dans ton design.c tu utilises des fonctions déclarées dans myconio.h. Or dans ton design.c, tu n'as pas mis de #define <myconio.h>
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
10 mars 2010 à 22:04
Oui mais le #define <myconio.h> est déjà dans le header.h... Donc, si j'ajoute le myconio.h dans le design.c, il me mettra encore les messages d'erreur que j'ai mis ci-dessous...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013
10 mars 2010 à 22:08
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.
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
10 mars 2010 à 22:12
Ca me met toujours les mêmes erreurs, et je ne vois vraiment pas pourquoi...
Avant ça allait très bien, mais je ne vois pas pourquoi là, ça ne fonctionne plus...
Tant pi, je vais tenter en créant ma librairie .o avec le myconio et tout changer moi-même pour voir...
Ca devrait fonctionner ainsi
0
Maknash Messages postés 643 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 15 juillet 2013 183
10 mars 2010 à 22:01
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 :
: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 ===
0