Vous êtes sur la page 1sur 11

Royaume du Maroc

OFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL

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

Langage C et Gestion des Entres/Sorties

TECCART INTERNATIONAL 2000 inc.


3155, rue Hochelaga,
Montral, Qubec (Canada)
H1W 1G4

RDACTION
Robert Pesant
DESSINS ET CONCEPTION GRAPHIQUE
Robert Pesant
RVISION TECHNIQUE
Robert Pesant
RVISION LINGUISTIQUE
Franois Gaudreau

COMMISSION DE VALIDATION
Formateurs de lOFPPT

Les droits de reproduction et de diffusion de ce document sont cds par Teccart


International 2000 inc. lOffice de la Formation Professionnelle et de la Promotion du
Travail du Royaume du Maroc, pour sa propre utilisation au Maroc.
Mis part lOFPPT, toute reproduction, en tout ou en partie, par quelque procd que ce
soit, est interdite.

Imprim Montral, le j May


270866142.doc

Fichiers d'en-tte

Page 2

OFPPT/TECCART

Rsum de Thorie

Langage C et Gestion des Entres/Sorties

TABLE DES MATIRES


7. FICHIERS DEN-TTE
07.1 Fichiers d'en-tte de l'usager
07.1.1 Principaux lments d'un fichier d'en-tte...................................................................
17.1.2 Rdaction de programme avec fichier d'en-tte: FONC_H.C....................................
17.2 Fchiers d'en-tte de la bibliothque de Borland C++
27.2.1 Analyse de CONIO.H.................................................................................................
37.2.2 Fichier d'en-tte et fonction de bibliothque: EFFACE.C..........................................

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.

/*
*
*
*
*
*
*

Compilez FONC_H.C dans sa forme originale. Vous n'obtiendrez ni avertissement ni


erreur.
liminez ensuite la directive #include "fonc_h.h" en l'insrant temporairement dans un
commentaire. Compilez nouveau FONC_H.C: vous devriez obtenir 12
avertissements et 25 erreurs! Les deux premiers avertissements indiquent bien que le
compilateur ne trouve pas la dclaration de la fonction menu():
Warning FONC_H.C 45: No declaration for function 'menu'
Warning FONC_H.C 45: Call to function 'menu' with no prototype

Fich. d'entte: FONC_H.H


=============== ========
Auteur:
Date:
Rvision:
Version:

*
* 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.

/* ----- Les constantes symboliques --------------------------------------- */


#define
#define
#define
#define
#define

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

"Affichage des codes ASCII ..................


"Mise l'chelle d'un transmetteur 4-20 mA .
"Quitter ....................................
"Votre choix ................................

#define
#define
#define
#define
#define
#define
#define

RETOUR
ASCII_1
ASCII_2
ECHELLE_1
ECHELLE_2
ECHELLE_3
ECHELLE_4

"Retour au menu: une touche, SVP"


"Entrez le code ASCII initial: "
"Entrez le code ASCII final: "
"Transmetteur de temprature 4-20 mA (-25 C +75 C)"
"====================================================="
"Entrez la valeur du courant du transmetteur .: "
"La temprature mesure correspondante est ...: "

#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>"
< * >"

/* ----- Les dclarations des fonctions de l'usager ----------------------- */


void
int
void
void
double

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.

/* Les fichiers d'en-tte de la bibliothque de Borland C++ --------------- */


/*
* Note:
*
*
*/
#include
#include
#include
#include
#include

A cause des crochets <> dans les directives #include suivantes,


le prprocesseur se dirige immdiatement dans le
rpertoire \TC\INCLUDE pour trouver le fichier d'en-tte.
<stdio.h>
<conio.h>
<string.h>
<process.h>
<dos.h>

/* Le fichier d'en-tte de l'usager --------------------------------------- */


/*
* Note:
*
*
*
*/

A cause des guillemets "" dans la directive #include suivante,


le prprocesseur consulte d'abord le rpertoire par dfaut
pour trouver le fichier d'en-tte. S'il n'y est pas,
il poursuit sa recherche dans le rpertoire \TC\INCLUDE.

