Cours 13T
Langage C et Gestion des Entres/Sorties
Rsum de Thorie
Version prliminaire
Deuxime Anne
Programme de Formation des Techniciens
Spcialiss en lectronique
DIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATION
Septembre 1996
Rsum de Thorie
RDACTION
Robert Pesant
DESSINS ET CONCEPTION GRAPHIQUE
Robert Pesant
RVISION TECHNIQUE
Robert Pesant
RVISION LINGUISTIQUE
Franois Gaudreau
COMMISSION DE VALIDATION
Formateurs de lOFPPT
Fichiers d'en-tte
Page 2
OFPPT/TECCART
Rsum de Thorie
Fichiers d'en-tte
Page 3
OFPPT/TECCART
Fichiers den-tte
Fichiers d'en-tte de l'usager
Principaux lments d'un fichier d'en-tte
L'utilisation des constantes symboliques et des fonctions permet de bien structurer les
programmes. Toutefois, le dbut des fichiers sources commence s'alourdir quelque peu: il y
d'abord la liste des directives #include, puis la liste des directives #define pour les constantes
symboliques, et finalement la liste des dclarations des fonctions de l'usager. Pour certains
programmes, il peut y en avoir des pages avant de trouver la dfinition de main()!
Pour remdier cette situation, toutes les informations concernant le programme de l'usager
peuvent tre rassembles dans un fichier d'en-tte. Par une directive #include, le prprocesseur
l'insrera dans le programme, au mme titre que les fichiers d'en-tte de la bibliothque de
Borland C++.
Un fichier d'en-tte est un fichier source, rdig en C, dont le suffixe est H, comme CONIO.H,
STDIO.H. Fondamentalement, un fichier d'en-tte contient:
1.
les constantes symboliques (appeles aussi macros sans paramtres);
2.
les macros avec paramtres (ne seront pas tudies dans ce cours);
3.
les dclarations de fonctions.
Rdaction de programme avec fichier d'en-tte: FONC_H.C
Pour illustrer la notion de fichier d'en-tte, le programme FONCTION.C, prsent au chapitre
prcdent, a t modifi de la faon suivante.
4.
Une premire copie de FONCTION.C a t nomme FONC_H.C.
5.
Dans ce nouveau fichier, les directives au prprocesseur #define ont toutes t limines.
6.
On y a galement effac les dclarations des fonctions de l'usager.
7.
Enfin, la directive #include "fonc_h.h" a t ajoute. Les guillemets "" indiquent au
prprocesseur de dbuter la recherche du fichier d'en-tte dans le rpertoire par
dfaut, avant d'aller voir dans le sous-rpertoire INCLUDE de Borland C++. Pour
les fichiers d'en-tte de la bibliothque, on prfre utiliser les crochets < > pour
diriger immdiatement le prprocesseur vers le sous-rpertoire INCLUDE.
8.
Une deuxime copie de FONCTION.C a t nomme FONC_H.H.
9.
Dans ce fichier d'en-tte, seules les directives au prprocesseur #define et les dclarations
des fonctions de l'usager ont t conserves.
10. Les constantes symboliques MENU_3 et MENU_4 ont t adaptes FONC_H.C.
11. Les commentaires de dbut de fichier de FONC_H.C et FONC_H.H ont t modifis en
consquence.
En rsum, les directives pour crer les constantes symboliques et les dclarations des fonctions
de l'usager ont t exportes dans un deuxime fichier. Ce dernier est appel fichier d'en-tte et
est identifi par le suffixe H: FONC_H.H. la compilation du programme, les informations qu'il
contient seront importes dans FONC_H.C par le prprocesseur l'excution de la directive
#include "fonc_h.h". Les fichiers FONC_H.C et FONC_H.H sont donc complmentaires et
contiennent les mmes informations que FONCTION.C.
Le listage complet de FONC_H.H est prsent la page suivante. Il est suivi du listage partiel de
FONC_H.C: vous remarquerez que la suite de ce listage est identique celui de FONCTION.C,
analys au chapitre prcdent.
Pour confirmer le fonctionnement d'un fichier d'en-tte, on vous suggre les deux exercices
suivants.
12.
13.
/*
*
*
*
*
*
*
*
* Volume:
* Fichier:
*
* Description:
*
*
*
*
*
*/
Robert Pesant
07/03/1993
25/04/1995
V1.2
COURS_13T
\CHAP.007\FONC_H.H
Fichier d'en-tte pour le programme FONC_H.C
Note: Fondamentalement, un fichier d'en-tte contient:
1. les constantes symboliques (macros sans paramtres);
2. les macros avec paramtres;
3. les dclarations de fonctions.
MENU_1
MENU_2
MENU_3
MENU_4
MENU_5
""
" Programme de dmonstration "
" avec fonctions et fichier "
"
d'en-tte de l'usager
"
""
#define
#define
#define
#define
MENU_6
MENU_7
MENU_8
MENU_9
#define
#define
#define
#define
#define
#define
#define
RETOUR
ASCII_1
ASCII_2
ECHELLE_1
ECHELLE_2
ECHELLE_3
ECHELLE_4
#define
#define
#define
#define
CODE_ASCII
TX_4_20_MA
ESC
CLE_INTERDITE
'1'
'2'
27
!((choix == '1') || (choix == '2') || (choix == ESC))
< 1 >"
< 2 >"
<Esc>"
< * >"
menu
get_choix
clr_lines
affi_ascii
mise_a_echelle
(void);
(void);
(int y);
(int code_min, int code_max);
(double courant, double portee_min, double portee_max);
/* Programme:
* =========
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*/
FONC_H.C
========
Robert Pesant
07/03/1993
25/04/1995
V1.2
COURS_13T
\CHAP.007\FONC_H.C
Programme de dmonstration qui utilise les fonctions
et le fichier d'en-tte de l'usager.
#include "fonc_h.h"
void main(void)
{
int choix, ascii_min, ascii_max;
double courant, temperature;
clrscr();
menu();
....
conio.h
Direct MSDOS console input/output.
*/
#if !defined(__CONIO_H)
#define __CONIO_H
#if !defined(__DEFS_H)
#include <_defs.h>
#endif
#define _NOCURSOR
#define _SOLIDCURSOR
#define _NORMALCURSOR
0
1
2
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 text_modes { LASTMODE=-1, BW40=0, C40, BW80, C80, MONO=7, C4350=64 };
#if !defined(__COLORS)
#define __COLORS
enum COLORS {
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#endif
#define BLINK
extern
extern
/* dark colors */
/* light colors */
#ifdef __cplusplus
extern "C" {
#endif
void
void
void
int
int
int
int
int
int
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
clreol( void );
clrscr( void );
gotoxy( int __x, int __y );
wherex( void );
wherey( void );
getch( void );
getche( void );
kbhit( void );
putch( int __c );
#ifndef _PORT_DEFS
int
_Cdecl inp( unsigned __portid );
unsigned
_Cdecl inpw( unsigned __portid );
int
_Cdecl outp( unsigned __portid, int __value );
unsigned
_Cdecl outpw( unsigned __portid, unsigned __value );
unsigned char _Cdecl inportb( int __portid );
void
_Cdecl outportb( int __portid, unsigned char __value );
#endif /* !_PORT_DEFS */
int
void
void
int
_Cdecl
_Cdecl
_Cdecl
_Cdecl
inportb
__inportb__
inportw
__inportw__
outportb
__outportb__
outportw
__outportw__
inp( portid )
__inportb__( portid )
outp( portid,v ) (__outportb__( portid,v ), (int)_AL)
inpw( portid )
__inportw__( portid )
outpw( portid,v ) (__outportw__( portid,v ), (unsigned)_AX)
/* _PORT_DEFS */
#ifdef __cplusplus
}
#endif
#endif /* __CONIO_H */
Si on fait abstraction des directives de compilation conditionnelle comme #ifdef, #if !defined et
#endif, on peut comprendre la signification d'environ 80% de ce fichier.
Tout d'abord, on y retrouve des constantes symboliques dfinies l'aide de la directive #define ainsi
que des constantes symboliques dfinies par numration l'aide du mot-cl enum:
#define _NOCURSOR
#define _SOLIDCURSOR
#define _NORMALCURSOR
0
1
2
/* dark colors */
/* light colors */
Les valeurs numriques des constantes dfinies par numration sont obligatoirement entires et
conscutives en commenant par 0, 1, 2, et ainsi de suite. L'ensemble COLORS suit exactement
cette rgle et est quivalent :
#define
#define
#define
#define
...
#define
BLACK
BLUE
GREEN
CYAN
0
1
2
3
WHITE
15
On peut aussi forcer la valeur d'une constante par numration pour dbuter avec un entier autre
que 0 ou pour briser la chane des valeurs conscutives. C'est le cas de l'ensemble text_modes qui
est synonyme de:
#define
#define
#define
#define
#define
#define
#define
LASTMODE
BW40
C40
BW80
C80
MONO
C4350
-1
0
1
2
3
7
64
Un peu plus loin dans CONIO.H, on reconnat les dclarations de plusieurs fonctions de la
bibliothque de Borland C++.
void
void
void
int
int
int
int
int
int
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
_Cdecl
clreol( void );
clrscr( void );
gotoxy( int __x, int __y );
wherex( void );
wherey( void );
getch( void );
getche( void );
kbhit( void );
putch( int __c );
Il faut faire abstraction du mot-cl Cdecl et des caractres de soulignement simples et doubles. Ils
apportent des nuances de programmation avance qui dbordent le cadre de ce cours. Il faut
interprter ces dclarations de fonction comme suit:
void
void
void
int
int
int
int
int
int
clreol( void );
clrscr( void );
gotoxy( int x, int y );
wherex( void );
wherey( void );
getch( void );
getche( void );
kbhit( void );
putch( int c );
EFFACE.C
========
Robert Pesant
08/03/1993
08/03/1993
V1.0
COURS_13T
\CHAP.007\EFFACE.C
Programme de dmonstration qui montre le lien entre
le fichier d'en-tte CONIO.H et la fonction clrscr().
/* #include <conio.h> */
/* void clrscr(void); */
void main(void)
{
clrscr();
}