17
Royaume du Maroc OFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL Cours 13T Langage C et Gestion des Entr�es/Sorties R�sum� de Th�orie Version préliminaire Deuxième Année Programme de Formation des Techniciens Spécialisés en Électronique DIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATION Septembre 1996

CH07_13T

  • Upload
    red-all

  • View
    214

  • Download
    0

Embed Size (px)

DESCRIPTION

CH07_13T

Citation preview

Rsum de Thorie

COMMENTAIRES \* FUSIONFORMAT Cours 13T SUJET \* FUSIONFORMAT Langage C et Gestion des Entres/Sorties TITRE \* FUSIONFORMAT Rsum de ThorieVersion prliminaire

TECCART INTERNATIONAL 2000 inc.3155, rue Hochelaga,Montral, Qubec (Canada)H1W 1G4

RDACTIONRobert Pesant

DESSINS ET CONCEPTION GRAPHIQUERobert Pesant

RVISION TECHNIQUERobert Pesant

RVISION LINGUISTIQUEFranois Gaudreau

COMMISSION DE VALIDATIONFormateurs 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 HEURE \@ "j MMMM aaaa" 26 fvrier 1996 NOMFICHIER \* FUSIONFORMAT CH07_13T.DOCTABLE DES MATIRES TM \o "1-3" 7. Fichiers den-tte BOUTONATTEINDRE _Toc352994657 RENVOIPAGE _Toc352994657 7-17.1 Fichiers d'en-tte de l'usager BOUTONATTEINDRE _Toc352994658 RENVOIPAGE _Toc352994658 7-17.1.1 Principaux lments d'un fichier d'en-tte BOUTONATTEINDRE _Toc352994659 RENVOIPAGE _Toc352994659 7-17.1.2 Rdaction de programme avec fichier d'en-tte: FONC_H.C BOUTONATTEINDRE _Toc352994660 RENVOIPAGE _Toc352994660 7-17.2 Fchiers d'en-tte de la bibliothque de Borland C++ BOUTONATTEINDRE _Toc352994661 RENVOIPAGE _Toc352994661 7-47.2.1 Analyse de CONIO.H BOUTONATTEINDRE _Toc352994662 RENVOIPAGE _Toc352994662 7-47.2.2 Fichier d'en-tte et fonction de bibliothque: EFFACE.C BOUTONATTEINDRE _Toc352994663 RENVOIPAGE _Toc352994663 7-7Fichiers den-tteFichiers d'en-tte de l'usagerPrincipaux lments d'un fichier d'en-tteL'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:les constantes symboliques (appeles aussi macros sans paramtres);les macros avec paramtres (ne seront pas tudies dans ce cours);les dclarations de fonctions.Rdaction de programme avec fichier d'en-tte: FONC_H.CPour illustrer la notion de fichier d'en-tte, le programme FONCTION.C, prsent au chapitre prcdent, a t modifi de la faon suivante.Une premire copie de FONCTION.C a t nomme FONC_H.C.Dans ce nouveau fichier, les directives au prprocesseur #define ont toutes t limines.On y a galement effac les dclarations des fonctions de l'usager.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.Une deuxime copie de FONCTION.C a t nomme FONC_H.H.Dans ce fichier d'en-tte, seules les directives au prprocesseur #define et les dclarations des fonctions de l'usager ont t conserves.Les constantes symboliques MENU_3 et MENU_4 ont t adaptes FONC_H.C.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.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: Robert Pesant * Date: 07/03/1993 * Rvision: 25/04/1995 * Version: V1.2 * * Volume: COURS_13T * Fichier: \CHAP.007\FONC_H.H * * Description: 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 MENU_1 ""#define MENU_2 " Programme de dmonstration "#define MENU_3 " avec fonctions et fichier "#define MENU_4 " d'en-tte de l'usager "#define MENU_5 ""

#define MENU_6 "Affichage des codes ASCII .................. < 1 >"#define MENU_7 "Mise l'chelle d'un transmetteur 4-20 mA . < 2 >"#define MENU_8 "Quitter .................................... "#define MENU_9 "Votre choix ................................ < * >"

#define RETOUR "Retour au menu: une touche, SVP"#define ASCII_1 "Entrez le code ASCII initial: "#define ASCII_2 "Entrez le code ASCII final: "#define ECHELLE_1 "Transmetteur de temprature 4-20 mA (-25 C +75 C)"#define ECHELLE_2 "====================================================="#define ECHELLE_3 "Entrez la valeur du courant du transmetteur .: "#define ECHELLE_4 "La temprature mesure correspondante est ...: "

