Vous êtes sur la page 1sur 25

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


270865687.doc

Projets

Page 2

OFPPT/TECCART

Rsum de Thorie

Langage C et Gestion des Entres/Sorties

TABLE DES MATIRES


9. PROJETS
09.1 Compilation individuelle
09.1.1 Introduction................................................................................................................
19.1.2 Avantages de la compilation individuelle....................................................................
29.1.3 De l'dition l'excution, en projet.............................................................................
39.1.4 Fichiers d'un programme rdig en projet..................................................................
19.2 Rdaction d'un programme en projet
49.2.1 Programme avec des fichiers sources de l'usager: FONC_PRO.PRJ.........................
59.2.2 Programme avec un fichier objet de l'usager: FONC_PRO.PRJ................................
69.2.3 Programme avec des fichiers sources imports: CLKCHASR.PRJ............................
79.2.4 Programme avec une bibliothque importe: CLKCHASR.PRJ.................................

Projets

Page 3

OFPPT/TECCART

Projets
Compilation individuelle
Introduction
Jusqu' maintenant, nos programmes ont t constitus d'un seul fichier source xxx.C,
comprenant toutes les dfinitions de nos fonctions.
Il est toutefois possible, avec Borland C++, de sparer le programme en plusieurs fichiers
sources xxx.C contenant chacun une ou plusieurs fonctions. Ces fichiers pourront tre compils
individuellement et lis ensemble pour former le programme excutable. Il y aura autant de
fichiers objets xxx.OBJ qu'il y a de fichiers sources xxx.C, mais un seul fichier excutable
xxx.EXE.
Avantages de la compilation individuelle
La compilation individuelle de plusieurs fichiers sources mne une programmation modulaire.
Elle est responsable d'une grande conomie de temps la compilation, surtout lorsque le
programme est considrable. Les fichiers sources, dont la mise au point est termine, n'ont plus
tre recompils durant le dveloppement du reste du programme.
Enfin, cette technique de programmation favorise l'utilisation de fonctions disponibles sous forme
de banques de fichiers sources xxx.C, de banques de fichiers objets xxx.OBJ ou de bibliothques
xxx.LIB.
De l'dition l'excution, en projet
L'environnement intgr de Borland C++ permet de dfinir un projet l'aide des options du
menu Project. On pourra ouvrir une fentre Project o l'on rassemblera les noms de tous les
fichiers qui devront tre compils individuellement et lis ensembles pour produire le fichier
excutable du programme. Les dtails de cette technique seront dvoils plus loin dans ce
chapitre.
Pour l'instant, reportez-vous la Figure 9 -1. Les tapes menant de l'dition l'excution en
projet sont fondamentalement les mmes que pour un fichier xxx.C unique.
l'tape de l'Edition, l'usager pourra rdiger et sauvegarder tous ses fichiers sources l'aide de
l'diteur de Borland C++, comme auparavant. Toutefois, s'il a, sa disposition, une banque de
fichiers sources utilitaires, il pourra les importer dans le rpertoire de son application en vue de
l'tape suivante.
L'tape de Compilation produira autant de fichiers xxx.OBJ qu'il y a de fichiers xxx.C, ceux de
l'usager et ceux qu'il vient d'importer. Si l'usager veut utiliser des fichiers objets xxx.OBJ ou des
fichiers bibliothques xxx.LIB qu'il a en sa possession, il devra galement les importer dans le
rpertoire de l'application, en vue de l'dition des liens. Ces fichiers objets et bibliothques
peuvent tre de provenances diverses: proprit de l'usager, change avec d'autres programmeurs,
achat chez un manufacturier, achat d'une disquette accompagnant une publication technique.
Enfin, l'Edition des liens gnrera le fichier excutable xxx.EXE du projet.
Les informations relatives au projet pourront tre sauves dans le rpertoire de l'application en
pointant l'aide d'un [X] les options Desktop et Project de la commande Options/Save. Les
deux fichiers obtenus par cette intervention seront respectivement xxx.DSK et xxx.PRJ.

tapes

Organes logiciels

Fichiers gnrs

Fichiers externes