#include "fonc_h.h"
void main(void)
{
int choix, ascii_min, ascii_max;
double courant, temperature;
clrscr();
menu();
....

Fchiers d'en-tte de la bibliothque de Borland C++


Analyse de CONIO.H
L'diteur de texte de Borland C++ nous a permis de rdiger un fichier d'en-tte pour notre
application. Nous pouvons galement nous en servir pour lire un fichier d'en-tte de la
bibliothque.
l'aide de la commande File/Open, chargeons le fichier C:\TC\INCLUDE\CONIO.H:
/*

conio.h
Direct MSDOS console input/output.

*/

Copyright (c) 1987, 1991 by Borland International


All Rights Reserved.

#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 */

128 /* blink bit */

int _Cdecl directvideo;


int _Cdecl _wscroll;

#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

inport( int __portid );


outport( int __portid, int __value );
delline( void );
gettext( int __left, int __top,
int __right, int __bottom,
void *__destin);
void
_Cdecl gettextinfo (struct text_info *__r );
void
_Cdecl highvideo( void );
void
_Cdecl insline( void );
void
_Cdecl lowvideo( void );
int
_Cdecl movetext( int __left, int __top,
int __right, int __bottom,
int __destleft, int __desttop );
void
_Cdecl normvideo( void );
int
_Cdecl puttext( int __left, int __top,
int __right, int __bottom,
void *__source );
void
_Cdecl textattr( int __newattr );
void
_Cdecl textbackground( int __newcolor );
void
_Cdecl textcolor( int __newcolor );
void
_Cdecl textmode( int __newmode );
void
_Cdecl window( int __left, int __top, int __right, int __bottom);
void
_Cdecl _setcursortype( int __cur_t );
char * _Cdecl cgets( char *__str );
int
_Cdecl cprintf( const char *__format, ... );
int
_Cdecl cputs( const char *__str );
int
_Cdecl cscanf( const char *__format, ... );
char * _Cdecl getpass( const char *__prompt );
int
_Cdecl ungetch( int __ch );
#ifndef _PORT_DEFS
#define _PORT_DEFS
/* These are in-line functions. These prototypes just clean up
some syntax checks and code generation.
*/
unsigned char _Cdecl
__inportb__( int __portid );
unsigned int _Cdecl
__inportw__( int __portid );
void
_Cdecl
__outportb__( int __portid, unsigned char __value );
void
_Cdecl
__outportw__( int __portid, unsigned int __value );
#define
#define
#define
#define
#define
#define
#define
#define
#endif

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

enum text_modes { LASTMODE=-1, BW40=0, C40, BW80, C80, MONO=7, C4350=64 };


enum COLORS {
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#define BLINK

/* dark colors */

/* light colors */

128 /* blink bit */

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 );

Fichier d'en-tte et fonction de bibliothque: EFFACE.C


Le lien entre le fichier d'en-tte CONIO.H et la fonction clrscr() sera tabli l'aide du
programme EFFACE.C:
/* Programme:
* =========
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
*/

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();
}

Compilez EFFACE.C. Vous obtiendrez les avertissements suivants:


Warning EFFACE.C 21: No declaration for function 'clrscr';
Warning EFFACE.C 21: Call to function 'clrscr' with no prototype.
Compilez maintenant EFFACE.C, aprs avoir activ la directive #include <conio.h> en
enlevant les dlimiteurs de commentaire qui l'entourent. La compilation s'effectuera parfaitement,
sans avertissement ni erreur.
Insrez nouveau la directive #include <conio.h> dans un commentaire. liminez les
dlimiteurs de commentaire entourant la dclaration de fonction void clrscr(void);. Compilez
une dernire fois EFFACE.C. La compilation s'effectuera encore parfaitement, sans
avertissement ni erreur.
Dans le cas de clrscr(), on peut donc conclure que la seule et unique information contenue dans
CONIO.H ncessaire sa compilation est sa dclaration.