#define CODE_ASCII '1'#define TX_4_20_MA '2'#define ESC 27#define CLE_INTERDITE !((choix == '1') || (choix == '2') || (choix == ESC))

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

void menu (void);int get_choix (void);void clr_lines (int y);void affi_ascii (int code_min, int code_max);double mise_a_echelle (double courant, double portee_min, double portee_max);

/* Programme: FONC_H.C * ========= ======== * * Auteur: Robert Pesant * Date: 07/03/1993 * Rvision: 25/04/1995 * Version: V1.2 * * Volume: COURS_13T * Fichier: \CHAP.007\FONC_H.C * * Description: 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: 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. */

#include #include #include #include #include

/* Le fichier d'entte 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.HL'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 #endif

#define _NOCURSOR 0#define _SOLIDCURSOR 1#define _NORMALCURSOR 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, /* dark colors */ BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, /* light colors */ LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE};#endif

#define BLINK 128 /* blink bit */

extern int _Cdecl directvideo;extern int _Cdecl _wscroll;

#ifdef __cplusplusextern "C" {#endif

void _Cdecl clreol( void );void _Cdecl clrscr( void );void _Cdecl gotoxy( int __x, int __y );int _Cdecl wherex( void );int _Cdecl wherey( void );int _Cdecl getch( void );int _Cdecl getche( void );int _Cdecl kbhit( void );int _Cdecl putch( int __c );

#ifndef _PORT_DEFSint _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 _Cdecl inport( int __portid );void _Cdecl outport( int __portid, int __value );void _Cdecl delline( void );int _Cdecl 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 inline 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 inportb __inportb__#define inportw __inportw__#define outportb __outportb__#define outportw __outportw__#define inp( portid ) __inportb__( portid )#define outp( portid,v ) (__outportb__( portid,v ), (int)_AL)#define inpw( portid ) __inportw__( portid )#define outpw( portid,v ) (__outportw__( portid,v ), (unsigned)_AX)#endif /* _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 0#define _SOLIDCURSOR 1#define _NORMALCURSOR 2

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

enum COLORS { BLACK, /* dark colors */ BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, /* light colors */ LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE};

#define BLINK 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 BLACK 0#define BLUE 1#define GREEN 2#define CYAN 3...#define 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 LASTMODE -1#define BW40 0#define C40 1#define BW80 2#define C80 3#define MONO 7#define C4350 64

Un peu plus loin dans CONIO.H, on reconnat les dclarations de plusieurs fonctions de la bibliothque de Borland C++.

void _Cdecl clreol( void );void _Cdecl clrscr( void );void _Cdecl gotoxy( int __x, int __y );int _Cdecl wherex( void );int _Cdecl wherey( void );int _Cdecl getch( void );int _Cdecl getche( void );int _Cdecl kbhit( void );int _Cdecl 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 clreol( void );void clrscr( void );void gotoxy( int x, int y );int wherex( void );int wherey( void );int getch( void );int getche( void );int kbhit( void );int putch( int c );

Fichier d'en-tte et fonction de bibliothque: EFFACE.CLe lien entre le fichier d'en-tte CONIO.H et la fonction clrscr() sera tabli l'aide du programme EFFACE.C:

/* Programme: EFFACE.C * ========= ======== * * Auteur: Robert Pesant * Date: 08/03/1993 * Rvision: 08/03/1993 * Version: V1.0 * * Volume: COURS_13T * Fichier: \CHAP.007\EFFACE.C * * Description: Programme de dmonstration qui montre le lien entre * le fichier d'en-tte CONIO.H et la fonction clrscr(). */

/* #include *//* 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 en enlevant les dlimiteurs de commentaire qui l'entourent. La compilation s'effectuera parfaitement, sans avertissement ni erreur.Insrez nouveau la directive #include 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. TITRE \* FUSIONFORMAT Rsum de Thorie SUJET \* FUSIONFORMAT Langage C et Gestion des Entres/Sorties

MOTSCLES \* FUSIONFORMAT Les fichiers d'en-ttePage PAGE \* FUSIONFORMAT 7-1OFPPT/TECCART

INCORPORER CDraw4 Royaume du MarocOFFICE DE LA FORMATION PROFESSIONNELLE ET DE LA PROMOTION DU TRAVAIL

Deuxime AnneProgramme de Formation des TechniciensSpcialiss en lectroniqueDIRECTION DE LA RECHERCHE ET INGENIERIE DE LA FORMATIONSeptembre 1996