Source en
C
avec main()
xxx.C
(#1)

Fichiers d'en-tte
(Header Files)
xxx.H

diteur Intgr
(de type
WordStar)

1. dition

Prprocesseur et
Compilateur

2. Compilation

diteur de liens
(Linker)

3. dition des
liens

Source en
C
sans main()
xxx.C
(#2)

Source en
C
Import
xxx.C
(#3)

Code Objet
xxx.OBJ

(#1)

Code Objet
Import
xxx.OBJ

Code Objet
xxx.OBJ

(#2)

Code Objet
xxx.OBJ

(#3)

Bibliothque
Importe
xxx.LIB

Bibliothque
Standard
xxx.LIB

Code excutable
xxx.EXE

DOS
(Charger et
excuter)

4. Excution

Note 1
Note 2

: Tous les fichiers avec encadrs ombrags peuvent tre runis dans le projet.

: Le projet sera enregistr dans le fichier

F I G U R E 9-1: D E

xxx.PRJ

et le bureau, dans le fichier

xxx.DSK

L ' D I T I O N L ' E X C U T I O N , E N P R OJ E T

Pour se familiariser avec le contenu de ces deux fichiers, revoyons la configuration de Borland
C++ suggre au chapitre 1. La sauvegarde de cette configuration a cr trois fichiers dans le
rpertoire C:\TC\BIN: TCCONFIG.TC, TCDEF.DPR et TCDEF.DSK.
TCCONFIG.TC contient les informations globales de l'environnement intgr de Borland C++
incluant:
1.
les macros de l'diteur de texte;
2.
les options de l'diteur: mode d'insertion, mode de retrait automatique (autoindent mode),
usage du caractre de tabulation, etc.;
3.
la configuration de la souris;
4.
les drapeaux de sauvegarde automatique.
Le deuxime fichier, TCDEF.DPR, contient:
5.
les options compiler, linker, make et librarian;
6.
les chemins de rpertoires.
Enfin, TCDEF.DSK renferme les informations concernant:
7.
l'agencement des fentres sur le bureau (desktop); l'cran est considr comme un
bureau sur lequel sont dposs les documents et les outils de travail, c'est--dire
les fentres et la barre de menus);
8.
l'tat de chaque fentre: position du curseur, mode d'insertion, etc.;
9.
le contenu de la fentre du presse-papier (Clipboard);
10. le contenu de la fentre de surveillance (Watch);
11. les points d'arrt.
Ces trois fichiers sont utiliss par Borland C++ lorsque nous rdigeons un programme l'aide
d'un fichier source unique. Par contre, lorsqu'un programme est bti en projet, xxx.PRJ et
xxx.DSK remplacent respectivement TCDEF.DPR et TCDEF.DSK, les deux fichiers par dfaut.
Ils contiennent les mmes donnes qui peuvent tre modifies pour chaque projet. Le fichier de
projet xxx.PRJ contient en plus la liste des noms des fichiers de la fentre Project.
Fichiers d'un programme rdig en projet
La Tableau 9 -1 dresse la liste de tous les fichiers qui pourront tre impliqus dans la ralisation
d'un programme en projet.
T AB L E AU 9- 1: L E S
Rpertoire

Application

Output
(OBJ_EXE)

F I C H I E R S D ' U N P R O G R AM M E R D I G E N P R O J E T

Fichiers
Sources (xxx.C)
Den-tte (xxx.H)
Sources imports (xxx.C)
Den-tte pour sources imports (xxx.H)
Objets imports (xxx.OBJ)
Den-tte pour objets imports (xxx.H)
Bibliothques importes (xxx.LIB)
Den-tte pour bibliothques importes (xxx.H)
Projet (xxx.PRJ)
Bureau (xxx.DSK)
Objets (xxx.OBJ) de tous les sources (xxx.C)
Excutable unique du projet (xxx.EXE)

Optionel
Non
Oui

Origine
Usager.

Oui
Oui

Usager, banque, publication


technique, manufacturier.

Oui
Oui

Usager, banque, publication


technique, manufacturier.

Oui
Oui

Usager, banque, publication


technique, manufacturier.

Oui
Oui

Usager.

Non
Non

Compilation.
dition des liens.

Dans le rpertoire d'application, se trouvent tous les fichiers rdigs ou imports par l'usager. Les
noms de tous les fichiers xxx.C, xxx.OBJ et xxx.LIB devront tre ajouts au fichier projet
xxx.PRJ. Attention! Il ne faut pas inscrire les noms des fichiers d'en-tte xxx.H dans un fichier
projet xxx.PRJ. Les fichiers d'en-tte doivent toujours tre appels par une directive #include
dans un fichier source xxx.C.
Aprs la compilation et l'dition des liens, le rpertoire d'Output de l'usager contiendra le fichier
excutable xxx.EXE ainsi que les fichiers objets xxx.OBJ correspondant aux fichiers sources
xxx.C du projet.
Attention! Si vous oubliez de sauvegarder les fichiers xxx.PRJ et xxx.DSK, vous devrez repartir
le projet zro lors de la prochaine session de travail. Ceci implique que vous devrez reconstituer
le contenu du projet et ouvrir, sur le bureau, toutes les fentres des fichiers que vous voulez
diter.

Rdaction d'un programme en projet


Programme avec des fichiers sources de l'usager: FONC_PRO.PRJ
Le programme FONC_CO.C, prsent au chapitre prcdent, a t fragment en plusieurs fichiers
sources pour obtenir un programme d'application conu en projet. La procdure suivie se compose
des tapes suivantes.
1.
Une copie de FONC_CO.H a t nomme FONC_PRO.H.
2.

Aucune modification importante n'a t apporte FONC_PRO.H puisque les fonctions


du programme sont restes les mmes. Seule une constante symbolique a t change
pour adapter le titre la nouvelle procdure de programmation.

3.

Une copie de FONC_CO.C a t nomme FONC_PRO.C.

4.

La fonction get_choix() a t extraite de FONC_PRO.C et sauvegarde dans un fichier


source appel LIRE_KB.C.

5.

Les fonctions menu(), clr_lines() et affi_ascii() ont t transfres de FONC_PRO.C


AFFI_SCR.C.

6.

Seule la fonction mise_a_echelle() a t conserve dans FONC_PRO.C pour


accompagner la fonction main(). Mme si un programme se compose de plusieurs
fichiers sources, il ne peut contenir qu'une et une seule fonction main().

7.

Nous avons choisi, pour cette application, de travailler avec deux fichiers secondaires: un
fichier d'entre de donnes au clavier, LIRE_KB.C, et un fichier de sortie l'cran,
AFFI_SCR.C. Il aurait t possible de crer un troisime fichier source, CALCUL.C,
pour contenir la fonction mise_a_echelle(). C'est l'usager de dcider d'un compromis
entre les deux extrmes: avoir un seul fichier source contenant toutes les fonctions ou
rdiger un fichier source par fonction. Avec un peu d'exprience, le gros bon sens dictera
la meilleure faon de procder.

8.

Vous pouvez consulter les listages documents des fichiers du projet la fin des tapes de
la procdure.

9.

Chaque fichier source du projet a t compil sparment l'aide de la commande


Compile/Compile. Les fichiers d'en-tte ncessaires pour liminer les warnings ont t
insrs dans chacun d'entre eux par une directive #include. Pour tre compils, les
fichiers dun projet doivent tre disposs sur le bureau de Borland C++ (Desktop),
comme la Figure 9 -2.

F I G U R E 9-2: D I S P O S I T I O N

10.

D E S F I C H I E R S D U P R OJ E T

F O NC_ P R O . P RJ

S U R L E B U R E AU

L'ouverture d'une fentre de projet s'effectue l'aide de la commande Project/Open


project.... On doit d'abord nommer le fichier xxx.PRJ: tous les noms sont permis mais on
recommande d'utiliser le mme nom pour le fichier projet, le fichier source contenant
main() et le fichier d'en-tte du programme (c.f. Figure 9 -3). La gestion du projet en est
grandement simplifie.

F I G U R E 9-3: O U V E R T U R E

11.

DE LA FENTRE DU PROJET

FO NC_ P RO . P RJ

On doit ensuite dresser la liste de tous les fichiers sources dans la fentre Project l'aide
de la commande Project/Add item... (c.f. Figure 9 -4). Les fichiers d'en-tte ne doivent
jamais faire partie de la liste d'un projet: il doivent tre appels par la directive
#include.

F I G U R E 9-4: P R PAR ATI O N

DE LA LISTE DES FICHIERS DU PROJET

FO NC_ P RO . P RJ

12.

L'dition des liens peut tre ralise de deux faons diffrentes. Avec la commande
Compile/Make, seuls les fichiers qui ont t modifis sont compils avant l'dition des
liens. Par contre, avec un Compile/Build all, tous les fichiers sources sont
inconditionnellement recompils avant l'dition des liens. Les rsultats de la ralisation du
projet sont affichs dans la fentre projet, comme la Figure 9 -5.

F I G U R E 9-5: R S U LTAT S

13.

D E L A R AL I S AT I O N D U P R OJ E T

Maintenant que nous avons obtenu le fichier excutable FONC_PRO.EXE, on peut


sauvegarder les fichiers FONC_PRO.PRJ et FONC_PRO.DSK avec la commande
Options/Save.... Mme si cette tape est optionnelle, il est trs avantageux de possder
ces deux fichiers dans le rpertoire de l'application. Lorsqu'on voudra reprendre le travail,
il suffira de dmarrer Borland C++ partir de ce rpertoire ou de slectionner le projet
FONC_PRO.PRJ l'aide de la commande Project/Open project... pour voir apparatre
toutes les fentres des fichiers, telles qu'elles taient places lors de la dernire sauvegarde
(c.f. Figure 9 -6).

F I G U R E 9-6: S AU V E G AR D E

DU PROJET

14.

Voici le contenu du rpertoire du programme FONC_PRO.PRJ:

15.

Vous remarquerez que les fichiers FONC_PRO.PRJ et FONC_PRO.DSK sont absents


du rpertoire CHAP.010\FONC_PRO de la disquette d'accompagnement. Ce n'est pas
un oubli: les chemins d'accs des fichiers sources, qu'ils contiennent, seront coup sr
diffrents sur votre ordinateur. Pour viter des erreurs, vous avez avantage les
reconstituer vous-mmes.

Voici les listagess documents des fichiers du projet:


/* Fich. d'entte:
* ===============
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*/

FONC_PRO.H
==========
Robert Pesant
15/03/1993
25/04/1995
V1.2
COURS_13T
\CHAP.009\FONC_PRO\FONC_PRO.H
Fichier d'en-tte pour le projet FONC_PRO.PRJ

/* ----- Les constantes


#define MENU_1
#define MENU_2
#define MENU_3
#define MENU_4
#define MENU_5

symboliques --------------------------------------- */
""
" Programme de dmonstration "
" avec prsentation couleur "
" et compilation en projet
"
""

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

#define LENT
#define RAPIDE

< 1 >"
< 2 >"
<Esc>"
< * >"

0
1

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


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

/* Programme:
* =========
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*
* Projet:
*
*
*
*
*/
#include
#include
#include
#include

FONC_PRO.C
==========
Robert Pesant
15/03/1993
25/04/1995
V1.2
COURS_13T
\CHAP.009\FONC_PRO\FONC_PRO.C
Fichier source principal du projet FONC_PRO.PRJ
FONC_PRO.PRJ se compose de:
-------------------------FONC_PRO.C
LIRE_KB.C
AFFI_SCR.C

<conio.h>
<string.h>
<process.h>
"fonc_pro.h"

void main(void)
{
int choix, ascii_min, ascii_max;
double courant, temperature;
textbackground(CYAN);
clrscr();
menu();
do

{
choix = get_choix();
textcolor(WHITE);
/* En effaant toutes les lignes de 15 25 aprs l'nonc
textcolor(WHITE);, on s'assure que le curseur sera de couleur
WHITE s'il apparat dans cette rgion de l'cran. */
clr_lines(15, RAPIDE);
switch(choix)
{
case CODE_ASCII:
gotoxy(1, 15); cprintf(ASCII_1);
/* Il faut utiliser getch() au lieu de fflush(stdin)
pour vider le buffer du clavier si l'usager tape
des caractres non conformes au format de cscanf(). */
cscanf("%d", &ascii_min); getch();
gotoxy(41, 15); cprintf(ASCII_2);
cscanf("%d", &ascii_max); getch();
affi_ascii(ascii_min, ascii_max);
break;
case TX_4_20_MA:
gotoxy(1, 15); cputs(ECHELLE_1);
gotoxy(1, 16); cputs(ECHELLE_2);
gotoxy(1, 18); cprintf(ECHELLE_3);
cscanf("%lf", &courant); getch();
gotoxy(1 + strlen(ECHELLE_3), 18);
cprintf("%6.2f mA", courant);
if((courant < 4.0) || (courant > 20.0))
{
cputs(" (...???)");
}
temperature = mise_a_echelle(courant, -25.0, 75.0);
gotoxy(1, 19); cprintf(ECHELLE_4);
cprintf("%6.2f C", temperature);
break;
case ESC:
textbackground(BLACK);
textcolor(LIGHTGRAY);
clrscr(); exit(0);
}

textcolor(BLINK + BLUE);
gotoxy(41, 25);

/* Le clreol() qui suit est ncessaire pour que le curseur soit


de couleur BLUE sur cette ligne. */
clreol();
cprintf(RETOUR);
getch();
clr_lines(15, LENT);
}
while(1);

/* Fonction:
* ========
*
* Description:
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* Paramtres:
*
*
*
* Valeur/retour:
*/

mise_a_echelle()
================
Effectue la mise l'chelle d'un transmetteur 4-20 mA
en fonction des portes minimale et maximale de son
tendue de mesure.
Exemple: Transmetteur de temprature 4-20 mA dont l'tendue
de mesure est comprise entre -25 C et +75 C.
20 mA ----------- 75 C
<-- porte maximale

B

I ----------- T
<-- grandeur mesure
C


4 mA ----------- -25 C <-- porte minimale
Calcul de mise l'chelle:
A/B = C/D
(T - (-25))/(75 - (-25)) = (I - 4)/(20 - 4)
(T + 25)/100 = (I - 4)/16

T = (100/16)*(I - 4) - 25 <-- Fonction de transfert

Pour n'importe quelle valeur de courant mesure entre


4 et 20 mA, on peut valuer la temprature laquelle est
soumis le capteur du transmetteur de temprature.
1. Le courant du transmetteur.
2. La porte minimale du transmetteur.
3. La porte maximale du transmetteur.
1. La grandeur physique mesure par le transmetteur.

double mise_a_echelle(double courant, double portee_min, double portee_max)


{
double grandeur;
courant = (courant < 4.0) ? 4.0: courant;
courant = (courant > 20.0) ? 20.0: courant;
grandeur = ((portee_max - portee_min)*(courant - 4.0)/16.0) + portee_min;
}

return(grandeur);

/* Titre:
* =====
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*/

Fonctions de lecture du clavier (FONC_PRO.PRJ)


==============================================
Robert Pesant
15/03/1993
15/03/1993
V1.0
COURS_13T
\CHAP.009\FONC_PRO\LIRE_KB.C

#include <conio.h>
#include "fonc_pro.h"
/* Fonction:
* ========
*
* Description:
*
*
* Paramtres:
*
* Valeur/retour:
*/

get_choix()
===========
Attend et retourne le choix de l'usager.
Les touches interdites du clavier sont verrouilles.
1. Aucun
1. Le code ASCII du choix de l'usager

int get_choix(void)
{
int choix;
textcolor(BLACK);
do
{
gotoxy(63, 11); putch('*'); gotoxy(63, 11);
choix = getche();
}
while(CLE_INTERDITE);
}

return(choix);

/* Titre:
* =====
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*/
#include
#include
#include
#include

Fonctions d'affichage (FONC_PRO.PRJ)


====================================
Robert Pesant
15/03/1993
15/03/1993
V1.0
COURS_13T
\CHAP.009\FONC_PRO\AFFI_SCR.C

<conio.h>
<string.h>
<dos.h>
"fonc_pro.h"

/* Fonction:
* ========
*
* Description:
*
* Paramtres:
*
* Valeur/retour:
*/

menu()
======
Affiche le menu du programme
1. Aucun
1. Aucune

void menu(void)
{
textcolor(RED);
gotoxy(41 - strlen(MENU_1
gotoxy(41 - strlen(MENU_2
gotoxy(41 - strlen(MENU_3
gotoxy(41 - strlen(MENU_4
gotoxy(41 - strlen(MENU_5

)/2,
)/2,
)/2,
)/2,
)/2,

1);
2);
3);
4);
5);

cputs(MENU_1
cputs(MENU_2
cputs(MENU_3
cputs(MENU_4
cputs(MENU_5

);
);
);
);
);

textcolor(YELLOW);
gotoxy(41 - strlen(MENU_6
gotoxy(41 - strlen(MENU_7
gotoxy(41 - strlen(MENU_8
gotoxy(41 - strlen(MENU_9

/* Fonction:
* ========
*
* Description:
*
*
* Paramtres:
*
*
* Valeur/retour:
*/

)/2, 8); cputs(MENU_6


)/2, 9); cputs(MENU_7
)/2, 10); cputs(MENU_8
)/2, 11); cputs(MENU_9

);
);
);
);

clr_lines()
===========
Efface le bas de l'cran en faisant remonter le texte
partir de la ligne choisie par l'usager.
1. La ligne partir de laquelle on efface l'cran.
2. La vitesse d'excution de l'effacement: LENT = 0, RAPIDE = 1.
1. Aucune.

void clr_lines(int y, int vitesse_execution)


{
int i;

gotoxy(1, y);
for(i=y; i<=25; i++)
{
delline();
if(vitesse_execution == LENT)
{
delay(50);
}
}

/* Fonction:
* ========
*
* Description:
*
*
* Paramtres:
*
*
* Valeur/retour:
*/

affi_ascii()
============
Affiche les codes ASCII demands par l'usager
et compris entre 0 et 255.
1. Le code ASCII initial qui doit tre affich.
2. Le code ASCII final qui doit tre affich.
1. Aucune.

void affi_ascii(int code_min, int code_max)


{
int i;

gotoxy(1, 17);
if((code_min < 0) || (code_min > 255) || (code_max < 0) || (code_max > 255))
{
cputs("ERREUR!!!\n\r");
cputs("Au moins un des deux codes n'est pas compris entre 0 et 255.\n\r");
cputs("Vous devez recommencer...");
return;
}
if(code_max < code_min)
{
cputs("ERREUR!!!\n\r");
cputs("Le code final est plus petit que le code initial.\n\r");
cputs("Vous devez recommencer...");
return;
}
for(i = code_min; i <= code_max ; i++)
{
putch(i); putch(' ');
}

Programme avec un fichier objet de l'usager: FONC_PRO.PRJ


Pour illustrer qu'un projet peut contenir des fichiers objets en plus des fichiers sources, on a rebti
le programme FONC_PRO.PRJ avec un fichier objet de l'usager. La procdure suivie se
compose des tapes suivantes:
1.

Le fichier objet AFFI_SCR.OBJ, disponible dans le rpertoire


D:\BC_DATA\OBJ_EXE, a t transfr dans le rpertoire de travail.

d'Output,

2.

Le rpertoire d'Output, D:\BC_DATA\OBJ_EXE, a t nettoy de tous ses fichiers,


pour confirmer la validit de cette mthode.

3.

Le fichier source AFFI_SCR.C a t limin du projet l'aide de la commande


Project/Delete item.

4.

Le fichier objet AFFI_SCR.OBJ a t ajout au projet l'aide de la commande


Project/Add item... (c.f. Figure 9 -7).

F I G U R E 9- 7: P R O J E T F O NC_ P R O . P RJ

5.

C O N S T R U I T AVE C U N F I C H I E R OB J E T

L'dition des liens a t effectue avec la commande Compile/Make, pour obtenir le


fichier excutable FONC_PRO.EXE.

Faites l'essai de cette technique. Vous constaterez que le programme obtenu est parfaitement
identique celui ralis avec seulement des fichiers sources dans le projet.
Programme avec des fichiers sources imports: CLKCHASR.PRJ
Le programme MODEL_2B.C du chapitre 5 a t modifi pour tirer profit d'une banque de
fonctions concernant le curseur et l'horloge. En plus de faire fonctionner le mme chenillard et
d'afficher le code ASCII des touches presses, nous voulions afficher continuellement l'heure du
systme et faire disparatre le curseur pour liminer le scintillement. Voici comment nous avons
procd.
1.

Une copie de MODEL_2B.C a t nomme CLKCHASR.C.

2.

Pour mieux structurer la fonction main(), les diffrentes sections du programme ont t
regroupes en fonctions. On a choisi, dans cet exemple, de conserver toutes ces fonctions
l'intrieur de CLKCHASR.C.

3.

Les constantes symboliques et les dclarations de fonctions ont t transportes dans


CLKCHASR.H.

4.

Les fichiers CURS_UTL.C et CURS_UTL.H ont t copis dans le rpertoire


d'application en provenance du rpertoire BANQUE\CURSEUR de la disquette
d'accompagnement. On aurait pu viter cette tape si on avait choisi de prciser le chemin
d'accs du fichier source dans le fichier projet et celui du fichier d'en-tte dans la directive
#include.

5.

Les fichiers HEUR_UTL.C et HEUR_UTL.H ont galement t copis dans le


rpertoire d'application en provenance du rpertoire BANQUE\HORLOGE de la
disquette d'accompagnement.

6.

CURS_UTL.H et HEUR_UTL.H ont t inclus dans CLKCHASR.C par des directives


#include.

7.

Dans CLKCHASR.C, la fonction cursoff() a t utilise en dbut de programme pour


faire disparatre le curseur. La fonction curson() a t appele juste avant de sortir au
DOS.

8.

L'heure du systme est affiche continuellement la position (37,21) par l'nonc


heure_xy(37,21);.

9.

Une classe de stockage dtermine comment une variable est sauvegarde en mmoire.
Nous avons appris qu'une variable de classe automatique est sauvegarde sur la pile du
systme. Elle cesse donc d'exister la fin de l'excution de la fonction o elle est dfinie
localement. Ici, la fonction chaser() fait avancer le chenillard d'une position l'cran,
chaque fois qu'on l'appelle. Pour se rappeler de la dernire coordonne en x de celui-ci,
elle ne peut donc pas utiliser une variable de classe automatique. Il faut donc changer de
classe de stockage. Le mot-cl static, utilis dans une dfinition de variable, force le
compilateur lui rserver une zone de stockage en RAM: son existence est donc assure
pour toute l'excution du programme. La variable x, dfinie par l'nonc static int x =
37;, possde les caractristiques suivantes:
La variable x est dite locale, c'est--dire invisible pour les autres fonctions, car elle
est dfinie l'intrieur du bloc d'instructions de chaser().
La variable x n'est pas dtruite la fin de l'excution de chaser(), car elle est de
classe statique, c'est--dire stocke en RAM.
Au premier appel de chaser(), la variable x est initialise 37.
Pour tous les appels subsquents, on retrouve dans x la dernire valeur que la
fonction chaser() lui a attribue.
Enfin, un peu de couleur agrmente le tout.

10.

11.

La Figure 9 -8 montre tous les fichiers qui ont t runis dans CLKCHASR.PRJ l'aide
de la commande Project/Add item.... Il sagit de CLKCHASR.C, CURS_UTL.C et
HEUR_UTL.C.

F I G U R E 9-8: L E

12.

PROJET

CLKCHAS R . P RJ

AVE C D E S B AN Q U E S D E F ON C T I O N S

Voici les listages de CLKCHASR.H et de CLKCHASR.C. l'annexe 4, vous trouverez


ceux des fichiers de la banque. Les fonctions curson() et cursoff() font usage des
interruptions du BIOS et d'un type de donne inconnu pour l'instant, l'union. La fonction
heure_xy() utilise de son ct le type de donne struct... Qu' cela ne tienne, la beaut de
la technique est de pouvoir en faire l'appel sans ncessairement les comprendre.

/* Fich. d'entte:
* ===============
*
* Auteur:
* Date:
* Rvision:
* Version:
*
* Volume:
* Fichier:
*
* Description:
*/

CLKCHASR.H
==========

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

""
"
Chaser, Horloge et Curseur
"
""
"
Projet conu avec des
"
" banques de fonctions importes "
""
""
"
CHASER
"
""
" "
""
"Appuyez sur une touche (<Esc> pour quitter) ..."
"Aucune touche date ..."
"La dernire touche enfonce est: [ 0 * ] (code tendu) "
"La dernire touche enfonce est: [ * ] (code standard)"

void
void
void
void

MENU_1
MENU_2
MENU_3
MENU_4
MENU_5
MENU_6
MENU_7
MENU_8
MENU_9
MENU_10
MENU_11
MENU_12
MENU_13
MENU_14
MENU_15

menu
code_standard
code_etendu
chaser

Robert Pesant
16/03/1993
16/03/1993
V1.0
COURS_13T
\CHAP.009\CLKCHASR\CLKCHASR.H
Fichier d'en-tte pour le projet CLKCHASR.PRJ

(void);
(int c);
(int c);
(void);

/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Programme:
=========

CLKCHASR.C
==========

Auteur:
Date:
Rvision:
Version:

Robert Pesant
16/03/1993
16/03/1993
V1.0

Volume:
Fichier:

COURS_13T
\CHAP.009\CLKCHASR\CLKCHASR.C

Description:

Fichier source principal du projet CLKCHASR.PRJ.


Ce programme est une modification de MODEL_2B.C qui
1.
faisait fonctionner un chenillard (chaser);
2.
surveillait le clavier;
3.
interrompait la tche pour afficher la touche presse;
4.
retournait l'tape 1 pour continuer.
Ce projet fait appel deux banques de fonctions
importes, CURS_UTL.C et HEUR_UTL.C pour effectuer
les tches additionnelles suivantes:
1.
afficher l'heure en permanence;
2.
faire disparatre le curseur pour toute la dure
du programme pour liminer le scintillement;
3.
faire apparatre le curseur avant de sortir au DOS.

Projet:

CLKCHASR.PRJ se compose de:


-------------------------CLKCHASR.C
CLKCHASR.C
CURS_UTL.C
ou
UTL_TST.LIB
HEUR_UTL.C

*/
#include
#include
#include
#include
#include
#include
#include

<conio.h>
<string.h>
<process.h>
<dos.h>
"heur_utl.h"
"curs_utl.h"
"clkchasr.h"

void main(void)
{
int touche;
textbackground(LIGHTGRAY);
/* Fait disparatre le curseur pour liminer le scintillement */
cursoff();
clrscr();
menu();
do

{
do

{
chaser();
/* Affiche l'heure partir des coordonnes (37,21) */
heure_xy(37,21);
}
while(!kbhit());
touche = getch();
switch(touche)
{
case 27:
/* Fait rapparatre le curseur avant de sortir au DOS */
curson();
textcolor(LIGHTGRAY);
textbackground(BLACK);
clrscr();
exit(0);
break;

}
while(1);

case 0:
touche = getch();
code_etendu(touche);
break;
default:
code_standard(touche);
}

/* Fonction:
* ========
*
* Description:
*
* Paramtres:
*
* Valeur/retour:
*/

menu()
======
Affiche le menu du programme
1. Aucun
1. Aucune

void menu(void)
{
textcolor(YELLOW);
gotoxy(41 - strlen(MENU_1
gotoxy(41 - strlen(MENU_2
gotoxy(41 - strlen(MENU_3
gotoxy(41 - strlen(MENU_4
gotoxy(41 - strlen(MENU_5
gotoxy(41 - strlen(MENU_6

)/2,
)/2,
)/2,
)/2,
)/2,
)/2,

1);
2);
3);
4);
5);
6);

textcolor(RED);
gotoxy(41 - strlen(MENU_7 )/2,
gotoxy(41 - strlen(MENU_8 )/2,
gotoxy(41 - strlen(MENU_9 )/2,
gotoxy(41 - strlen(MENU_10)/2,
gotoxy(41 - strlen(MENU_11)/2,

9);
10);
11);
12);
13);

cputs(MENU_1
cputs(MENU_2
cputs(MENU_3
cputs(MENU_4
cputs(MENU_5
cputs(MENU_6

);
);
);
);
);
);

cputs(MENU_7 );
cputs(MENU_8 );
cputs(MENU_9 );
cputs(MENU_10);
cputs(MENU_11);

textcolor(BLACK);
gotoxy(41 - strlen(MENU_12)/2, 16); cputs(MENU_12);
textcolor(BLUE);
gotoxy(41 - strlen(MENU_13)/2, 18); cputs(MENU_13);

/* Fonction:
* ========
*
* Description:
*
* Paramtres:
*
* Valeur/retour:
*/

code_etendu()
=============
Affiche le code ASCII tendu de la touche presse.
1. Le code ASCII tendu de la touche presse.
1. Aucune

void code_etendu(int c)
{
textcolor(BLUE);
gotoxy(41 - strlen(MENU_14)/2, 18); cputs(MENU_14);
gotoxy(50,18); putch(c);
sound(350); delay(100);
sound(450); delay(100);
nosound();
}

/* Fonction:
* ========
*
* Description:
*
* Paramtres:
*
* Valeur/retour:
*/

code_standard()
===============
Affiche le code ASCII standard de la touche presse.
1. Le code ASCII standard de la touche presse.
1. Aucune

void code_standard(int c)
{
textcolor(BLUE);
gotoxy(41 - strlen(MENU_15)/2, 18); cputs(MENU_15);
gotoxy(49,18); putch(c);
sound(300); delay(100);
sound(400); delay(100);
nosound();
}
/* Fonction:
* ========
*
* Description:
*
* Paramtres:
*
* Valeur/retour:
*/

chaser()
========
Fait avancer d'une position le "bit" du chenillard (chaser).
1. Aucun
1. Aucune

void chaser(void)
{
static int x = 37;

textcolor(RED);
if(x == 37)
{
gotoxy(44,12);
}
else
{
gotoxy(x-1,12);
}
putch('');
gotoxy(x,12); putch(' ');
x = (x == 44) ? 37: x+1;
delay(100);

La Figure 9 -9 montre lcran du moniteur durant lexcution du programme.

F I G U R E 9- 9: E X C U T I O N

DE

CLKCHAS R . E X E

Programme avec une bibliothque importe: CLKCHASR.PRJ


Pour complter l'tude des projets, le programme CLKCHASR.PRJ a t reconstruit avec le
fichier de bibliothque UTL_TST.LIB, contenant le code objet des fonctions curson(),
cursoff(), heure() et heure_xy(). La procdure suivie comporte les tapes suivantes:
1.

Le fichier de bibliothque UTL_TST.LIB, disponible dans le rpertoire \BANQUE\LIB,


de la disquette d'accompagnement, a t import dans le rpertoire de travail.

2.

Le rpertoire d'Output, D:\BC_DATA\OBJ_EXE, a t nettoy de tous ses fichiers,


pour valider cette mthode.

3.

Les fichiers sources CURS_UTL.C et HEUR_UTL.C ont t limins du projet avec la


commande Project/Delete item.

4.

CURS_UTL.H et HEUR_UTL.H doivent toujours tre inclus dans CLKCHASR.C par


des directives #include.

5.

Le fichier de bibliothque UTL_TST.LIB a t ajout au projet l'aide de la commande


Project/Add item... (c.f. Figure 9 -10).

F I G U R E 9- 10: L E

6.

PROJET

CLKCHAS R . P RJ

AVE C B I B L I O T H Q U E D E F O N C T I ON S

L'dition des liens a t effectue avec la commande Compile/Make, pour obtenir le


fichier excutable FONC_PRO.EXE.

Essayez cette technique. Vous obtiendrez le mme programme qu' la section prcdente.