Sunteți pe pagina 1din 546

Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence : Creative Commons BY-NC-SA 2.

0 La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence Texte complet de la licence disponible sur :

http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

Simple IT 2012 - ISBN : 979-10-90085-00-8

Avant-propos

e livre que vous tenez dns vos mins une longue histoire derrire luiF it pour use X il mis plus de dix ns mrir vnt de voir le jourF gomment peutEon en rriver prprer un livre pendnt dix longues nnes c n petit retour en rrire s9imposeF te suis un pssionn de nouvelles tehnologiesF t9i eu mon premier ordinteur entre les mins juste vnt de rentrer u ollgeF g9tit e moment le lnement en grndes pompes de indows WSF t9i immditement voulu ller plus loinD svoir  omment fontionne l9intrieur F won premier r)exe t d9umer les liriries de qurtier et plus prtiulirement leur setion miroEinformtique dj ien dveloppeF out @ou presqueA me fisit envie X  grez votre site we en rwv en SH minutes D  hveloppez vos propres progrmmes filement ve isul fsi D etF hes promesses quiD elles seulesD urient pu voir rison de mon rgent de poheF g9est en lisnt l qutrime de ouverture que les hoses ont ommen oiner X  Ce livre est destin aux personnes ayant dj une bonne exprience en programmation F s de pniqueF sl su0t de trouver elui qui s9dresse ux dutnts omme moiF te repose le livre sur les tlges et je tente d9en sortir un utreF uis un utreF uis enore un utreF tusqu9 me rendre l9videne X pour pprendre progrmmerD il fut dj svoir progrmmerF ristoire de ne ps voir fit le trjet pour rienD je reprtiri qund mme ve un livre ou deux sous le rsD eux qui semlient les plus orrets du lotF te leur rends hommge ii X 9est ve eux que j9i dmrr et j9i euoup ppris leur letureF wis en les relisnt ve un peu de reul quelques mois plus trdD j9i (ni pr m9perevoir de ertines inohrenes X un hpitre simple sur l9instlltion d9un logiiel qui urit d tre pl tout u dutD des odes soure sns explitionsD qund e n9tit ps rrment un mot importnt utilis tout u long du livre et d(ni vers l (n 3 v ritique tit fileD mis il me fllit prouver que l9on pouvit fire plus clair et plus simpleF t9i don entrepris de reformuler mon premier livre tel que j'aurais souhait le lire en rnt mon premier site weF

CHAPITRE 0. AVANT-PROPOS

Qu'est-ce que ce livre vous propose ?


fien des nnes se sont oules depuis l rdtion des premiers oursF hns et interE vlle de tempsD j9i suivi des tudes d9ingnieur en informtique puis j9i t professeur de lngge g dns l9enseignement suprieurF out ei m9 men onstruire un pln de ours dpt ux dutntsD progressif et onretF geluiEi est onstitu de qutre prties que vous retrouverez dns et ouvrge X IF Les bases de la programmation en C X nous dmrrerons en doueur en douvrnt e qu9est l progrmmtion et quoi sert le lngge g qui fit l9ojet de e livreF xous instllerons les outils nessires u progrmmeur dpts votre systme d9exploittion X indowsD w y ou vinuxF xous rliserons nos premiers progrmmes simples et pourrons prtiquer en rlisnt un petit jeu ds l (n de ette prtieF PF Techniques  avances  du langage C X nous tudierons des onepts plus vns et plus omplexes du gF geuxEiD ien que d9un niveu plus levD sont indispensles l onne omprhension du lngge X pointeursD tleuxD struE turesD hnes de rtresD etF ve niveu reste progressif mis le ours demnE der plus d9ttention de votre prt prtir de ette seonde prtieD soyezEen simplement prvenusF QF Cration de jeux 2D en SDL X prs voir quis l9essentiel des onnissnes nessires pour progrmmer en gD il nous ser possile de nous muser en rnt nousEmmes des progrmmes omplets tels que des jeux et des leteurs udioF our y prvenirD nous utiliserons une  extension du lngge g que l9on ppelle l hvF RF Les structures de donnes X pour ller plus loinD nous douvrirons des mE thodes de progrmmtion spi(ques dns ette dernire prtieF xous mnipuleE rons des donnes en mmoire l9ide de strutures personnlises et intelligentesD e qui vous permettr d9ugmenter en e0it lorsque vous rliserez vos futurs progrmmesF

Comment lire ce livre ?


Suivez l'ordre des chapitres
visez e livre omme on lit un romnF sl t onu de ette fonF gontrirement euoup de livres tehniques o il est ournt de lire en digonle et de suter ertins hpitresD ii il est trs fortement reommnd de suivre l9ordre du oursD moins que vous ne soyez dj un peu exprimentF ii

COMMENT LIRE CE LIVRE ?

Pratiquez en mme temps


rtiquez rgulirementF x9ttendez ps d9voir (ni l leture de e livre pour llumer votre ordinteur et fire vos propres essisF ve livre omporte plusieurs FF qui vous invitent rer votre propre progrmme en suivnt une srie de onsignesF g9est ienD mis ne vous en ontentez psF issyez les odes soure que je vous propose tout u long du oursF wodi(ezEles un tout petit peuD puis de plus en plus jusqu9 vous sentir l9iseF ne fois les FF terminsD essyez de rliser les mliortions suggres insi que elles qui vous pssent pr l tteF ous progresserez insi euoup plus vite que vous ne l9imginiezF
1

Utilisez les codes web !


e(n de tirer prti du ite du ro dont est issu e livreD eluiEi vous propose e qu9on ppelle des  odes we F ge sont des odes T hi'res rentrer sur une pge du ite du ro pour tre utomtiquement redirig vers un site we sns voir en reopier l9dresseF our utiliser les odes weD rendezEvous sur l pge suivnte X
2

n formulire vous invite rentrer votre ode weF pites un premier essi ve le ode iEdessous X  ester le ode we gode we X IPQRST  ges odes we ont deux intrts X ! vous fire tlhrger les odes soure inlus dns e livreD e qui vous viter d9voir reopier ertins odes un peu longs Y ! vous rediriger vers les sites we prsents tout u long du oursF ge systme de rediretion nous permet de tenir jour le livre que vous vez entre les mins sns que vous yez esoin d9heter systmtiquement hque nouvelle ditionF i un site we hnge d9dresseD nous modi(erons l rediretion mis le ode we utiliser rester le mmeF i un site we disprtD nous vous redirigerons vers une pge du ite du ro expliqunt e qui s9est pss et vous proposnt une lterntiveF in lirD 9est un moyen de nous ssurer de l prennit de et ouvrge sns que vous yez fire quoi que e soit 3

http://www.siteduzero.com/codeweb.html

1. Travaux Pratiques 2. Je vous suggre d'ailleurs de l'ajouter vos favoris.

iii

CHAPITRE 0. AVANT-PROPOS

Du Site du Zro au Livre du Zro


l9poque o j9i souhit rdiger mes premiers ours pour dutntsD mon premier r)exe t de rer un site we r 9tit pour moi le moyen le plus simple de pulier mes rits F sl fut did que le site s9ppellerit le  ite du ro F F F pre qu9on y pprendrit tout prtir de zroF ns moyens puliitires utres que le ouhe oreilleD mis ve euoup de motiE vtion et de pssionD www.siteduzero.com s9est fit u (l des nnes un vritle nom sur le eF tel point que j9i (ni pr douvrir qu9il tit onnu et reommnd pr des professeurs en informtiqueD mis ussi utilis omme support de ours pr leurs lves 3 ve site s9est fortement dvelopp et est devenu plus qu9un site de ours en ligne pour dutntsF sl regroupe ujourd9hui plus de IUH HHH memres formidles qui hngent et s9entrident sur les forums mis prennent ussi prt l rdtion des ours de fon dsintresseF v seule onsigne en vigueur sur le site est l seule que j9ie jmis suivie X se mettre l ple du leteur dutnt que nous vons tous tF gel fit longtemps que je souhite un retour ux souresD dns es liriries o j9i moiEmme t perduF ve vivre du ro est le moyen idl de ouler l ouleF
3

l'attention de ceux qui ne connaissent pas le Site du Zro


i vous ne fites ps prtie des visiteurs du ite du ro D vous vous demndez juste titre si e livre est fit pour vousF gomme vous l9urez sns doute omprisD e livre est vnt tout destin ux dutntsF ous y trouverez nnmoins ussi votre ompte si vous vez dj de l9expriene en progrmmtion dns d9utres lngges et que vous souhitez douvrir le gF outes les notions onntre pour dmrrer dns l progrmmtion seront dtillesD en privilgint les exemples ux d(nitions thoriquesF ve ours est d9illeurs prtiuE lirement fourni en shms omme vous pourrez le onstterF visez le premier hpitre pour dider si vous rohez et omprenez e qui s9y ditF v seule omptene rellement requise est de svoir llumer un ordinteur F te me hrge de vous expliquer tout le reste X de l9instlltion des logiiels nessires pour progrmmer l9explition des ommndes qui permettent de rer des progrmmesD en pssnt pr les onseils et les onnes prtiques qui vous feront ggner du tempsF ous noterez que je m9exprime toujours l premire personneF g9est m fon de fireF smginez d9une ertine mnire que nous sommes vous et moi dns l mme slle et que je suis votre professeurF te vous prle diretement et je rponds vos questions en
4 5

3. Et a l'est d'ailleurs toujours, c'est amusant de voir que cela n'a pas chang. Le Web est plus que jamais un formidable espace d'expression et doit le rester. 4. Que l'on appelle d'ailleurs les  Zros , selon une logique implacable qui ne vous aura pas chapp. ;-) 5. Ce n'est pas une plaisanterie, c'est la raison d'tre de ce livre et c'est pour cela qu'on l'appelle le  Livre du Zro .

iv

REMERCIEMENTS

essynt dns l mesure du possile de les ntiiperF

l'attention des visiteurs du Site du Zro


ge livre ne remple ps le ite du roF sl le complteF in fitD il rpond une question que l9on m9 souvent pose X  ourquoi ne voitEon ps es ours en liririe c F yui 9est vriD pourquoi c re que rdiger et pulier un livre ne s9improvise psF e(n d9voir le mximum de liert et d9indpendneD je souhitis tre l9diteur de es livresF sl ur fllu du temps pour y prvenir mis 9est ujourd9hui hose fiteF ge livre s9dresse vous si vous vez im les ours du ite du ro mis que X ! l leture sur rn vous ftigue Y ! vous vez esoin d9un support hors ligne que vous pouvez emporter o vous voulez Y ! vous uriez ien imprim les entines de pges du ours vousEmme mis votre imprimnte risquerit de fire un peu l tte Y ! vous souhitez tout simplement pporter votre ontriution u siteD (n de nous ider (nner son dveloppement et l rdtion de nouveux oursF ous y retrouverez le ours de progrmmtion en g dns une dition revue et orrigeD ve de nouvelles remrques et nedotesF ve livre omporte une srie de hpitres indits qui vous permettront d9ller enore plus loin et d9explorer de nouvelles voies dns votre douverte de l progrmmtionF

Remerciements
ge livre n9est ps le fruit d9une seule et mme personneF sl n9urit en fit jmis vu le jour sns de nomreuses personnes qui m9ont pport leur soutien ou leur ideF ! wes prents tout d9ordD qui m9ont toujours enourg et onseill qund j9en vis le plus esoinF ! lodieD qui prtge m vie depuis plusieurs nnes et qui sit toujours trouver les mots justes pour m9ider vnerF ! ierre huuD mon ssoiD qui l9on doit les fondtions tehniques du ite du ro que l9on onnt ujourd9hui insi que le rent dveloppement de notre strutureF v dvotion qu9il porte l nissne de e livre ne surit tre su0smment slueF ! xht winh v @rzHA ve qui j9i eu de longues et intressntes onverstions sur v iD le lngge dns lequel est rit e livre D insi que sur le lngge gD son domine de prdiletionF ! wohmed ou(q il eissoui @erthurusA pour l9ide qu9il m9 fournie pour mettre jour les explitions de pwyh vers pwyh ixF ! xotre infogrphisteD pn tiyongD pour l ouverture et les ines de e livreF
A 6

6. Eh oui, mme ce livre est compil, on ne se refait pas. :-)

CHAPITRE 0. AVANT-PROPOS

! v9quipe des zgorreteursD des pssionns de lngue frnise et de typogrphie qui orrigent depuis longtemps les ours du ite du ro et qui ont fit un trvil formidle de rigueur et d9e0it pour relire e livre @triple releture pour hque hpitre 3AF te tiens remerier en prtiulier les inq orreteurs qui se sont hrgs de l releture de e livre X hilippe vutun @ptipilouAD vo ve freton @pihldAD wrtin etterwld @ht poxAD quillume qullier @quillwmeA et vo oux @xeltyAF ! v9quipe du ite du roD psseD prsente et futureF veur ide pour fire tourner le site est inestimleF diger une liste omplte des memres de l9quipe serit ien trop long iiD mis ils suront se reonntre tous utnt qu9ils sontF YEA ! in(n et surtoutD tous eux qui nous ont fit on(ne et nous ont enourgs ontinuer X les visiteurs du ite du ro F iux ussi sont un peu trop nomreux pour tre lists iiD mis qu9ils shent quel point leurs enourgements ont t le moteur de l rtion de e livreF weri vous en(nD qui vous pprtez nous fire on(ne en lisnt e livreF te vous souhite une onne et grle letureD et surtout n9ouliez ps d9y prendre du plisir 3
7

7. Il est intressant de noter que toutes les personnes listes prcdemment en font partie !

vi

Sommaire

Avant-propos

u9estEe que e livre vous propose c gomment lire e livre c F F F F F F F F hu ite du ro u vivre du ro F F emeriements F F F F F F F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F ii F ii F iv F v

I Les bases de la programmation en C


1 Vous avez dit programmer ?

1
3

rogrmmerD 9est quoi c F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F rogrmmerD dns quel lngge c F F F F F F F F F F F F F F F F F F F F F F F F F rogrmmerD 9est dur c F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F

R S W

2 Ayez les bons outils !

ves outils nessires u progrmmeur F F gode: :floks @indowsD w yD vinuxA isul gCC @indows seulementA F F F F ode @w y seulementA F F F F F F F F

11

IP IQ IW PS

3 Votre premier programme

gonsole ou fentre c F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QP n minimum de ode F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QR rire un messge l9rn F F F F F F F F F F F F F F F F F F F F F F F F F F F F QW vii

31

SOMMAIRE

ves ommentiresD 9est trs utile 3 F F F F F F F F F F F F F F F F F F F F F F F F RQ


4 Un monde de variables

ne 'ire de mmoire F F F F F F hlrer une vrile F F F F F F F F e0her le ontenu d9une vrile F uprer une sisie F F F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

47

RV SP SW TI

5 Une bte de calcul

ves luls de se F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TT ves rouris F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UH v iliothque mthmtique F F F F F F F F F F F F F F F F F F F F F F F F F F UP v ondition if... else F F F F F F F F F ves oolensD le oeur des onditions F F F v ondition switch F F F F F F F F F F F F ves ternires X des onditions ondenses F u9estEe qu9une oule c v oule while F F F F F v oule do... while F v oule for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
77

65

6 Les conditions

UV VR VU WI WR WR WU WV

7 Les boucles

93

8 TP : Plus ou Moins, votre premier jeu

rprtifs et onseils F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHP gorretion 3 F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHR sdes d9mliortion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHU grer et ppeler une fontion F F F F F F F F F F F F F F F F F F F F F F F F F F F IIH hes exemples pour ien omprendre F F F F F F F F F F F F F F F F F F F F F F F IIV
109

101

9 Les fonctions

viii

SOMMAIRE

II Techniques  avances  du langage C


10 La programmation modulaire

125
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
127

ves prototypes F F F F F F F F F F F F F F ves heders F F F F F F F F F F F F F F F F v ompiltion spre F F F F F F F F F F v porte des fontions et des vriles

F F F F

F F F F

F F F F

F F F F F F F F F F F F F

F F F F F F F F F F F F F

F F F F F F F F F F F F F

F F F F F F F F F F F F F

IPV IQH IQS IQV

11 l'assaut des pointeurs

n prolme ien ennuyeux F F F F F F F F v mmoireD une question d9dresse F F F tiliser des pointeurs F F F F F F F F F F F F invoyer un pointeur une fontion F F F F ui dit X  n prolme ien ennuyeux ves tleux dns l mmoire F F F h(nir un tleu F F F F F F F F F rourir un tleu F F F F F F F F ssge de tleux une fontion F F F F F F F F F F F F F F F F

FF FF FF FF cF F F F F F F F F

143

IRR IRT IRW ISR ISU

12 Les tableaux

161

ITP ITP ITS ITU

13 Les chanes de caractres

ve type char F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUP ves hnes sont des tleux de char F F F F F F F F F F F F F F F F F F F F F F IUR pontions de mnipultion des hnes F F F F F F F F F F F F F F F F F F F F F F IUV F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
191

171

14 Le prprocesseur

ves include F F ves define F F ves mros F F ves onditions F

IWP IWQ IWU PHH

15 Crez vos propres types de variables

h(nir une struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHT tilistion d9une struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHV ointeur de struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PIP

205

ix

SOMMAIRE

ves numrtions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PIS


16 Lire et crire dans des chiers

yuvrir et fermer un (hier F F F F F F F F F hi'rentes mthodes de leture G riture e dpler dns un (hier F F F F F F F F F enommer et supprimer un (hier F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

219

PPH PPU PQS PQU

17 L'allocation dynamique

v tille des vriles F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRH ellotion de mmoire dynmique F F F F F F F F F F F F F F F F F F F F F F F F PRR ellotion dynmique d9un tleu F F F F F F F F F F F F F F F F F F F F F F F F PRW ves onsignes F F F F F F F F F F F F F F F F F v solution @I X le ode du jeuA F F F F F F F v solution @P X l gestion du ditionnireA F sdes d9mliortion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
253

239

18 TP : ralisation d'un Pendu

PSR PTH PTS PUT

19 La saisie de texte scurise

ves limites de l fontion scanf F F F F F F F F F F F F F F F F F F F F F F F F F F PVH uprer une hne de rtres F F F F F F F F F F F F F F F F F F F F F F F F PVQ gonvertir l hne en nomre F F F F F F F F F F F F F F F F F F F F F F F F F F F PWH

279

III Cration de jeux 2D en SDL


20 Installation de la SDL

293
295

ourquoi voir hoisi l hv c F F F F F F F F F F F F F F F F F F F F F F F F F F F PWT lhrgement de l hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QHH grer un projet hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QHI ghrger et rrter l hv F yuverture d9une fentre F F wnipultion des surfes F ixerie X rer un dgrd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
315

21 Cration d'une fentre et de surfaces

QIT QPH QPU QQU

SOMMAIRE

22 Acher des images

ghrger une imge fw F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRR qestion de l trnsprene F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRV ghrger plus de formts d9imge ve SDL_Image F F F F F F F F F F F F F F F F QSP ve prinipe des vnements F F F F ve lvier F F F F F F F F F F F F F F ixerie X diriger ozor u lvier F v souris F F F F F F F F F F F F F F ves vnements de l fentre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
361

343

23 La gestion des vnements

QTP QTU QUH QUV QVP

24 TP : Mario Sokoban

ghier des hrges du okon F F F F F F ve main et les onstntes F F F F F F F F F ve jeu F F F F F F F F F F F F F F F F F F F F ghrgement et enregistrement de niveux v9diteur de niveux F F F F F F F F F F F F sum et mliortions F F F F F F F F F F

387

QVV QWI QWT RIH RIP RIV

25 Matrisez le temps !

ve Delay et les ticks F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPR ves timers F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQP


437

423

26 crire du texte avec SDL_ttf

snstller SDL_ttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV ghrgement de SDL_ttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RRH ves di'rentes mthodes d9riture F F F F F F F F F F F F F F F F F F F F F F F F RRQ snstller pwyh F F F F F F F F F F F F F snitiliser et lirer un ojet systme F ves sons ourts F F F F F F F F F F F F F ves musiques @wQD yqqD weF F FA F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
455

27 Jouer du son avec FMOD

RST RSV RTH RTU xi

28 TP : visualisation spectrale du son

475

SOMMAIRE

ves onsignes F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RUT v solution F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RVI sdes d9mliortion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RVU

IV Les structures de donnes


29 Les listes chanes

489
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
491

eprsenttion d9une liste hne gonstrution d9une liste hne F F ves fontions de gestion de l liste eller plus loin F F F F F F F F F F F F

F F F F

F F F F

RWP RWQ RWT SHI

30 Les piles et les les

ves piles F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR ves (les F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SII ourquoi utiliser une tle de hhge c u9estEe qu9une tle de hhge c F F F rire une fontion de hhge F F F F F qrer les ollisions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
517

503

31 Les tables de hachage

SIV SIV SPH SPP

xii

Premire partie
Les bases de la programmation en C

Chapitre

1
Dicult :

Vous avez dit programmer ?

ous avez dj entendu parler de programmation et nul doute que si vous avez ce livre entre les mains, c'est parce que vous voulez  enn  comprendre comment a fonctionne. Mais programmer en langage C. . . a veut dire quoi ? Est-ce que c'est bien pour commencer ? Est-ce que vous avez le niveau pour programmer ? Est-ce qu'on peut tout faire avec ? Ce chapitre a pour but de rpondre toutes ces questions apparemment btes et pourtant trs importantes. Grce ces questions simples, vous saurez la n de ce premier chapitre ce qui vous attend. C'est quand mme mieux de savoir quoi sert ce que vous allez apprendre, vous ne trouvez pas ?

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

Programmer, c'est quoi ?


yn ommene pr l question l plus simple qui soitD l plus sique de toutes les questions siquesF i vous vez l9impression de dj svoir tout D je vous onseille de lire qund mmeD ne peut ps vous fire de ml 3 te prs de zro pour e oursD don je vis devoir rpondre l question X
Que signie le mot  programmer  ?

rogrmmer signi(e rliser des  progrmmes informtiques F ves progrmmes deE mndent l9ordinteur d9e'etuer des tionsF otre ordinteur est rempli de progrmmes en tous genres X ! l lultrie est un progrmme Y ! votre tritement de texte est un progrmme Y ! votre logiiel de  ht est un progrmme Y ! les jeux vido sont des progrmmes @fF (gF IFID le lre jeu rlfEvife PAF

Figure IFI ! ve jeu rlfEvife P t progrmm en gCCD un lngge voisin du g

in refD les progrmmes sont prtout et permettent de fire priori tout et n9importe quoi sur un ordinteurF ous pouvez inventer un logiiel de ryptge rvolutionnire si vous hnteD ou rliser un jeu de omt en Qh sur snternetD peu importeF otre ordinteur peut tout fire @suf le fD mis j9y trvilleAF ettention 3 te n9i ps dit que rliser un jeu vido se fisit en lqunt des doigtsF t9i simplement dit que tout el tit possileD mis soyez srs que demnde euoup de trvilF R

PROGRAMMER, DANS QUEL LANGAGE ?

gomme vous dutezD nous n9llons ps ommener en rlisnt un jeu QhF ge serit suiidireF xous llons devoir psser pr des progrmmes trs simplesF ne des preE mires hoses que nous verrons est comment acher un message l'cranF yuiD je sisD n9 rien de trnsendntD mis rien que royezEmoiD e n9est ps ussi file que en l9irF impressionne moins les misD mis on v ien devoir psser pr lF etit petitD vous pprendrez su0smment de hoses pour ommener rliser des progrmmes de plus en plus omplexesF ve ut de e ours est que vous soyez ples de vous en sortir dns n9importe quel progrmme rit en gF wis tenezD u fitD vous svez e que 9est vousD e fmeux  lngge g c

Programmer, dans quel langage ?


otre ordinteur est une mhine izrreD 9est le moins que l9on puisse direF yn ne peut s9dresser lui qu9en lui envoynt des H et des IF einsiD si je trduis  pis le lul Q C S en lngge informtiqueD pourrit donner quelque hose omme X
1

0010110110010011010011110

ge que vous voyez lD 9est le lngge informtique de votre ordinteurD ppel langage binaire @retenez ien e mot 3AF otre ordinteur ne onnt que e lnggeEl etD omme vous pouvez le onstterD 9est solument inomprhensileF hon voil notre premier vri prolme X
Comment parler l'ordinateur plus simplement qu'en binaire avec des 0 et des 1 ?

otre ordinteur ne prle ps l9nglis et enore moins le frnisF ourtntD il est inonevle d9rire un progrmme en lngge inireF wme les informtiiens les plus fous ne le font psD 9est vous dire 3 ih ien l9ide que les informtiiens ont eueD 9est d9inventer de nouveux lngges qui serient ensuite trduits en inire pour l9ordinteurF ve plus dur fireD 9est de rliser le progrmme qui fit l  trdution F reureusementD e progrmme dj t rit pr des informtiiens et nous n9urons ps le refire @ouf 3AF yn v u ontrire s9en servir pour rire des phrses omme X  Fais le calcul 3 + 5 qui seront trduites pr le progrmme de  trdution en quelque hose omme X  0010110110010011010011110 F ve shm IFP rsume e que je viens de vous expliquerF
1. J'invente, je ne connais quand mme pas la traduction informatique par cur.

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

Figure IFP ! hm @trs simpli(A de rlistion d9un progrmme

Un peu de vocabulaire
v j9i prl ve des mots simplesD mis il fut svoir qu9en informtique il existe un mot pour hune de es hosesElF out u long de e oursD vous llez d9illeurs pprendre utiliser un voulire ppropriF xon seulement vous urez l9ir de svoir de quoi vous prlezD mis si un jour @et rriverA vous devez prler un utre progrmmeurD vous surez vous fire omprendre F eprenons le shm que l9on vient de voirF v premire se est  otre progrmme est rit dns un lngge simpli( F ge fmeux  lngge simpli( est ppel en fit langage de haut niveauF sl existe plusieurs niveux de lnggesF lus un lngge est hut niveuD plus il est prohe de votre vrie lngue @omme le frnisAF n lngge de hut niveu est don file utiliserD mis el ussi quelques petits dfuts omme nous le verrons plus trdF sl existe de nomreux lngges de plus ou moins hut niveu en informtique dns lesquels vous pouvez rire vos progrmmesF in voii quelquesEuns pr exemple X ! le g Y ! le gCC Y ! tv Y ! isul fsi Y ! helphi Y ! etF xotez que je ne les i ps lsss pr  niveu de lngge D n9llez don ps vous imginer que le premier de l liste est plus file que le dernier ou l9inverseF ge sont juste quelques exemples F gertins de es lngges sont plus hut niveu que d9utres @don en thorie un peu plus files utiliserAF yn v voir notmment un peu plus loin e qui di'renie le lngge g du lngge gCCF n utre mot de voulire retenir est code sourceF ge qu9on ppelle le ode soureD 9est tout simplement le ode de votre progrmme rit dns un lngge de hut niveuF g9est don vous qui rivez le ode soureD qui ser ensuite trduit en
2 3

2. Certes, les gens autour de vous vous regarderont comme si vous tiez des extra-terrestres, mais a il ne faudra pas y faire attention ! 3. D'avance dsol pour tous les autres langages qui existent, mais faire une liste complte serait vraiment trop long !

PROGRAMMER, DANS QUEL LANGAGE ?

inireF enonsEen justement u  progrmme de trdution qui trduit notre lngge de hut niveu @omme le g ou le gCCA en inireF ge progrmme un nom X on l9ppelle le compilateurF v trdutionD elleD s9ppelle la compilationF rs importnt X il existe un ompilteur di'rent pour hque lngge de hut niveuF g9est d9illeurs tout fit logique X les lngges tnt di'rentsD on ne trduit ps le gCC de l mme mnire qu9on trduit le helphiF
Vous verrez par la suite que mme pour le langage C il existe plusieurs compilateurs dirents ! Il y a le compilateur crit par Microsoft, le compilateur GNU, etc. On verra tout cela dans le chapitre suivant. Heureusement, ces compilateurs-l sont quasiment identiques (mme s'il y a parfois quelques  lgres  dirences que nous apprendrons reconnatre).

in(nD le progrmme inire r pr le ompilteur est ppel l'excutableF g9est d9illeurs pour ette rison que les progrmmes @tout du moins sous indowsA ont l9extension  Fexe omme iiutleF eprenons notre shm prdentD et utilisons ette fois des vris mots tordus d9inE formtiien @(gF IFQAF

Figure IFQ ! ve mme shmD ve le on voulire

Pourquoi choisir d'apprendre le C ?


gomme je vous l9i dit plus hutD il existe de trs nomreux lngges de hut niveuF hoitEon ommener pr l9un d9entre eux en prtiulier c qrnde questionF ourtntD il fut ien fire un hoixD ommener l progrmmtion un moment ou un utreF it lD vous vez en fit le hoix entre X ! un langage trs haut niveau X 9est file utiliserD plutt  grnd puli F rmi euxD on ompte ythonD uyD isul fsi et ien d9utresF ges lngges permettent d9rire des progrmmes plus rpidementD en rgle gnrleF sls nessitent toutefois d9tre ompgns de (hiers pour qu9ils puissent s9exuter @omme un interprE teurA Y ! un langage un peu plus bas niveau @mis ps trop qund mme 3A X ils sont peutEtre un peu plus di0iles ertesD mis ve un lngge omme le gD vous llez en pprendre euoup plus sur l progrmmtion et sur le fontionnement de votre U

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

ordinteurF ous serez ensuite lrgement ples d9pprendre un utre lngge de progrmmtion si vous le dsirezF ous serez don plus utonomesF r illeursD le g est un lngge trs populireF sl est utilis pour progrmmer une grnde prtie des logiiels que vous onnissezF in(nD le lngge g est un des lngges les plus onnus et les plus utiliss qui existentF sl est trs frquent qu9il soit enseign lors d9tudes suprieures en informtiqueF oil les risons qui m9initent vous pprendre le lngge g plutt qu9un utre F te ne dis ps qu9il faut ommener pr D mis je vous dis plutt que 9est un on hoix qui v vous donner de solides onnissnesF te vis supposer tout u long de e ours que 9est votre premier lngge de progrmE mtionD que vous n9vez jmis fit de progrmmtion vntF i pr hsrdD vous vez dj un peu progrmmD ne pourr ps vous fire de ml de reprendre zroF
4

Il y a quelque chose que je ne comprends pas. . . Quelle est la dirence entre le langage  C  et cet autre langage dont on parle, le langage  C++  ?

ve lngge g et le lngge gCC sont trs similiresF sls sont tous les deux toujours trs utilissF our ien omprendre omment ils sont nsD il fut fire un peu d9histoireF ! eu tout dutD l9poque o les ordinteurs pesient des tonnes et fisient l tille de votre misonD on ommen inventer un lngge de progrmmtion ppel l'AlgolF ! ves hoses voluntD on r un nouveu lngge ppel le CPLD qui volu luiE mme en BCPLD qui prit ensuite le nom de langage BF ! uis un eu jourD on en est rriv rer un utre lngge enoreD qu9on ppelF F F le langage CF ge lnggeD s9il sui quelques modi(tionsD reste enore un des plus utiliss ujourd9huiF ! n peu plus trdD on propos d9jouter des hoses u lngge gF ne sorte d9mlioE rtion si vous voulezF ge nouveu lnggeD que l9on ppel  gCC D est entirement s sur le gF Le langage C++ n9est en fit rien d9utre que le lngge g ve des jouts permettnt de progrmmer d9une fon di'renteF
Qu'il n'y ait pas de malentendus : le langage C++ n'est pas  meilleur  que le langage C, il permet juste de programmer diremment. Disons aussi qu'il permet au nal de programmer un peu plus ecacement et de mieux hirarchiser le code de son programme. Malgr tout, il ressemble beaucoup au C. Si vous voulez passer au C++ par la suite, cela vous sera facile.

ge n9est e pre que le gCC est une  volution du g qu9il fut solument fire du gCC pour rliser des progrmmesF ve lngge g n9est ps un  vieux lngge ouli X u ontrireD il est enore trs utilis ujourd9huiF sl est l se des plus grnds systmes d9exploittion tels nix @et don vinux et w yA ou indowsF
4. On pourrait citer d'autres raisons : certains langages de programmation sont plus destins au Web (comme PHP) qu' la ralisation de programmes informatiques.

PROGRAMMER, C'EST DUR ?

Retenez donc X le g et le gCC ne sont ps des lngges onurrentsD on peut fire

utnt de hoses ve l9un qu9ve l9utreF ge sont juste deux mnires de progrmmer ssez di'rentesF

Programmer, c'est dur ?


oil une question qui doit ien vous torturer l9espritF elors X futEil tre un superE mthmtiien qui fit IH ns d9tudes suprieures pour pouvoir ommener l proE grmmtion c v rponseD que je vous rssureD est nonF xonD un superEniveu en mths n9est ps nE essireF in fit tout e que vous vez esoin de onntreD e sont les qutre oprtions de se X ! l9ddition Y ! l soustrtion Y ! l multiplition Y ! l divisionF ge n9est ps trop intimidntD vouez 3 te vous expliqueri dns un prohin hpitre omment l9ordinteur rlise es oprtions de se dns vos progrmmesF frefD niveu mthsD il n9y ps de di0ult insurmontleF in fitD tout dpend du progrmme que vous llez rliser X si vous devez fire un logiiel de ryptgeD lors ouiD il vous fudr onntre des hoses en mthsF i vous devez fire un progrmme qui fit de l QhD ouiD il vous fudr quelques onnissnes en gomtrie de l9espeF ghque s est prtiulierF wis pour pprendre le lngge g luiEmmeD vous n9vez ps esoin de onnissnes pointues en quoi que e soitF
Mais alors, o est le pige ? O est la dicult ?

sl fut svoir omment un ordinteur fontionne pour omprendre e qu9on fit en gF he e point de vueElD rssurezEvousD je vous pprendri tout u fur et mesureF xotez qu9un progrmmeur ussi ertines qulits omme X ! la patience X un progrmme ne mrhe jmis du premier oupD il fut svoir perE svrer 3 ! le sens de la logique X ps esoin d9tre forts en mths ertesD mis ne vous empher ps d9voir r)hirF hsol pour eux qui pensient que llit tomer tout uit sns e'ort 3 ! le calme X nonD on ne tpe ps sur son ordinteur ve un mrteuF ge n9est ps qui fer mrher votre progrmmeF in refD et pour fire simpleD il n9y ps de vritles onnissnes requises pour progrmmerF n nul en mths peut s9en sortir sns prolmeD le tout est d9voir l ptiene de r)hirF sl y en d9illeurs euoup qui douvrent qu9ils dorent 3 W

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

En rsum
! our rliser des progrmmes informtiquesD on doit rire dns un langage que l9ordinteur  omprend F ! sl existe de nomreux lngges informtiques que l9on peut lsser pr niveuF ves lngges dits de  hut niveu sont prfois plus files mtriser u dtriment souvent d9une perte de performnes dns le progrmme (nlF ! ve langage C que nous llons tudier dns e livre est onsidr omme tnt de s niveuF g9est un des lngges de progrmmtion les plus lres et les plus utiliss u mondeF ! ve code source est une srie d9instrutions rites dns un lngge informtiqueF ! ve compilateur est un progrmme qui trnsforme votre ode soure en code binaireD qui peut lors tre exut pr votre proesseurF ves .exe que l9on onnt sont des progrmmes iniresD il n9y plus de ode soure l9intrieurF ! v progrmmtion ne requiert ps en elleEmme de onnissnes mthmtiques pousses Y nnmoinsD il est nessire d9voir un on sens de l logique et d9tre mthodiqueF
5

5. Sauf dans quelques cas prcis o votre application doit faire appel des formules mathmatiques, comme c'est le cas des logiciels de cryptage.

IH

Chapitre

2
Dicult :

Ayez les bons outils !

prs un premier chapitre plutt introductif, nous commenons entrer dans le vif du sujet. Nous allons rpondre la question suivante :  De quels logiciels a-t-on besoin pour programmer ? . Il n'y aura rien de dicile faire dans ce chapitre, on va prendre le temps de se familiariser avec de nouveaux logiciels. Protez-en ! Dans le chapitre suivant, nous commencerons vraiment programmer et il ne sera plus l'heure de faire la sieste !

II

CHAPITRE 2. AYEZ LES BONS OUTILS !

Les outils ncessaires au programmeur


elors votre visD de quels outils un progrmmeur EtEil esoin c i vous vez ttentiE vement suivi le hpitre prdentD vous devez en onntre u moins un 3 ous voyez de quoi je prle cF F F riment ps c ih ouiD il s9git du compilateurD e fmeux progrmme qui permet de trduire votre lngge g en lngge inire 3 gomme je vous l9vis dj un peu dit dns le premier hpitreD il existe plusieurs ompilteurs pour le lngge gF xous llons voir que le hoix du ompilteur ne ser ps trs ompliqu dns notre sF fonD de quoi d9utre EtEon esoin c te ne vis ps vous lisser deviner plus longtempsF oii le strit minimum pour un progrmmeur X ! un diteur de texte pour rire le ode soure du progrmmeF in thorie un logiiel omme le floEnotes sous indowsD ou  vi sous vinux fit l9'ireF v9idlD 9est d9voir un diteur de texte intelligent qui olore tout seul le odeD e qui vous permet de vous y reprer ien plus filement Y ! un compilateur pour trnsformer @ ompiler A votre soure en inire Y ! un dbogueur pour vous ider trquer les erreurs dns votre progrmme F e prioriD si vous tes venturiersD vous pouvez vous psser de dogueurF wis onD je sis pertinemment que vous ne trderez ps en voir esoinF YEA prtir de mintennt on deux possiilits X ! soit on rupre hun de es trois progrmmes sparmentF g9est l mthode l plus ompliqueD mis elle fontionneF ous vinux en prtiulierD on nomre de progrmmeurs prfrent utiliser es trois progrmmes sprmentF te ne dtilleri ps ette mthode iiD je vis plutt vous prler de l mthode simple Y ! soit on utilise un progrmme  troisEenEun @omme les liquides visselleD ouiD ouiA qui omine diteur de texteD ompilteur et dogueurF ges progrmmes  troisEenE un sont ppels IDE D ou enore  invironnements de dveloppement F sl existe plusieurs environnements de dveloppementF eu dutD vous urez peutEtre un peu de ml hoisir elui qui vous pltF ne hose est sre en tout s X vous pouvez rliser n9importe quel type de progrmmeD quel que soit l9shi que vous hoisissezF
1 2

Choisissez votre IDE


sl m9 seml intressnt de vous montrer quelques shi prmi les plus onnusF ous sont disponiles grtuitementF ersonnellementD je nvigue un peu entre tous euxEl et j9utilise l9shi qui me plt selon le jourF ! n des shi que je prfre s9ppelle Code: :BlocksF sl est grtuit et fontionne sur l pluprt des systmes d9exploittionF te onseille d9utiliser eluiEi pour duter @et
1. On n'a malheureusement pas encore invent le  correcteur  qui corrigerait tout seul nos erreurs. Ceci dit, quand on sait bien se servir du dbogueur, on peut facilement retrouver ses erreurs ! 2. Integrated Development Environment

IP

CODE: :BLOCKS (WINDOWS, MAC OS, LINUX)

mme pour l suite s9il vous plt ien 3AF pontionne sous indowsD w et vinuxF ! ve plus lre shi sous indowsD 9est elui de wirosoft X Visual C++F sl existe l se en version pynte @hre 3AD mis il existe heureusement une version grtuite intitule Visual C++ Express qui est vriment trs ien @il y peu de di'E renes ve l version pynteAF sl est trs omplet et possde un puissnt module de orretion des erreurs @doggeAF pontionne sous indows uniquementF ! ur w y D vous pouvez utiliser odeD gnrlement fourni sur le gh d9insE tlltion de w y F g9est un shi trs ppri pr tous eux qui font de l progrmmtion sur wF pontionne sous w y uniquementF
Note pour les utilisateurs de Linux : il existe de nombreux IDE sous Linux, mais les programmeurs expriments prfrent parfois se passer d'IDE et compiler  la main , ce qui est un peu plus dicile. En ce qui nous concerne nous allons commencer par utiliser un IDE. Je vous conseille d'installer Code: :Blocks si vous tes sous Linux, pour suivre mes explications. Quel est le meilleur de tous ces IDE ?

ous es shi vous permettront de progrmmer et de suivre le reste de e ours sns prolmeF gertins sont plus omplets u niveu des optionsD d9utres un peu plus intuitifs utiliserD mis dns tous les s les progrmmes que vous rerez seront les mmes quel que soit l9shi que vous utilisezF ge hoix n9est don ps si ruil qu9on pourrit le roireF out u long de tout e oursD j9utiliseri gode: :floksF i vous voulez otenir exE tement les mmes rns que moiD surtout pour ne ps tre perdus u dutD je vous reommnde don de ommener pr instller gode: :floksF

Code: :Blocks (Windows, Mac OS, Linux)


gode: :floks est un shi lire et grtuitD disponile pour Windows, Mac et LinuxF gode: :floks n9est disponile pour le moment qu9en nglisF gel ne devrit e vous repousser l9utiliserF groyezEmoiD nous urons quoi qu9il en soit peu 'ire ux menus X 9est le lngge g qui nous intresseF hez toutefois que qund vous progrmmerezD vous serez de toute fon onfronts ien souvent des doumenttions en nglisF oil don une rison de plus pour s9entrner utiliser ette lngueF IQ

CHAPITRE 2. AYEZ LES BONS OUTILS !

Tlcharger Code: :Blocks


endezEvous sur l pge de tlhrgements de gode: :floks F  lhrger gode: :floks gode we X VUHQQU  ! i vous tes sous indowsD reprez l setion  indows un peu plus s sur ette pgeF lhrgez le logiiel en prennt le progrmme qui ontient mingw dns le nom @exF X codeblocks-10.05mingw-setup.exeAF v9utre version tnt sns ompilteurD vous uriez eu du ml ompiler vos progrmmes 3 ! i vous tes sous vinuxD hoisissez le pkge qui orrespond votre distriutionF ! in(nD sous wD hoisissez le (hier le plus rent de l listeF ixF X codeblocks-10.05-p2-mac.zipF
3

J'insiste l-dessus : si vous tes sous Windows, tlchargez la version incluant mingw dans le nom du programme d'installation. Si vous prenez la mauvaise version, vous ne pourrez pas compiler vos programmes par la suite !

v9instlltion est trs simple et rpideF vissez toutes les options pr dfut et lnez le progrmmeF ous devriez voir une fentre similire l (gF PFIF yn distingue R grndes setions dns l fentreD numrotes sur l9imge X IF la barre d'outils X elle omprend de nomreux outonsD mis seuls quelquesEuns nous seront rgulirement utilesF t9y reviendri plus loin Y PF la liste des chiers du projet X 9est guhe que s90he l liste de tous les (hiers soure de votre progrmmeF xotez que sur ette pture uun projet n9 t rD on ne voit don ps enore de (hiers l9intrieur de l listeF ous verrez ette setion se remplir dns inq minutes en lisnt l suite du ours Y QF la zone principale X 9est l que vous pourrez rire votre ode en lngge g Y RF la zone de notication X ussi ppele l  zone de l mort D 9est ii que vous verrez les erreurs de ompiltion s90her si votre ode omporte des erreursF gel rrive trs rgulirement 3 sntressonsEnous mintennt une setion prtiulire de l rre d9outils @(gF PFPAF ous trouverez les outons suivnts @dns l9ordreA X CompilerD ExcuterD Compiler & Excuter et Tout recompilerF etenezElesD nous les utiliserons rgulirementF oii l signi(tion de hune des qutre ines que vous voyez sur l (gF PFPD dns l9ordre X ! compiler X tous les (hiers soure de votre projet sont envoys u ompilteur qui v se hrger de rer un exutleF 9il y des erreurs D l9exutle ne ser ps r et on vous indiquer les erreurs en s de gode: :floks Y
4

3. J'en prote pour vous rappeler que les codes web peuvent tre entrs dans le formulaire du Site du Zro prvu cet eet. Cela vous redirige automatiquement sur la page ou le chier qui vous intresse. Voir l'avant-propos pour plus d'informations ce sujet. 4. Ce qui a de fortes chances d'arriver tt ou tard !

IR

CODE: :BLOCKS (WINDOWS, MAC OS, LINUX)

Figure PFI ! gode: :floks

Figure PFP ! ves prinipux outons de l rre d9outils

IS

CHAPITRE 2. AYEZ LES BONS OUTILS !

! excuter X ette ine lne juste le dernier exutle que vous vez ompilF gel vous permettr don de tester votre progrmme et de voir insi e qu9il donneF hns l9ordreD si vous vez ien suiviD on doit d9ord ompilerD puis exuter pour tester e que donneF yn peut ussi utiliser le troisime outonF F F ! compiler & excuter X ps esoin d9tre un gnie pour omprendre que 9est l ominison des deux outons prdentsF g9est d9illeurs e outon que vous utiliserez le plus souventF xotez que s9il y des erreurs pendnt l ompiltion @pendnt l gnrtion de l9exutleAD le progrmme ne ser ps exutF l pleD vous urez droit une eeelle liste d9erreurs orriger 3 ! tout reconstruire X qund vous fites compilerD gode: :floks ne reompile en fit que les (hiers que vous vez modi(s et non les utresF rfois E je dis ien prfois E vous urez esoin de demnder gode: :floks de vous reompiler tous les (hiersF yn verr plus trd qund on esoin de e outonD et vous verrez plus en dtils le fontionnement de l ompiltion dns un hpitre futurF our l9instntD on se ontente de svoir le minimum nessire pour ne ps tout mlngerF ge outon ne nous ser don ps utile de suiteF
Je vous conseille d'utiliser les raccourcis plutt que de cliquer sur les boutons, parce que c'est quelque chose qu'on fait vraiment trs trs souvent. Retenez en particulier qu'il faut taper sur F9 pour faire Compiler & Excuter.

Crer un nouveau projet


our rer un nouveu projetD 9est trs simple X llez dns le menu File / New ProjectF hns l fentre qui s9ouvre @(gF PFQAD hoisissez Console applicationF
/

Comme vous pouvez le voir, Code: :Blocks propose de raliser pas mal de types de programmes dirents qui utilisent des bibliothques connues comme la SDL (2D), OpenGL (3D), Qt et wxWidgets (fentres), etc. Pour l'instant, ces icnes servent plutt faire joli car les bibliothques ne sont pas installes sur votre ordinateur, vous ne pourrez donc pas les faire marcher. Nous nous intresserons ces autres types de programmes bien plus tard. En attendant il faudra vous contenter de  Console , car vous n'avez pas encore le niveau ncessaire pour crer les autres types de programmes.

gliquez sur Go pour rer le projetF n ssistnt s9ouvreF pites NextD ette premire pge ne servnt rienF yn vous demnde ensuite si vous llez fire du g ou du gCC @(gF PFRA X rpondez g F yn vous demnde le nom de votre projet @(gF PFSA et dns quel dossier les (hiers soure seront enregistrsF in(nD l dernire pge @(gF PFTA vous permet de hoisir de quelle fon le progrmme doit tre ompilF ous pouvez lisser les options pr dfutD n9ur ps d9inidene IT

CODE: :BLOCKS (WINDOWS, MAC OS, LINUX)

Figure PFQ ! xouveu projet

Figure PFR ! ghoix du lngge

IU

CHAPITRE 2. AYEZ LES BONS OUTILS !

Figure PFS ! xom et emplement du projet

sur e que nous llons fire dns l9immdit @veillez e que l se Debug ou Release u moins soit oheAF

Figure PFT ! wode de ompiltion

gliquez sur FinishD 9est on 3 gode: :floks vous rer un premier projet ve dj un tout petit peu de ode soure dednsF IV

VISUAL C++ (WINDOWS SEULEMENT)

hns le dre de guhe  rojets D dveloppez l9roresene en liqunt sur le petit  C pour 0her l liste des (hiers du projetF ous devriez voir u moins un main.c que vous pourrez ouvrir en douleEliqunt dessusF ous voil prs 3

Visual C++ (Windows seulement)


uelques petits rppels sur isul gCC X ! 9est l9shi de wirosoft Y ! il est l se pyntD mis wirosoft sorti une version grtuite intitule isul gCC ixpress Y ! il permet de progrmmer en g et en gCC @et non ps seulement en gCC omme son nom le lisse entendreAF xous llons ien entendu voir ii l version grtuiteD isul gCC ixpress @(gF PFUAF
5

Figure PFU ! isul gCC ixpress


5. Attention, il n'est compatible avec Windows 7 qu' partir de la version 2010.

IW

CHAPITRE 2. AYEZ LES BONS OUTILS !

Quelles sont les dirences avec le  vrai  Visual ?

sl n9y ps l9diteur de ressoures qui vous permet de dessiner des imgesD des inesD ou des fentresF wis onD D entre nousD on s9en moque ien pre qu9on n9ur ps esoin de s9en servir dns e oursF ge ne sont ps des fontionnlits indispenslesD ien u ontrireF our tlhrger isul gCC ixpressD rendezEvous sur le site we de isul gCCF   lhrger isul gCC ixE press gode we X QQQUQQ   letionnez ensuite isul gCC ixpress prnis un peu plus s sur l pgeF isul gCC ixpress est en frnis et totlement grtuitF ge n9est don ps une version d9essi limite dns le tempsF g9est une hne d9voir un shi ussi puissnt que elui de wirosoft disponile grtuitementD ne l lissez don ps psserF

Installation
v9instlltion devrit normlement se psser sns enomreF ve progrmme d9instlE ltion v tlhrger l dernire version de isul sur snternetF te vous onseille de lisser les options pr dfutF sl fut vous enregistrer dns les QH joursF s de pniqueD 9est grtuit et rpide Y mis il fut le fireF gliquez sur le lien qui vous est donn X vous rrivez sur le site de wirosoftF gonnetezE vous ve votre ompte indows vive sh @quivlent du ompte rotmil ou wxA ou rezEen un si vous n9en vez psD puis rpondez u petit questionnireF yn vous donner l (n une l d9enregistrementF ous devrez reopier ette l dns le menu ? / Inscrire le produitF

Crer un nouveau projet


our rer un nouveu projet sous isulD llez dns le menu Fichier / Nouveau / ProjetF letionnez Win32 dns l olonne de guheD puis Application console Win32 droite @(gF PFVAF intrez un nom pour votre projetD pr exemple testF lidezF ne nouvelle fentre s9ouvre @(gF PFWAF gette fentre ne sert ps grndEhoseF r ontreD liquez sur Paramtres de l'application dns l olonne de guheF eillez e que Projet vide soit oh omme sur l (gF PFIHF gliquez en(n sur TerminerF PH

VISUAL C++ (WINDOWS SEULEMENT)

Figure PFV ! grtion de projet isul gCC ixpress

Figure PFW ! essistnt rtion de projet isul gCC ixpress

PI

CHAPITRE 2. AYEZ LES BONS OUTILS !

Figure PFIH ! gon(gurtion du projet

Ajouter un nouveau chier source


otre projet est pour l9instnt ien videF pites un li droit sur le dossier Fichiers source situ sur votre guheD puis llez dns Ajouter / Nouvel lment @(gF PFIIAF

Figure PFII ! ejout d9un (hier soure

ne fentre s9ouvreF letionnez Visual C++ guhe puis Fichier C++ (.cpp) F intrez un nom pour votre (hier X main.cD omme sur l (gF PFIPF gliquez sur AjouterF n (hier vide est rD je vous invite l9enregistrer rpidement sous le nom de main.cF
6

6. Je sais, on ne fait pas de C++ mais a n'a pas d'importance ici.

PP

VISUAL C++ (WINDOWS SEULEMENT)

Figure PFIP ! ghoix du type du (hier soure

PQ

CHAPITRE 2. AYEZ LES BONS OUTILS !

g9est onD vous llez pouvoir ommener rire du ode 3

La fentre principale de Visual


oyons ensemle le ontenu de l fentre priniple de isul gCC ixpress @(gF PFIQAF

Figure PFIQ ! pentre priniple de isul gCC ixpress

gette fentre ressemle en tous points elle de gode: :floksF yn v rpidement @reAvoir qund mme e que signi(ent hune des prtiesF IF v rre d9outils X tout e qu9il y de plus stndrdF yuvrirD enregistrerD enreE gistrer toutD ouperD opierD ollerD etF r dfutD il semle qu9il n9y it ps de outon de rre d9outils pour ompilerF ous pouvez les rjouter en fisnt un li droit sur l rre d9outilsD puis en hoisissnt Dboguer et Gnrer dns l listeF outes es ines de ompiltion ont leur quivlent dns les menus Gnrer et DboguerF i vous fites GnrerD el rer l9exutle @ signi(e  ompiler pour isulAF i vous fites Dboguer / ExcuterD on devrit vous proposer de ompiler vnt d9exuter le progrmmeF pU permet de gnrer le projetD et pS de l9exuterF PF hns ette zone trs importnte vous voyez normlement l liste des (hiers de votre projetF gliquez sur l9onglet Explorateur de solutions en sD si e n9est PR

XCODE (MAC OS SEULEMENT)

dj fitF ous devriez voir que isul re dj des dossiers pour sprer les di'rents types de (hiers de votre projet @souresD enEtte et ressouresAF xous verrons un peu plus trd quels sont les di'rents types de (hiers qui onstituent un projetF QF v prtie priniple X 9est l qu9on modi(e les (hiers soureF oilD on fit le tour de isul gCCF ous pouvez ller jeter un il dns les options @Outils / OptionsA si vous hnteD mis n9y pssez ps trois heuresF sl fut dire qu9il y tellement de ses oher de prtout qu9on ne sit plus trop o donner de l tteF

Xcode (Mac OS seulement)


sl existe plusieurs shi omptiles wF sl y gode: :floks ien srD mis e n9est ps le seulF te vis vous prsenter ii l9shi le plus lre sous w X odeF gette setion ddie ode est inspire d9un tutoriel pru sur vogiielwFomD ve l9imle utoristion de son uteur syhorIQF weri plohw pour l mise jour des pturesF  vire le tutoriel sur ode gode we X TRVSVR 

Xcode, o es-tu ?
ous les utilisteurs de w y ne sont ps des progrmmeursF epple l9 ien ompris et n9instlle ps pr dfut d9shi ve w yF reureusementD pour eux qui voudrient progrmmerD tout est prvuF in e'etD ode @logo en (gF PFIRA est disponile sur le wepptoreF gommenez don pr le ruprer lEsF

Figure PFIR ! vogo de ode

r illeursD je vous onseille de mettre en fvoris l pge ddie ux dveloppeurs sur le site d9eppleF ous y trouverez une foule d9informtions utiles pour le dveloppement sous wF ous pourrez notmment y tlhrger plusieurs logiiels pour dvelopperF x9hsitez ps vous insrire l9ehg @ epple hevelopment gonnetion AD 9est grtuit et  vous serez insi tenus u ournt des nouveutsF  ge ddie ux dveloppeurs epple gode we X PTRUHV   PS

CHAPITRE 2. AYEZ LES BONS OUTILS !

Lancement de Xcode
ode est l9shi le plus utilis sous wD r pr epple luiEmmeF ves plus grnds logiielsD omme ihoto et ueynoteD ont t ods l9ide de odeF g9est rellement l9outil de dveloppement de hoix qund on un w 3 v premire hose fire est de rer un nouveu projetD lors ommenons pr F ellez dns le menu File / New ProjectF ne fentre de sletion de projet s9ouvre @(gF PFISAF

Figure PFIS ! eueil de ode

ellez dns l setion Application et sletionnez Command Line Tool F gliquez ensuite sur NextF yn vous demnder o vous voulez enregistrer votre projet @un projet doit toujours tre enregistr ds le dutA insi que son nomF lezEle dns le dossier que vous voulezF ne fois rD votre projet se prsenter sous l forme d9un dossier ontennt de mulE tiples (hiers dns le FinderF ve (hier l9extension .xcodeproj orrespond u (hier du projetF g9est lui que vous devrez sletionner l prohine fois si vous souhitez rouvrir votre projetF
7

7. Si vous avez une version plus ancienne du logiciel, il vous faudra probablement aller dans la section Command line utility et slectionner Standard tool.

PT

XCODE (MAC OS SEULEMENT)

La fentre de dveloppement
hns odeD si vous sletionnez similire l (gF PFITF
main.c

guheD vous devriez voir une fentre

Figure PFIT ! ode en tion

v fentre est doupe en qutre prtiesD ii numrotes de I RF IF v premire prtie est l rre de outons tout en hutF ve plus importnt d9entre euxD RunD vous permettr d9exuter votre progrmmeF PF v prtie de guhe orrespond l9roresene de votre projetF gertines seE tions regroupent les erreursD les vertissementsD etF ode vous ple utomtiE quement dns l setion l plus utileD elle qui porte le nom de votre projetF QF v troisime prtie hnge en fontion de e que vous vez sletionn dns l prtie de guheF siD on le ontenu de notre (hier main.cF RF in(nD l qutrime prtie 0he le rsultt de l9exution du progrmme dns l onsoleD lorsque vous vez liqu sur RunF

Ajouter un nouveau chier


eu dutD vous n9urez qu9un seul (hier soure @main.cAF gependntD plus loin dns le oursD je vous demnderi de rer de nouveux (hiers soure lorsque nos progrmmes deviendront plus grosF PU

CHAPITRE 2. AYEZ LES BONS OUTILS !

our rer un nouveu (hier soure sous odeD rendezEvous dns le menu File / New FileF n ssistnt vous demnde quel type de (hier vous voulez rerF endezE vous dns l setion Mac OS X G C and C++ et sletionnez C File @pihier gAF ous devriez voir sous les yeux l (gF PFIUF

Figure PFIU ! ejouter un (hier sous ode

ous devrez donner un nom votre nouveu (hier @e que vous voulezAF v9extensionD elleD doit rester .cF rfois E nous le verrons plus loin ED il fudr ussi rer des (hiers .h @mis on en reprlerAF v se oher Also create fichier.h est l pour F our le momentD elle ne nous intresse psF gliquez ensuite sur FinishF g9est fit 3 otre (hier est r et jout votre projetD en plus de main.cF ous tes mintennt prts progrmmer sous w 3

En rsum
! ves progrmmeurs ont esoin de trois outils X un diteur de texteD un ompilteur et un dogueurF ! sl est possile d9instller es outils sprmentD mis il est ournt ujourd9hui d9voir un pkge troisEenEun que l9on ppelle IDED l9environnement de dveloppementF ! gode: :floksD isul gCC et ode omptent prmi les shi les plus lresF

PV

Chapitre

3
Dicult :

Votre premier programme

n a prpar le terrain jusqu'ici, maintenant il serait bien de commencer programmer un peu, qu'en dites-vous ? C'est justement l'objectif de ce chapitre ! la n de celuici, vous aurez russi crer votre premier programme ! Bon d'accord, ce programme sera en noir et blanc et ne saura que vous dire bonjour, il semblera donc compltement inutile mais ce sera votre premier ; je peux vous assurer que vous en serez ers.

PW

CHAPITRE 3. VOTRE PREMIER PROGRAMME

Console ou fentre ?
xous vons rpidement prl de l notion de  progrmme onsole et de  progrmme fentre dns le hpitre prdentF xotre shi nous demndit quel type de proE grmme nous voulions rer et je vous vis dit de rpondre consoleF sl fut svoir qu9en fit il existe deux types de progrmmesD ps plus X ! les progrmmes ve fentres Y ! les progrmmes en onsoleF

Les programmes en fentres


ge sont les progrmmes que vous onnissezF v (gF QFI est un exemple de progrmme en fentres que vous onnissez srementF

Figure QFI ! ve progrmme int

donD 9est un progrmme ve des fentresF te suppose que vous imeriez ien rer e type de progrmmesD hmm c ih ienF F F vous n9llez ps pouvoir de suite 3 in e'etD rer des progrmmes ve des fentres en g 9est possileD misF F F qund on duteD 9est ien trop ompliqu 3 our duterD il vut mieux ommener pr rer des progrmmes en onsoleF
Mais au fait, quoi a ressemble un programme en console ?

QH

CONSOLE OU FENTRE ?

Les programmes en console


ves progrmmes onsole ont t les premiers pprtreF ette poqueD l9ordinteur ne grit que le noir et ln et il n9tit ps ssez puissnt pour rer des fentres omme on le fit ujourd9huiF fien entenduD le temps pss depuisF indows rendu l9ordinteur  grnd puli priniplement gre s simpliit et u fit qu9il n9utilisit que des fentresF indows est devenu tellement populire qu9ujourd9hui euoup de monde ouli e qu9tit l onsole 3 t9i une grnde nouvelle 3 La console n'est pas morte 3 in e'etD vinux remis u got du jour l9utilistion de l onsoleF v (gF QFP est une pture d9rn d9une onsole sous vinuxF
1

Figure QFP ! n exemple de onsoleD ii sous vinux

frrrF F F erri(ntD hein c oilD vous vez mintennt une petite ide de e quoi ressemle une onsoleF gei ditD plusieurs remrques X ! ujourd9hui on sit 0her de l ouleurD tout n9est don ps en noir et ln omme on pourrit le roire Y ! l onsole est ssez peu ueillnte pour un dutnt Y ! 9est pourtnt un outil puissnt qund on sit le mtriserF gomme je vous l9i dit plus hutD rer des progrmmes en mode  onsole omme iiD 9est trs file et idl pour duter @e qui n9est ps le s des progrmmes en mode  fentre AF xotez que l onsole volu X elle peut 0her des ouleursD et rien ne vous emphe de mettre une imge de fondF
1. Oui vous l, ne regardez pas derrire vous, je sais que vous vous demandez ce que c'est.

QI

CHAPITRE 3. VOTRE PREMIER PROGRAMME

Et sous Windows ? Il n'y a pas de console ?

iD mis elle est un peuF F F  he on v direF ous pouvez voir une onsole en fisnt Dmarrer / Accessoires / Invite de commandesD ou ien enore en fisnt Dmarrer / Excuter...D et en tpnt ensuite cmdF v (gF QFQ reprsente l mgni(que onsole de indowsF

Figure QFQ ! v onsole de indows

i vous tes sous indowsD shez don que 9est dns une fentre qui ressemle que nous ferons nos premiers progrmmesF i j9i hoisi de ommener pr des petits progrmmes en onsoleD e n9est ps pour vous ennuyerD ien u ontrire 3 in ommennt pr fire des progrmmes en onsoleD vous pprendrez les ses nessires pour pouvoir ensuite rer des fentresF Soyez donc rassurs X ds que nous urons le niveu pour rer des fentresD nous verrons omment en fireF

Un minimum de code
our n9importe quel progrmmeD il fudr tper un minimum de odeF ge ode ne fer rien de prtiulier mis il est indispensleF g9est e  ode minimum que nous llons douvrir mintenntF sl devrit servir de se pour l pluprt de vos progrmmes en lngge gF QP

UN MINIMUM DE CODE

Demandez le code minimal votre IDE


elon l9shi que vous vez hoisi dns le hpitre prdentD l mthode pour rer un nouveu projet n9est ps l mmeF eportezEvous e hpitre si vous vez ouli omment fireF our rppelD sous gode: :floks @qui est l9shi que je vis utiliser tout u long de e oursAD il fut ller dns le menu File / New / ProjectD puis hoisir Console Application et sletionner le lngge gF gode: :floks don gnr le minimum de ode en lngge g dont on esoinF ve voii X
1 2 3 4 5 6 7 8

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @A { printf @ 4 rello world 3 n 4 A Y return H Y }

Notez qu'il y a une ligne vide la n de ce code. Il est ncessaire de taper sur la touche  Entre  aprs la dernire accolade. Chaque chier en C devrait normalement se terminer par une ligne vide. Si vous ne le faites pas, ce n'est pas grave, mais le compilateur risque de vous acher un avertissement (warning ).

xotez que l ligne X


1

int min @A

F F F peut ussi s9rire X


1

int min @ int rg D hr B rgv A

ves deux ritures sont possilesD mis l seonde @l ompliqueA est l plus ournteF t9uri don tendne utiliser plutt ette dernire dns les prohins hpitresF in e qui nous onerneD que l9on utilise l9une ou l9utre des rituresD ne hnger rien pour nousF snutile don de s9y ttrderD surtout que nous n9vons ps enore le niveu pour nlyser e que signi(eF i vous tes sous un utre shiD opiez e ode soure dns votre (hier main.c pour que nous yons le mme ode vous et moiF inregistrez le toutF yui je sisD on n9 enore rien fitD mis enregistrez qund mmeD 9est une onne hitude prendreF xormlementD vous n9vez qu9un seul (hier soure ppel main.c @le resteD e sont des (hiers de projet gnrs pr votre shiAF QQ

CHAPITRE 3. VOTRE PREMIER PROGRAMME

Analysons le code minimal


ge ode miniml qu9on vient de voir n9est rien d9utre que du hinois pour vousD j9imgineF it pourtntD moi je vois l un progrmme onsole qui 0he un messge l9rnF sl v flloir pprendre lire tout 3 gommenons pr les deux premires lignes qui se ressemlent euoup X
1 2

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b

ge sont des lignes spiles que l9on ne voit qu9en hut des (hiers soureF ges lignes sont filement reonnissles r elles ommenent pr un dise #F ges lignes spilesD on les ppelle directives de prprocesseur @un nom ompliquD n9estEe ps cAF ge sont des lignes qui seront lues pr un progrmme ppel prproesseurD un progrmme qui se lne u dut de l ompiltionF yui X omme je vous l9i dit plus ttD e qu9on vu u dut n9tit qu9un shm trs simpli( de l ompiltionF sl se psse en rlit plusieurs hoses pendnt une ompilE tionF yn les dtiller plus trd X pour le momentD vous vez juste esoin d9insrer es lignes en hut de hun de vos (hiersF
Oui mais elles signient quoi, ces lignes ? J'aimerais bien savoir quand mme !

ve mot include en nglis signi(e  inlure en frnisF ges lignes demndent d9inE lure des (hiers u projetD 9estEEdire d9jouter des (hiers pour l ompiltionF sl y deux lignesD don deux (hiers inlusF ges (hiers s9ppellent stdio.h et stdlib.hF ges (hiers existent djD des (hiers soure tout prtsF yn verr plus trd qu9on les ppelle des bibliothques @ertins prlent ussi de librairies mis 9est un ngliE ismeAF in grosD es (hiers ontiennent du ode tout prt qui permet d90her du texte l9rnF ns es (hiersD rire du texte l9rn urit t mission impossileF v9ordinteur l se ne sit rien fireD il fut tout lui direF ous voyez l glre dns lquelle on est 3 frefD en rsum les deux premires lignes inluent les iliothques qui vont nous permettre @entre utresA d90her du texte l9rn ssez  filement F ssons l suiteF v suiteD 9est tout X
1 2 3 4 5

int min @A { printf @ 4 rello world 3 n 4 A Y return H Y }

ge que vous voyez lD 9est e qu9on ppelle une fonctionF n progrmme en lngge g est onstitu de fontionsD il ne ontient qusiment que F our le momentD notre progrmme ne ontient don qu9une seule fontionF QR

UN MINIMUM DE CODE

ne fontion permet grosso modo de rssemler plusieurs ommndes l9ordinteurF egroupes dns une fontionD les ommndes permettent de fire quelque hose de prisF r exempleD on peut rer une fontion ouvrir_fichier qui ontiendr une suite d9instrutions pour l9ordinteur lui expliqunt omment ouvrir un (hierF v9vnE tgeD 9est qu9une fois l fontion riteD vous n9urez plus qu9 dire ouvrir_fichierD et votre ordinteur sur omment fire sns que vous yez tout rpter 3 ns rentrer dns les dtils de l onstrution d9une fontion @il est trop ttD on reprE ler des fontions plus trdAD nlysons qund mme ses grndes prtiesF v premire ligne ontient le nom de l fontionD 9est le deuxime motF yui X notre fontion s9pE pelle don mainF g9est un nom de fontion prtiulier qui signi(e  prinipl F main est l fontion priniple de votre progrmmeD c'est toujours par la fonction main que le programme commenceF ne fontion un dut et une (nD dlimits pr des oldes { et }F oute l fontion main se trouve don entre es oldesF i vous vez ien suiviD notre fontion main ontient deux lignes X
1 2

printf @ 4 rello world 3 n 4 A Y return H Y

ges lignes l9intrieur d9une fontion ont un nomF yn les ppelle instructions @ en fit du voulire qu9il v flloir retenirAF ghque instrution est une ommnde l9ordinteurF ghune de es lignes demnde l9ordinteur de fire quelque hose de prisF gomme je vous l9i dit un peu plus hutD en regroupnt intelligemment @9est le trvil du progrmmeurA les instrutions dns des fontionsD on re si on veut des  bouts de programmes tout prts F in utilisnt les onnes instrutionsD rien ne nous empherit don de rer une fontion ouvrir_fichier omme je vous l9i expliqu tout l9heureD ou enore une fontion avancer_personnage dns un jeu vidoD pr exempleF n progrmmeD e n9est u out du ompte rien d9utre qu9une srie d9instrutions X  fis ei D  fis el F ous donnez des ordres votre ordinteur et il les exute F
2

Trs important : toute instruction se termine obligatoirement par un pointvirgule  ; . C'est d'ailleurs comme a qu'on reconnat ce qui est une instruction et ce qui n'en est pas une. Si vous oubliez de mettre un point-virgule la n d'une instruction, votre programme ne compilera pas !

v premire ligne X printf("Hello world!\n"); demnde 0her le messge  rello world 3 l9rnF und votre progrmme rriver ette ligneD il v don 0her un messge l9rnD puis psser l9instrution suivnteF ssons l9instrution suivnte justement X return 0; ih ien D en grosD veut dire que 9est (ni @eh ouiD djAF gette ligne indique qu9on rrive l (n de notre fontion main et demnde de renvoyer l vleur HF
2. Du moins si vous l'avez bien dress.

QS

CHAPITRE 3. VOTRE PREMIER PROGRAMME

Pourquoi mon programme renverrait-il le nombre 0 ?

in fitD hque progrmme une fois termin renvoie une vleurD pr exemple pour dire que tout s9est ien pss F v pluprt du tempsD ette vleur n9est ps vriment utiliseD mis il fut qund mme en renvoyer uneF otre progrmme urit mrh sns le return HD mis on v dire que 9est plus propre et plus srieux de le mettreD don on le metF it voil 3 yn vient de dtiller un peu le fontionnement du ode minimlF gertesD on n9 ps vriment tout vu en profondeurD et vous devez voir quelques quesE tions en suspensF oyez rssurs X toutes vos questions trouveront une rponse petit petitF te ne peux ps tout vous divulguer d9un oupD el ferit trop de hoses ssimilerF ous suivez toujours c i tel n9est ps le sD rien ne presseF xe vous forez ps lire l suiteF pites une puse et relisez e dut de hpitre tte reposeF out e que je viens de vous pprendre est fondmentlD surtout si vous voulez tre srs de pouvoir suivre prsF enez X omme je suis de onne humeurD je vous fis un shm qui rpitule le voulire qu9on vient d9pprendre @(gF QFRAF
3

Figure QFR ! ve voulire du progrmme miniml

Testons notre programme


ester devrit ller viteF out e que vous vez fire 9est ompiler le projetD puis l9exuter @liquez sur l9ine Build & Run sous gode: :floksAF i vous ne l9vez ps enore fitD on vous demnder d9enregistrer les (hiersF pitesEleF
Si la compilation ne fonctionne pas et que vous avez une erreur de ce type : "My-program - Release" uses an invalid compiler. Skipping... Nothing to be done... Cela signie que vous avez tlcharg la version de Code: :Blocks sans mingw (le compilateur). Retournez sur le site de Code: :Blocks pour tlcharger la version avec mingw.
3. En pratique, 0 signie  tout s'est bien pass  et n'importe quelle autre valeur signie  erreur .

QT

CRIRE UN MESSAGE L'CRAN

eprs un temps d9ttente insupportle @l ompiltionAD votre premier progrmme v pprtre sous vos yeux totlement envhis de onheur @(gF QFSAF

Figure QFS ! otre premier progrmme 3

ve progrmme 0he  rello world 3 @sur l premire ligneAF ves lignes en dessous ont t gnres pr gode: :floks et indiquent que le progrmme s9est ien exut et omien de temps s9est oul depuis le lnementF yn vous invite ppuyer sur n9importe quelle touhe du lvier pour fermer l fentreF otre progrmme s9rrte lors F
4

crire un message l'cran


prtir de mintenntD on v modi(er nousEmmes le ode de e progrmme minimlF otre missionD si vous l9eptez X 0her le messge  fonjour l9rnF gomme tout l9heureD une onsole doit s9ouvrirF ve messge  fonjour doit s90her dns l onsoleF
Comment fait-on pour choisir le texte qui s'ache l'cran ?

ge ser en fit ssez simpleF i vous prtez du ode qui t donn plus hutD il vous su0t simplement de rempler  rello world 3 pr  fonjour dns l ligne qui fit ppel printfF gomme je vous le disis plus ttD printf est une instructionF ille ommnde l9orE dinteur X  Ache-moi ce message l'cran F sl fut svoir que printf est en fit
4. Oui je sais, ce n'est pas transcendant. Mais bon, quand mme ! C'est un premier programme, un instant dont vous vous souviendrez toute votre vie ! . . . Non ?

QU

CHAPITRE 3. VOTRE PREMIER PROGRAMME

une fontion qui dj t rite pr d9utres progrmmeurs vnt vousF


Cette fonction, o se trouve-t-elle ? Moi je ne vois que la fonction main !

ous vous souvenez de es deux lignes c


1 2

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b

te vous vis dit qu9elles permettient d9jouter des iliothques dns votre proE grmmeF ves iliothques sont en fit des (hiers ve des tonnes de fontions toutes prtes l9intrieurF ges (hiersEl @stdio.h et stdlib.hA ontiennent l pluprt des fontions de se dont on esoin dns un progrmmeF stdio.h en prtiulier ontient des fontions permettnt d90her des hoses l9rn @omme printfA mis ussi de demnder l9utilisteur de tper quelque hose @e sont des fontions que l9on verr plus trdAF

Dis Bonjour au Monsieur


hns notre fontion mainD on fit don ppel l fontion printfF g9est une fontion qui en ppelle une utre @iiD main ppelle printfAF ous llez voir que 9est tout le temps omme que se psse en lngge g X une fontion ontient des instrutions qui ppellent d9utres fontionsD et insi de suiteF honD pour fire ppel une fontionD 9est simple X il su0t d9rire son nomD suivi de deux prenthsesD puis un pointEvirguleF
1

printf @A Y

g9est ienD mis e n9est ps su0sntF sl fut indiquer quoi rire l9rnF our fire D il fut donner l fontion printf le texte 0herF our e fireD ouvrez des guillemets l9intrieur des prenthses et tpez le texte 0her entre es guillemetsD omme el vit dj t fit sur le ode minimlF hns notre sD on v don tper trs extement X
1

printf @ 4 fonjour 4 A Y

t9espre que vous n9vez ps ouli le pointEvirgule l (nD je vous rppelle que 9est trs importnt 3 gel permet d9indiquer que l9instrution s9rrte lF oii le ode soure que vous devriez voir sous les yeux X
1 2 3 4 5 6

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @A { printf @ 4 fonjour 4 A Y

QV

CRIRE UN MESSAGE L'CRAN


7 8

return H Y

yn don deux instrutions qui ommndent dns l9ordre l9ordinteur X IF 0he  fonjour l9rn Y PF l fontion main est termineD renvoie HF ve progrmme s9rrte lorsF v (gF QFT vous montre e que donne e progrmme l9rnF

Figure QFT ! n progrmme poli qui dit fonjour

gomme vous pouvez le voirD l ligne du  fonjour est un peu olle ve le reste du texteD ontrirement tout l9heureF ne des solutions pour rendre notre progrmme plus prsentle serit de fire un retour l ligne prs  fonjour @omme si on ppuyit sur l touhe  intre AF wis ien srD e serit trop simple de tper  intre dns notre ode soure pour qu9une entre soit e'etue l9rn 3 sl v flloir utiliser e qu9on ppelle des rtres spiuxF F F

Les caractres spciaux


ves rtres spiux sont des lettres spiles qui permettent d9indiquer qu9on veut ller l ligneD fire une tultionD etF sls sont files reonntre X 9est un enE semle de deux rtresF ve premier d9entre eux est toujours un ntiEslsh @ AD et le seond un nomre ou une lettreF oii deux rtres spiux ournts que vous urez prolement esoin d9utiliserD insi que leur signi(tion X ! \n X retour l ligne @a  intre A Y ! \t X tultionF QW

CHAPITRE 3. VOTRE PREMIER PROGRAMME

hns notre sD pour fire une entreD il su0t de tper \n pour rer un retour l ligneF i je veux don fire un retour l ligne juste prs le mot  fonjour D je devris tper X
1

printf @ 4 fonjour n 4 A Y

otre ordinteur omprend qu9il doit 0her  fonjour suivi d9un retour l ligne @(gF QFUAF

Figure QFU ! ve progrmme fonjour ve un sut de ligne

g9est dj un peu mieuxD non c


Vous pouvez crire la suite du \n sans aucun problme. Tout ce que vous crirez la suite du \n sera plac sur la deuxime ligne. Vous pourriez donc vous entraner crire : printf("Bonjour\nAu Revoir\n"); Cela achera  Bonjour  sur la premire ligne et  Au revoir  sur la ligne suivante.

Le syndrome de Grard
Bonjour, je m'appelle Grard et j'ai voulu essayer de modier votre programme pour qu'il me dise  Bonjour Grard . Seulement voil, j'ai l'impression que l'accent de Grard ne s'ache pas correctement. . . Que faire ?

out d9ordD onjour qrrdF g9est une question trs intressnte que vous nous posez lF te tiens en premier lieu vous fliiter pour votre esprit d9inititiveD 9est trs ien d9voir eu l9ide de modi(er un peu le progrmmeF g9est en  idouillnt les progrmmes que je vous donne que vous llez en pprendre le plusF xe vous ontentez RH

LES COMMENTAIRES, C'EST TRS UTILE !

ps de e que vous lisezD essyez un peu vos propres modi(tions des progrmmes que nous voyons ensemle 3 fien 3 wintenntD pour rpondre l question de notre mi qrrdD j9i une ien triste nouvelle vous nnoner X l onsole de indows ne gre ps les entsF r ontre l onsole de vinuxD ouiF prtir de l vous vez deux solutionsF ! Passer LinuxF g9est une solution un peu rdile et il me fudrit un ours entier pour vous expliquer omment vous servir de vinuxF i vous n9vez ps le niveuD ouliez ette possiilit pour le momentF ! Ne pas utiliser d'accentsF g9est mlheureusement l solution que vous risquez de hoisirF v onsole de indows ses dfutsD que voulezEvousF sl v vous flE loir prendre l9hitude d9rire sns entsF fien entenduD omme plus trd vous ferez prolement des progrmmes ve des fentresD vous ne renontrerez plus e prolmeElF te vous reommnde don de ne ps utiliser d9ents temporirementD pendnt votre pprentissge dns l onsoleF os futurs progrmmes  professionE nels n9uront ps e prolmeD rssurezEvousF our ne ps tre gnD vous devrez don rire sns ent X
1

printf @ 4 fonjour qerrd n 4 A Y


5

yn remerie notre mi qrrd pour nous voir soulev e prolme 3

Les commentaires, c'est trs utile !


evnt de terminer e premier hpitre de  vritle progrmmtionD je dois soluE ment vous fire douvrir les commentairesF uel que soit le lngge de progrmmE tionD on l possiilit d9jouter des ommentires son odeF ve lngge g n9hppe ps l rgleF u9estEe que veut direD  ommenter c gel signi(e tper du texte u milieu de votre progrmme pour indiquer e qu9il fitD quoi sert telle ligne de odeD etF g9est vriment quelque hose d9indispensle rD mme en tnt un gnie de l progrmmE tionD on esoin de fire quelques nnottions prEi prElF gel permet X ! de vous retrouver u milieu d9un de vos odes soure plus trdF yn ne dirit ps omme D mis on oulie vite omment fontionnent les progrmmes qu9on ritsF i vous fites une puse ne seritEe que quelques joursD vous urez esoin de vous ider de vos propres ommentires pour vous retrouver dns un gros ode Y ! si vous donnez votre projet quelqu9un d9utre @qui ne onnt priori ps votre ode soureAD el lui permettr de se fmiliriser ve ien plus rpidement Y ! en(nD v me permettre moi d9jouter des nnottions dns les odes soure de e oursF it de mieux vous expliquer quoi peut servir telle ou telle ligne de odeF
5. Si d'aventure vous vous appeliez Grard, sachez que je n'ai rien contre ce prnom. C'est simplement le premier prnom avec un accent qui m'est pass par la tte. . . Et puis bon, il faut toujours que quelqu'un prenne pour les autres, que voulez-vous !

RI

CHAPITRE 3. VOTRE PREMIER PROGRAMME

sl y plusieurs mnires d9insrer un ommentireF out dpend de l longueur du ommentire que vous voulez rireF ! otre ommentire est court X il tient sur une seule ligneD il ne fit que quelques motsF hns e sD vous devez tper un doule slsh @//A suivi de votre ommentireF r exemple X
1

GG gei est un ommentire

ous pouvez ussi ien rire un ommentire seul sur s ligneD ou ien droite d9une instrutionF g9est d9illeurs quelque hose de trs prtique r insiD on sit que le ommentire sert indiquer quoi sert l ligne sur lquelle il estF ixemple X
1

printf @ 4 fonjour 4 A Y GG gette instrution ffihe fonjour l ' rn

xotez que e type de ommentire normlement t introduit pr le lngge gCCD mis vous n9urez ps de prolme en l9utilisnt pour un progrmme en lngge g ujourd9huiF ! otre ommentire est long X vous vez euoup direD vous vez esoin d9rire plusieurs phrses qui tiennent sur plusieurs lignesF hns e sD vous devez tper un ode qui signi(e  dut de ommentire et un utre ode qui signi(e  (n de ommentire X ! pour indiquer le dbut du commentaire X tpez un slsh suivi d9une toile @/*A Y ! pour indiquer l n du commentaire X tpez une toile suivie d9un slsh @*/AF ous rirez don pr exemple X
1 2 3

GB gei est un ommentire sur plusieurs lignes BG

eprenons notre ode soure qui rit  fonjour D et joutonsElui quelques ommenE tires juste pour s9entrner X
1 2 3 4 5

6 7 8 9 10 11 12 13

GB gi E dessous D e sont des diretives de pr proesseur F ges lignes permettent d ' jouter des fihiers u projet D fihiers que l ' on ppelle ilioth ques F qr e es ilioth ques D on disposer de fontions toutes pr tes pour ffiher pr exemple un messge l ' rn F BG 5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GB gi E dessous D vous vez l fontion priniple du progrmme D ppel e texttt { min }F g ' est pr ette fontion que tous les progrmmes ommenent F si D m fontion se ontente d ' ffiher fonjour l ' rn F BG

14 15 16

RP

LES COMMENTAIRES, C'EST TRS UTILE !


17 18 19 20

21

22

int min @A { printf @ 4 fonjour 4 A Y GG gette instrution ffihe fonjour l ' rn return H Y GG ve progrmme renvoie le nomre H puis s ' rr te }

oil e que donnerit notre progrmme ve quelques ommentiresF yuiD il l9ir d9tre plus grosD mis en fit 9est le mme que tout l9heureF vors de l ompiltionD tous les ommentires seront ignorsF ges ommentires n9pprtront ps dns le progrmme (nlD ils servent seulement ux progrmmeursF xormlementD on ne ommente ps hque ligne du progrmmeF t9i dit @et je le reE diriA que 9tit importnt de mettre des ommentires dns un ode soureD mis il fut svoir doser X ommenter hque ligne ne servir l pluprt du temps rienF foreD vous surez que le printf permet d90her un messge l9rnD ps esoin de l9indiquer hque foisF ve mieux est de ommenter plusieurs lignes l foisD 9estEEdire d9indiquer quoi sert une srie d9instrutions histoire d9voir une ideF eprsD si le progrmmeur veut se penher plus en dtil dns es instrutionsD il est ssez intelligent pour y rriver tout seulF Retenez donc X les ommentires doivent guider le progrmmeur dns son ode soureD lui permettre de se reprerF issyez de ommenter un ensemle de lignes plutt que toutes les lignes une pr uneF it pour (nir sur une petite touhe ulturelleD voii une ittion tire de hez sfw X
Si aprs avoir lu uniquement les commentaires d'un programme vous n'en comprenez pas le fonctionnement, jetez le tout !

En rsum
! ves progrmmes peuvent ommuniquer ve l9utilisteur vi une onsole ou une fentreF ! sl est euoup plus file pour nos premiers progrmmes de trviller ve l consoleD ien que elleEi soit moins ttirnte pour un dutnt F ! n progrmme est onstitu d9instructions qui se terminent toutes pr un pointE virguleF ! ves instrutions sont ontenues dns des fonctions qui permettent de les lsserD omme dns des otesF ! v fontion main @qui signi(e  priniple A est l fontion pr lquelle dmrre votre progrmmeF g9est l seule qui soit oligtoireD uun progrmme ne peut tre ompil sns elleF
6

6. Cela ne nous empchera pas par la suite de travailler avec des fentres dans la partie III. Tout vient point qui sait attendre. ;-)

RQ

CHAPITRE 3. VOTRE PREMIER PROGRAMME

est une fontion toute prte qui permet d90her un messge l9rn dns une onsoleF ! printf se trouve dns une bibliothque o l9on retrouve de nomreuses utres fontions prtes l9emploiF
printf

RR

Chapitre

4
Dicult :

Un monde de variables

ous savez acher un texte l'cran. Trs bien. a ne vole peut-tre pas trs haut pour le moment, mais c'est justement parce que vous ne connaissez pas encore ce qu'on appelle les variables en programmation. Le principe dans les grandes lignes, c'est de faire retenir des nombres l'ordinateur. On va apprendre stocker des nombres dans la mmoire. Je souhaite que nous commencions par quelques explications sur la mmoire de votre ordinateur. Comment fonctionne une mmoire ? Combien un ordinateur possde-t-il de mmoires direntes ? Cela pourra paratre un peu simpliste certains d'entre vous, mais je pense aussi ceux qui ne savent pas bien ce qu'est une mmoire.

RS

CHAPITRE 4. UN MONDE DE VARIABLES

Une aaire de mmoire


ge que je vis vous pprendre dns e hpitre un rpport diret ve l mmoire de votre ordinteurF out tre humin normlement onstitu une mmoireF ih ien 9est preil pour un ordinteurF F F un dtil prs X un ordinteur plusieurs types de mmoire 3
Pourquoi un ordinateur aurait-il plusieurs types de mmoire ? Une seule mmoire aurait su, non ?

xon X en fitD le prolme 9est qu9on esoin d9voir une mmoire l fois rapide @pour ruprer une informtion trs viteA et importante @pour stoker euoup de donnesAF yrD vous llez rireD mis jusqu9ii nous vons t inples de rer une mmoire qui soit l fois trs rpide et importnteF lus extementD l mmoire rpide ote herD on n9en fit don qu9en petites quntitsF hu oupD pour nous rrngerD nous vons d doter les ordinteurs de mmoires trs rpides mis ps importntesD et de mmoires importntes mis ps trs rpides @vous suivez toujours cAF

Les dirents types de mmoire


our vous donner une ideD voii les di'rents types de mmoire existnt dns un ordinteurD de l plus rpide l plus lente X IF les registres X une mmoire ultrErpide situe diretement dns le proesseur Y PF l mmoire he X elle fit le lien entre les registres et l mmoire vive Y QF l mmoire vive X 9est l mmoire ve lquelle nous llons trviller le plus souvent Y RF le disque dur X que vous onnissez srementD 9est l qu9on enregistre les (hiersF gomme je vous l9i ditD j9i lss les mmoires de l plus rpide @les registresA l plus lente @le disque durAF i vous vez ien suiviD vous vez ompris ussi que l mmoire l plus rpide tit l plus petiteD et l plus lente l plus grosseF ves registres sont don peine ples de retenir quelques nomresD tndis que le disque dur peut stoker de trs gros (hiersF
Quand je dis qu'une mmoire est  lente , c'est l'chelle de votre ordinateur bien sr. Eh oui : pour un ordinateur, 8 millisecondes pour accder au disque dur, c'est dj trop long !

ue futEil retenir dns tout c in fitD je souhite vous situer un peuF ous svez dsormis qu9en progrmmtionD on v surtout trviller ve l mmoire viveF yn verr ussi omment lire et rire sur le disque durD pour lire et rer des (hiers @mis RT

UNE AFFAIRE DE MMOIRE

on ne le fer que plus trdAF unt l mmoire he et ux registresD on n9y touher ps du tout 3 g9est votre ordinteur qui s9en oupeF
Dans des langages trs bas niveau, comme l'assembleur (abrg  ASM ), on travaille au contraire plutt directement avec les registres. Je l'ai fait, et je peux vous dire que faire une simple multiplication dans ce langage est un vritable parcours du combattant ! Heureusement, en langage C (et dans la plupart des autres langages de programmation), c'est beaucoup plus facile.

sl fut jouter une dernire hose trs importnte X seul le disque dur retient tout le temps les informtions qu9il ontientF outes les utres mmoires @registresD mmoire heD mmoire viveA sont des mmoires temporires X lorsque vous teignez votre ordinateur, ces mmoires se vident 3 reureusementD lorsque vous rllumerez l9ordinteurD votre disque dur ser toujours l pour rppeler votre ordinteur qui il estF

La mmoire vive en photos


u qu9on v trviller pendnt un moment ve l mmoire viveD je pense qu9il serit ien de vous l prsenterF yn v y ller pr zooms suessifsF gommenons pr votre ordinteur @(gF RFIAF

Figure RFI ! n ordinteur et tous ses omposnts

ous reonnissez le lvierD l sourisD l9rn et l9unit entrle @l tourAF sntressonsE nous mintennt l9unit entrle @(gF RFPAD le ur de votre ordinteur qui ontient toutes les mmoiresF

Figure RFP ! v9unit entrle

RU

CHAPITRE 4. UN MONDE DE VARIABLES

ge qui nous intresseD 9est e qu9il y l9intrieur de l9unit entrleF yuvronsEl @(gF RFQAF

Figure RFQ ! sntrieur de l9unit entrle

g9est un joyeux petit zrF ssurezEvousD je ne vous demnderi ps de svoir omE ment tout el fontionneF te veux juste que vous shiez o se trouve l mmoire vive lEdednsF te vous l9i endreF te n9i ps indiqu les utres mmoires @registres et mmoire heA r de toute fon elles sont ien trop petites pour tre visiles l9il nuF oii quoi ressemle une rrette de mmoire vive de plus prs @(gF RFRAF

Figure RFR ! ne rrette de mmoire vive

v mmoire vive est ussi ppele RAMD ne vous tonnez don ps si pr l suite j9utilise plutt le mot ew qui est un peu plus ourtF RV

UNE AFFAIRE DE MMOIRE

Le schma de la mmoire vive


in photogrphint de plus prs l mmoire viveD on n9y verrit ps grndEhoseF ourE tntD il est trs importnt de svoir omment fontionne l9intrieurF g9est d9illeurs l que je veux en venir depuis tout l9heureF te vous propose un shm du fontionnement de l mmoire vive @(gF RFSAF sl est trs simpli( @omme mes shms de ompiltion 3AD mis 9est pre que nous n9vons ps esoin de trop de dtilsF i vous retenez e shmD e ser dj trs ien 3

Figure RFS ! yrgnistion de l mmoire vive

gomme vous le voyezD il fut en gros distinguer deux olonnesF ! sl y les adresses X une dresse est un nomre qui permet l9ordinteur de se reprer dns l mmoire viveF yn ommene l9dresse H @u tout dut de l mmoireA et on (nit l9dresse Q RRV UTS WHH IPT et des poussiresF F F iuhD en fit je ne onnis ps le nomre d9dresses qu9il y dns l ewD je sis juste qu9il y en euoupF in plus dpend de l quntit de mmoire vive que vous vezF lus vous vez de mmoire viveD plus il y d9dressesD don plus on peut stoker de hosesF ! hque dresseD on peut stoker une valeur @un nomreA X votre ordinteur stoke dns l mmoire vive es nomres pour pouvoir s9en souvenir pr l suiteF yn ne peut stoker qu9un nomre pr dresse 3 xotre ew ne peut stoker que des nomresF RW

CHAPITRE 4. UN MONDE DE VARIABLES

Mais alors, comment fait-on pour retenir des mots ?

fonne questionF in fitD mme les lettres ne sont que des nomres pour l9ordinteur 3 ne phrse est une simple suession de nomresF sl existe un tleu qui fit l orE respondne entre les nomres et les lettresF g9est un tleu qui dit pr exemple X le nombre 67 correspond la lettre YF te ne rentre ps dns les dtilsD on ur l9osion de reprler de el plus loin dns le oursF evenons notre shmF ves hoses sont en fit trs simples X si l9ordinteur veut retenir le nomre S @qui pourrit tre le nomre de vies qu9il reste u personnge d9un jeuAD il le met quelque prt en mmoire o il y de l ple et note l9dresse orrespondnte @pr exemple Q HTP IWW WHPAF lus trdD lorsqu9il veut svoir nouveu quel est e nomreD il v herher l  se mmoire nQ HTP IWW WHP e qu9il y D et il trouve l vleurF F F S 3 oil en gros omment fontionneF g9est peutEtre un peu )ou pour le moment @quel intrt de stoker un nomre s9il fut l ple retenir l9dresse cA mis tout v rpidement prendre du sens dns l suite de e hpitreD je vous le prometsF

Dclarer une variable


groyezEmoiD ette petite introdution sur l mmoire v nous tre plus utile que vous ne le pensezF wintennt que vous svez e qu9il futD on peut retourner progrmmerF elors une vrileD 9est quoi c ih ien 9est une petite informtion temporire qu9on stoke dns l ewF out simplementF yn dit qu9elle est  vrile r 9est une vleur qui peut hnger pendnt le droulement du progrmmeF r exempleD notre nomre S de tout l9heure @le nomre de vies restnt u joueurA risque de diminuer u (l du tempsF i e nomre tteint HD on sur que le joueur perduF xos progrmmesD vous llez le voirD sont remplis de vrilesF ous llez en voir prtoutD toutes les suesF in lngge gD une vrile est onstitue de deux hoses X ! une valeur X 9est le nomre qu9elle stokeD pr exemple S Y ! un nom X 9est e qui permet de l reonntreF in progrmmnt en gD on n9ur ps retenir l9dresse mmoire @ouf 3A X l pleD on v juste indiquer des noms de vrilesF g9est le ompilteur qui fer l onversion entre le nom et l9dresseF oil dj un soui de moinsF

Donner un nom ses variables


in lngge gD hque vrile doit don voir un nomF our notre fmeuse vrile qui retient le nomre de viesD on imerit ien l9ppeler  xomre de vies ou quelque hose du genreF SH

DCLARER UNE VARIABLE

rlsD il y quelques ontrintesF ous ne pouvez ps ppeler une vrile n9importe omment X ! il ne peut y voir que des minusulesD mjusules et des hi'res @abcABC012A Y ! votre nom de vrile doit ommener pr une lettre Y ! les espes sont interditsF l pleD on peut utiliser le rtre  undersore @qui ressemle un trit de soulignementAF g9est le seul rtre di'rent des lettres et hi'res utoris Y ! vous n9vez ps le droit d9utiliser des ents @ etFAF in(nD et 9est trs importnt svoirD le lngge g fit l di'rene entre les mjusE ules et les minusulesF our votre ultureD shez qu9on dit que 9est un lngge qui  respete l sse F honD du oupD les vriles largeurD LARGEUR ou enore LArgEuR sont trois vriles di'rentes en lngge gD mme si pour nous l9ir de signi(er l mme hose 3 oii quelques exemples de noms de vriles orrets X nombreDeViesD prenomD nomD numero_de_telephoneD numeroDeTelephoneF ghque progrmmeur s propre fon de nommer des vrilesF endnt e oursD je vis vous montrer m mnire de fire X ! je ommene tous mes noms de vriles pr une lettre minusule Y ! s9il y plusieurs mots dns mon nom de vrileD je mets une lettre mjusule u dut de hque nouveu motF te vis vous demnder de fire de l mme mnire que moiD nous permettr d9tre sur l mme longueur d9ondesF
Quoi que vous fassiez, faites en sorte de donner des noms clairs vos variables. On aurait pu abrger nombreDeVies, en l'crivant par exemple ndv. C'est peut-tre plus court, mais c'est beaucoup moins clair pour vous quand vous relisez votre code. N'ayez donc pas peur de donner des noms un peu plus longs pour que a reste comprhensible.

Les types de variables


xotre ordinteurD vous pourrez le onstterD n9est en fit rien d9utre qu9une @trs grosseA mhine lulerF sl ne sit triter que des nomresF yui mis voilD j9i un soop 3 sl existe plusieurs types de nomres 3 r exempleD il y les nomres entiers positifs X ! RS Y ! QWV Y ! UTSHF wis il y ussi des nomres dimuxD 9estEEdire des nomres virgule X ! USDWHW Y ! IDUURI Y SI

CHAPITRE 4. UN MONDE DE VARIABLES

! WVIHDUF in plus de D il y ussi des nomres entiers ngtifs X ! EVU Y ! EWITF F F F it des nomres ngtifs dimux 3 ! EUTDW Y ! EIHHDIIF otre puvre ordinteur esoin d9ide 3 vorsque vous lui demndez de stoker un nomreD vous devez dire de quel type il estF ge n9est ps vriment qu9il ne soit ps ple de le reonntre tout seulD misF F F l9ide euoup s9orgniserD et fire en sorte de ne ps prendre trop de mmoire pour rienF vorsque vous rez une vrileD vous llez don devoir indiquer son typeF oii les prinipux types de vriles existnt en lngge g X
Nom du type Nombres stockables
char int long float double

EIPV IPU EP IRU RVQ TRV P IRU RVQ TRU EP IRU RVQ TRV P IRU RVQ TRU EQFR x IH puissne QV QFR x IH puissne QV EIFU x IH puissne QHV IFU x IH puissne QHV

(Je suis loin d'avoir mis tous les types, mais j'ai conserv les principaux)

ves trois premiers types @charD intD longA permettent de stoker des nomres entiers X ID PD QD RF F F ves deux derniers @floatD doubleA permettent de stoker des nomres dimux X IQFVD ITFWIIF F F
Les types float et double permettent de stocker des nombres dcimaux extrmement grands. Si vous ne connaissez pas les puissances de 10, dites-vous par exemple que le type double permet de stocker le nombre 1 suivi de 308 zros derrire ! C'est-dire : 10000000000000000000000000000000000000000000000000000. . . (je ne vais quand mme pas crire 308 zros pour vous !). Vous remarquerez qu'un int et un long ont l'air identiques. Avant ce n'tait pas le cas (un int tait plus petit qu'un long), mais aujourd'hui les mmoires ont volu et on a assez de place pour stocker des grands nombres, on se moque donc un peu de la dirence entre un int et un long. Le langage C  conserve  tous ces types pour des raisons de compatibilit, mme si certains sont un peu de trop. En pratique, j'utilise principalement char, int et double.

ous verrez que l pluprt du temps on mnipule des nomres entiers @tnt mieuxD pre que 9est plus file utiliserAF SP

DCLARER UNE VARIABLE

Attention avec les nombres dcimaux ! Votre ordinateur ne connat pas la virgule, il utilise le point. Vous ne devez donc pas crire 54,9 mais plutt 54.9 !

ge n9est ps tout 3 our les types stoknt des entiers @charD intD longF F FAD il existe d9utres types dits unsigned @non signsA qui eux ne peuvent stoker que des nomres positifsF our les utiliserD il su0t d9rire le mot unsigned devnt le type X unsigned char H PSS unsigned int H R PWR WTU PWS unsigned long H R PWR WTU PWS gomme vous le voyezD les unsigned sont des types qui ont le dfut de ne ps pouvoir stoker de nomres ngtifsD mis l9vntge de pouvoir stoker des nomres deux fois plus grnds @char s9rrte IPVD tndis que unsigned char s9rrte PSS pr exempleAF
Pourquoi avoir cr trois types pour les nombres entiers ? Un seul type aurait t susant, non ?

yuiD mis on r l9origine plusieurs types pour onomiser de l mmoireF einsiD qund on dit l9ordinteur qu9on esoin d9une vrile de type charD on prend moins d9espe en mmoire que si on vit demnd une vrile de type intF outefoisD 9tit utile surtout l9poque o l mmoire tit limiteF eujourd9huiD nos ordinteurs ont lrgement ssez de mmoire vive pour que ne soit plus vriment un prolmeF sl ne ser don ps utile de se prendre l tte pendnt des heures sur le hoix d9un typeF i vous ne svez ps si votre vrile risque de prendre une grosse vleurD mettez intF in rsumD on fer surtout l distintion entre nomres entiers et dimux X ! pour un nomre entierD on utiliser le plus souvent int Y ! pour un nomre dcimalD on utiliser gnrlement doubleF

Dclarer une variable


yn y rriveF wintenntD rez un nouveu projet onsole que vous ppellerez  vE riles F yn v voir omment dlrer une vrileD 9estEEdire demander l'ordinateur la permission d'utiliser un peu de mmoireF ne dlrtion de vrileD 9est trs simple mintennt que vous svez tout e qu9il futF sl su0t dns l9ordre X IF d9indiquer le type de l vrile que l9on veut rer Y PF d9insrer un espe Y QF d9indiquer le nom que vous voulez donner l vrile Y RF et en(nD de ne ps oulier le pointEvirguleF SQ

CHAPITRE 4. UN MONDE DE VARIABLES

r exempleD si je veux rer m vrile nombreDeVies de type intD je dois tper l ligne suivnte X
1

int nomreheies Y

it 9est tout 3 uelques utres exemples stupides pour l forme X


1 2 3

int notehewths Y doule sommeergenteue Y unsigned int nomreheveteursinrinhevirenxomherileneuvong Y

fon refD vous vez ompris le prinipe je pense 3 ge qu9on fit l s9ppelle une dclaration de variable @un voulire retenirAF ous devez fire les dlrtions de vriles u dut des fontionsF gomme pour le moment on n9 qu9une seule fontion @l fontion mainAD vous llez dlrer l vrile omme ei X
1 2 3 4 5 6 7 8 9

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A GG quivlent de int min @A { int nomreheies Y } return H Y

i vous lnez le progrmme iEdessusD vous onstterez ve stupeurF F F qu9il ne fit rienF
Quelques explications

elorsD vnt que vous ne m9trngliez en roynt que je vous mne en teu depuis tout l9heureD lissezEmoi juste dire une hose pour m dfenseF in fitD il se psse des hosesD mis vous ne les voyez psF vorsque le progrmme rrive l ligne de l dlrtion de vrileD il demnde ien gentiment l9ordinteur s9il peut utiliser un peu d9espe dns l mmoire viveF i tout v ienD l9ordinteur rpond  yui ien srD fis omme hez toi F qnrlementD el se psse sns prolme F oyez don sns rinteD vos vriles devrient normlement tre res sns souiF
1

Une petite astuce connatre : si vous avez plusieurs variables du mme type dclarer, inutile de faire une ligne pour chaque variable. Il vous sut de sparer les dirents noms de variables par des virgules sur la mme ligne : int nombreDeVies, niveau, ageDuJoueur;. Cela crera trois variables int appeles nombreDeVies, niveau et ageDuJoueur.
1. Le seul problme qu'il pourrait y avoir, c'est qu'il n'y ait plus de place en mmoire. . . Mais heureusement cela arrive rarement, car pour remplir toute la mmoire rien qu'avec des int il faut vraiment le vouloir !

SR

DCLARER UNE VARIABLE

it mintennt c wintennt qu9on r notre vrileD on v pouvoir lui donner une vleurF

Aecter une valeur une variable


g9est tout e qu9il y de plus teF i vous voulez donner une vleur l vrile nombreDeViesD il su0t de proder omme ei X
1

nomreheies a S Y

ien de plus fireF ous indiquez le nom de l vrileD un signe glD puis l vleur que vous voulez y mettreF siD on vient de donner l vleur S l vrile nombreDeViesF xotre progrmme omplet ressemle don ei X
1 2 3 4 5 6 7 8 9 10

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int nomreheies Y nomreheies a S Y } return H Y

v enoreD rien ne s90he l9rnD tout se psse dns l mmoireF uelque prt dns les trfonds de votre ordinteurD une petite se de mmoire vient de prendre l vleur SF x9estEe ps mgni(que c yn peut s9muser si on veut hnger l vleur pr l suite X
1 2 3 4

int nomreheies Y nomreheies a S Y nomreheies a R Y nomreheies a Q Y

hns et exempleD l vrile v prendre d9ord l vleur SD puis RD et en(n QF gomme votre ordinteur est trs rpideD tout el se psse extrmement viteF ous n9vez ps le temps de ligner des yeux que votre vrile vient de prendre les vleurs SD R et QF F F et y estD votre progrmme est (niF

La valeur d'une nouvelle variable


oii une question trs importnte que je veux vous soumettre X
Quand on dclare une variable, quelle valeur a-t-elle au dpart ?

SS

CHAPITRE 4. UN MONDE DE VARIABLES

in e'etD qund l9ordinteur lit ette ligne X


1

int nomreheies Y

il rserve un petit emplement en mmoireD d9ordF wis quelle est l vleur de l vrile e momentEl c EtEil une vleur pr dfut @pr exemple HA c ih ienD rohezEvous X l rponse est nonF xonD non et nonD il n9y ps de vleur pr dfutF in fitD l9emplement est rserv mis l vleur ne hnge psF yn n9e'e ps e qui se trouve dns l  se mmoire F hu oupD votre vrile prend l vleur qui se trouvit l vnt dns l mmoireD et cette valeur peut tre n'importe quoi 3 i ette zone de l mmoire n9 jmis t modi(eD l vleur est peutEtre HF wis vous n9en tes ps srsD il pourrit trs ien y voir le nomre QTQ ou IV l pleD 9estEEdire un reste d9un vieux progrmme qui est pss pr l vnt 3 sl fut don fire trs ttention si on veut viter des prolmes pr l suiteF ve mieux est d9initiliser l vrile ds qu9on l dlreF in gD 9est tout fit possileF in grosD onsiste ominer l dlrtion et l9'ettion d9une vrile dns l mme instrution X
1

int nomreheies a S Y

siD l vrile nombreDeVies est dlre et prend tout de suite l vleur SF v9vntgeD 9est que vous tes srs prs que ette vrile ontient une vleur orreteD et ps du n9importe quoiF

Les constantes
sl rrive prfois que l9on it esoin d9utiliser une vrile dont on voudrit qu9elle grde l mme vleur pendnt toute l dure du progrmmeF g9estEEdire qu9une fois dlreD vous voudriez que votre vrile onserve s vleur et que personne n9it le droit de hnger e qu9elle ontientF ges vriles prtiulires sont ppeles constantesD justement pre que leur vleur reste onstnteF our dlrer une onstnteD 9est en fit trs simple X il fut utiliser le mot const juste devnt le type qund vous dlrez votre vrileF r illeursD il fut oligtoirement lui donner une vleur u moment de s dlrtion omme on vient d9pprendre le fireF eprsD il ser trop trd X vous ne pourrez plus hnger l vleur de l onstnteF ixemple de dlrtion de onstnte X
1

onst int xywfihisisxssevi a S Y

Ce n'est pas une obligation, mais par convention on crit les noms des constantes entirement en majuscules comme je viens de le faire l. Cela nous permet ainsi de distinguer facilement les constantes des variables. Notez qu'on utilise l'underscore _ la place de l'espace.

prt D une onstnte s9utilise omme une vrile normleD vous pouvez 0her s vleur si vous le dsirezF v seule hose qui hngeD 9est que si vous essyez de modi(er ST

AFFICHER LE CONTENU D'UNE VARIABLE

l vleur de l onstnte plus loin dns le progrmmeD le ompilteur vous indiquer qu9il y une erreur ve ette onstnteF ves erreurs de ompiltion sont 0hes en s de l9rn @dns e que j9ppelle l  zone de l mort D vous vous souvenez cAF hns un tel sD le ompilteur vous fE (herit un mot doux du genre X [Warning] assignment of read-only variable 'NOMBRE_DE_VIES_INITIALES' F
2

Acher le contenu d'une variable


yn sit 0her du texte l9rn ve l fontion printfF wintenntD on v voir omment 0her l vleur d9une vrile ve ette mme fontionF yn utilise en fit printf de l mme mnireD suf que l9on rjoute un symole spil l9endroit o l9on veut 0her l vleur de l vrileF r exemple X
1

printf @ 4 sl vous reste 7 d vies 4 A Y

ge  symole spil dont je viens de vous prler est en fit un 7 suivi de l lettre  d F gette lettre permet d9indiquer e que l9on doit 0herF  d signi(e que 9est un nomre entierF sl existe plusieurs utres possiilitsD mis pour des risons de simpliit on v se ontenter de retenir es deuxEl X
Symbole Signication
%d %f

xomre entier @exF X RA xomre diml @exF X SFIVA

te vous prleri des utres symoles en temps vouluF our le momentD shez que si vous voulez 0her un int vous devez utiliser %dD et pour un double vous utiliserez %fF yn presque (niF yn indiqu qu9 un endroit pris on voulit 0her un nomre entierD mis on n9 ps pris lequel 3 sl fut don indiquer l fontion printf quelle est l vrile dont on veut 0her l vleurF our e fireD vous devez tper le nom de l vrile prs les guillemets et prs voir rjout une virguleD omme ei X
1

printf @ 4 sl vous reste 7 d vies 4 D nomreheies A Y

ve %d ser rempl pr l vrile indique prs l virguleD svoir nombreDeViesF yn se teste dns un progrmme c
1 2 3 4 5 6 7

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int nomreheies a S Y GG eu d prt D le joueur S vies
2. Traduction :  Triple idiot, pourquoi tu essaies de modier la valeur d'une constante ? 

SU

CHAPITRE 4. UN MONDE DE VARIABLES


8 9

10 11

printf @ 4 ous vez 7 d vies n 4 D nomreheies A Y printf @ 4 BBBB f e w BBBB n 4 A Y GG v il se prend un grnd oup sur l t te nomreheies a R Y GG sl vient de perdre une vie 3 printf @ 4 eh desole D il ne vous reste plus que 7 d vies mintennt 3 n n 4 D nomreheies A Y } return H Y

12 13 14

pourrit presque tre un jeu vido @il fut juste euoup d9imgintionAF ge proE grmme 0he ei l9rn X
ous vez S vies BBBB f e w BBBB eh desole D il ne vous reste plus que R vies mintennt 3

ous devriez reonntre e qui se psse dns votre progrmmeF IF eu dprt le joueur S viesD on 0he dns un printfF PF insuiteD le joueur prend un oup sur l tte @d9o le fewAF QF pinlement il n9 plus que R viesD on 0he ussi ve un printfF frefD 9est plutt simpleF

Acher plusieurs variables dans un mme printf


sl est possile d90her l vleur de plusieurs vriles dns un seul printfF sl vous su0t pour el d9indiquer des %d ou des %f l o vous voulezD puis d9indiquer les vriles orrespondntes dns le mme ordreD spres pr des virgulesF r exemple X
1

printf @ 4 ous vez 7 d vies et vous etes u niveu n 7 d 4 D nomreheies D niveu A Y

Veillez bien indiquer vos variables dans le bon ordre. Le premier %d sera remplac par la premire variable (nombreDeVies), et le second %d par la seconde variable (niveau). Si vous vous trompez d'ordre, votre phrase ne voudra plus rien dire.

ellezD un petit test mintenntF xotez que j9enlve les lignes tout en hut @les diretives de prproesseur ommennt pr un 5AD je vis supposer que vous les mettez hque fois mintennt X
1 2 3

int min @ int rg D hr B rgv A { int nomreheies a S D niveu a I Y

SV

RCUPRER UNE SAISIE


4 5

printf @ 4 ous vez 7 d vies et vous etes u niveu n 7 d n 4 D nomreheies D niveu AY } return H Y

6 7 8

ge qui 0her X
ous vez S vies et vous etes u niveu n I

Rcuprer une saisie


ves vriles vont en fit ommener devenir intressntes mintenntF yn v pE prendre demnder l9utilisteur de tper un nomre dns l onsoleF ge nomreD on v le ruprer et le stoker dns une vrileF ne fois que ser fitD on pourr fire tout un ts de hoses veD vous verrezF our demnder l9utilisteur d9entrer quelque hose dns l onsoleD on v utiliser une utre fontion toute prte X scanfF gette fontion ressemle euoup printfF ous devez mettre un %d pour indiquer que l9utilisteur doit entrer un nomre entier @pour les dimuxD je vis y revenirAF uis vous devez ensuite indiquer le nom de l vrile qui v reevoir le nomreF oii omment fire pr exemple X
1 2

int ge a H Y snf @ 4 7 d 4 D 8 ge A Y

yn doit mettre le %d entre guillemetsF r illeursD il fut mettre le symole 8 devnt le nom de l vrile qui v reevoir l vleurF
Euh, pourquoi mettre un & devant le nom de la variable ?

vD il v flloir que vous me fssiez on(neF i je dois vous expliquer tout de suiteD on n9est ps sortis de l9uergeD royezEmoi 3 ue je vous rssure qund mme X je vous expliqueri un peu plus trd e que signi(e e symoleF our le momentD je hoisis de ne ps vous l9expliquer pour ne ps vous emrouillerD 9est don plutt un servie que je vous rends l 3
Attention : si vous voulez faire entrer un nombre dcimal (de type double), cette fois il ne faut pas utiliser %f comme on pourrait s'y attendre mais. . . %lf. C'est une petite dirence avec le printf qui lui prenait %f.
1

doule poids a H Y

SW

CHAPITRE 4. UN MONDE DE VARIABLES


2

snf @ 4 7 lf 4 D 8 poids A Y

evenons notre progrmmeF vorsque eluiEi rrive un scanfD il se met en puse et ttend que l9utilisteur entre un nomreF ge nomre ser stok dns l vrile ageF oii un petit progrmme simple qui demnde l9ge de l9utilisteur et qui le lui 0he ensuite X
1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { int ge a H Y GG yn initilise l vrile H printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 ge A Y GG yn demnde d ' entrer l ' ge ve snf printf @ 4 eh 3 ous vez don 7 d ns 3 n n 4 D ge A Y } return H Y

gopier e ode gode we X WWPIVT 

uel ge vez E vous c PH eh 3 ous vez don PH ns 3

ve progrmme se met don en puse prs voir 0h l question  uel ge vezE vous c F ve urseur pprt l9rnD vous devez tper un nomre entier @votre geAF pez ensuite sur  intre pour vliderD et le progrmme ontinuer s9exuterF siD tout e qu9il fit prs 9est 0her l vleur de l vrile age l9rn @ Ah ! Vous avez donc 20 ans ! AF oilD vous vez ompris le prinipeF qre l fontion scanfD on peut don ommenE er intergir ve l9utilisteurF xotez que rien ne vous emphe de tper utre hose qu9un nomre entier X ! si vous rentrez un nomre dimlD omme PFWD il ser utomtiquement tronquD 9estEEdire que seule l prtie entire ser onserveF hns e sD 9est le nomre P qui urit t stok dns l vrile Y ! si vous tpez des lettres u hsrd @ ydf AD l vrile ne hnger ps de vleurF ge qui est ien iiD 9est qu9on vit initilis notre vrile H u dutF he e fitD le progrmme 0her  H ns si n9 ps mrhF i on n9vit ps initilis l vrileD le progrmme urit pu 0her n9importe quoi 3

En rsum
! xos ordinteurs possdent plusieurs types de mmoireF he l plus rpide l plus lente X les registresD l mmoire heD l mmoire vive et le disque durF TH

RCUPRER UNE SAISIE

! our  retenir des informtionsD notre progrmme esoin de stoker des donnes dns l mmoireF sl utilise pour el l mmoire vive F ! hns notre ode soureD les variables sont des donnes stokes temporirement en mmoire viveF v vleur de es donnes peut hnger u ours du progrmmeF ! l9opposD on prle de constantes pour des donnes stokes en mmoire viveF v vleur de es donnes ne peut ps hngerF ! sl existe plusieurs types de vrilesD qui oupent plus ou moins d9espe en mmoireF gertins types omme int sont prvus pour stoker des nomres entiersD tndis que d9utres omme double stokent des nomres dimuxF ! v fontion scanf permet de demnder l9utilisteur de sisir un nomreF
3

3. Les registres et la mmoire cache sont aussi utiliss pour augmenter les performances, mais cela fonctionne automatiquement, nous n'avons pas nous en proccuper.

TI

CHAPITRE 4. UN MONDE DE VARIABLES

TP

Chapitre

5
Dicult :

Une bte de calcul

e vous l'ai dit dans le chapitre prcdent : votre ordinateur n'est en fait qu'une grosse machine calculer. Que vous soyez en train d'couter de la musique, regarder un lm ou jouer un jeu vido, votre ordinateur ne fait que des calculs. Ce chapitre va vous apprendre raliser la plupart des calculs qu'un ordinateur sait faire. Nous rutiliserons ce que nous venons tout juste d'apprendre, savoir les variables. L'ide, c'est justement de faire des calculs avec vos variables : ajouter des variables entre elles, les multiplier, enregistrer le rsultat dans une autre variable, etc. Mme si vous n'tes pas fan des mathmatiques, ce chapitre vous sera absolument indispensable.

TQ

CHAPITRE 5. UNE BTE DE CALCUL

Les calculs de base


sl fut svoir qu9en plus de n9tre qu9une vulgire lultrieD votre ordinteur est une lultrie trs sique puisqu9on ne peut fire que des oprtions trs simples X ! ddition Y ! soustrtion Y ! multiplition Y ! division Y ! modulo F i vous voulez fire des oprtions plus ompliques @des rrsD des puissnesD des logrithmes et utres joyeusetsA il vous fudr les progrmmerD 9estEEdire expliquer l'ordinateur comment les faireF port heureusementD nous verrons plus loin dns e hpitre qu9il existe une iliothque mthmtique livre ve le lngge g qui ontient des fontions mthmtiques toutes prtesF ous n9urez don ps les rrireD moins que vous souhitiez volontirement psser un sle qurt d9heure @ou que vous soyez prof de mthsAF oyons don l9ddition pour ommenerF our fire une dditionD on utilise le signe C @sns lgue 3AF ous devez mettre le rsultt de votre lul dns une vrileF yn v don pr exemple rer une vrile resultat de type int et fire un lul X
1 1 2 3

int resultt a H Y resultt a S C Q Y

s esoin d9tre un pro du lul mentl pour deviner que l vrile resultat ontiendr l vleur V prs exutionF fien srD rien ne s90he l9rn ve e odeF i vous voulez voir l vleur de l vrileD rjoutez un printf omme vous svez mintennt si ien le fire X
1

printf @ 4 S C Q a

7 d 4 D resultt A Y

l9rnD el donner X
S C Q a V

oil pour l9dditionF our les utres oprtionsD 9est l mme hoseD seul le signe utilis hnge @voir tF SFIAF i vous vez dj utilis l lultrie sur votre ordinteurD vous devriez onntre es signesF sl n9y ps de di0ult prtiulire pour es oprtionsD prt pour les deux dernires @l division et le moduloAF xous llons don prler un peu plus en dtil de hune d9ellesF
1. Je vous expliquerai ce que c'est si vous ne savez pas, pas de panique.

TR

LES CALCULS DE BASE

eddition + oustrtion wultiplition * hivision / wodulo % Table SFI ! ignes des oprteurs

Opration

Signe

La division
ves divisions fontionnent normlement sur un ordinteur qund il n9y ps de resteF r exempleD 6 / 3 font PD votre ordinteur vous donner l rponse justeF tusqueEl ps de souiF wis prenons mintennt une division ve reste omme 5 / 2F F F ve rsultt devrit tre PFSF it pourtnt 3 egrdez e que fit e ode X
1 2 3 4

int resultt a H Y resultt a S G P Y printf @ 4 S G P a 7 d 4 D resultt AY S G P a P

sl y un gros prolmeF yn demnd 5 / 2D on s9ttend voir PFSD et l9ordinteur nous dit que fit P 3 sl y nguille sous roheF xos ordinteurs serientEils stupides e point c in fitD qund il voit les hi'res S et PD votre ordinteur fit une division de nomres entiers F gel veut dire qu9il tronque le rsulttD il ne grde que l prtie entire @le PAF
2

H mais je sais pourquoi ! C'est parce que resultat est un int ! Si a avait t un double, il aurait pu stocker un nombre dcimal l'intrieur !

ih nonD e n9est ps l rison 3 issyez le mme ode en trnsformnt juste resultat en doubleD et vous verrez qu9on vous 0he qund mme PF re que les nomres de l9oprtion sont des nomres entiersD l9ordinteur rpond pr un nomre entierF i on veut que l9ordinteur 0he le on rsulttD il v flloir trnsformer les nomres S et P de l9oprtion en nomres dimuxD 9estEEdire rire SFH et PFH @e sont les mmes nomresD mis l9ordinteur onsidre que e sont des nomres dimuxD don il fit une division de nomres dimuxA X
1 2

doule resultt a H Y
2. Aussi appele  division euclidienne .

TS

CHAPITRE 5. UNE BTE DE CALCUL


3 4

resultt a S F H G P F H Y printf @ 4 S G P a 7 f 4 D resultt A Y S G P a PFSHHHHH

vD le nomre est orretF fon X il 0he des tonnes de zros derrire si lui hnteD mis le rsultt reste qund mme orretF gette proprit de l division de nomres entiers est trs importnteF sl fut que vous reteniez que pour un ordinteur X ! S G P a PY ! IH G Q a Q Y ! R G S a HF g9est un peu surprenntD mis 9est s fon de luler ve des entiersF i vous voulez voir un rsultt dimlD il fut que les nomres de l9oprtion soient dimux X ! SFH G PFH a PFS Y ! IHFH G QFH a QFQQQQQ Y ! RFH G SFH a HFVF in fitD en fisnt une division d9entiers omme 5 / 2D votre ordinteur rpond l question  gomien y EtEil de fois P dns le nomre S c F v rponse est deux foisF he mmeD  omien de fois y EtEil le nomre Q dns IH c rois foisF wis lors me direzEvousD omment on fit pour ruprer le reste de l division c g9est l que superEmodulo intervientF

Le modulo
ve modulo est une oprtion mthmtique qui permet d9otenir le reste d'une divisionF g9est peutEtre une oprtion moins onnue que les qutre utresD mis pour votre ordinteur reste une oprtion de seF F F prolement pour justement omler le prolme de l  division d9entiers qu9on vient de voirF ve moduloD je vous l9i dit tout l9heureD se reprsente pr le signe %F oii quelques exemples de modulos X ! S 7 P a IY ! IR 7 Q a P Y ! R 7 P a HF ve modulo 5 % 2 est le reste de l division 5 / 2D 9estEEdire IF v9ordinteur lule que 5 = 2 * 2 + 1 @9est e ID le resteD que le modulo renvoieAF he mmeD 14 % 3, le lul est 14 = 3 * 4 + 2 @modulo renvoie le PAF in(nD pour 4 % 2D l division tome justeD il n9y ps de resteD don modulo renvoie HF oilD il n9y rien jouter u sujet des modulosF te tenis juste l9expliquer eux qui ne onntrient psF TT

LES CALCULS DE BASE

in plus j9i une onne nouvelle X on vu toutes les oprtions de seF pinis les ours de mths 3

Des calculs entre variables


ge qui serit intressntD mintennt que vous svez fire les inq oprtions de seD e serit de s9entrner fire des luls entre plusieurs vrilesF in e'etD rien ne vous emphe de fire X
1

resultt a nomreI C nomreP Y

gette ligne fit l somme des vriles nombre1 et nombre2D et stoke le rsultt dns l vrile resultatF it 9est l que les hoses ommenent devenir trs intressntesF enezD il me vient une ideF ous vez mintennt dj le niveu pour rliser une miniElultrieF iD siD je vous ssure 3 smginez un progrmme qui demnde deux nomres l9utilisteurF ges deux nomresD vous les stokez dns des vrilesF insuiteD vous fites l somme de es vriles et vous stokez le rsultt dns une vrile ppele resultatF ous n9vez plus qu9 0her le rsultt du lul l9rnD sous les yeux his de l9utilisteur qui n9urit jmis t ple de luler el de tte ussi viteF issyez de oder vousEmmes e petit progrmmeD 9est file et vous entrner 3 v rponse est iEdessous X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

int min @ int rg D hr B rgv A { int resultt a H D nomreI a H D nomreP a H Y GG yn demnde les nomres I et P l ' utilisteur X printf @ 4 intrez le nomre I X 4 A Y snf @ 4 7 d 4 D 8 nomreI A Y printf @ 4 intrez le nomre P X 4 A Y snf @ 4 7 d 4 D 8 nomreP A Y GG yn fit le lul X resultt a nomreI C nomreP Y GG it on ffihe l ' ddition l ' rn X printf @ 4 7 d C 7 d a 7 d n 4 D nomreI D nomreP D resultt A Y } return H Y

TU

CHAPITRE 5. UNE BTE DE CALCUL




gopier e ode gode we X PSTRSP 


intrez le nomre I X QH intrez le nomre P X PS QH C PS a SS

ns en voir l9irD on vient de fire l notre premier progrmme ynt un intrtF xotre progrmme est ple d9dditionner deux nomres et d90her le rsultt de l9oprtion 3 ous pouvez essyer ve n9importe quel nomre @du moment que vous ne dpssez ps les limites d9un type intAD votre ordinteur e'etuer le lul en un lir F te vous onseille de fire l mme hose ve les utres oprtions pour vous entrner @soustrtionD multiplitionF F FAF ous ne devriez ps voir trop de ml vu qu9il y juste un ou deux signes hngerF ous pouvez ussi jouter une troisime vrile et fire l9ddition de trois vriles l foisD fontionne sns prolme X
3 1

resultt a nomreI C nomreP C nomreQ Y

Les raccourcis
gomme promisD nous n9vons ps de nouvelles oprtions voirF it pour use 3 xous les onnissons dj toutesF g9est ve es simples oprtions de se que vous pouvez tout rerF sl n9y ps esoin d9utres oprtionsF te reonnis que 9est di0ile vlerD se dire qu9un jeu Qh ne fit rien d9utre u (nl que des dditions et des soustrtionsD pourtntF F F 9est l strite vritF gei tntD il existe en g des tehniques permettnt de rourir l9riture des opE rtionsF ourquoi utiliser des rouris c re queD souventD on fit des oprtions rptitivesF ous llez voir e que je veux dire pr l tout de suiteD ve e qu9on ppelle l9inrmenttionF

L'incrmentation
ous verrez que vous serez souvent mens jouter I une vrileF eu fur et mesure du progrmmeD vous urez des vriles qui ugmentent de I en IF smginons que votre vrile s9ppelle nombre @nom trs originlD n9estEe ps cAF uriezE vous omment fire pour jouter I ette vrileD sns svoir quel est le nomre qu9elle ontient c oii omment on doit fire X
1

nomre a nomre C I Y

3. Encore heureux, parce que des oprations comme a, il doit en faire des milliards en une seule seconde !

TV

LES RACCOURCIS

ue se psseEtEil ii c yn fit le lul nombre + 1D et on rnge e rsultt dns l vrileF F F nombre 3 hu oupD si notre vrile nombre vlit RD elle vut mintennt SF i elle vlit VD elle vut mintennt WD etF gette oprtion est justement rptitiveF ves informtiiens tnt des gens prtiuliE rement finntsD ils n9vient gure envie de tper deux fois le mme nom de vrile @en oui quoiD 9est ftignt 3AF sls ont don invent un rouri pour ette oprE tion qu9on ppelle l'incrmentationF gette instrution produit extement le mme rsultt que le ode qu9on vient de voir X
1

nomre CCY

gette ligneD ien plus ourte que elle de tout l9heureD signi(e  ejoute I l vrile nombre F sl su0t d9rire le nom de l vrile inrmenterD de mettre deux signes CD et ien entenduD de ne ps oulier le pointEvirguleF wine de rienD el nous ser ien prtique pr l suite rD omme je vous l9i ditD on ser souvent mens fire des inrmenttions @9estEEdire jouter I une vrileAF
Si vous tes perspicaces, vous avez d'ailleurs remarqu que ce signe ++ se trouve dans le nom du langage C++. C'est en fait un clin d'il des programmeurs, et vous tes maintenant capables de le comprendre ! C++ signie qu'il s'agit du langage C  incrment , c'est--dire si on veut  du langage C un niveau suprieur . En pratique, le C++ permet surtout de programmer diremment mais il n'est pas  meilleur  que le C : juste dirent.

La dcrmentation
g9est tout tement l9inverse de l9inrmenttion X on enlve I une vrileF wme si on fit plus souvent des inrmenttions que des drmenttionsD el reste une oprtion prtique que vous utiliserez de temps en tempsF v drmenttionD si on l9rit en forme  longue X
1

nomre a nomre E I Y

it mintennt en forme  rourie X


1

nomre E EY

yn l9urit presque devin tout seul 3 eu lieu de mettre un ++D vous mettez un -- X si votre vrile vut TD elle vudr S prs l9instrution de drmenttionF

Les autres raccourcis


sl existe d9utres rouris qui fontionnent sur le mme prinipeF gette foisD es rouris fontionnent pour toutes les oprtions de se X + - * / %F gel permet l enore d9viter une rptition du nom d9une vrile sur une mme ligneF einsiD si vous voulez multiplier pr deux une vrile X TW

CHAPITRE 5. UNE BTE DE CALCUL


1

nomre a nomre B P Y

ous pouvez l9rire d9une fon rourie omme ei X


1

nomre Ba P Y

i le nomre vut S u dprtD il vudr IH prs ette instrutionF our les utres oprtions de seD el fontionne de l mme mnireF oii un petit progrmme d9exemple X
1 2 3 4 5 6 7

int nomre a P Y nomre nomre nomre nomre nomre Ca Ea Ba Ga 7a RY QY SY QY QY GG GG GG GG GG nomre vut T FFF FFF nomre vut mintennt Q FFF nomre vut IS FFF nomre vut S FFF nomre vut P @ r S a I B Q C P A

(Ne boudez pas, un peu de calcul mental n'a jamais tu personne !)

v9vntge ii est qu9on peut utiliser toutes les oprtions de seD et qu9on peut jouE terD soustrireD multiplier pr n9importe quel nomreF ge sont des rouris onntre si vous vez un jour des lignes rptitives tper dns un progrmmeF etenez qund mme que l9inrmenttion reste de loin le rouri le plus utilisF

La bibliothque mathmatique
in lngge gD il existe e qu9on ppelle des iliothques  stndrd D 9estEEdire des iliothques toujours utilislesF ge sont en quelque sorte des iliothques  de se qu9on utilise trs souventF ves iliothques sontD je vous le rppelleD des ensemles de fontions toutes prtesF ges fontions ont t rites pr des progrmmeurs vnt vousD elles vous vitent en quelque sorte d9voir rinventer l roue hque nouveu progrmmeF ous vez dj utilis les fontions printf et scanf de l iliothque stdio.hF sl fut svoir qu9il existe une utre iliothqueD ppele math.hD qui ontient de nomreuses fontions mthmtiques toutes prtesF in e'etD les inq oprtions de se que l9on vues sont loin d9tre su0sntes 3 fonD il se peut que vous n9yez jmis esoin de ertines oprtions omplexes omme les exponentielles F outefoisD l iliothque mthmtique ontient de nomreuses utres fontions dont vous urez trs prolement esoinF enez pr exempleD on ne peut ps fire de puissnes en g 3 gomment luler un simple rr c ous pouvez toujours essyer de tper 52 dns votre progrmmeD mis votre ordinteur ne le omprendr jmis r il ne sit ps e que 9estF F F moins que vous le lui expliquiez en lui indiqunt l iliothque mthmtique 3
4

4. Si vous ne savez pas ce que c'est, c'est que vous tes peut-tre un peu trop jeunes ou que vous n'avez pas assez fait de maths dans votre vie.

UH

LA BIBLIOTHQUE MATHMATIQUE

our pouvoir utiliser les fontions de l iliothque mthmtiqueD il est indispensle de mettre l diretive de prproesseur suivnte en hut de votre progrmme X
1

5 inlude ` mth Fh b

ne fois que 9est fitD vous pouvez utiliser toutes les fontions de ette iliothqueF t9i justement l9intention de vous les prsenterF fon X omme il y euoup de fonE tionsD je ne peux ps en fire l liste omplte iiF h9une prt vous ferit trop ssimilerD et d9utre prt mes puvres petits doigts urient fondu vnt l (n de l9riture du hpitreF te vis don me ontenter des fontions priniplesD 9estEEdire elles qui me semlent les plus importntesF
Vous n'avez peut-tre pas tous le niveau en maths pour comprendre ce que font ces fonctions. Si c'est votre cas, pas d'inquitude. Lisez juste, cela ne vous pnalisera pas pour la suite. Ceci tant, je vous ore un petit conseil gratuit : soyez attentifs en cours de maths, on ne dirait pas comme a, mais en fait a nit par servir !

fabs
gette fontion retourne l vleur solue d9un nomreD 9estEEdire |x| @9est l nottion mthmtiqueAF v vleur solue d9un nomre est s vleur positive X ! si vous donnez ESQ l fontionD elle vous renvoie SQ Y ! si vous donnez SQ l fontionD elle vous renvoie SQF in refD elle renvoie toujours l9quivlent positif du nomre que vous lui donnezF
1 2 3

doule solu a H D nomre a E PU Y solu a fs @ nomre A Y GG solu vudr PU

gette fontion renvoie un doubleD don votre vrile absolu doit tre de type doubleF
Il existe aussi une fonction similaire appele abs, situe cette fois dans La fonction abs marche de la mme manire, sauf qu'elle utilise des entiers (int). Elle renvoie donc un nombre entier de type int et non un double comme fabs.
stdlib.h.

ceil
gette fontion renvoie le premier nomre entier prs le nomre diml qu9on lui donneF g9est une sorte d9rrondiF yn rrondit en fit toujours u nomre entier supE rieurF r exempleD si on lui donne PTFSIPD l fontion renvoie PUF gette fontion s9utilise de l mme mnire et renvoie un double X UI

CHAPITRE 5. UNE BTE DE CALCUL


1 2 3

doule dessus a H D nomre a SP F UI Y dessus a eil @ nomre A Y GG dessus vudr SQ

oor
g9est l9inverse de l fontion prdente X ette foisD elle renvoie le nomre diretement en dessousF i vous lui donnez QUFWID l fontion floor vous renverr don QUF

pow
gette fontion permet de luler l puissne d9un nomreF ous devez lui indiquer deux vleurs X le nomre et l puissne lquelle vous voulez l9leverF oii le shm de l fontion X
1

pow @ nomre D puissne A Y

r exempleD  P puissne Q @que l9on rit hituellement PQ sur un ordinteurAD 9est le lul P B P B PD e qui fit V X
1 2 3

doule resultt a H D nomre a P Y resultt a pow @ nomre D Q A Y GG resultt vudr P { textsiiirum } Q a V

ous pouvez don utiliser ette fontion pour luler des rrsF sl su0t d9indiquer une puissne de PF

sqrt
gette fontion lule l rine rre d9un nomreF ille renvoie un doubleF
1 2 3

doule resultt a H D nomre a IHH Y resultt a sqrt @ nomre A Y GG resultt vudr IH

sin, cos, tan


ge sont les trois fmeuses fontions utilises en trigonomtrieF ve fontionnement est le mmeD es fontions renvoient un doubleF ges fontions ttendent une vleur en radiansF

asin, acos, atan


ge sont les fontions r sinusD r osinus et r tngenteD d9utres fontions de trigoE nomtrieF illes s9utilisent de l mme mnire et renvoient un doubleF UP

LA BIBLIOTHQUE MATHMATIQUE

exp
gette fontion lule l9exponentielle d9un nomreF ille renvoie un double @ouiD ouiD elle ussiAF

log
gette fontion lule le logrithme nprien d9un nomre @que l9on note ussi  ln AF

log10
gette fontion lule le logrithme se IH d9un nomreF

En rsum
! n ordinteur n9est en fit qu9une calculatrice gante X tout e qu9il sit fireD e sont des oprtionsF ! ves oprtions onnues pr votre ordinteur sont trs basiques X l9dditionD l sousE trtionD l multiplitionD l division et le modulo F ! sl est possile d9eectuer des calculs entre des variablesF g9est d9illeurs e qu9un ordinteur sit fire de mieux X il le fit ien et viteF ! v9incrmentation est l9oprtion qui onsiste jouter I une vrileF yn rit variable++F ! v dcrmentation est l9oprtion inverse X on retire I une vrileF yn rit don variable--F ! our ugmenter le nomre d9oprtions onnues pr votre ordinteurD il fut hrger l bibliothque mathmatique F ! gette iliothque ontient des fonctions mathmatiques plus avancesD telles que l puissneD l rine rreD l9rrondiD l9exponentielleD le logrithmeD etF
5 6

5. Il s'agit du reste de la division. 6. #include <math.h>

UQ

CHAPITRE 5. UNE BTE DE CALCUL

UR

Chapitre

6
Dicult :

Les conditions

ous avons vu dans le premier chapitre qu'il existait de nombreux langages de programmation. Certains se ressemblent d'ailleurs : un grand nombre d'entre eux sont inspirs du langage C. En fait le langage C a t cr il y a assez longtemps, ce qui fait qu'il a servi de modle de nombreux autres plus rcents. La plupart des langages de programmation ont nalement des ressemblances, ils reprennent les principes de base de leurs ans. En parlant de principes de base : nous sommes en plein dedans. Nous avons vu comment crer des variables, faire des calculs avec (concept commun tous les langages de programmation !), nous allons maintenant nous intresser aux conditions. Sans conditions, nos programmes informatiques feraient toujours la mme chose !

US

CHAPITRE 6. LES CONDITIONS

La condition if... else


ves onditions permettent de tester des vrilesF yn peut pr exemple dire  si l vrile mhin est gle SHD fis ei F F F wis e serit dommge de ne pouvoir tester que l9glit 3 sl fudrit ussi pouvoir tester si l vrile est infrieure SHD infrieure ou gle SHD suprieureD suprieure ou gleF F F xe vous inquitez psD le g tout prvu 3 our tudier les onditions if... elseD nous llons suivre le pln suivnt X IF quelques symoles onntre vnt de ommenerD PF le test ifD QF le test elseD RF le test else ifD SF plusieurs onditions l foisD TF quelques erreurs ourntes viterF evnt de voir omment on rit une ondition de type if... else en gD il fut don que vous onnissiez deux ou trois symoles de seF ges symoles sont indispensles pour rliser des onditionsF

Quelques symboles connatre


oii un petit tleu de symoles du lngge g connatre par coeur X
Symbole Signication

aa b ` ba `a 3a

est gl est suprieur est infrieur est suprieur ou gl est infrieur ou gl est di'rent de

Faites trs attention, il y a bien deux symboles == pour tester l'galit. Une erreur courante que font les dbutants et de ne mettre qu'un symbole =, ce qui n'a pas la mme signication en C. Je vous en reparlerai un peu plus bas.

Un if simple
ettquons mintennt sns plus trderF xous llons fire un test simpleD qui v dire l9ordinteur X s l vrile vut D evy fis eiF UT

LA CONDITION IF... ELSE

in nglisD le mot  si se trduit pr ifF g9est elui qu9on utilise en lngge g pour introduire une onditionF rivez don un ifF yuvrez ensuite des prenthses X l9intrieur de es prenthses vous devrez rire votre onditionF insuiteD ouvrez une olde { et fermezEl un peu plus loin }F out e qui se trouve l9intrieur des oldes ser exut uniquement si l ondition est vri(eF gel nous donne don rire X
1 2 3 4

if @ GB otre ondition BG A { GG snstrutions ex uter si l ondition est vrie }

l ple de mon ommentire  otre ondition D on v rire une ondition pour tester une vrileF r exempleD on pourrit tester une vrile age qui ontient votre geF enez pour s9entrnerD on v tester si vous tes mjeurD 9estEEdire si votre ge est suprieur ou gal 18 X
1 2 3 4

if @ ge ba IV A { printf @ 4 ous etes mjeur 3 4 A Y }

ve symole >= signi(e  suprieur ou gl D omme on l9 vu dns le tleu tout l9heureF


S'il n'y a qu'une instruction entre les accolades (comme c'est le cas ici), alors celles-ci deviennent facultatives. Je recommande nanmoins de toujours mettre des accolades pour des raisons de clart.
Tester ce code

i vous voulez tester les odes prdents pour voir omment le if fontionneD il fudr pler le if l9intrieur d9une fontion main et ne ps oulier de dlrer une vrile age lquelle on donner l vleur de notre hoixF gel peut prtre vident pour ertinsD mis plusieurs leteurs visilement perdus m9ont enourg jouter ette explitionF oii don un ode omplet que vous pouvez tester X
1 2 3 4 5 6 7 8 9

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int ge a PH Y if @ ge ba IV A {

UU

CHAPITRE 6. LES CONDITIONS


10 11 12 13 14

} }

printf @ 4 ous etes mjeur 3 n 4 A Y

return H Y

gopier e ode gode we X SQQURT  siD l vrile age vut PHD don le  ous tes mjeur 3 s90herF issyez de hnger l vleur initile de l vrile pour voirF wettez pr exemple IS X l ondition ser fusseD et don  ous tes mjeur 3 ne s90her ps ette foisF tilisez e ode de se pour tester les prohins exemples du hpitreF
Une question de propret

v fon dont vous ouvrez les oldes n9est ps importnteD votre progrmme fonE tionner ussi ien si vous rivez tout sur une mme ligneF r exemple X
1

if @ ge ba IV A {

printf @ 4 ous etes mjeur 34 A Y }

ourtntD mme s9il est possile d9rire omme D 9est absolument dconseillF in e'etD tout rire sur une mme ligne rend votre ode di0ilement lisileF i vous ne prenez ps ds mintennt l9hitude d9rer votre odeD plus trd qund vous rirez de plus gros progrmmes vous ne vous y retrouverez plus 3 issyez don de prsenter votre ode soure de l mme fon que moi X une olde sur une ligneD puis vos instrutions @prdes d9une tultion pour les  dler vers l droite AD puis l9olde de fermeture sur une ligneF
Il existe plusieurs bonnes faons de prsenter son code source. a ne change rien au fonctionnement du programme nal, mais c'est une question de  style informatique  si vous voulez. Si vous voyez le code de quelqu'un d'autre prsent un peu diremment, c'est qu'il code avec un style dirent. Le principal dans tous les cas tant que le code reste ar et lisible.

Le else pour dire  sinon 


wintennt que nous svons fire un test simpleD llons un peu plus loin X si le test n9 ps mrh @il est fuxAD on v dire l9ordinteur d9exuter d9utres instrutionsF in frnisD nous llons don rire quelque hose qui ressemle el X s l vrile vut D evy fis eiD sxyx fis elF UV

LA CONDITION IF... ELSE

sl su0t de rjouter le mot else prs l9olde fermnte du ifF etit exemple X
1 2 3 4 5 6 7 8

if @ ge ba IV A GG i l ' ge est sup rieur ou gl IV { printf @ 4 ous etes mjeur 3 4 A Y } else GG inon FFF { printf @ 4 eh ' est ete D vous etes mineur 3 4 A Y }

ves hoses sont ssez simples X si l vrile age est suprieure ou gle IVD on 0he le messge  ous tes mjeur 3 D sinon on 0he  ous tes mineur F

Le else if pour dire  sinon si 


yn vu omment fire un  si et un  sinon F sl est possile ussi de fire un  sinon si pour fire un utre test si le premier test n9 ps mrhF ve  sinon si se ple entre le if et le elseF yn dit dns e s l9ordinteur X s l vrile vut evy fis eiD sxyx s l vrile vut evy fis D sxyx fis elF rdution en lngge g X
1 2 3 4 5

6 7 8 9 10 11

12

if @ ge ba IV A GG i l ' ge est sup rieur ou gl IV { printf @ 4 ous etes mjeur 3 4 A Y } else if @ ge b R A GG inon D si l ' ge est u moins sup rieur R { printf @ 4 fon t ' es ps trop jeune qund meme FFF 4 A Y } else GG inon FFF { printf @ 4 eg g g g 4 A Y GG vngge D vous pouvez ps omprendre }

v9ordinteur fit les tests dns l9ordreF IF h9ord il teste le premier if X si l ondition est vrieD lors il exute e qui se trouve entre les premires oldesF PF inonD il v u  sinon si et fit nouveu un test X si e test est vriD lors il exute les instrutions orrespondntes entre oldesF UW

CHAPITRE 6. LES CONDITIONS

QF in(nD si uun des tests prdents n9 mrhD il exute les instrutions du  sinon F
Le else et le else if ne sont pas obligatoires. Pour faire une condition, seul un if est ncessaire (logique me direz-vous, sinon il n'y a pas de condition !).

xotez qu9on peut mettre utnt de else if que l9on veutF yn peut don rire X s l vrile vut D evy fis eiD sxyx s l vrile vut evy fis D sxyx s l vrile vut evy fis D sxyx s l vrile vut evy fis D sxyx fis elF

Plusieurs conditions la fois


sl peut ussi tre utile de fire plusieurs tests l fois dns votre ifF r exempleD vous voudriez tester si l9ge est suprieur IV i si l9ge est infrieur PSF our fire elD il v flloir utiliser de nouveux symoles X
Symbole Signication
&& || !

i y xyx

Test ET

i on veut fire le test que j9i mentionn plus hutD il fudr rire X
1

if @ ge b IV 88 ge ` PS A

ves deux symoles && signi(ent iF xotre ondition se dirit en frnis X  si l9ge est suprieur IV i si l9ge est infrieur PS F
Test OU

our fire un yD on utilise les deux signes ||F te dois vouer que e signe n9est ps filement essile sur nos lviersF our le tper sur un lvier ei frnisD il fudr fire Alt Gr + 6F ur un lvier elgeD il fudr fire Alt Gr + &F smginons pour l9exemple un progrmme stupide qui dide si une personne le droit d9ouvrir un ompte en nqueF g9est ien onnuD pour ouvrir un ompte en nque il vut mieux ne ps tre trop jeune @on v dire ritrirement qu9il fut voir u moins VH

LA CONDITION IF... ELSE

QH nsA ou ien voir euoup d9rgent @pre que lD mme IH ns on vous epter rs ouverts 3AF xotre test pour svoir si le lient le droit d9ouvrir un ompte en nque pourrit tre X
1 2 3 4 5 6 7 8

if @ ge b QH || rgent b IHHHHH A { printf @ 4 fienvenue hez isoufnque 3 4A Y } else { printf @ 4 rors de m vue D miserle 3 4 A Y }

ge test n9est vlide que si l personne plus de QH ns ou si elle possde plus de IHH HHH euros 3
Test NON

ve dernier symole qu9il nous reste tester est le point d9exlmtionF in informtiqueD le point d9exlmtion signi(e  non F ous devez mettre e signe vnt votre ondition pour dire  si el n9est ps vri X
1

if @3@ ge ` IV AA

gel pourrit se trduire pr  si l personne n9est ps mineure F i on vit enlev le ! devntD el urit signi( l9inverse X  si l personne est mineure F

Quelques erreurs courantes de dbutant


N'oubliez pas les deux signes ==

i on veut tester si l personne tout juste IV nsD il fudr rire X


1 2 3 4

if @ ge aa IV A { printf @ 4 ous venez de devenir mjeur 3 4 A Y }

N'oubliez pas de mettre deux signes  gl dns un ifD omme ei X == i vous ne mettez qu9un seul signe =D lors votre vrile prendra l vleur IV @omme

on l9 ppris dns le hpitre sur les vrilesAF xous e qu9on veut fire iiD 9est tester l vleur de l vrileD non ps l hnger 3 pites trs ttention elD euoup d9entre vous n9en mettent qu9un qund ils dutent et formentF F F leur progrmme ne fontionne ps omme ils voudrient 3 VI

CHAPITRE 6. LES CONDITIONS

Le point-virgule de trop

ne utre erreur ournte de dutnt X vous mettez prfois un pointEvirgule l (n de l ligne d9un ifF yrD un if est une onditionD et on ne met de pointEvirgule qu9 l (n d9une instrution et non d9une onditionF ve ode suivnt ne mrher ps omme prvu r il y un pointEvirgule l (n du if X
1 2 3 4

if @ ge aa IV A Y GG xotez le point E virgule ii qui ne devrit e tre l { printf @ 4 u es tout juste mjeur 4 A Y }

Les boolens, le coeur des conditions


xous llons mintennt entrer plus en dtils dns le fontionnement d9une ondition de type if... elseF in e'etD les onditions font intervenir quelque hose qu9on ppelle les boolens en informtiqueF

Quelques petits tests pour bien comprendre


xous llons ommener pr fire quelques petites exprienes vnt d9introduire ette nouvelle notionF oii un ode soure trs simple que je vous propose de tester X
1 2 3 4 5 6 7 8

if @ I A { printf @ 4 g ' est vri 4 A Y } else { printf @ 4 g ' est fux 4 A Y }

sultt X
g 9 est vri

Mais ? On n'a pas mis de condition dans le if, juste un nombre. Qu'est-ce que a veut dire ? a n'a pas de sens.

iD en D vous llez omprendreF pites un utre test en remplnt I pr H X


1 2 3

if @ H A { printf @ 4 g ' est vri 4 A Y

VP

LES BOOLENS, LE COEUR DES CONDITIONS


4 5 6 7 8

} else { }

printf @ 4 g ' est fux 4 A Y

sultt X
g 9 est fux

pites mintennt d9utres tests en remplnt le H pr n9importe quel utre nomre entierD omme RD ISD PPTD EIHD EQTD etF u9estEe qu9on vous rpond hque fois c yn vous rpond X  g9est vri F Rsum de nos tests : si on met un HD le test est onsidr omme fuxD et si on met un I ou n9importe quel utre nomreD le test est vriF

Des explications s'imposent


in fitD hque fois que vous fites un test dns un ifD e test renvoie l vleur I s9il est vriD et H s9il est fuxF r exemple X
1

if @ ge ba IV A

siD le test que vous fites est age >= 18F upposons que age ville PQF elors le test est vriD et l9ordinteur  remple en quelque sorte age >= 18 pr IF insuiteD l9ordinteur otient @dns s tteA un if (1)F und le nomre est ID omme on l9 vuD l9ordinteur dit que l ondition est vrieD don il 0he  g9est vri 3 he mmeD si l ondition est fusseD il remple age >= 18 pr le nomre HD et du oup l ondition est fusse X l9ordinteur v lire les instrutions du elseF

Un test avec une variable


estez mintennt un utre tru X envoyez le rsultt de votre ondition dns une vrileD omme si 9tit une oprtion @r pour l9ordinteurD c'est une oprtion 3AF
1 2 3 4 5

int ge a PH Y int mjeur a H Y mjeur a ge ba IV Y printf @ 4 wjeur vut X 7 d n 4 D mjeur AY

gomme vous le voyezD l ondition age >= 18 renvoy le nomre I r elle est vrieF hu oupD notre vrile majeur vut ID on vri(e d9illeurs el gre un printf qui montre ien qu9elle hng de vleurF pites le mme test en mettnt age == 10 pr exempleF gette foisD majeur vudr HF VQ

CHAPITRE 6. LES CONDITIONS

Cette variable majeur est un boolen


etenez ien ei X on dit qu9une vrile lquelle on fit prendre les vleurs H et I est un boolenF it ussi ei X ! H a fuxD ! I a vriF in lngge gD il n9existe ps de type de vrile  oolen F in fitD le type oolen n9 t jout qu9en gCCF in e'etD en gCC vous vez un nouveu type bool qui t r spilement pour es vriles oolennesF gomme ii on fit du gD on ne dispose ps de type spilF hu oupD on est olig d9utiliser un type entier omme int pour grer les oolensF
1

Les boolens dans les conditions


ouventD on fer un test if sur une vrile oolenne X
1 2 3 4 5 6 7 8 9 10

int mjeur a I Y if @ mjeur A { printf @ 4 u es mjeur 3 4 A Y } else { printf @ 4 u es mineur 4 A Y }

gomme mjeur vut ID l ondition est vrieD don on 0he  u es mjeur 3 F ge qui est trs prtiqueD 9est que l ondition peut tre lue filement pr un tre huminF yn voit if (majeur)D e qui peut se trduire pr  si tu es mjeur F ves tests sur des oolens sont don files lire et omprendreD pour peu que vous yez donn des noms lirs vos vriles omme je vous i dit de le fire ds le dutF enezD voii un utre test imginire X
1

if @ mjeur 88 gron A

ge test signi(e  si tu es mjeur i que tu es un gron F garcon est ii une utre vrile oolenne qui vut I si vous tes un gronD et H si vous tesF F F une (lle 3 frvoD vous vez tout ompris 3 ves oolens permettent don de dire si quelque hose est vri ou fuxF g9est vriment utile et e que je viens de vous expliquer vous permettr de omprendre on nomre de hoses pr l suiteF
1. Pour tre tout fait exact, 0 = faux et tous les autres nombres valent vrai (on a eu l'occasion de le tester plus tt). Ceci dit, pour simplier les choses on va se contenter de n'utiliser que les nombres 0 et 1, pour dire si  quelque chose est faux ou vrai .

VR

LA CONDITION SWITCH

Petite question : si on fait le test if

(majeur == 1),

a marche aussi, non ?

out fitF wis le prinipe des oolens 9est justement de rourir l9expression du if et de l rendre plus filement lisileF evouez que if (majeur) se omprend trs ienD non c Retenez donc X si votre vrile est ense ontenir un nomre @omme un geAD fites un test sous l forme if (variable == 1)F i u ontrire votre vrile est ense ontenir un oolen @9estEEdire soit I soit H pour dire vri ou fuxAD fites un test sous l forme if (variable)F

La condition switch
v ondition if... else que l9on vient de voir est le type de ondition le plus souvent utilisF in fitD il n9y ps QT fons de fire une ondition en gF ve if... else permet de grer tous les sF outefoisD le if... else peut s9vrer quelque peuF F F rptitifF renons et exemple X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

if @ ge aa P A { printf @ 4 lut ee 3 4 A Y } else if @ ge aa T A { printf @ 4 lut gmin 3 4 A Y } else if @ ge aa IP A { printf @ 4 lut jeune 3 4 A Y } else if @ ge aa IT A { printf @ 4 lut do 3 4 A Y } else if @ ge aa IV A { printf @ 4 lut dulte 3 4 A Y } else if @ ge aa TV A { printf @ 4 lut ppy 3 4 A Y } else { printf @ 4 te n ' i uune phrse de prete pour ton ge 4 A Y }

VS

CHAPITRE 6. LES CONDITIONS




gopier e ode gode we X WTRVIQ 

Construire un switch
ves informtiiens dtestent fire des hoses rptitivesD on eu l9osion de le vri(er plus ttF elorsD pour viter d9voir fire des rptitions omme qund on teste l vleur d9une seule et mme vrileD ils ont invent une utre struture que le if... elseF gette struture prtiulire s9ppelle switchF oii un switch s sur l9exemple qu9on vient de voir X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

swith @ ge A { se P X printf @ 4 lut ee 3 4 A Y rek Y se T X printf @ 4 lut gmin 3 4 A Y rek Y se IP X printf @ 4 lut jeune 3 4 A Y rek Y se IT X printf @ 4 lut do 3 4 A Y rek Y se IV X printf @ 4 lut dulte 3 4 A Y rek Y se TV X printf @ 4 lut ppy 3 4 A Y rek Y defult X printf @ 4 te n ' i uune phrse de prete pour ton ge rek Y }

4AY

gopier e ode gode we X WWTWVV  smprgnezEvous de mon exemple pour rer vos propres switchF yn les utilise plus rrementD mis 9est vri que 9est prtique r fit @un peuA moins de ode tperF v9ide 9est don d9rire switch (maVariable) pour dire  je vis tester l vleur de l vrile maVariable F ous ouvrez ensuite des oldes que vous refermez tout en sF insuiteD l9intrieur de es oldesD vous grez tous les s X case 2D case 4D case 5D case 45F F F VT

LA CONDITION SWITCH

Vous devez mettre une instruction break; obligatoirement la n de chaque cas. Si vous ne le faites pas, alors l'ordinateur ira lire les instructions en dessous censes tre rserves aux autres cas ! L'instruction break; commande en fait l'ordinateur de  sortir  des accolades.

in(nD le s default orrespond en fit u else qu9on onnt ien mintenntF i l vrile ne vut uune des vleurs prdentesD l9ordinteur ir lire le defaultF

Grer un menu avec un switch


ve switch est trs souvent utilis pour fire des menus en onsoleF te rois que le moment est venu de prtiquer un peu 3
Au boulot !

in onsoleD pour fire un menuD on fit des printf qui 0hent les di'rentes options possilesF ghque option est numroteD et l9utilisteur doit entrer le numro du menu qui l9intresseF oii pr exemple e que l onsole devr 0her X
aaa wenu aaa IF oyl gheese PF w heluxe QF w fon RF fig w otre hoix c

Voici votre mission (si vous l'acceptez) X reproduisez e menu l9ide de printf

@fileAD joutez un scanf pour enregistrer le hoix de l9utilisteur dns une vrile choixMenuD et en(n fites un switch pour dire l9utilisteur  tu s hoisi le menu oyl gheese pr exempleF ellezD u trvil 3
Correction

oii l solution @j9espre que vous l9vez trouve 3A X


1 2 3 4 5 6 7 8 9 10

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int hoixwenu Y printf @ 4 aaa wenu aaa n n 4 A Y printf @ 4 I F oyl gheese n 4 A Y printf @ 4 P F w heluxe n 4 A Y

VU

CHAPITRE 6. LES CONDITIONS


11 12 13 14 15 16 17 18 19 20 21 22 23 24

printf @ 4 Q F w fon n 4 A Y printf @ 4 R F fig w n 4 A Y printf @ 4 notre hoix c 4 A Y snf @ 4 7 d 4 D 8 hoixwenu A Y printf @ 4 n 4 A Y swith @ hoixwenu A { se I X printf @ 4 ous vez hoisi le oyl gheese F fon hoix 3 4 A Y rek Y se P X printf @ 4 ous vez hoisi le w heluxe F ferk D trop de sue FFF 4 A Y rek Y se Q X printf @ 4 ous vez hoisi le w fon F fon D psse enore Y o A 4 A Y rek Y se R X printf @ 4 ous vez hoisi le fig w F ous devez voir tres fim 3 4 A Y rek Y defult X printf @ 4 ous n ' vez ps rentre un nomre orret F ous ne mngerez rien du tout 3 4 A Y rek Y } printf @ 4 n n 4 A Y } return H Y

25 26 27

28 29 30

31 32 33

34 35 36 37 38 39 40

gopier e ode gode we X SQRIIV  it voil le trvil 3 t9espre que vous n9vez ps ouli le default l (n du switch 3 in e'etD qund vous progrmmez vous devez toujours penser tous les sF ous vez eu dire de tper un nomre entre I et RD vous trouverez toujours un imile qui ir tper 10 ou enore Salut lors que e n9est ps e que vous ttendezF frefD soyez toujours vigilnts de e tEi X ne fites ps on(ne l9utilisteurD il peut prfois entrer n9importe quoiF rvoyez toujours un s default ou un else si vous fites ve des ifF VV

LES TERNAIRES : DES CONDITIONS CONDENSES

Je vous conseille de vous familiariser avec le fonctionnement des menus en console, car on en fait souvent dans des programmes console et vous en aurez srement besoin.

Les ternaires : des conditions condenses


sl existe une troisime fon de fire des onditionsD plus rreF yn ppelle el des expressions ternairesF gonrtementD 9est omme un if... elseD suf qu9on fit tout tenir sur une seule ligne 3 gomme un exemple vut mieux qu9un long disoursD je vis vous donner deux fois l mme ondition X l premire ve un if... elseD et l seondeD identiqueD mis sous forme d9une expression ternireF

Une condition if... else bien connue


upposons qu9on it une vrile oolenne majeur qui vut vri @IA si on est mjeurD et fux @HA si on est mineurF yn veut hnger l vleur de l vrile age en fontion du oolenD pour mettre 4IV4 si on est mjeurD 4IU4 si on est mineurF g9est un exemple ompltement stupide je suis d9ordD mis me permet de vous montrer omment on peut se servir des expressions terniresF oii omment fire el ve un if... else X
1 2 3 4

if @ mjeur A ge a IV Y else ge a IU Y

Notez que j'ai enlev dans cet exemple les accolades car elles sont facultatives s'il n'y a qu'une instruction, comme je vous l'ai expliqu plus tt.

La mme condition en ternaire


oii un ode qui fit extement l mme hose que le ode prdentD mis rit ette fois sous forme ternire X
1

ge a @ mjeur A c IV X IU Y

ves ternires permettentD sur une seule ligneD de hnger l vleur d9une vrile en fontion d9une onditionF si l ondition est tout simplement majeurD mis pourrit tre n9importe quelle ondition plus longue ien entendu F
2

2. Un autre exemple ? autorisation = (age >= 18) ? 1 : 0;

VW

CHAPITRE 6. LES CONDITIONS

ve point d9interrogtion permet de dire  estEe que tu es mjeur c F i ouiD lors on met l vleur IV dns ageF inon @le deuxEpoints : signi(e else iiAD on met l vleur IUF ves ternires ne sont ps du tout indispenslesD personnellement je les utilise peu r ils peuvent rendre l leture d9un ode soure un peu di0ileF gei tntD il vut mieux que vous les onnissiez pour le jour o vous tomerez sur un ode plein de ternires dns tous les sens 3

En rsum
! ves conditions sont l se de tous les progrmmesF g9est un moyen pour l9ordiE nteur de prendre une dcision en fontion de l vleur d9une vrileF ! ves motsEls ifD else ifD else signi(ent respetivement  si D  sinon si D  siE non F yn peut rire utnt de else if que l9on dsireF ! n boolen est une vrile qui peut voir deux tts X vri @IA ou fux @HA F yn utilise des int pour stoker des oolens r e ne sont en fit rien d9utre que des nomresF ! ve switch est une lterntive u if qund il s9git d9nlyser l vleur d9une vrileF sl permet de rendre un ode soure plus lir si vous vous pprtiez tester de nomreux s F ! ves ternaires sont des onditions trs onises qui permettent d9'eter rpideE ment une vleur une vrile en fontion du rsultt d9un testF yn les utilise ve primonie r le ode soure tendne devenir moins lisile ve ellesF
3 4

3. Toute valeur dirente de 0 est en fait considre comme  vraie . 4. Si vous utilisez de nombreux else if c'est en gnral le signe qu'un switch serait plus adapt pour rendre le code source plus lisible.

WH

Chapitre

7
Dicult :

Les boucles

prs avoir vu comment raliser des conditions en C, nous allons dcouvrir les boucles. Qu'est-ce qu'une boucle ? C'est une technique permettant de rpter les mmes instructions plusieurs fois. Cela nous sera bien utile par la suite, notamment pour le premier TP qui vous attend aprs ce chapitre. Relaxez-vous : ce chapitre sera simple. Nous avons vu ce qu'taient les conditions et les boolens dans le chapitre prcdent, c'tait un gros morceau avaler. Maintenant a va couler de source et le TP ne devrait pas vous poser trop de problmes. Enn protez-en, parce qu'ensuite nous ne tarderons pas entrer dans la partie II du cours, et l vous aurez intrt tre bien rveills !

WI

CHAPITRE 7. LES BOUCLES

Qu'est-ce qu'une boucle ?


te me rpte X une oule est une struture qui permet de rpter les mmes instrutions plusieurs foisF out omme pour les onditionsD il y plusieurs fons de rliser des oulesF eu out du ompteD el revient fire l mme hose X rpter les mmes instrutions un ertin nomre de foisF xous llons voir trois types de oules ourntes en g X ! while ! do... while ! for hns tous les sD le shm est le mme @(gF UFIAF

Figure UFI ! hm d9une oule

oii e qu9il se psse dns l9ordre X IF l9ordinteur lit les instrutions de hut en s @omme d9hitudeA Y PF puisD une fois rriv l (n de l ouleD il reprt l premire instrution Y QF il reommene lors lire les instrutions de hut en sF F F RF F F F et il reprt u dut de l ouleF ve prolme dns e systme 9est que si on ne l9rrte psD l9ordinteur est ple de rpter les instrutions l9in(ni 3 sl n9est ps du genre se plindreD vous svez X il fit e qu9on lui dit de fireF F F sl pourrit trs ien se loquer dns une oule in(nieD 9est d9illeurs une des nomreuses rintes des progrmmeursF it 9est l qu9on retrouveF F F les onditions 3 und on re une ouleD on indique toujours une onditionF gette ondition signi(er  pte l oule tnt que ette ondition est vrie F gomme je vous l9i ditD il y plusieurs mnires de s9y prendreF oyons voir sns plus trder omment on rlise une oule de type while en gF

La boucle while
oii omment on onstruit une oule while X
1

while @ GB gondition BG A

WP

LA BOUCLE WHILE
2 3 4

{ }

GG snstrutions r p ter

g9est ussi simple que elF while signi(e  nt que F yn dit don l9ordinteur  nt que l ondition est vrieD rpte les instrutions entre oldes F te vous propose de fire un test simple X on v demnder l9utilisteur de tper le nomre RUF nt qu9il n9 ps tp le nomre RUD on lui redemnde le nomreF ve progrmme ne pourr s9rrter que si l9utilisteur tpe le nomre RU @je sisD je sisD je suis dioliqueA X
1 2 3 4 5 6 7

int nomreintre a H Y while @ nomreintre 3a RU A { printf @ 4 pez le nomre RU 3 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y }

oii mintennt le test que j9i fitF xotez que j9i fit exprs de me tromper PEQ fois vnt de tper le on nomreF
pez pez pez pez le le le le nomre nomre nomre nomre RU RU RU RU 3 3 3 3 IH PU RH RU

ve progrmme s9est rrt prs voir tp le nomre RUF gette oule while se rpte don tnt que l9utilisteur n9 ps tp RUD 9est ssez simpleF wintenntD essyons de fire quelque hose d9un peu plus intressnt X on veut que notre oule se rpte un ertin nomre de foisF yn v pour el rer une vrile compteur qui vudr H u dut du progrmme et que l9on v incrmenter u fur et mesureF ous vous souvenez de l9inrmenttion c onsiste jouter I l vrile en fisnt variable++;F egrdez ttentivement e out de ode etD surtoutD essyez de le omprendre X
1 2 3 4 5 6 7

int ompteur a H Y while @ ompteur ` IH A { printf @ 4 lut les eros 3 n 4 A Y ompteur CCY }

sultt X
lut les eros 3 lut les eros 3 lut les eros 3

WQ

CHAPITRE 7. LES BOUCLES


lut lut lut lut lut lut lut les les les les les les les eros eros eros eros eros eros eros 3 3 3 3 3 3 3

ge ode rpte IH fois l90hge de  lut les eros 3 F


Comment a marche exactement ?

IF eu dprtD on une vrile compteur initilise HF ille vut don H u dut du progrmmeF PF v oule while ordonne l rptition ex i compteur est infrieur IHF gomme compteur vut H u dprtD on rentre dns l ouleF QF yn 0he l phrse  lut les eros 3 vi un printfF RF yn incrmente l vleur de l vrile compteurD gre compteur++;F compteur vlit HD elle vut mintennt IF SF yn rrive l (n de l oule @olde fermnteA X on reprt don u dutD u niveu du whileF yn refit le test du while X  Est-ce que compteur est toujours infrieure 10 ? F fen ouiD compteur vut I 3 hon on reommene les instrutions de l ouleF it insi de suiteF F F compteur v vloir progressivement HD ID PD QD F F FD VD WD et IHF vorsque compteur vut IHD l ondition compteur < 10 est fusseF gomme l9instrution est fusseD on sort de l ouleF yn pourrit d9illeurs voir que l vrile compteur ugmente u fur et mesure dns l ouleD en l90hnt dns le printf X
1 2 3 4 5 6 7

int ompteur a H Y while @ ompteur ` IH A { printf @ 4 v vrile ompteur vut 7d n 4 D ompteur A Y ompteur CCY } v v v v v v vrile vrile vrile vrile vrile vrile ompteur ompteur ompteur ompteur ompteur ompteur vut vut vut vut vut vut H I P Q R S

WR

LA BOUCLE DO... WHILE


v v v v vrile vrile vrile vrile ompteur ompteur ompteur ompteur vut vut vut vut T U V W

oil X si vous vez ompris D vous vez tout ompris 3 ous pouvez vous muser ugmenter l limite du nomre de oules @< 100 u lieu de < 10AF gel m9urit t d9illeurs trs utile plus jeune pour rdiger les punitions que je devis rrire IHH foisF

Attention aux boucles innies


vorsque vous rez une ouleD assurez-vous toujours qu'elle peut s'arrter un moment 3 i l ondition est toujours vrieD votre progrmme ne s9rrter jmis 3 oii un exemple de oule in(nie X
1 2 3 4

while @ I A { printf @ 4 foule infinie n 4 A Y }

ouvenezEvous des oolens X I a vriD H a fuxF siD l ondition est toujours vrieD e progrmme 0her don  foule in(nie sns rrt 3
Pour arrter un tel programme sous Windows, vous n'avez pas d'autre choix que de fermer la console en cliquant sur la croix en haut droite. Sous Linux, faites Ctrl + C.

pites don trs ttention X vitez tout prix de tomer dns une oule in(nieF xotez toutefois que les oules in(nies peuvent s9vrer utilesD notmmentD nous le verrons plus trdD lorsque nous rliserons des jeuxF

La boucle do... while


ge type de oule est trs similire whileD ien qu9un peu moins utilis en gnrlF v seule hose qui hnge en fit pr rpport whileD 9est l position de l onditionF eu lieu d9tre u dut de l ouleD l ondition est l (n X
1 2 3 4 5 6 7

int ompteur a H Y do {

printf @ 4 lut les eros 3 n 4 A Y ompteur CCY } while @ ompteur ` IH A Y

u9estEe que hnge c g9est trs simple X l oule while pourrit trs ien ne jmis tre exute si l ondition est fusse ds le dprtF r exempleD si on vit WS

CHAPITRE 7. LES BOUCLES

initilis le ompteur SHD l ondition urit t fusse ds le dut et on ne serit jmis rentr dns l ouleF our l oule do... whileD 9est di'rent X cette boucle s'excutera toujours au moins une foisF in e'etD le test se fit l (n omme vous pouvez le voirF i on initilise compteur SHD l oule s9exuter une foisF sl est don prfois utile de fire des oules de e typeD pour s9ssurer que l9on rentre u moins une fois dns l ouleF
Il y a une particularit dans la boucle do... while qu'on a tendance oublier quand on dbute : il y a un point-virgule tout la n ! N'oubliez pas d'en mettre un aprs le while, sinon votre programme plantera la compilation !

La boucle for
in thorieD l oule while permet de rliser toutes les oules que l9on veutF outeE foisD tout omme le switch pour les onditionsD il est dns ertins s utile d9voir un utre systme de oule plus  ondens D plus rpide rireF ves oules for sont trs trs utilises en progrmmtionF te n9i ps de sttistiques sous l minD mis shez que vous utiliserez ertinement utnt de for que de whileD si e n9est plusD il vous fudr don svoir mnipuler es deux types de oulesF gomme je vous le disisD les oules for sont juste une utre fon de fire une oule whileF oii un exemple de oule while que nous vons vu tout l9heure X
1 2 3 4 5 6 7

int ompteur a H Y while @ ompteur ` IH A { printf @ 4 lut les eros 3 n 4 A Y ompteur CCY }

oii mintennt l9quivlent en oule for X


1 2 3 4 5 6

int ompteur Y for @ ompteur a H Y ompteur ` IH Y ompteur CCA { printf @ 4 lut les eros 3 n 4 A Y }

uelles di'renes c ! ous noterez que l9on n9 ps initilis l vrile compteur H ds s dlrtion @mis on urit pu le fireAF ! sl y euoup de hoses entre les prenthses prs le for @nous llons dtiller prsAF ! sl n9y plus de compteur++; dns l ouleF WT

LA BOUCLE FOR

sntressonsEnous e qui se trouve entre les prenthsesD r 9est l que rside tout l9intrt de l oule forF sl y trois instrutions ondensesD hune spre pr un pointEvirguleF ! v premire est l'initialisation X ette premire instrution est utilise pour prprer notre vrile compteurF hns notre sD on initilise l vrile HF ! v seonde est la condition X omme pour l oule whileD 9est l ondition qui dit si l oule doit tre rpte ou nonF nt que l ondition est vrieD l oule for ontinueF ! in(nD il y l'incrmentation X ette dernire instrution est exute l (n de hque tour de oule pour mettre jour l vrile compteurF v qusiEtotlit du temps on fer une inrmenttionD mis on peut ussi fire une drmenttion @variable--;A ou enore n9importe quelle utre oprtion @variable += 2; pour vner de P en P pr exempleAF frefD omme vous le voyez l oule for n9est rien d9utre qu9un ondensF hez vous en servirD vous en urez esoin plus d9une fois 3

En rsum
! ves boucles sont des strutures qui nous permettent de rpter une srie d9instruE tions plusieurs foisF ! sl existe plusieurs types de oules X whileD do... while et forF gertines sont plus dptes que d9utres selon les sF ! v oule for est prolement elle qu9on utilise le plus dns l prtiqueF yn y fit trs souvent des inrmenttions ou des drmenttions de vrilesF

WU

CHAPITRE 7. LES BOUCLES

WV

Chapitre

8
Dicult :

TP : Plus ou Moins, votre premier jeu

ous arrivons maintenant dans le premier TP. Le but est de vous montrer que vous savez faire des choses avec ce que je vous ai appris. Car en eet, la thorie c'est bien, mais si on ne sait pas mettre tout cela en pratique de manire concrte. . . a ne sert rien d'avoir pass tout ce temps apprendre. Croyez-le ou non, vous avez dj le niveau pour raliser un premier programme amusant. C'est un petit jeu en mode console (les programmes en fentres arriveront plus tard je vous le rappelle). Le principe du jeu est simple et le jeu est facile programmer. C'est pour cela que j'ai choisi d'en faire le premier TP du cours.

WW

CHAPITRE 8. TP : PLUS OU MOINS, VOTRE PREMIER JEU

Prparatifs et conseils
Le principe du programme
evnt toute hoseD il fut que je vous explique en quoi v onsister notre progrmmeF g9est un petit jeu que j9ppelle  lus ou moins F ve prinipe est le suivntF IF v9ordinteur tire u sort un nomre entre I et IHHF PF sl vous demnde de deviner le nomreF ous entrez don un nomre entre I et IHHF QF v9ordinteur ompre le nomre que vous vez entr ve le nomre  mystre qu9il tir u sortF sl vous dit si le nomre mystre est suprieur ou infrieur elui que vous vez entrF RF uis l9ordinteur vous redemnde le nomreF SF F F F it il vous indique si le nomre mystre est suprieur ou infrieurF TF it insi de suiteD jusqu9 e que vous trouviez le nomre mystreF ve ut du jeuD ien srD est de trouver le nomre mystre en un minimum de oupsF oii une  pture d9rn d9une prtieD 9est e que vous devez rriver fire X
uel est le nomre c SH g 9 est plus 3 uel est le nomre c US g 9 est plus 3 uel est le nomre c VS g 9 est moins 3 uel est le nomre c VH g 9 est moins 3 uel est le nomre c UV g 9 est plus 3 uel est le nomre c UW frvo D vous vez trouve le nomre mystere 333

Tirer un nombre au sort


Mais comment tirer un nombre au hasard ? Je ne sais pas le faire !

gertesD nous ne svons ps gnrer un nomre ltoireF sl fut dire que demnder el l9ordinteur n9est ps simple X il sit ien fire des lulsD mis lui demnder de hoisir un nomre u hsrdD D il ne sit ps fire 3 IHH

PRPARATIFS ET CONSEILS

in fitD pour  essyer d9otenir un nomre ltoireD on doit fire fire des luls omplexes l9ordinteurF F F e qui revient u out du ompte fire des luls 3 fonD on don deux solutionsF ! oit on demnde l9utilisteur d9entrer le nomre mystre vi un scanf d9ordF implique qu9il y it deux joueurs X l9un entre un nomre u hsrd et l9utre essie de le deviner ensuiteF ! oit on tente le tout pour le tout et on essie qund mme de gnrer un nomre ltoire utomtiquementF v9vntge est qu9on peut jouer tout seul du oupF ve dfutF F F est qu9il v flloir que je vous explique omment fire 3 xous llons tenter l seonde solutionD mis rien ne vous emphe de oder l premire ensuite si vous voulezF our gnrer un nomre ltoireD on utilise l fontion rand()F gette fontion gnre un nomre u hsrdF wis nousD on veut que e nomre soit ompris entre I et IHH pr exemple @si on ne onnt ps les limitesD v devenir trop ompliquAF our e fireD on v utiliser l formule suivnte X
1 1 2

srnd @ time @ xvv A A Y nomrewystere a @ rnd @A 7 @ we E wsx C I A A C wsx Y

v premire ligne @ve srandA permet d9initiliser le gnrteur de nomres ltoiresF yuiD 9est un peu ompliquD je vous vis prvenusF nombreMystere est une vrile qui ontiendr le nomre tir u hsrdF
L'instruction srand ne doit tre excute qu'une seule fois (au dbut du programme). Il faut obligatoirement faire un srand une fois, et seulement une fois. Vous pouvez ensuite faire autant de rand() que vous voulez pour gnrer des nombres alatoires, mais il ne faut PAS que l'ordinateur lise l'instruction srand deux fois par programme, ne l'oubliez pas.
MAX

et MIN sont des onstntesD le premier est le nomre mximl @IHHA et le seond le nomre miniml @IAF te vous reommnde de d(nir es onstntes u dut du progrmmeD omme ei X
1

onst int we a IHH D wsx a I Y

Les bibliothques inclure


our que votre progrmme fontionne orretementD vous urez esoin d9inlure trois iliothques X stdlibD stdio et time @l dernire sert pour les nomres ltoiresAF otre progrmme devr don ommener pr X
1 2 3

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` time Fh b


1. Je ne pouvais pas trop vous demander de la deviner !

IHI

CHAPITRE 8. TP : PLUS OU MOINS, VOTRE PREMIER JEU

J'en ai assez dit !


fon llezD j9rrte l pre que sinon je vis vous donner tout le ode du progrmme si ontinue 3
Pour vous faire gnrer des nombres alatoires, j'ai t oblig de vous donner des codes  tout prts , sans vous expliquer totalement comment ils fonctionnent. En gnral je n'aime pas faire a mais l, je n'ai pas vraiment le choix car a compliquerait trop les choses pour le moment. Soyez srs toutefois que par la suite vous apprendrez de nouvelles notions qui vous permettront de comprendre cela.

frefD vous en svez ssezF te vous i expliqu le prinipe du progrmmeD je vous i fit une pture d9rn du progrmme u ours d9une prtieF eve tout D vous tes tout fit ples d9rire le progrmmeF vous de jouer 3 fonne hne 3

Correction !
top 3 prtir d9ii je rmsse les opiesF te vis vous donner une orretion @l mienneAD mis il y plusieurs onnes fons de fire le progrmmeF i votre ode soure n9est ps identique u mien et que vous vez trouv une utre fon de le fireD shez que 9est prolement ussi ienF

La correction de  Plus ou Moins 


oii l orretion que je vous propose X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` time Fh b int min @ int rg D hr BB rgv A { int nomrewystere a H D nomreintre a H Y onst int we a IHH D wsx a I Y GG q n rtion du nomre l toire srnd @ time @ xvv A A Y nomrewystere a @ rnd @A 7 @ we E wsx C I A A C wsx Y

IHP

CORRECTION !
17

GB v oule du progrmme F ille se r p te tnt que l ' utilisteur n ' ps trouv le nomre myst re BG do {

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

GG yn demnde le nomre printf @ 4 uel est le nomre c 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y GG yn ompre le nomre entr ve le nomre myst re

33 34 35

if @ nomrewystere b nomreintre A printf @ 4 g ' est plus 3 n n 4 A Y else if @ nomrewystere ` nomreintre A printf @ 4 g ' est moins 3 n n 4 A Y else printf @ 4 frvo D vous vez trouve le nomre mystere 333 n n 4 A Y } while @ nomreintre 3a nomrewystere A Y }

gopier e ode gode we X SVWTTH 

Excutable et sources
our eux qui le dsirentD je mets votre disposition en tlhrgement l9exutle du progrmme insi que les souresF  lhrger le progrmme gode we X IUSSUR 
L'excutable (.exe) est compil pour Windows, donc si vous tes sous un autre systme d'exploitation il faudra obligatoirement recompiler le programme pour qu'il marche chez vous.

sl y deux dossiersD l9un ve l9exutle @ompil sous indows je le rppelleA et l9utre ve les souresF hns le s de  lus ou moins D les soures sont trs simples X il y juste un (hier main.cF x9ouvrez ps le (hier main.c diretementF yuvrez d9ord votre shi fvori @gode: :floksD isulD etFA et rez un nouveu projet de type onsoleD videF ne fois que 9est fitD demndez jouter u projet le (hier main.cF ous pourrez lors ompiler le progrmme pour tester et le modi(er si vous le dsirezF IHQ

CHAPITRE 8. TP : PLUS OU MOINS, VOTRE PREMIER JEU

Explications
te vis mintennt vous expliquer mon odeD en ommennt pr le dutF
Les directives de prprocesseur

ge sont les lignes ommennt pr # tout en hutF illes inluent les iliothques dont on esoinF te vous les i donnes tout l9heureD don si vous vez russi fire une erreur lD vous tes trs fortsF
Les variables

yn n9en ps eu esoin de euoupF tuste une pour le nomre entr pr l9utilisteur @nombreEntreA et une utre qui retient le nomre ltoire gnr pr l9ordinteur @nombreMystereAF t9i ussi d(ni les onstntes omme je vous l9i dit u dut de e hpitreF v9vntge de d(nir les onstntes en hut du progrmmeD 9est que pour hnger l di0ult @en mettnt IHHH pour MAX pr exempleA il su0t juste d9diter ette ligne et de reompilerF
La boucle

t9i hoisi de fire une oule do... whileF in thorieD une oule while simple urit pu fontionner ussiD mis j9i trouv qu9utiliser do... while tit plus logiqueF ourquoi c re queD souvenezEvousD do... while est une oule qui s9exute u moins une foisF it nousD on sit qu9on veut demnder le nomre l9utilisteur u moins une fois @il ne peut ps trouver le rsultt en moins d9un oupD ou lors 9est qu9il est super fort 3AF hque pssge dns l ouleD on redemnde l9utilisteur d9entrer un nomreF yn stoke le nomre qu9il propose dns nombreEntreF uisD on ompre e nombreEntre u nombreMystereF sl y trois possiilits X ! le nomre mystre est suprieur u nomre entrD on indique don l9indie  g9est plus 3 Y ! le nomre mystre est infrieur u nomre entrD on indique l9indie  g9est moins 3 Y ! et si le nomre mystre n9est ni suprieur ni infrieur c ih ienF F F 9est qu9il est glD forment 3 h9o le elseF hns e sD on 0he l phrse  frvo vous vez trouv 3 F sl fut une ondition pour l ouleF gelleEi tit file trouver X on ontinue l oule TANT QUE le nombre entr n'est pas gal au nombre mystreF und es deux nomres sont gux @9estEEdire qund on trouvAD l oule s9rrteF ve progrmme est lors terminF IHR

IDES D'AMLIORATION

Ides d'amlioration
ous ne royiez tout de mme ps qu9on llit s9rrter l c te veux vous initer ontinuer mliorer e progrmmeD pour vous entrnerF x9ouliez ps que 9est en vous entrnnt omme el que vous progresserez 3 geux qui lisent les ours d9une trite sns jmis fire de tests font une grosse erreurD je l9i dit et je le rediri 3 pigurezEvous que j9i une imgintion dordnteD et mme sur un petit progrmme omme eluiEl je ne mnque ps d9ides pour l9mliorer 3 ettention X ette fois je ne vous fournis ps de orretionD il fudr vous drouiller tout seuls 3 i vous vez vriment des prolmesD n9hsitez ps ller fire un tour sur les forums du ite du roD setion lngge gF pites une reherhe pour voir si on n9 ps dj donn l rponse vos questionsD sinon rez un nouveu sujet pour poser es questionsF  porum g du ite du ro gode we X RUQSUQ  ! Faites un compteur de  coups F ge ompteur devr tre une vrile que vous inrmenterez hque fois que vous pssez dns l ouleF vorsque l9utilisteur trouv le nomre mystreD vous lui direz  frvoD vous vez trouv le nomre mystre en V oups pr exempleF ! vorsque l9utilisteur trouv le nomre mystreD le progrmme s9rrteF ourquoi ne ps demnder s9il veut fire une autre partie c i vous fites D il vous fudr fire une oule qui engloer l qusiEtotlit de votre progrmmeF gette oule devr se rpter ex i l9utilisteur n9 ps demnd rrter le progrmmeF te vous onseille de rjouter une vrile oolenne continuerPartie initilise I u dprtF i l9utilisteur demnde rrter le progrmmeD vous mettrez l vrile H et le progrmme s9rrterF ! smplmentez un mode 2 joueurs 3 ettentionD je veux qu9on it le hoix entre un mode I joueur et un mode P joueurs 3 ous devrez don fire un menu u dut de votre progrmme qui demnde l9utilisteur le mode de jeu qui l9intresseF v seule hose qui hnger entre les deux modes de jeuD 9est l gnrtion du nomre mystreF hns un s e ser un rand() omme on vuD dns l9utre s serF F F un scanfF ! grez plusieurs niveaux de dicultF eu dutD fites un menu qui demnde le niveu de di0ultF r exemple X ! I a entre I et IHH Y ! P a entre I et IHHH Y ! Q a entre I et IHHHHF i vous fites D vous devrez hnger votre onstnte weF F F ih ouiD ne peut plus tre une onstnte si l vleur doit hnger u ours du progrmme 3 enommez don ette vrile en nombreMaximum @vous prendrez soin d9enlever le motEl const sinon ser toujours une onstnte 3AF v vleur de ette vrile dpendr du niveu qu9on ur hoisiF oilD devrit vous ouper un petit out de tempsF emusezEvous ien et n9hsitez IHS

CHAPITRE 8. TP : PLUS OU MOINS, VOTRE PREMIER JEU

ps herher d9utres ides pour mliorer e  lus ou woins D je suis sr qu9il y en 3 x9ouliez ps que les forums sont votre disposition si vous vez des questionsF

IHT

Chapitre

9
Dicult :

Les fonctions

ous terminerons la partie I du cours ( Les bases ) par cette notion fondamentale que sont les fonctions en langage C. Tous les programmes en C se basent sur le principe que je vais vous expliquer dans ce chapitre. Nous allons apprendre structurer nos programmes en petits bouts. . . un peu comme si on jouait aux Legos. Tous les gros programmes en C sont en fait des assemblages de petits bouts de code, et ces petits bouts de code sont justement ce qu'on appelle. . . des fonctions !

IHU

CHAPITRE 9. LES FONCTIONS

Crer et appeler une fonction


xous vons vu dns les tout premiers hpitres qu9un progrmme en g ommenit pr une fontion ppele mainF te vous vis mme fit un shm rpitultifD pour vous rppeler quelques mots de voulire @(gF WFIAF

Figure WFI ! ve voulire du progrmme miniml

in hutD on y trouve les diretives de prproesseur @un nom rre sur lequel on reviendr d9illeursAF ges diretives sont files identi(er X elles ommenent pr un # et sont gnrlement mises tout en hut des (hiers souresF uis en dessousD il y vit e que j9vis dj ppel  une fontion F siD sur mon shmD vous voyez une fontion main @ps trop remplie il fut le reonntreAF te vous vis dit qu9un progrmme en lngge g ommenit pr l fontion mainF te vous rssureD 9est toujours vri 3 eulementD jusqu9ii nous sommes rests l9intrieur de l fontion mainF xous n9en sommes jmis sortisF evoyez vos odes soures et vous verrez X nous sommes toujours rests l9intrieur des oldes de l fontion mainF
Eh bien, c'est mal d'avoir fait comme a ?

xon e n9est ps  ml D mis e n9est ps e que les progrmmeurs en g font dns l rlitF usiment uun progrmme n9est rit uniquement l9intrieur des oldes de l fontion mainF tusqu9ii nos progrmmes tient ourtsD don ne posit ps de gros prolmesD mis imginez des plus gros progrmmes qui font des milliers de lignes de ode 3 i tout tit onentr dns l fontion mainD onjour le zrF F F xous llons don mintennt pprendre nous orgniserF xous llons en fit douper nos progrmmes en petits outs @souvenezEvous de l9imge des vegos que je vous i donne tout l9heureAF ghque  petit out de progrmme ser e qu9on ppelle une fontionF ne fontion exute des tions et renvoie un rsulttF g9est un morceau de code qui sert fire quelque hose de prisF yn dit qu9une fontion possde une entre et une sortieF v (gF WFP reprsente une fontion shmtiquementF vorsqu9on ppelle une fontionD il y trois tpesF IF L'entre X on fit  rentrer des informtions dns l fontion @en lui donnnt des informtions ve lesquelles trvillerAF IHV

CRER ET APPELER UNE FONCTION

Figure WFP ! ne fontion une entre et une sortie

PF Les calculs X gre ux informtions qu9elle reues en entreD l fontion trE villeF QF La sortie X une fois qu9elle (ni ses lulsD l fontion renvoie un rsulttF g9est e qu9on ppelle l sortieD ou enore le retourF gonrtementD on peut imginer pr exemple une fontion ppele triple qui lule le triple du nomre qu9on lui donneD en le multiplint pr Q @(gF WFQAF
1

Figure WFQ ! intre et sortie de l fontion triple

ve ut des fontions est don de simpli(er le ode soureD pour ne ps voir retper le mme ode plusieurs fois d90leF vez un peu X plus trdD nous rerons pr exemple une fontion afficherFenetre qui ouvrir une fentre l9rnF ne fois l fontion rite @9est l9tpe l plus di0ileAD on n9ur plus qu9 dire  rep 3 toi l fontion afficherFenetreD ouvreEmoi une fentre 3 F yn pourr ussi rire une fontion deplacerPersonnage dont le ut ser de dpler le personnge d9un jeu l9rnD etF

Schma d'une fonction


ous vez dj eu un peru de l fon dont est fite une fontion ve l fontion mainF gependnt pour ien que vous ompreniez il v flloir que je vous montre qund mme omment on onstruit une fontionF ve ode suivnt reprsente une fontion shmtiquementF g9est un modle onntre X
1 2 3 4

type nompontion @ prmetres A { GG sns rez vos instrutions ii }

ous reonnissez l forme de l fontion mainF oii e qu9il fut svoir sur e shmF
1. Bien entendu, les fonctions seront en gnral plus compliques.

IHW

CHAPITRE 9. LES FONCTIONS

@orrespond l sortieA X 9est le type de l fontionF gomme les vrilesD les fontions ont un typeF ge type dpend du rsultt que l fontion renvoie X si l fontion renvoie un nomre dimlD vous mettrez srement doubleD si elle renvoie un entier vous mettrez int ou long pr exempleF wis il est ussi possile de rer des fontions qui ne renvoient rien 3 sl y don deux sortes de fontions X ! les fontions qui renvoient une vleur X on leur met un des types que l9on onnt @charD intD doubleD etFA Y ! les fontions qui ne renvoient ps de vleur X on leur met un type spil void @qui signi(e  vide AF ! nomFonction X 9est le nom de votre fontionF ous pouvez ppeler votre fontion omme vous voulezD du temps que vous respetez les mmes rgles que pour les vriles @ps d9entsD ps d9espesD etFAF ! parametres @orrespond l9entreA X entre prenthsesD vous pouvez envoyer des prmtres l fontion F ge sont des vleurs ve lesquelles l fontion v trvillerF r exempleD pour une fontion tripleD vous envoyez un nomre en prmtreF v fontion  rupre e nomre et en lule le tripleD en le multiplint pr QF ille renvoie ensuite le rsultt de ses lulsF ! insuite vous vez les accolades qui indiquent le dut et l (n de l fontionF l9intrieur de es oldes vous mettrez les instrutions que vous voulezF our l fontion tripleD il fudr tper des instrutions qui multiplient pr Q le nomre reu en entreF ne fontionD 9est don un mnisme qui reoit des vleurs en entre @les prmtresA et qui renvoie un rsultt en sortieF
type
2

Crer une fonction


oyons un exemple prtique sns plus trder X l fmeuse fontion triple dont je vous prle depuis tout l9heureF yn v dire que ette fontion reoit un nomre entier de type int et qu9elle renvoie un nomre entier ussi de type intF gette fontion lule le triple du nomre qu9on lui donne X
1 2 3 4 5

int triple @ int nomre A { int resultt a H Y resultt a Q B nomre Y GG yn multiplie le nomre fourni pr Q return resultt Y GG yn retourne l vrile resultt qui vut le triple de nomre

oil notre premire fontion 3 ne premire hose importnte X omme vous le voyezD l fontion est de type intF ille doit don renvoyer une vleur de type intF
2. Vous pouvez envoyer autant de paramtres que vous le voulez. Vous pouvez aussi n'envoyer aucun paramtre la fonction, mais a se fait plus rarement.

IIH

CRER ET APPELER UNE FONCTION

intre les prenthsesD vous vez les vriles que l fontion reoitF siD notre fontion triple reoit une vrile de type int ppele nombreF v ligne qui donne pour onsigne de  renvoyer une vleur est elle qui ontient le returnF gette ligne se trouve gnrlement l (n de l fontionD prs les lulsF
1

return resultt Y

ge ode signi(e pour l fontion X  errteEtoi l et renvoie le nomre resultat F gette vrile resultat hys tre de type intD r l fontion renvoie un int omme on l9 dit plus hutF v vrile resultat est dlre @a reA dns l fontion tripleF gel signi(e qu9elle n9est utilisle que dns ette fontionD et ps dns une utre omme l fontion main pr exempleF g9est don une vrile propre l fontion tripleF wis estEe l fon l plus ourte d9rire notre fontion triple c xonD on peut fire tout el en une ligne en fit X
1 2 3 4

int triple @ int nomre A { return Q B nomre Y }

gette fontion fit extement l mme hose que l fontion de tout l9heureD elle est juste plus rpide rire F
3

Plusieurs paramtres, aucun paramtre


Plusieurs paramtres

xotre fontion triple ontient un prmtreD mis il est possile de rer des fontions eptnt plusieurs prmtresF r exempleD une fontion addition qui dditionne deux nomres a et b X
1 2 3 4

int ddition @ int D int A { return C Y }

sl su0t de sprer les di'rents prmtres pr une virgule omme vous le voyezF
Aucun paramtre

gertines fontionsD plus rresD ne prennent uun prmtre en entreF ges fontions feront gnrlement toujours l mme hoseF in e'etD si elles n9ont ps de nomres sur
3. Gnralement, vos fonctions contiendront plusieurs variables pour eectuer leurs calculs et leurs oprations, rares seront les fonctions aussi courtes que triple.

III

CHAPITRE 9. LES FONCTIONS

lesquels trvillerD vos fontions serviront juste e'etuer ertines tionsD omme 0her du texte l9rn F smginons une fontion bonjour qui 0he juste  fonjour l9rn X
4 1 2 3 4

void onjour @A { printf @ 4 fonjour 4 A Y }

te n9i rien mis entre prenthses r l fontion ne prend uun prmtreF he plusD j9i utilis le type void dont je vous i prl plus hutF in e'etD omme vous le voyez m fontion n9 ps non plus de returnF ille ne retourne rienF ne fontion qui ne retourne rien est de type voidF

Appeler une fonction


yn v mintennt tester un ode soure pour s9entrner un peu ve e qu9on vient d9pprendreF xous llons utiliser notre fontion triple @didment je l9ime ienA pour luler le triple d9un nomreF our le momentD je vous demnde d9rire l fontion triple eex l fontion mainF i vous l plez prsD ne mrher psF te vous expliqueri pourquoi pr l suiteF oii un ode tester et omprendre X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A { return Q B nomre Y } int min @ int rg D hr B rgv A { int nomreintre a H D nomreriple a H Y printf @ 4 intrez un nomre FFF 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y nomreriple a triple @ nomreintre A Y printf @ 4 ve triple de e nomre est 7 d n 4 D nomreriple A Y } return H Y

4. Et encore, ce sera forcment toujours le mme texte puisque la fonction ne reoit aucun paramtre susceptible de modier son comportement !

IIP

CRER ET APPELER UNE FONCTION

gopier e ode gode we X VISRWT  xotre progrmme ommene pr l fontion main omme vous le svezF yn demnde l9utilisteur d9entrer un nomreF yn envoie e nomre qu9il entr l fontion tripleD et on rupre le rsultt dns l vrile nombreTripleF egrdez en prtiulier ette ligneD 9est l plus intressnte r 9est l9ppel de l fontion X
1

nomreriple a triple @ nomreintre A Y

intre prenthsesD on envoie une vrile en entre l fontion tripleD 9est le nomre sur lequel elle v trvillerF gette fontion renvoie une vleurD vleur qu9on rupre dns l vrile nombreTripleF yn ordonne don l9ordinteur dns ette ligne X  hemnde l fontion triple de me luler le triple de nombreEntreD et stoke le rsultt dns l vrile nombreTriple F
Les mmes explications sous forme de schma

ous vez enore du ml omprendre omment fontionne onrtement c s de pnique 3 te suis sr que vous llez omprendre ve mes shmsF ge ode prtiulirement omment vous indique dns quel ordre le ode est luF gomE menez don pr lire l ligne numrote ID puis PD puis Q @on vous vez ompris je rois 3A X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A GG T { return Q B nomre Y GG U } int min @ int rg D hr B rgv A GG I { int nomreintre a H D nomreriple a HY GG P printf @ 4 intrez un nomre FFF 4 A Y GG Q snf @ 4 7 d 4 D 8 nomreintre A Y GG R nomreriple a triple @ nomreintre A Y GG S printf @ 4 ve triple de e nomre est 7 d n 4 D nomreriple A Y GG V } return H Y GG W

18 19 20

oii e qui se psseD ligne pr ligneF IF ve progrmme ommene pr l fontion mainF IIQ

CHAPITRE 9. LES FONCTIONS

PF QF RF SF TF UF VF WF

sl lit les instrutions dns l fontion une pr une dns l9ordreF sl lit l9instrution suivnte et fit e qui est demnd @printfAF he mmeD il lit l9instrution et fit e qui est demnd @scanfAF sl lit l9instrutionF F F eh 3 yn ppelle l fontion tripleD on doit don suter l ligne de l fontion triple plus hutF yn sute l fontion triple et on rupre un prmtre @nombreAF yn fit des luls sur le nomre et on termine l fontionF return signi(e l (n de l fontion et permet d9indiquer le rsultt renvoyerF yn retourne dns le main l9instrution suivnteF n return 3 v fontion min se termine et don le progrmme est terminF

i vous vez ompris dns quel ordre l9ordinteur lit les instrutionsD vous vez dj ompris le priniplF wintenntD il fut ien omprendre qu9une fontion reoit des prmtres en entre et renvoie une vleur en sortie @(gF WFRAF

Figure WFR ! pontion et return


Note X e n9est ps le s de toutes les fontionsF rfoisD une fontion ne prend uun

prmtre en entreD ou u ontrire elle en prend plusieurs @je vous i expliqu un peu plus hutAF he mmeD prfois une fontion renvoie une vleurD prfois elle ne renvoie rien @dns e s il n9y ps de returnAF
Testons ce programme

oii un exemple d9utilistion du progrmme X


intrez un nomre FFF IH ve triple de e nomre est QH

IIR

CRER ET APPELER UNE FONCTION

Vous n'tes pas obligs de stocker le rsultat d'une fonction dans une variable ! Vous pouvez directement envoyer le rsultat de la fonction triple une autre fonction, comme si triple(nombreEntre) tait une variable.

egrdez ien eiD 9est le mme ode mis il y un hngement u niveu du dernier printfF he plusD on n9 ps dlr de vrile nombreTriple r on ne s9en sert plus X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A { return Q B nomre Y } int min @ int rg D hr B rgv A { int nomreintre a H Y printf @ 4 intrez un nomre FFF 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y GG ve r sultt de l fontion est diretement envoy u printf et n ' est ps stok dns une vrile printf @ 4 ve triple de e nomre est 7 d n 4 D triple @ nomreintre A A Y } return H Y

17

18 19 20

gomme vous le voyezD triple(nombreEntre) est diretement envoy u printfF ue fit l9ordinteur qund il tome sur ette ligne c g9est trs simpleF sl voit que l ligne ommene pr printfD il v don ppeler l fontion printfF sl envoie l fontion printf tous les prmtres qu9on lui donneF ve premier prmtre est le texte 0her et le seond est un nomreF otre ordinteur voit que pour envoyer e nomre l fontion printf il doit d9ord ppeler l fontion tripleF g9est e qu9il fit X il ppelle tripleD il e'etue les luls de triple et une fois qu9il le rsultt il l9envoie diretement dns l fontion printf 3 g9est un peu une imrition de fontionsF it le plus (n dns tout D 9est qu9une fontion peut en ppeler une utre son tour 3 xotre fontion triple pourrit ppeler une utre fontionD qui elleEmme ppellerit une utre fontionD etF g9est le prinipe de l progrmmtion en g 3 out est ominD omme dns un jeu de vegoF eu (nlD le plus dur ser d9rire vos fontionsF ne fois que vous les urez ritesD vous n9urez plus qu9 ppeler les fontions sns vous souier des luls qu9elles peuvent ien fire l9intrieurF v permettre de simpli(er onsidrlement l9riture de nos progrmmes et royezEmoi on en ur ien esoin 3 IIS

CHAPITRE 9. LES FONCTIONS

Des exemples pour bien comprendre


ous vez d vous en rendre ompte X je suis un mnique des exemplesF v thorie 9est ienD mis si on ne fit que on risque de ne ps retenir grndEhose et surtout ne ps omprendre omment s9en servirD e qui serit un peu dommgeF F F te vis don mintennt vous montrer plusieurs exemples d9utilistion de fontionsD pour que vous yez une ide de leur intrtF te vis m9e'orer de fire des s di'rents hque foisD pour que vous puissiez voir des exemples de tous les types de fontions qui peuvent existerF te ne vous pprendri rien de nouveuD mis e ser l9osion de voir des exemples prtiquesF i vous vez dj ompris tout e que j9i expliqu vntD 9est trs ien et normlement uun des exemples qui vont suivre ne devrit vous surprendreF

Conversion euros / francs


yn ommene pr une fontion trs similire tripleD qui qund mme un minimum d9intrt ette fois X une fontion qui onvertit les euros en frnsF our eux d9entre vous qui ne onntrient ps es monnies shez que I euro a TDSSWSU frnsF yn v rer une fontion ppele conversionF gette fontion prend une vrile en entre de type double et retourne une sortie de type double r on v forment mnipuler des nomres dimuxF visezEl ttentivement X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

doule onversion @ doule euros A { doule frns a H Y frns a T F SSWSU B euros Y return frns Y

int min @ int rg D hr B rgv A { printf @ 4 IH euros a 7 fp n 4 D onversion @ IH A A Y printf @ 4 SH euros a 7 fp n 4 D onversion @ SH A A Y printf @ 4 IHH euros a 7 fp n 4 D onversion @ IHH A A Y printf @ 4 PHH euros a 7 fp n 4 D onversion @ PHH A A Y } return H Y

gopier e ode gode we X UVTSRW 


IH euros a TSFSWSUHH p SH euros a QPUFWUVSHH p IHH euros a TSSFWSUHHH p

IIT

DES EXEMPLES POUR BIEN COMPRENDRE


PHH euros a IQIIFWIRHHH p

sl n9y ps grndEhose de di'rent pr rpport l fontion tripleD je vous vis prvenusF h9illeursD m fontion conversion est un peu longue et pourrit tre rE ourie en une ligneD je vous lisse le fire je vous i dj expliqu omment fire plus hutF hns l fontion mainD j9i fit exprs de fire plusieurs printf pour vous montrer l9intrt d9voir une fontionF our otenir l vleur de SH eurosD je n9i qu9 rire conversion(50)F it si je veux voir l onversion en frns de IHH eurosD j9i juste esoin de hnger le prmtre que j9envoie l fontion @IHH u lieu de SHAF vous de jouer ! rivez une seonde fontion @toujours vnt l fontion mainA qui fer elle l onversion inverse X prns ab iurosF ge ne ser ps ien di0ileD il y juste un signe d9oprtion hngerF

La punition
yn v mintennt s9intresser une fontion qui ne renvoie rien @ps de sortieAF g9est une fontion qui 0he le mme messge l9rn utnt de fois qu9on lui demndeF gette fontion prend un prmtre en entre X le nomre de fois o il fut 0her l punitionF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

void punition @ int nomrehevignes A { int i Y for @ i a H Y i ` nomrehevignes Y i CCA { printf @ 4 te ne dois ps reopier mon voisin n 4 A Y }

int min @ int rg D hr B rgv A { punition @ IH A Y } return H Y

gopier e ode gode we X VHSQRQ 


te te te te te te ne ne ne ne ne ne dois dois dois dois dois dois ps ps ps ps ps ps reopier reopier reopier reopier reopier reopier


mon mon mon mon mon mon voisin voisin voisin voisin voisin voisin

IIU

CHAPITRE 9. LES FONCTIONS


te te te te ne ne ne ne dois dois dois dois ps ps ps ps reopier reopier reopier reopier mon mon mon mon voisin voisin voisin voisin

yn ii 'ire une fontion qui ne renvoie uune vleurF gette fontion se ontente juste d9e'etuer des tions @iiD elle 0he des messges l9rnAF ne fontion qui ne renvoie uune vleur est de type voidD 9est pour el qu9on rit voidF prt D il n9y rien de ien di'rentF sl urit t ien plus intressnt de rer une fontion punition qui s9dpte n9imE porte quelle sntionF yn lui urit envoy deux prmtres X le texte rpter et le nomre de fois qu9il doit tre rptF ve prolmeD 9est qu9on ne sit ps enore grer le texte en g F h9illeurs e sujetD je vous nnone que nous ne trderons ps pprendre utiliser des vriles qui retiennent du texteF g9est plus ompliqu qu9il n9y prt et on ne pouvit ps l9pprendre ds le dut du ours 3
5

Aire d'un rectangle


v9ire d9un retngle est file luler X largeur * hauteurF xotre fontion nomme v prendre deux prmtres X l lrgeur et l huteurF ille renverr l9ireF
aireRectangle
1 2 3 4 5 6 7 8

doule ireetngle @ doule lrgeur D doule huteur A { return lrgeur B huteur Y } int min @ int rg D hr B rgv A { printf @ 4 etngle de lrgeur S et huteur IH F eire a 7 f n 4 D ireetngle @S D IH A A Y printf @ 4 etngle de lrgeur P F S et huteur Q F S F eire a 7 f n 4 D ireetngle @ P FS D Q F S A AY printf @ 4 etngle de lrgeur R F P et huteur W F U F eire a 7 f n 4 D ireetngle @ R FP D W F U A AY } return H Y

10

11 12 13

gopier e ode gode we X QUVISW 

etngle de lrgeur S et huteur IHF eire a SHFHHHHHH etngle de lrgeur PFS et huteur QFSF eire a VFUSHHHH etngle de lrgeur RFP et huteur WFUF eire a RHFURHHHH
5. Au cas o vous n'auriez pas vu, je vous rappelle qu'on n'a fait que manipuler des variables contenant des nombres depuis le dbut du cours !

IIV

DES EXEMPLES POUR BIEN COMPRENDRE

Pourrait-on acher directement la largeur, la hauteur et l'aire dans la fonction ?

fien sr 3 hns e sD l fontion ne renverrit plus rienD elle se ontenterit de luler l9ire et de l90her immditementF
1 2 3 4 5 6

void ireetngle @ doule lrgeur D doule huteur A { doule ire a H Y ire a lrgeur B huteur Y printf @ 4 etngle de lrgeur 7 f et huteur 7 f F eire a 7 f n 4 D lrgeur D huteur D ire A Y

7 8 9 10 11 12 13 14 15 16

int min @ int rg D hr B rgv A { ireetngle @S D IH A Y ireetngle @ P FS D Q F S A Y ireetngle @ R FP D W F U A Y } return H Y

gomme vous le voyezD le printf est l'intrieur de l fontion aireRectangle et proE duit le mme 0hge que tout l9heureF g9est juste une fon di'rente de proderF

Un menu
ge ode est plus intressnt et onretF yn re une fontion menu() qui ne prend uun prmtre en entreF gette fontion se ontente d90her le menu et demnde l9utilisteur de fire un hoixF v fontion renvoie le hoix de l9utilisteurF
1 2 3 4 5 6 7 8

int menu @A { int hoix a H Y while @ hoix ` I || hoix b R A { printf @ 4 wenu X n 4 A Y printf @ 4 I X oulet de dinde ux esrgots rotis l sue ernise n 4 A Y printf @ 4 P X gonomres sures l sue de myrtilles enroee de hoolt n4 A Y printf @ 4 Q X islope de kngourou signnte et s gelee ux frises poivree n 4 A Y printf @ 4 R X v surprise du ghef @ j ' en slive d ' vne FFFA n 4 A Y printf @ 4 otre hoix c 4 A Y

10

11

12

IIW

CHAPITRE 9. LES FONCTIONS


13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

} }

snf @ 4 7 d 4 D 8 hoix A Y

return hoix Y

34 35 36 37 38

int min @ int rg D hr B rgv A { swith @ menu @A A { se I X printf @ 4 ous vez pris le poulet n 4A Y rek Y se P X printf @ 4 ous vez pris les onomres n 4 A Y rek Y se Q X printf @ 4 ous vez pris l ' eslope n 4 A Y rek Y se R X printf @ 4 ous vez pris l surprise du ghef F ous etes un sre venturier dites don 3 n 4 A Y rek Y } } return H Y

gopier e ode gode we X IIRHRS  t9en i pro(t pour mliorer le menu @pr rpport e qu9on fisit hituellementA X l fontion menu 0he nouveu le menu tnt que l9utilisteur n9 ps entr un nomre ompris entre I et RF gomme D uun risque que l fontion renvoie un nomre qui ne (gure ps u menu 3 hns le mainD vous vez vu qu9on fit un switch(menu())F ne fois que l fontion menu() est termineD elle renvoie le hoix de l9utilisteur diretement dns le switchF g9est une mthode rpide et prtiqueF vous de jouer ! ve ode est enore mliorle X on pourrit 0her un messge d9erreur si l9utilisteur entre un muvis nomre plutt que de simplement 0her une nouvelle fois le menuF

En rsum
! ves fontions s9ppellent entre ellesF einsiD le main peut ppeler des fontions toutes prtes telles que printf ou scanfD mis ussi des fontions que nous vons resF ! ne fontion rupre en entre des vriles qu9on ppelle paramtresF IPH

DES EXEMPLES POUR BIEN COMPRENDRE

! ille e'etue ertines oprtions ve es prmtres puis retourne en gnrl une vleur l9ide de l9instrution returnF

IPI

CHAPITRE 9. LES FONCTIONS

IPP

Deuxime partie
Techniques  avances  du langage C

IPQ

Chapitre

10
Dicult :

La programmation modulaire

ans cette seconde partie, nous allons dcouvrir des concepts plus avancs du langage C. Je ne vous le cache pas, et vous vous en doutiez srement, la partie II est d'un cran de dicult suprieur. Lorsque vous serez arrivs la n de cette partie, vous serez capables de vous dbrouiller dans la plupart des programmes crits en C. Dans la partie suivante nous verrons alors comment ouvrir une fentre, crer des jeux 2D, etc. Jusqu'ici nous n'avons travaill que dans un seul chier appel main.c. Pour le moment c'tait acceptable car nos programmes taient tout petits, mais ils vont bientt tre composs de dizaines, que dis-je de centaines de fonctions, et si vous les mettez toutes dans un mme chier celui-l va nir par devenir trs long ! C'est pour cela que l'on a invent ce qu'on appelle la programmation modulaire. Le principe est tout bte : plutt que de placer tout le code de notre programme dans un seul chier (main.c), nous le  sparons  en plusieurs petits chiers.

IPS

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

Les prototypes
tusqu9iiD je vous i demnd de pler votre fontion vnt l fontion mainF ourquoi c re que l9ordre une relle importne ii X si vous mettez votre fontion vnt le main dns votre ode soureD votre ordinteur l9ur lue et l onntrF vorsque vous ferez un ppel l fontion dns le mainD l9ordinteur onntr l fontion et sur o ller l herherF in revnheD si vous mettez votre fontion prs le mainD ne mrher ps r l9ordinteur ne onntr ps enore l fontionF issyezD vous verrez 3
Mais. . . c'est un peu mal fait, non ?

out fit d9ord ve vous 3 wis rssurezEvousD les progrmmeurs s9en sont rendu ompte vnt vous et ont prvu le oupF qre e que je vis vous pprendre mintenntD vous pourrez positionner vos fonE tions dns n9importe quel ordre dns le ode soureF g9est mieux de ne ps voir s9en souierD royezEmoiF

Le prototype pour annoncer une fonction


xous llons  nnoner nos fontions l9ordinteur en rivnt e qu9on ppelle des prototypesF xe soyez ps intimids pr e nom high-techD he en fit quelque hose de trs simpleF egrdez l premire ligne de notre fontion aireRectangle X
1 2 3 4

doule ireetngle @ doule lrgeur D doule huteur A { return lrgeur B huteur Y }

gopiez l premire ligne @double aireRectangleF F FA tout en hut de votre (hier soure @juste prs les #includeAF Rajoutez un point-virgule l (n de ette nouE velle ligneF it voil 3 wintenntD vous pouvez pler votre fontion aireRectangle prs l fontion main si vous le voulez 3 ous devriez voir le ode suivnt sous les yeux X
1 2 3 4

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GG v ligne suivnte est le prototype de l fontion ireetngle X doule ireetngle @ doule lrgeur D doule huteur A Y int min @ int rg D hr B rgv A {

5 6 7 8

IPT

LES PROTOTYPES
9

10

11

printf @ 4 etngle de lrgeur S et huteur IH F eire a 7 f n 4 D ireetngle @S D IH A A Y printf @ 4 etngle de lrgeur P F S et huteur Q F S F eire a 7 f n 4 D ireetngle @ P FS D Q F S A A Y printf @ 4 etngle de lrgeur R F P et huteur W F U F eire a 7 f n 4 D ireetngle @ R FP D W F U A A Y } return H Y

12 13 14 15 16

17 18 19 20

GG xotre fontion ireetngle peut mintennt tre mise n ' importe o dns le ode soure X doule ireetngle @ doule lrgeur D doule huteur A { return lrgeur B huteur Y }

gopier e ode gode we X QVUUPQ  ge qui hng iiD 9est l9jout du prototype en hut du ode soureF n prototypeD 9est en fit une indition pour l9ordinteurF gel lui indique qu9il existe une fontion ppele aireRectangle qui prend tels prmtres en entre et renvoie une sortie du type que vous indiquezF gel permet l9ordinteur de s9orgniserF qre ette ligneD vous pouvez mintennt pler vos fontions dns n9importe quel ordre sns vous prendre l tte 3 rivez toujours les prototypes de vos fontionsF os progrmmes ne vont ps trder se omplexi(er et utiliser de nomreuses fontions X mieux vut prendre ds mintennt l onne hitude d9rire le prototype de hune d9ellesF gomme vous le voyezD l fontion main n9 ps de prototypeF in fitD 9est l seule qui n9en nessite psD pre que l9ordinteur l onnt @9est toujours l mme pour tous les progrmmesD lors il peut ien l onntreD fore 3AF our tre tout fit extD il fut svoir que dns l ligne du prototype il est fulttif d9rire les noms de vriles en entreF v9ordinteur juste esoin de onntre les types des vrilesF yn urit don pu simplement rire X
1

doule ireetngle @ doule D doule A Y

outefoisD l9utre mthode que je vous i montre tout l9heure fontionne ussi ienF v9vntge ve m mthodeD 9est que vous vez juste esoin de opierEoller l preE mire ligne de l fontion et de rjouter un pointEvirguleF v plus viteF
N'oubliez JAMAIS de mettre un point-virgule la n d'un prototype. C'est ce qui permet l'ordinateur de direncier un prototype du vritable dbut d'une fonction. Si vous ne le faites pas, vous risquez d'avoir des erreurs incomprhensibles lors de la compilation.

IPU

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

Les headers
tusqu9iiD nous n9vions qu9un seul (hier soure dns notre projetF ge (hier soureD je vous vis demnd de l9ppeler main.cF

Plusieurs chiers par projet


hns l prtiqueD vos progrmmes ne seront ps tous rits dns e mme (hier main.cF fien srD il est possible de le fireD mis e n9est jmis trs prtique de se lder dns un (hier de IH HHH lignes @en(nD personnellementD je trouve 3AF g9est pour el qu9en gnrl on re plusieurs (hiers pr projetF
Qu'est-ce qu'un projet, dj ?

xonD vous n9vez ps dj ouli c fon X je vous le rexpliqueD pre qu9il est importnt qu9on soit ien d9ord sur e termeF n projetD 9est l9ensemle des (hiers soure de votre progrmmeF our le momentD nos projets n9tient omposs que d9un (hier soureF egrdez dns votre shiD gE nrlement 9est sur l guhe @(gF IHFIAF

Figure IHFI ! viste des (hiers d9un projet simple

gomme vous pouvez le voir guhe sur ette pture d9rnD e projet n9est ompos que d9un (hier main.cF vissezEmoi mintennt vous montrer un vri projet que vous rliserez un peu plus loin dns le ours X un jeu de okon @(gF IHFPAF gomme vous le voyezD il y plusieurs (hiersF n vri projet ressemler X vous verE rez plusieurs (hiers dns l olonne de guheF ous reonnissez dns l liste le (hier main.c X 9est elui qui ontient l fontion mainF in gnrl dns mes progrmmesD je ne mets que le main dns main.c F
1

Mais pourquoi avoir cr plusieurs chiers ? Et comment je sais combien de chiers je dois crer pour mon projet ?
1. Pour information, ce n'est pas du tout une obligation, chacun s'organise comme il veut. Pour bien me suivre, je vous conseille nanmoins de faire comme moi.

IPV

LES HEADERS

Figure IHFP ! viste des (hiers d9un projet plus omplexe

D 9est vous qui hoisissezF in gnrlD on regroupe dns un mme (hier des fontions ynt le mme thmeF einsiD dns le (hier editeur.c j9i regroup toutes les fontions onernnt l9diteur de niveu Y dns le (hier jeu.cD j9i regroup toutes les fontions onernnt le jeu luiEmmeD etF

Fichiers .h et .c
gomme vous le voyezD il y deux types de (hiers di'rents sur l (gF IHFPF ! Les .hD ppels (hiers headersF ges (hiers ontiennent les prototypes des fontionsF ! Les .c X les (hiers soureF ges (hiers ontiennent les fontions ellesEmmesF in gnrlD on met don rrement les prototypes dns les (hiers .c omme on l9 fit tout l9heure dns le main.c @suf si votre progrmme est tout petitAF our hque (hier .c, il y son quivlent .h qui ontient les prototypes des fontionsF tetez un il plus ttentif l (gF IHFP X ! il y editeur.c @le ode des fontionsA et editeur.h @les prototypes des fontionsA Y ! il y jeu.c et jeu.h Y ! etF
Mais comment faire pour que l'ordinateur sache que les prototypes sont dans un autre chier que le .c ?

sl fut inlure le (hier .h gre une diretive de prproesseurF ettentionD prprezE vous omprendre euoup de hoses d9un oup 3 gomment inlure un (hier heder cF F F ous svez le fireD vous l9vez dj fit 3 egrdez pr exemple le dut de mon (hier jeu.c X
1

5 inlude ` stdli Fh b

IPW

CHAPITRE 10. LA PROGRAMMATION MODULAIRE


2 3 4 5 6 7

5 inlude ` stdio Fh b 5 inlude 4 jeu F h 4 void jouer @ hvurfe B ern A { GG FFF

v9inlusion se fit gre l diretive de prproesseur #include que vous onnissez ien mintenntF egrdez les premires lignes du ode soure iEdessus X
1 2 3

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude 4 jeu F h 4 GG yn inlut jeu F h

yn inlut trois (hiers .h X stdioD stdlib et jeuF xotez une di'rene X les (hiers que vous vez rs et pls dns le rpertoire de votre projet doivent tre inlus ve des guillemets @"jeu.h"A tndis que les (hiers orrespondnt ux iliothques @qui sont gnrlement instllsD euxD dns le rpertoire de votre shiA sont inlus entre hevrons @<stdio.h>AF ous utiliserez don X ! les chevrons < > pour inlure un (hier se trouvnt dns le rpertoire  inlude de votre shi Y ! les guillemets " " pour inlure un (hier se trouvnt dns le rpertoire de votre projet @ t des .cD gnrlementAF v ommnde #include demnde d9insrer le ontenu du (hier dns le .cF g9est don une ommnde qui dit  snsre ii le (hier jeu.h pr exempleF it dns le (hier jeu.hD que trouveEtEon c yn trouve simplement les prototypes des fontions du (hier jeu.c 3
1 2 3 4 5 6 7 8 9 10 11

GB jeu F h EEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X prototypes des fontions du jeu F BG void jouer @ hvurfe B ern A Y void deplertoueur @ int rte xffvygrei D hvet B pos D int diretion A Y void deplergisse @ int B premieregse D int B seondegse A Y

12

oil omment fontionne un vri projet 3


Quel est l'intrt de mettre les prototypes dans des chiers .h ?

IQH

LES HEADERS

v rison est en fit ssez simpleF und dns votre ode vous fites ppel une fontionD votre ordinteur doit dj l onntreD svoir omien de prmtres elle prendD etF g9est que sert un prototype X 9est le mode d9emploi de l fontion pour l9ordinteurF out est une question d9ordre X si vous plez vos prototypes dns des .h @hedersA inlus en hut des (hiers .cD votre ordinteur onntr le mode d9emploi de toutes vos fontions ds le dut de l leture du (hierF in fisnt elD vous n9urez insi ps vous souier de l9ordre dns lequel les fontions se trouvent dns vos (hiers .cF i mintennt vous fites un petit progrmme onteE nnt deux ou trois fontionsD vous vous rendrez peutEtre ompte que les prototypes semlent fulttifs @ mrhe snsAF wis ne durer ps longtemps 3 hs que vous urez un peu plus de fontionsD si vous ne mettez ps vos prototypes de fontions dns des .hD l ompiltion houer sns uun douteF
Lorsque vous appellerez une fonction situe dans fonctions.c depuis le chier main.c, vous aurez besoin d'inclure les prototypes de fonctions.c dans main.c. Il faudra donc mettre un #include "fonctions.h" en haut de main.c. Souvenez-vous de cette rgle : chaque fois que vous faites appel une fonction X dans un chier, il faut que vous ayez inclus les prototypes de cette fonction dans votre chier. Cela permet au compilateur de vrier si vous l'avez correctement appele. Comment puis-je ajouter des chiers .c et .h mon projet ?

dpend de l9shi que vous utilisezD mis glolement l produre est l mme X Fichier / Nouveau / Fichier sourceF gel re un nouveu (hier videF ge (hier n9est ps enore de type .c ou .hD il fut que vous l9enregistriez pour le direF inregistrez don e nouveu (hier @mme s9il est enore vide 3AF yn vous demnder lors quel nom vous voulez donner u (hierF g9est l que vous hoisissez si 9est un .c ou un .h X ! si vous l9ppelez fichier.cD e ser un .c Y ! si vous l9ppelez fichier.hD e ser un .hF g9est ussi simple que elF inregistrez votre (hier dns le rpertoire dns lequel se trouvent les utres (hiers de votre projet @le mme dossier que main.cAF qnrlementD vous enregistrerez tous vos (hiers dns le mme rpertoireD les .c omme les .hF ve dossier du projet ressemle u (nl l (gF IHFQF ous y voyez des .c et des .h ensemleF otre (hier est mintennt enregistrD mis il n9est ps enore vriment jout u projet 3 our l9jouter u projetD fites un li droit dns l prtie guhe de l9rn @o il y l liste des (hiers du projetA et hoisissez Add files @(gF IHFRAF ne fentre s9ouvre et vous demnde quels (hiers jouter u projetF letionnez le (hier que vous venez de rer et 9est fitF ve (hier fit mintennt prtie du projet IQI

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

Figure IHFQ ! n dossier de projet

Figure IHFR ! ejout de (hiers u projet

IQP

LA COMPILATION SPARE

et pprt dns l liste guhe 3

Les include des bibliothques standard


ne question devrit vous trotter dns l tteF F F i on inlut les (hiers stdio.h et stdlib.hD 9est don qu9ils existent quelque prt et qu9on peut ller les herherD non c yuiD ien sr 3 sls sont normlement instlls l o se trouve votre shiF hns mon s sous gode: :floksD je les trouve l X
C:\Program Files\CodeBlocks\MinGW\include

sl fut gnrlement herher un dossier includeF vEdednsD vous llez trouver de trs nomreux (hiersF ge sont des heders @.hA des iliothques stndrdD 9estEEdire des iliothques disponiles prtout @que e soit sous indowsD wD vinuxF F FAF ous y retrouverez don stdio.h et stdlib.hD entre utresF ous pouvez les ouvrir si vous voulezD mis risque de piquer un peu les yeuxF in e'etD 9est un peu ompliqu @il y ps ml de hoses qu9on n9 ps enore vuesD notmment ertines diretives de prproesseurAF i vous herhez ienD vous verrez que e (hier est rempli de prototypes de fontions stndrdD omme printf pr exempleF
Ok, je sais maintenant o se trouvent les prototypes des fonctions standard. Mais comment pourrais-je voir le code source de ces fonctions ? O sont les .c ?

ous ne les vez ps 3 in fitD les (hiers .c sont dj ompils @en ode inireD 9estE Edire en ode mhineAF sl est don totlement impossile de les lireF ous pouvez retrouver les (hiers ompils dns un rpertoire ppel lib F ghez moiD on peut les trouver dns le rpertoire X
2

C:\Program Files\CodeBlocks\MinGW\lib

ves (hiers ompils des iliothques ont l9extension .a sous gode: :floks @qui utilise le ompilteur ppel mingwA et ont l9extension .lib sous isul gCC @qui utilise le ompilteur VisualAF x9essyez ps de les lire X e n9est solument ps omestile pour un huminF in rsumD dns vos (hiers .cD vous inluez les .h des iliothques stndrd pour pouvoir utiliser des fontions stndrd omme printfF otre ordinteur insi les prototypes sous les yeux et peut vri(er si vous ppelez les fontions orretementD pr exemple que vous n9ouliez ps de prmtresF

La compilation spare
wintennt que vous svez qu9un projet est ompos de plusieurs (hiers soureD nous pouvons rentrer plus en dtil dns le fontionnement de l ompiltionF tusqu9iiD nous
2. C'est l'abrviation de library qui signie  bibliothque  en franais.

IQQ

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

vions vu un shm trs simpli(F v (gF IHFS est un shm ien plus pris de l ompiltionF g9est le genre de shms qu9il est fortement onseill de omprendre et de onntre pr ur 3

Figure IHFS ! hm d9une ompiltion

D 9est un vri shm de e qu9il se psse l ompiltionF htillonsEleF IF Prprocesseur X le prproesseur est un progrmme qui dmrre vnt l ompiE ltionF on rle est d9exuter les instrutions spiles qu9on lui donnes dns des diretives de prproesseurD es fmeuses lignes qui ommenent pr un #F our l9instntD l seule diretive de prproesseur que l9on onnt est #includeD qui permet d9inlure un (hier dns un utreF ve prproesseur sit fire d9utres hosesD mis D nous le verrons plus trdF ve #include est qund mme e qu9il y de plus importnt onntreF ve prproesseur  remple don les lignes #include pr le (hier indiquF sl met l9intrieur de hque (hier .c le ontenu des (hiers .h qu9on demnd d9inlureF e momentEl de l ompiE ltionD votre (hier .c est omplet et ontient tous les prototypes des fontions que vous utilisez @votre (hier .c est don un peu plus gros que l normleAF PF Compilation X ette tpe trs importnte onsiste trnsformer vos (hiers soure en ode inire omprhensile pr l9ordinteurF ve ompilteur ompile hque (hier .c un unF sl ompile tous les (hiers soure de votre projetD d9o l9importne d9voir ien jout tous vos (hiers u projet @ils doivent tous pprtre dns l fmeuse liste guheAF ve ompilteur gnre un (hier .o @ou .objD dpend du ompilteurA pr (hier .c ompilF ge sont des (hiers inires temporiresF qnrlementD es (hiers sont supprims l (n de l ompiltionD mis selon les options de votre shiD vous pouvez hoisir de les onserver F
3

3. Bien qu'inutiles puisque temporaires, on peut trouver un intrt conserver les .o. En eet, si parmi les 10 chiers .c de votre projet seul l'un d'eux a chang depuis la dernire compilation, le compilateur n'aura qu' recompiler seulement ce chier .c. Pour les autres, il possde dj les .o compils.

IQR

LA COMPILATION SPARE

QF dition de liens X le linker @ou  diteur de liens en frnisA est un progrmme dont le rle est d9ssemler les (hiers inires .oF sl les ssemle en un seul gros (hier X l9exutle (nl 3 get exutle l9extension .exe sous indowsF i vous tes sous un utre yD il devrit prendre l9extension dquteF wintenntD vous svez omment se psse l9intrieurF te le dis et je le rpteD e shm de l (gF IHFS est trs importntF sl fit l di'rene entre un progrmmeur du dimnhe qui opie sns omprendre des odes soure et un utre qui sit et omprend e qu9il fitF v pluprt des erreurs surviennent l ompiltionD mis il m9est ussi rriv d9voir des erreurs de linkerF gel signi(e que le linker n9est ps rriv ssemler tous les .o @il en mnquit peutEtreAF xotre shm est pr ontre enore un peu inompletF in e'etD les iliothques n9y pprissent ps 3 gomment el se psseEtEil qund on utilise des iliothques c in fitD le dut du shm reste le mmeD 9est seulement le linker qui v voir un peu plus de trvilF sl v ssemler vos .o @temporiresA ve les iliothques ompiles dont vous vez esoin @.a ou .lib selon le ompilteurAF v (gF IHFT est don une version mliore de l (gF IHFSF

Figure IHFT ! hm d9une ompiltion ve iliothques


.libA

xous y sommesD le shm est ette fois ompletF os (hiers de iliothques .a @ou sont rssemls dns l9exutle ve vos .oF IQS

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

g9est omme el qu9on peut otenir u (nl un progrmme IHH 7 ompletD qui ontient toutes les instrutions nessires l9ordinteurD mme elles qui lui expliquent omE ment 0her du texte 3 r exempleD l fontion printf se trouve dns un .aD et ser don rssemle ve votre ode soure dns l9exutleF hns quelque tempsD nous pprendrons utiliser des iliothques grphiquesF gellesEi seront l ussi dns des .a et ontiendront des instrutions pour indiquer l9ordinteur omment ouvrir une fentre l9rnD pr exempleF wis ptieneD r tout vient point qui sit ttendreD 9est ien onnuF

La porte des fonctions et des variables


our lore e hpitreD il nous fut imprtivement douvrir l notion de porte des fontions et des vrilesF xous llons voir qund les vriles et les fontions sont essilesD 9estEEdire qund on peut fire ppel ellesF

Les variables propres aux fonctions


vorsque vous dlrez une vrile dns une fontionD elleEi est supprime de l mmoire l (n de l fontion X
1 2 3

int triple @ int nomre A { int resultt a H Y GG v vrile resultt est r e en m moire resultt a Q B nomre Y return resultt Y } GG v fontion est termin e D l vrile resultt est supprim e de l m moire

4 5 6 7

ne vrile dlre dns une fontion n9existe don que pendnt que l fontion est exuteF u9estEe que veut direD onrtement c ue vous ne pouvez ps y der depuis une utre fontion 3
1 2 3 4 5 6 7 8 9 10 11 12 13

int triple @ int nomre A Y int min @ int rg D hr B rgv A { printf @ 4 ve triple de IS est 7 d n 4 D triple @ IS A A Y printf @ 4 ve triple de IS est 7 d 4 D resultt A Y GG irreur } return H Y

int triple @ int nomre A {

IQT

LA PORTE DES FONCTIONS ET DES VARIABLES


14 15 16 17 18

int resultt a H Y resultt a Q B nomre Y return resultt Y

hns le mainD j9essie ii d9der l vrile resultatF yrD omme ette vrile resultat t re dns l fontion tripleD elle n9est ps essile dns l fontion main 3 Retenez bien X une vrile dlre dns une fontion n9est essile qu9 l9intrieur de ette fontionF yn dit que 9est une vrile loleF

Les variables globales : viter


Variable globale accessible dans tous les chiers

sl est possile de dlrer des vriles qui seront essiles dns toutes les fontions de tous les (hiers du projetF te vis vous montrer omment fire pour que vous shiez que existeD mis gnrlement il fut viter de le fireF ur l9ir de simpli(er votre ode u dutD mis ensuite vous risquez de vous retrouver ve de nomreuses vriles essiles prtoutD e qui risquer de vous rer des souisF our dlrer une vrile  glole essile prtoutD vous devez fire l dlrtion de l vrile en dehors des fontionsF ous ferez gnrlement l dlrtion tout en hut du (hierD prs les #includeF
1 2 3 4 5 6 7 8 9 10

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int resultt a H Y GG h lrtion de vrile glole void triple @ int nomre A Y GG rototype de fontion int min @ int rg D hr B rgv A { triple @ IS A Y GG yn ppelle l fontion triple D qui modifie l vrile glole resultt printf @ 4 ve triple de IS est 7 d n 4 D resultt A Y GG yn s resultt } return H Y

11

12 13 14 15 16 17 18 19

void triple @ int nomre A { resultt a Q B nomre Y }

IQU

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

ur et exempleD m fontion triple ne renvoie plus rien @voidAF ille se ontente de modi(er l vrile glole resultat que l fontion main peut ruprerF w vrile resultat ser essile dns tous les (hiers du projetD on pourr don fire ppel elle dns yi les fontions du progrmmeF
Ce type de choses est gnralement bannir dans un programme en C. Utilisez plutt le retour de la fonction (return) pour renvoyer un rsultat.
Variable globale accessible uniquement dans un chier

v vrile glole que nous venons de voir tit essile dns tous les (hiers du projetF sl est possile de l rendre essile uniquement dns le (hier dns lequel elle se trouveF reste une vrile glole qund mmeD mis disons qu9elle n9est glole qu9ux fontions de e (hierD et non toutes les fontions du progrmmeF our rer une vrile glole essile uniquement dns un (hierD rjoutez simpleE ment le motEl static devnt X
1

stti int resultt a H Y

Variable statique une fonction


ettention X 9est un peu plus dlitD iiF i vous rjoutez le motEl static devnt l dlrtion d9une vrile l9intrieur d9une fontionD n9 ps le mme sens que pour les vriles glolesF in fitD l vrile static n9est plus supprime l (n de l fontionF v prohine fois qu9on ppeller l fontionD l vrile ur onserv s vleurF r exemple X
1 2 3

int triple @ int nomre A { stti int resultt a H Y GG v vrile resultt est r e l premi re fois que l fontion est ppel e resultt a Q B nomre Y return resultt Y } GG v vrile resultt n ' est e supprim e lorsque l fontion est termin e F

4 5 6 7

u9estEe que signi(eD onrtement c u9on pourr rppeler l fontion plus trd et l vrile resultat ontiendr toujours l vleur de l dernire foisF oii un petit exemple pour ien omprendre X
1 2

int inremente @A Y

IQV

LA PORTE DES FONCTIONS ET DES VARIABLES


3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

int min @ int rg D { printf @ 4 7 d n 4 D printf @ 4 7 d n 4 D printf @ 4 7 d n 4 D printf @ 4 7 d n 4 D } return H Y

hr B rgv A inremente @A A Y inremente @A A Y inremente @A A Y inremente @A A Y

int inremente @A { stti int nomre a H Y nomre CCY return nomre Y

gopier e ode gode we X WPSUUT 


I P Q R

siD l premire fois qu9on ppelle l fontion incrementeD l vrile nombre est reF ille est inrmente ID et une fois l fontion termine l vrile n9est ps supprimeF vorsque l fontion est ppele une seonde foisD l ligne de l dlrtion de vrile est tout simplement  sute F yn ne rere ps l vrileD on rutilise l vrile qu9on vit dj reF gomme l vrile vlit ID elle vudr mintennt PD puis QD puis RD etF

Les fonctions locales un chier


our en (nir ve les portesD nous llons nous intresser l porte des fontionsF xormlementD qund vous rez une fontionD elleEi est glole tout le progrmmeF ille est essile depuis n9importe quel utre (hier .cF sl se peut que vous yez esoin de rer des fontions qui ne seront essiles que dns le (hier dns lequel se trouve l fontionF our fire elD rjoutez le motEl static @enore luiA devnt l fontion X
1 2 3 4

stti int triple @ int nomre A { GG snstrutions }

IQW

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

ensez mettre jour le prototype ussi X


1

stti int triple @ int nomre A Y

wintenntD votre fontion static triple ne peut tre ppele que depuis une utre fontion du mme (hierF i vous essyez d9ppeler l fontion triple depuis une fontion d9un utre (hierD ne mrher ps r triple n9y ser ps essileF sumons tous les types de porte qui peuvent exister pour les vriles X ! ne vrile dlre dns une fontion est supprime l (n de l fontionD elle n9est essile que dns ette fontionF ! ne vrile dlre dns une fontion ve le motEl static devnt n9est ps supprime l (n de l fontionD elle onserve s vleur u fur et mesure de l9exution du progrmmeF ! ne vrile dlre en dehors des fontions est une vrile gloleD essile depuis toutes les fontions de tous les (hiers soure du projetF ! ne vrile glole ve le motEl static devnt est glole uniquement dns le (hier dns lequel elle se trouveD elle n9est ps essile depuis les fontions des utres (hiersF he mmeD voii les types de porte qui peuvent exister pour les fontions X ! ne fontion est pr dfut essile depuis tous les (hiers du projetD on peut don l9ppeler depuis n9importe quel utre (hierF ! i on veut qu9une fontion ne soit essile que dns le (hier dns lequel elle se trouveD il fut rjouter le motEl static devntF

En rsum
! n progrmme ontient de nomreux (hiers .cF in rgle gnrleD hque (hier .c un petit frre du mme nom ynt l9extension .h @qui signi(e headerAF ve .c ontient les fontions tndis que le .h ontient les prototypesD 9estEEdire l signture de es fontionsF ! ve ontenu des (hiers .h est inlus en hut des .c pr un progrmme ppel prprocesseurF ! ves .c sont trnsforms en (hiers .o inires pr le compilateurF ! ves .o sont ssemls en un exutle @.exeA pr le linkerD ussi ppel diteur de liensF ! ne vrile dlre dns une fontion n9est ps essile dns une utre fontionF yn prle de porte des variablesF

IRH

Chapitre

11
Dicult :

l'assaut des pointeurs

'heure est venue pour vous de dcouvrir les pointeurs. Prenez un grand bol d'air avant car ce chapitre ne sera probablement pas une partie de plaisir. Les pointeurs reprsentent en eet une des notions les plus dlicates du langage C. Si j'insiste autant sur leur importance, c'est parce qu'il est impossible de programmer en langage C sans les connatre et bien les comprendre. Les pointeurs sont omniprsents, nous les avons d'ailleurs dj utiliss sans le savoir. Nombre de ceux qui apprennent le langage C titubent en gnral sur les pointeurs. Nous allons faire en sorte que ce ne soit pas votre cas. Redoublez d'attention et prenez le temps de comprendre les nombreux schmas de ce chapitre.

IRI

CHAPITRE 11. L'ASSAUT DES POINTEURS

Un problme bien ennuyeux


n des plus gros prolmes ve les pointeursD en plus d9tre ssez dlits ssimiler pour des dutntsD 9est qu9on du ml omprendre quoi ils peuvent ien servirF elors ien srD je pourris vous dire X  ves pointeurs sont totlement indispenslesD on s9en sert tout le tempsD royezEmoi 3 D mis je sis que el ne vous su0r psF te vis don vous poser un prolme que vous ne pourrez ps rsoudre sns utiliser de pointeursF ge ser en quelque sorte le (l rouge du hpitreF xous en reprlerons l (n de e hpitre et verrons quelle est l solution en utilisnt e que vous urez pprisF oii le prolme X je veux rire une fontion qui renvoie deux vleursF  smpossile me direzEvous 3 in e'etD on ne peut renvoyer qu9une vleur pr fontion X
1 2 3 4

int fontion @A { return vleur Y }

i on indique intD on renverr un nomre de type int @gre l9instrution returnAF yn peut ussi rire une fontion qui ne renvoie uune vleur ve le motEl void X
1 2 3 4

void fontion @A { }

wis renvoyer deux vleurs l foisF F F 9est impossileF yn ne peut ps fire deux returnF upposons que je veuille rire une fontion lquelle on envoie un nomre de minutesF gelleEi renverrit le nomre d9heures et minutes orrespondntes X IF si on envoie RSD l fontion renvoie H heure et RS minutes Y PF si on envoie THD l fontion renvoie I heure et H minutes Y QF si on envoie WHD l fontion renvoie I heure et QH minutesF oyons fousD tentons le oup X
1 2 3 4 5 6 7 8 9 10 11 12

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GB te mets le prototype en hut F gomme ' est un tout petit progrmme je ne le mets ps dns un Fh D mis en temps norml @ dns un vri progrmme A D j ' uris pl le prototype dns un fihier F h ien entendu BG void deoupewinutes @ int heures D int minutes A Y int min @ int rg D hr B rgv A {

IRP

UN PROBLME BIEN ENNUYEUX


13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

int heures a H D minutes a WH Y GB yn une vrile minutes qui vut WH F epr s ppel de l fontion D je veux que m vrile 4 heures 4 ville I et que m vrile 4 minutes 4 ville QH BG deoupewinutes @ heures D minutes A Y printf @ 4 7 d heures et 7 d minutes 4 D heures D minutes A Y } return H Y

void deoupewinutes @ int heures D int minutes A { heures a minutes G TH Y GG WH G TH a I minutes a minutes 7 TH Y GG WH 7 TH a QH }

gopier e ode gode we X QRISVT  sultt X


H heures et WH minutes

utD zutD zut et rezutD n9 ps mrhF ue s9estEil pss c in fitD qund vous  envoyez une vrile une fontionD une opie de l vrile est rliseF einsiD l vrile heures dns l fontion decoupeMinutes n9est ps l mme que elle de l fontion main 3 g9est simplement une opie 3 otre fontion decoupeMinutes fit son joF l9intrieur de decoupeMinutesD les vriles heures et minutes ont les onnes vleurs X I et QHF wis ensuiteD l fontion s9rrte lorsqu9on rrive l9olde fermnteF gomme on l9 ppris dns les hpitres prdentsD toutes les vriles res dns une fontion sont dtruites l (n de ette fontionF os opies de heures et de minutes sont don supprimesF yn retourne ensuite l fontion mainD dns lquelle vos vriles heures et minutes vlent toujours H et WHF g9est un he 3
Notez que, comme une fonction fait une copie des variables qu'on lui envoie, vous n'tes pas du tout obligs d'appeler vos variables de la mme faon que dans le main. Ainsi, vous pourriez trs bien crire : void decoupeMinutes(int h, int m). h pour heures et m pour minutes. Si vos variables ne s'appellent pas de la mme faon dans la fonction et dans le main, a ne pose donc aucun problme !

frefD vous urez eu retourner le prolme dns tous les sensF F F vous pouvez essyer de renvoyer une vleur ve l fontion @en utilisnt un return et en mettnt le type IRQ

CHAPITRE 11. L'ASSAUT DES POINTEURS

l fontionAD mis vous n9rriveriez renvoyer qu9une des deux vleursF ous ne pouvez ps renvoyer les deux vleurs l foisF he plusD vous ne pouvez ps utiliser de vriles gloles rD omme on l9 vuD ette prtique est fortement donseilleF oilD le prolme est posF gomment les pointeurs vontEils nous permettre de le rE soudre c
int

La mmoire, une question d'adresse


Rappel des faits
etit )shEkF ous souvenezEvous du hpitre sur les vriles c uelle que soit l rponseD je vous reommnde trs vivement d9ller relire l premire prtie de e hpitreD intitule  ne 'ire de mmoire F sl y vit un shm trs importnt que je vous propose ii nouveu @(gF IIFIAF

Figure IIFI ! yrgnistion de l mmoire vive

g9est un peu omme qu9on peut reprsenter l mmoire vive @ewA de votre ordiE nteurF sl fut lire e shm ligne pr ligneF v premire ligne reprsente l  ellule du IRR

LA MMOIRE, UNE QUESTION D'ADRESSE

tout dut de l mmoire viveF ghque ellule un numroD 9est son adresse F v mmoire omporte un grnd nomre d9dressesD ommennt l9dresse numro H et se terminnt l9dresse numro (insrez un trs grand nombre ici) F hque dresseD on peut stoker un nomreF n et x iv nomreF yn ne peut ps stoker deux nomres pr dresseF otre mmoire n9est fite que pour stoker des nomresF ille ne peut stoker ni lettres ni phrsesF our ontourner e prolmeD on invent une tle qui fit l liison entre les nomres et les lettresF gette tle dit pr exemple X  ve nomre VW reprsente l lettre F xous reviendrons dns un prohin hpitre sur l gestion des rtres Y pour l9instntD nous nous onentrons sur le fontionnement de l mmoireF
1 2

Adresse et valeur
und vous rez une vrile age de type int pr exempleD en tpnt X
1

int ge a IH Y

F F F votre progrmme demnde u systme d9exploittion @indowsD pr exempleA l permission d9utiliser un peu de mmoireF ve systme d9exploittion rpond en indiqunt quelle dresse en mmoire il vous lisse le droit d9insrire votre nomreF g9est d9illeurs justement l un des rles prinipux d9un systme d9exploittion X on dit qu9il lloue de l mmoire ux progrmmesF g9est un peu lui le hefD il ontrle hque progrmme et vri(e que e dernier l9utoristion de se servir de l mmoire l9endroit o il le fitF
C'est d'ailleurs l la cause no 1 de plantage des programmes : si votre programme essaie d'accder une zone de la mmoire qui ne lui appartient pas, le systme d'exploitation (abrgez  OS ) le refuse et coupe brutalement le programme en guise de punition ( C'est qui le chef ici ? ). L'utilisateur, lui, voit une jolie bote de dialogue du type  Ce programme va tre arrt parce qu'il a eectu une opration non conforme .

evenons notre vrile ageF v vleur IH t insrite quelque prt en mmoireD disons pr exemple l9dresse no RTSSF ge qu9il se psse @et 9est le rle du ompilteurAD 9est que le mot age dns votre progrmme est rempl pr l9dresse RTSS l9exutionF gel fit queD hque fois que vous vez tp le mot age dns votre ode soureD il est rempl pr RTSSD et votre ordinteur voit insi quelle dresse il doit ller herher en mmoire 3 hu oupD l9ordinteur se rend en mmoire l9dresse RTSS et rpond (rement X  v vrile age vut IH 3 F yn sit don omment ruprer l vleur de l vrile X il su0t tout tement de tper age dns son ode soureF i on veut 0her l9geD on peut utiliser l fontion printf X
1. Le vocabulaire est trs important, retenez-le. 2. Le nombre d'adresses disponibles dpend en fait de la quantit de mmoire dont dispose votre ordinateur.

IRS

CHAPITRE 11. L'ASSAUT DES POINTEURS


1

printf @ 4 v vrile ge vut X 7 d4 D ge A Y

sultt l9rn X
v vrile ge vut X IH

ien de ien nouveu jusqueElF

Le scoop du jour
yn sit 0her l vleur de l vrileD mis sviezEvous que l9on peut ussi 0her l9dresse orrespondnte c our 0her l9dresse de l vrileD on doit utiliser le symole %p @le p du mot  poinE teur A dns le printfF in outreD on doit envoyer l fontion printf non ps l vrile ageD mis son dresseF F F it pour fire elD vous devez mettre le symole & devnt l vrile ageD omme je vous vis demnd de le fire pour les scanfD il y quelque tempsD sns vous expliquer pourquoiF pez don X
1

printf @ 4 v ' dresse de l vrile ge est X 7 p 4 D 8 ge A Y

sultt X
v 9 dresse de l vrile ge est X HHPQ ppUR

ge que vous voyez l est l9dresse de l vrile age u moment o j9i ln le proE grmme sur mon ordinteurF yuiD ouiD HHPQppUR est un nomreD il est simplement rit dns le systme hexdimlD u lieu du systme diml dont nous vons l9hitudeF i vous remplez %p pr %dD vous otiendrez un nomre diml que vous onnissezF
Si vous excutez ce programme sur votre ordinateur, l'adresse sera trs certainement dirente. Tout dpend de la place que vous avez en mmoire, des programmes que vous avez lancs, etc. Il est totalement impossible de prdire quelle adresse la variable sera stocke chez vous. Si vous lancez votre programme plusieurs fois d'ale, il se peut que l'adresse soit identique, la mmoire n'ayant pas beaucoup chang entre temps. Si par contre vous redmarrez votre ordinateur, vous aurez srement une valeur dirente.

y je veux en venir ve tout c ih ien en fitD je veux vous fire retenir ei X ! age X dsigne la valeur de l vrile Y ! &age X dsigne l'adresse de l vrileF eve ageD l9ordinteur v lire l vleur de l vrile en mmoire et vous renvoie ette vleurF eve &ageD votre ordinteur vous dit en revnhe quelle dresse se trouve l vrileF IRT

UTILISER DES POINTEURS

Utiliser des pointeurs


tusqu9iiD nous vons uniquement r des vriles fites pour ontenir des nomresF wintenntD nous llons pprendre rer des vriles fites pour ontenir des dresses X e sont justement e qu9on ppelle des pointeursF
Mais. . . Les adresses sont des nombres aussi, non ? a revient stocker des nombres encore et toujours !

g9est extF wis es nomres uront une signi(tion prtiulire X ils indiqueront l9dresse d9une utre vrile en mmoireF

Crer un pointeur
our rer une vrile de type pointeurD on doit rjouter le symole * devnt le nom de l vrileF
1

int B monointeur Y

Notez qu'on peut aussi crire int* monPointeur;. Cela revient exactement au mme. Cependant, la premire mthode est prfrer. En eet, si vous voulez dclarer plusieurs pointeurs sur la mme ligne, vous serez obligs de mettre l'toile devant le nom : int *pointeur1, *pointeur2, *pointeur3;.

gomme je vous l9i pprisD il est importnt d9initiliser ds le dut ses vrilesD en leur donnnt l vleur H pr exempleF g9est enore plus importnt de le fire ve les pointeurs 3 our initiliser un pointeurD 9estEEdire lui donner une vleur pr dfutD on n9utilise gnrlement ps le nomre H mis le motEl NULL X
3 1

int B monointeur a xvv Y

vD vous vez un pointeur initilis NULLF gomme D vous surez dns l suite de votre progrmme que votre pointeur ne ontient uune dresseF ue se psseEtEil c ge ode v rserver une se en mmoire omme si vous viez r une vrile normleF gependntD et 9est e qui hngeD l vleur du pointeur est fite pour ontenir une dresseF v9dresseF F F d9une utre vrileF ourquoi ps l9dresse de l vrile age c ous svez mintennt omment indiquer l9dresse d9une vrile u lieu de s vleur @en utilisnt le symole &AD lors llonsEy 3 nous donne X
1 2

int ge a IH Y int B pointeururege a 8 ge Y


3. Veillez l'crire en majuscules.

IRU

CHAPITRE 11. L'ASSAUT DES POINTEURS

v premire ligne signi(e X  grer une vrile de type int dont l vleur vut IH F v seonde ligne signi(e X  grer une vrile de type pointeur dont l vleur vut l9dresse de l vrile age F v seonde ligne fit don deux hoses l foisF i vous le souhitezD pour ne ps tout mlngerD shez qu9on peut l douper en deux temps X
1 2 3

int ge a IH Y int B pointeururege Y GG I A signifie 4 te r e un pointeur 4 pointeururege a 8 ge Y GG P A signifie 4 pointeururege ontient l ' dresse de l vrile ge 4

ous vez remrqu qu9il n9y ps de type  pointeur omme il y un type int et un type doubleF yn n9rit don ps X
1

pointeur pointeururege Y

eu lieu de D on utilise le symole *D mis on ontinue rire intF u9estEe que signi(e c in fitD on doit indiquer quel est le type de l vrile dont le pointeur v ontenir l9dresseF gomme notre pointeur pointeurSurAge v ontenir l9dresse de l vrile age @qui est de type intAD lors mon pointeur doit tre de type int* 3 i m vrile age vit t de type doubleD lors j9uris d rire double *monPointeurF Vocabulaire X on dit que le pointeur pointeurSurAge pointe sur l vrile ageF v (gF IIFP rsume e qu9il s9est pss dns l mmoireF hns e shmD l vrile age t ple l9dresse IUURSH @vous voyez d9illeurs que s vleur est IHAD et le pointeur pointeurSurAge t pl l9dresse Q @9est tout fit le fruit du hsrdAF vorsque mon pointeur est rD le systme d9exploittion rserve une se en mmoire omme il l9 fit pour ageF v di'rene iiD 9est que l vleur de pointeurSurAge est un peu prtiulireF egrdez ien le shm X 9est l9dresse de l vrile age 3 geiD hers leteursD est le seret solu de tout progrmme rit en lngge gF yn y estD nous venons de rentrer dns le monde merveilleux des pointeurs 3
Et. . . a sert quoi ?

ne trnsforme ps enore votre ordinteur en mhine fD ertesF eulement mintenntD on un pointeurSurAge qui ontient l9dresse de l vrile ageF issyons de voir e que ontient le pointeur l9ide d9un printf X
1 2 3 4

int ge a IH Y int B pointeururege a 8 ge Y printf @ 4 7 d 4 D pointeururege A Y IUURSH

IRV

UTILISER DES POINTEURS

Figure IIFP ! wmoireD dresses et pointeurs

IRW

CHAPITRE 11. L'ASSAUT DES POINTEURS

rumF in fitD el n9est ps trs tonnntF yn demnde l vleur de pointeurSurAgeD et s vleur 9est l9dresse de l vrile age @IUURSHAF gomment fire pour demnder voir l vleur de l vrile se trouvnt l9dresse indique dns pointeurSurAge c sl fut pler le symole * devnt le nom du pointeur X
1 2 3 4

int ge a IH Y int B pointeururege a 8 ge Y printf @ 4 7 d 4 D B pointeururege A Y

IH

rourr 3 xous y sommes rrivs 3 in plnt le symole * devnt le nom du pointeurD on de l vleur de l vrile ageF i u ontrire on vit utilis le symole & devnt le nom du pointeurD on urit otenu l9dresse lquelle se trouve le pointeur @iiD 9est QAF
Qu'est-ce qu'on y gagne ? On a simplement russi compliquer les choses ici. On n'avait pas besoin d'un pointeur pour acher la valeur de la variable age !

gette question @que vous devez invitlement vous poserA est lgitimeF eprs toutD qui pourrit vous en vouloir c etuellement l9intrt n9est ps videntD mis petit petitD tout u long des hpitres suivntsD vous omprendrez que tout el n9 ps t invent pr pur plisir de ompliquer les hosesF pites l9impsse sur l frustrtion que vous devez ressentir @ out pour c AF i vous vez ompris le prinipeD 9est l9essentielF ves hoses s9liriront d9ellesEmmes pr l suiteF

retenir absolument
oii e qu9il fut voir ompris et e qu9il fut retenir pour l suite de e hpitre X ! sur une vrileD omme l vrile age X ! age signi(e X  te veux l vleur de l vrile age D ! &age signi(e X  te veux l9dresse lquelle se trouve l vrile age Y ! sur un pointeurD omme pointeurSurAge X ! pointeurSurAge signi(e X  te veux l vleur de pointeurSurAge @ette vleur tnt une dresseAD ! *pointeurSurAge signi(e X  te veux l vleur de l vrile qui se trouve l9dresse ontenue dns pointeurSurAge F gontentezEvous de ien retenir es qutre pointsF pites des tests et vri(ez que mrheF ve shm de l (gF IIFQ devrit ien vous ider situer hun de es lmentsF ISH

UTILISER DES POINTEURS

Figure IIFQ ! hsigntion des vriles et pointeurs

ISI

CHAPITRE 11. L'ASSAUT DES POINTEURS

Attention ne pas confondre les direntes signications de l'toile ! Lorsque vous dclarez un pointeur, l'toile sert juste indiquer qu'on veut crer un pointeur : int *pointeurSurAge;. En revanche, lorsqu'ensuite vous utilisez votre pointeur en crivant printf("%d", *pointeurSurAge);, cela ne signie pas  Je veux crer un pointeur  mais :  Je veux la valeur de la variable sur laquelle pointe mon pointeurSurAge .

out el est fonEdEmenEtlF sl fut onntre el pr ur et surtout le omprendreF x9hsitez ps lire et relire e qu9on vient d9pprendreF te ne peux ps vous en vouloir si vous n9vez ps ompris du premier oup et e n9est ps une honte non plusD d9illeursF sl fut en gnrl quelques jours pour ien omprendre et souvent quelques mois pour en sisir toutes les sutilitsF i vous vous sentez un peu perdusD pensez es gens qui sont ujourd9hui de grnds gourous de l progrmmtion X uun d9entre eux n9 ompris tout le fontionnement des pointeurs du premier oupF it si jmis ette personne existeD il fudr vriment me l prsenterF

Envoyer un pointeur une fonction


ve gros intrt des pointeurs @mis e n9est ps le seulA est qu9on peut les envoyer des fontions pour qu9ils modi(ent diretement une vrile en mmoireD et non une opie omme on l9 vuF gomment mrhe c sl y en fit plusieurs fons de fireF oii un premier exemple X
1 2 3 4 5 6 7

void tripleointeur @ int B pointeururxomre A Y int min @ int rg D hr B rgv A { int nomre a S Y tripleointeur @8 nomre A Y GG yn envoie l ' dresse de nomre l fontion printf @ 4 7 d 4 D nomre A Y GG yn ffihe l vrile nomre F v fontion diretement modifi l vleur de l vrile r elle onnissit son dresse } return H Y

9 10 11 12 13 14 15

16

void tripleointeur @ int B pointeururxomre A { B pointeururxomre Ba Q Y GG yn multiplie pr Q l vleur de nomre }

ISP

ENVOYER UN POINTEUR UNE FONCTION

gopier e ode gode we X PTSPSR 


IS

v fontion triplePointeur prend un prmtre de type int* @9estEEdire un pointeur sur intAF oii e qu9il se psse dns l9ordreD en prtnt du dut du main X IF une vrile nombre est re dns le mainF yn lui 'ete l vleur SF D vous onnissez Y PF on ppelle l fontion triplePointeurF yn lui envoie en prmtre l9dresse de notre vrile nombre Y QF l fontion triplePointeur reoit ette dresse dns pointeurSurNombreF l9inE trieur de l fontion triplePointeurD on don un pointeur pointeurSurNombre qui ontient l9dresse de l vrile nombre Y RF mintennt qu9on un pointeur sur nombreD on peut modi(er diretement l vrile nombre en mmoire 3 sl su0t d9utiliser *pointeurSurNombre pour dsiE gner l vrile nombre 3 our l9exempleD on fit un simple test X on multiplie l vrile nombre pr Q Y SF de retour dns l fontion mainD notre nomre vut mintennt IS r l fontion triplePointeur modi( diretement l vleur de nombreF fien srD j9uris pu fire un simple return omme on ppris le fire dns le hpitre sur les fontionsF wis l9intrtD lD 9est que de ette mnireD en utilisnt des pointeursD on peut modi(er l vleur de plusieurs vriles en mmoire @on peut don  renvoyer plusieurs vleurs AF xous ne sommes plus limits une seule vleur 3
Quel est l'intrt maintenant d'utiliser un return dans une fonction si on peut se servir des pointeurs pour modier des valeurs ?

dpendr de vous et de votre progrmmeF g9est vous de diderF sl fut svoir que les return sont el et ien toujours utiliss en gF ve plus souventD on s9en sert pour renvoyer e qu9on ppelle un ode d9erreur X l fontion renvoie I @vriA si tout s9est ien pssD et H @fuxA s9il y eu une erreur pendnt le droulement de l fontionF

Une autre faon d'envoyer un pointeur une fonction


hns le ode soure qu9on vient de voirD il n9y vit ps de pointeur dns l fontion mainF tuste une vrile nombreF ve seul pointeur qu9il y vit vriment tit dns l fontion triplePointeur @de type int*AF sl fut solument que vous shiez qu9il y une utre fon d9rire le ode prdentD en joutnt un pointeur dns l fontion main X ISQ

CHAPITRE 11. L'ASSAUT DES POINTEURS


1 2 3 4 5 6

void tripleointeur @ int B pointeururxomre A Y int min @ int rg D hr B rgv A { int nomre a S Y int B pointeur a 8 nomre Y GG pointeur prend l ' dresse de nomre tripleointeur @ pointeur AY GG yn envoie pointeur @ l ' dresse de nomre A l fontion printf @ 4 7 d 4 D B pointeur A Y GG yn ffihe l vleur de nomre ve B pointeur } return H Y

7 8

10 11 12 13 14 15 16

17

void tripleointeur @ int B pointeururxomre A { B pointeururxomre Ba Q Y GG yn multiplie pr Q l vleur de nomre }

gopier e ode gode we X QWIQIU  gomprez ien e ode soure ve le prdentF sl y de sutiles di'renes et pourtnt le rsultt est stritement le mme X
IS

ge qui ompteD 9est d9envoyer l9dresse de l vrile nombre l fontionF yrD pointeur vut l9dresse de l vrile nombreD don 9est on de e t 3 yn le fit seulement d9une mnire di'rente en rnt un pointeur dns l fontion mainF hns le printf @et 9est juste pour l9exerieAD j90he le ontenu de l vrile nombre en tpnt *pointeurF xotez qu9 l pleD j9uris pu rire nombre X le rsultt urit t identique r *pointeur et nombre dsignent l mme hose dns l mmoireF hns le progrmme  lus ou woins D nous vons utilis des pointeurs sns vriment le svoirF g9tit en fit en ppelnt l fontion scanfF in e'etD ette fontion pour rle de lire e que l9utilisteur entr u lvier et de renvoyer le rsulttF our que l fontion puisse modi(er diretement le ontenu de votre vrile (n d9y pler l vleur tpe u lvierD elle esoin de l9dresse de l vrile X
1 2

int nomre a H Y snf @ 4 7 d 4 D 8 nomre A Y

v fontion trville ve un pointeur sur l vrile nombre et peut insi modi(er diretement le ontenu de nombreF gomme on vient de le voirD on pourrit rer un pointeur qu9on enverrit l fontion scanf X ISR

QUI A DIT :  UN PROBLME BIEN ENNUYEUX  ?


1 2 3

int nomre a H Y int B pointeur a 8 nomre Y snf @ 4 7 d 4 D pointeur A Y

ettention ne ps mettre le symole & devnt pointeur dns l fontion scanf 3 siD pointeur ontient luiEmme l9dresse de l vrile nombreD ps esoin de mettre un & 3 i vous fisiez D vous enverriez l9dresse o se trouve le pointeur X or 9est de l9dresse de nombre dont on esoinF

Qui a dit :  Un problme bien ennuyeux  ?


ve hpitre est sur le point de s9heverD il est temps de retrouver notre (l rougeF i vous vez ompris e hpitreD vous devriez tre ples de rsoudre le prolmeD mintenntF u9estEe que vous en dites c issyez 3 oii l solution pour omprer X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

void deoupewinutes @ int B pointeurreures D int B pointeurwinutes A Y int min @ int rg D hr B rgv A { int heures a H D minutes a WH Y GG yn envoie l ' dresse de heures et minutes deoupewinutes @8 heures D 8 minutes A Y GG gette fois D les vleurs ont t modifi es 3 printf @ 4 7 d heures et 7 d minutes 4 D heures D minutes A Y } return H Y

19

20

21 22 23 24

void deoupewinutes @ int B pointeurreures D int B pointeurwinutes A { GB ettention ne ps oulier de mettre une toile devnt le nom des pointeurs 3 gomme D vous pouvez modifier l vleur des vriles D et non leur dresse 3 ous ne voudriez ps diviser des dresses D n ' est E e ps c Y o A BG B pointeurreures a B pointeurwinutes G TH Y B pointeurwinutes a B pointeurwinutes 7 TH Y }

gopier e ode gode we X RPQHVQ  sultt X

ISS

CHAPITRE 11. L'ASSAUT DES POINTEURS

I heures et QH minutes

ien ne devrit vous surprendre dns e ode soureF outefoisD omme on n9est jmis trop prudentD je vis rher une fois de plus e qui se psse dns e ode (n d9tre ertin que tout le monde me suit ien F
4

IF ves vriles heures et minutes sont res dns le mainF PF yn envoie l fontion decoupeMinutes l9dresse de heures et minutesF QF v fontion decoupeMinutes rupre es dresses dns des pointeurs ppels pointeurHeures et pointeurMinutesF xotez que l enoreD le nom importe peuF t9uris pu les ppeler h et mD ou mme enore heures et minutes F RF v fontion decoupeMinutes modi(e diretement les vleurs des vriles heures et minutes en mmoire r elle possde leurs dresses dns des pointeursF v seule ontrinteD un peu gnnte je dois le reonntreD 9est qu9il fut imprtivement mettre une toile devnt le nom des pointeurs si on veut modi(er l vleur de heures et de minutesF i on n9vit ps fit D on urit modi( l9dresse onteE nue dns les pointeursD e qui n9urit serviF F F rienF
5

De nombreux lecteurs m'ont fait remarquer qu'il tait possible de rsoudre le  problme  sans utiliser de pointeurs. Oui, bien sr c'est possible, mais il faut contourner certaines rgles que nous nous sommes xes : on peut utiliser des variables globales (mais on l'a dit, c'est mal), ou encore faire un printf dans la fonction decoupeMinutes (alors que c'est dans le main qu'on veut faire le printf !). L'exercice est un peu scolaire et peut donc tre contourn si vous tes malins, ce qui vous fait peut-tre douter de l'intrt des pointeurs. Soyez assurs que cet intrt vous paratra de plus en plus vident au cours des chapitres suivants.

En rsum
! ghque vrile est stoke une adresse prise en mmoireF ! ves pointeurs sont semlles ux vrilesD ei prs qu9u lieu de stoker un nomre ils stokent l9dresse lquelle se trouve une vrile en mmoireF ! i on ple un symole & devnt un nom de vrileD on otient son dresse u lieu de s vleur @exF X &ageAF ! i on ple un symole * devnt un nom de pointeurD on otient l vleur de l vrile stoke l9dresse indique pr le pointeurF
4. C'est un chapitre important, vous devez faire beaucoup d'eorts pour comprendre : je peux donc bien en faire moi aussi pour vous. 5. Je ne l'ai pas fait car je ne veux pas que vous risquiez de confondre avec les variables heures et minutes du main, qui ne sont pas les mmes.

IST

QUI A DIT :  UN PROBLME BIEN ENNUYEUX  ?

! ves pointeurs onstituent une notion essentielle du lngge gD mis nnmoins un peu omplexe u dutF sl fut prendre le temps de ien omprendre omment ils fontionnent r euoup d9utres notions sont ses dessusF

ISU

CHAPITRE 11. L'ASSAUT DES POINTEURS

ISV

Chapitre

12
Dicult :

Les tableaux

e chapitre est la suite directe des pointeurs et va vous faire comprendre un peu plus leur utilit. Vous comptiez y chapper ? C'est rat ! Les pointeurs sont partout en C, vous avez t prvenus ! Dans ce chapitre, nous apprendrons crer des variables de type  tableaux . Les tableaux sont trs utiliss en C car ils sont vraiment pratiques pour organiser une srie de valeurs. Nous commencerons dans un premier temps par quelques explications sur le fonctionnement des tableaux en mmoire (schmas l'appui). Ces petites introductions sur la mmoire sont extrmement importantes : elles vous permettent de comprendre comment cela fonctionne. Un programmeur qui comprend ce qu'il fait, c'est quand mme un peu plus rassurant pour la stabilit de ses programmes, non ? ;-)

ISW

CHAPITRE 12. LES TABLEAUX

Les tableaux dans la mmoire


fonD je reonnis que ressemle un peu une d(nition du ditionnireF gonrteE mentD il s9git de  grosses vriles pouvnt ontenir plusieurs nomres du mme type @longD intD charD doubleF F FAF n tleu une dimension ien priseF sl peut ouper PD QD IHD ISHD P SHH sesD 9est vous qui didezF v (gF IPFI est un shm d9un tleu de R ses en mmoire qui ommene l9dresse ITHHF
 Les tableaux sont une suite de variables de mme type, situes dans un espace contigu en mmoire. 

Figure IPFI ! n tleu de R ses

vorsque vous demndez rer un tleu de R ses en mmoireD votre progrmme demnde l9y l permission d9utiliser R ses en mmoireF ges R ses doivent tre ontigusD 9estEEdire les unes l suite des utresF gomme vous le voyezD les dresses se suivent X ITHHD ITHID ITHPD ITHQF sl n9y ps de  trou u milieuF in(nD hque se du tleu ontient un nomre du mme typeF i le tleu est de type intD lors hque se du tleu ontiendr un intF yn ne peut ps fire de tleu ontennt l fois des int et des double pr exempleF in rsumD voii e qu9il fut retenir sur les tleuxF ! vorsqu9un tleu est rD il prend un espe ontigu en mmoire X les ses sont les unes l suite des utresF ! outes les ses d9un tleu sont du mme typeF einsiD un tleu de int ontiendr uniquement des intD et ps utre hoseF

Dnir un tableau
our ommenerD nous llons voir omment d(nir un tleu de R int X
1

int tleu R Y

ITH

DFINIR UN TABLEAU

oilD 9est toutF sl su0t don de rjouter entre rohets le nomre de ses que vous voulez mettre dns votre tleuF sl n9y ps de limite F wintenntD omment der hque se du tleu c g9est simpleD il fut rire tableau[numeroDeLaCase]F
1

Attention : un tableau commence l'indice no 0 ! Notre tableau de 4 int a donc les indices 0, 1, 2 et 3. Il n'y a pas d'indice 4 dans un tableau de 4 cases ! C'est une source d'erreurs trs courantes, souvenez-vous-en.

i je veux mettre dns mon tleu les mmes vleurs que elles indiques sur l (gF IPFID je devri don rire X
1 2 3 4 5 6

int tleu R Y tleu H tleu I tleu P tleu Q a a a a IH Y PQ Y SHS Y VY

Je ne vois pas le rapport entre les tableaux et les pointeurs ?

in fitD si vous rivez juste tableauD vous otenez un pointeurF g9est un pointeur sur l premire se du tleuF pites le test X
1 2 3

int tleu R Y printf @ 4 7 d 4 D tleu AY

sulttD on voit l9dresse o se trouve tableau X


ITHH

in revnheD si vous indiquez l9indie de l se du tleu entre rohetsD vous otenez l vleur X
1 2 3

int tleu R Y printf @ 4 7 d 4 D tleu H A Y IH

he mme pour les utres indiesF xotez que omme tableau est un pointeurD on peut utiliser le symole * pour onntre l premire vleur X
1. part peut-tre la taille de votre mmoire, quand mme.

ITI

CHAPITRE 12. LES TABLEAUX


1 2 3

int tleu R Y printf @ 4 7 d 4 D B tleu A Y IH

sl est ussi possile d9otenir l vleur de l seonde se ve *(tableau de tleu C IAF ves deux lignes suivntes sont don identiques X
1 2

+ 1) @dresse

tleu I GG envoie l vleur de l seonde se @ l premi re se tnt H A B@ tleu C I A GG sdentique X renvoie l vleur ontenue dns l seonde se

in lirD qund vous rivez tableau[0]D vous demndez l vleur qui se trouve l9dresse tleu C H se @9estEEdire ITHHAF i vous rivez tableau[1]D vous deE mndez l vleur se trouvnt l9dresse tleu C I se @9estEEdire ITHIAF it insi de suite pour les utres vleursF

Les tableaux taille dynamique


ve lngge g existe en plusieurs versionsF ne version renteD ppele le gWWD utorise l rtion de tleux tille dynmiqueD 9estEEdire de tleux dont l tille est d(nie pr une vrile X
1 2

int tille a S Y int tleu tille Y

yr el n9est ps forment reonnu pr tous les ompilteursD ertins plnteront sur l seonde ligneF ve lngge g que je vous enseigne depuis le dut @ppel le gVWA n9utorise ps e genre de hosesF xous onsidrerons don que fire el est interditF xous llons nous mettre d9ord sur ei X vous n9vez ps le droit d9utiliser une vrile entre rohets pour l d(nition de l tille du tleuD mme si ette vrile est une onstnte 3 ve tleu doit voir une dimension (xeD 9estEEdire que vous devez rire noir sur ln le nomre orrespondnt l tille du tleu X
1

int tleu S Y

Mais alors. . . il est interdit de crer un tableau dont la taille dpend d'une variable ?

xonD rssurezEvous X 9est possileD mme en gVWF wis pour fire elD nous utiliserons une utre tehnique @plus sre et qui mrhe prtoutA ppele l'allocation dynamiqueF xous verrons el ien plus loin dns e oursF ITP

PARCOURIR UN TABLEAU

Parcourir un tableau
upposons que je veuille mintennt 0her les vleurs de hque se du tleuF te pourris fire utnt de printf qu9il y de sesF wis onD e serit rptitif et lourd F ve mieux est de se servir d9une ouleF ourquoi ps d9une oule for c ves oules for sont trs prtiques pour prourir un tleu X
2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

int min @ int rg D hr B rgv A { int tleu R D i a H Y tleu H tleu I tleu P tleu Q a a a a IH Y PQ Y SHS Y VY

for @ i a H Y i ` R Y i CCA { printf @ 4 7 d n 4 D tleu i A Y } } return H Y

gopier e ode gode we X WIPPWP 


IH PQ SHS V

xotre oule prourt le tleu l9ide d9une vrile ppele i @9est le nom trs originl que les progrmmeurs donnent en gnrl l vrile qui leur permet de prourir un tleu 3AF ge qui est prtiulirement prtiqueD 9est qu9on peut mettre une vrile entre roE hetsF in e'etD l vrile tit interdite pour l rtion du tleu @pour d(nir s tilleAD mis elle est heureusement utorise pour  prourir le tleuD 9estEEdire 0her ses vleurs 3 siD on mis l vrile iD qui vut suessivement HD ID PD et QF he ette fonD on v don 0her l vleur de tableau[0]D tableau[1]D tableau[2] et tableau[3] 3
2. Imaginez un peu la taille de notre code si on devait acher le contenu de chaque case du tableau une une !

ITQ

CHAPITRE 12. LES TABLEAUX

Attention ne pas tenter d'acher la valeur de tableau[4] ! Un tableau de 4 cases possde les indices 0, 1, 2 et 3, point barre. Si vous tentez d'acher tableau[4], vous aurez soit n'importe quoi, soit une belle erreur, l'OS coupant votre programme car il aura tent d'accder une adresse ne lui appartenant pas.

Initialiser un tableau
wintennt que l9on sit prourir un tleuD nous sommes ples d9initiliser toutes ses vleurs H en fisnt une oule 3 fonD prourir le tleu pour mettre H hque seD 9est de votre niveu mintennt X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

int min @ int rg D hr B rgv A { int tleu R D i a H Y GG snitilistion du tleu for @ i a H Y i ` R Y i CCA { tleu i a H Y } GG effihge de ses vleurs pour v rifier for @ i a H Y i ` R Y i CCA { printf @ 4 7 d n 4 D tleu i A Y } } return H Y

gopier e ode gode we X ISUVVW 


H H H H

Une autre faon d'initialiser


sl fut svoir qu9il existe une utre fon d9initiliser un tleu un peu plus utomtise en gF ille onsiste rire tableau[4] = {valeur1, valeur2, valeur3, valeur4}F in lirD vous plez les vleurs une une entre oldesD spres pr des virgules X
1

int min @ int rg D hr B rgv A

ITR

PASSAGE DE TABLEAUX UNE FONCTION


2 3 4 5 6 7 8 9 10 11

int tleu R a {H D H D H D H } D i a H Y for @ i a H Y i ` R Y i CCA { printf @ 4 7 d n 4 D tleu i A Y }

} H H H H

return H Y

wis en fitD 9est mme mieux que X vous pouvez d(nir les vleurs des premires ses du tleuD toutes elles que vous n9urez ps renseignes seront utomtiquement mises HF einsiD si je fis X
1

int tleu R a { IH D PQ }Y GG leurs ins r es X IH D PQ D H D H

F F F l se no H prendr l vleur IHD l no I prendr PQD et toutes les utres prendront l vleur H @pr dfutAF gomment initiliser tout le tleu H en shnt c ih ien il vous su0t d9initiliser u moins l premire vleur HD et toutes les utres vleurs non indiques prendront l vleur HF
1

int tleu R a { H }Y GG outes les ses du tleu seront initilis es H

gette tehnique l9vntge de fontionner ve un tleu de n9importe quelle tille @lD mrhe pour R sesD mis s9il en vit eu IHH urit t on ussiAF
Attention, on rencontre souvent int tableau[4] = 1;, ce qui insre les valeurs suivantes : 1, 0, 0, 0. Contrairement ce que beaucoup d'entre vous semblent croire, on n'initialise pas toutes les cases 1 en faisant cela : seule la premire case sera 1, les autres seront 0. On ne peut donc pas initialiser toutes les cases 1 automatiquement, moins de faire une boucle.

Passage de tableaux une fonction


ous urez oup sr souvent esoin d90her tout le ontenu de votre tleuF ourquoi ne ps rire une fontion qui fit c v nous permettre de douvrir omment on envoie un tleu une fontion @e qui m9rrngeAF ITS

CHAPITRE 12. LES TABLEAUX

sl v flloir envoyer deux informtions l fontion X le tleu @en(nD l9dresse du tleuA et ussi et surtout s tille 3 in e'etD notre fontion doit tre ple d9initiE liser un tleu de n9importe quelle tilleF yrD dns votre fontionD vous ne onnissez ps l tille de votre tleuF g9est pour el qu9il fut envoyer en plus une vrile que vous ppellerez pr exemple tailleTableauF gomme je vous l9i ditD tableau peut tre onsidr omme un pointeurF yn peut don l9envoyer l fontion omme on l9urit fit ve un vulgire pointeur X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

GG rototype de l fontion d ' ffihge void ffihe @ int B tleu D int tilleleu A Y int min @ int rg D hr B rgv A { int tleu R a { IH D IS D Q }Y GG yn ffihe le ontenu du tleu ffihe @ tleu D R A Y } return H Y

void ffihe @ int B tleu D int tilleleu A { int i Y for @ i a H Y i ` tilleleu Y i CCA { printf @ 4 7 d n 4 D tleu i A Y }

gopier e ode gode we X SUIVSV 


IH IS Q H

v fontion n9est ps di'rente de elles que l9on tudies dns le hpitre sur les pointeursF ille prend en prmtre un pointeur sur int @notre tleuAD insi que l tille du tleu @trs importnt pour svoir qund s9rrter dns l oule 3AF out le ontenu du tleu est 0h pr l fontion vi une ouleF xotez qu9il existe une utre fon d9indiquer que l fontion reoit un tleuF lutt que d9indiquer que l fontion ttend un int *tableauD mettez ei X
1

void ffihe @ int tleu D int tilleleu A

ITT

PASSAGE DE TABLEAUX UNE FONCTION

gel revient extement u mmeD mis l prsene des rohets permet u progrmE meur de ien voir que 9est un tleu que l fontion prendD et non un simple pointeurF gel permet d9viter des onfusionsF t9utilise personnellement tout le temps les rohets dns mes fontions pour ien monE trer que l fontion ttend un tleuF te vous onseille de fire de mmeF sl n9est ps nessire de mettre l tille du tleu entre les rohets ette foisF

Quelques exercices !
te ne mnque ps d9ides d9exeries pour vous entrner 3 te vous propose de rliser des fontions trvillnt sur des tleuxF te donne juste les nons des exeries ii pour vous forer r)hir vos fontionsF i vous vez du ml rliser es fontionsD rendezEvous sur les forums pour poser vos questionsF  porum g du ite du ro gode we X RUQSUQ 
Exercice 1

grez une fontion sommeTableau qui renvoie l somme des vleurs ontenues dns le tleu @utilisez un return pour renvoyer l vleurAF our vous iderD voii le prototype de l fontion rer X
1

int sommeleu @ int tleu D int tilleleu A Y

Exercice 2

grez une fontion rototype X


1

moyenneTableau

qui lule et renvoie l moyenne des vleursF

doule moyenneleu @ int tleu D int tilleleu A Y

v fontion renvoie un double r une moyenne est souvent un nomre dimlF


Exercice 3

grez une fontion copierTableau qui prend en prmtre deux tleuxF ve ontenu du premier tleu devr tre opi dns le seond tleuF rototype X
1

void opie @ int tleuyriginl D int tleugopie D int tilleleu A Y

ITU

CHAPITRE 12. LES TABLEAUX

Exercice 4

grez une fontion maximumTableau qui ur pour rle de remettre H toutes les ses du tleu ynt une vleur suprieure un mximumF gette fontion prendr en prmtres le tleu insi que le nomre mximum utoris @valeurMaxAF outes les ses qui ontiennent un nomre suprieur valeurMax doivent tre mises HF rototype X
1

void mximumleu @ int tleu D int tilleleu D int vleurwx A Y

Exercice 5

get exerie est plus di0ileF grez une fontion ordonnerTableau qui lsse les vleurs d9un tleu dns l9ordre roissntF einsiD un tleu qui vut {15, 81, 22, 13} doit l (n de l fontion vloir {13, 15, 22, 81}F rototype X
1

void ordonnerleu @ int tleu D int tilleleu A Y

get exerie est don un peu plus di0ile que les utresD mis tout fit rlisleF v vous ouper un petit momentF
Faites-vous un petit chier de fonctions appel tableaux.c (avec son homologue tableaux.h qui contiendra les prototypes, bien sr !) contenant toutes les fonctions de votre cru ralisant des oprations sur des tableaux.

eu trvil 3 XEA

En rsum
! ves tableaux sont des ensemles de vriles du mme type stokes te te en mmoireF ! v tille d9un tleu doit tre dtermine vnt l ompiltionD elle ne peut ps dpendre d9une vrileF ! ghque se d9un tleu de type int ontient une vrile de type intF ! ves ses sont numrotes vi des indices ommennt H X tableau[0]D tableau[1]D tableau[2]D etF

ITV

Chapitre

13
Dicult :

Les chanes de caractres

ne  chane de caractres , c'est un nom programmatiquement correct pour dsigner. . . du texte, tout simplement ! Une chane de caractres, c'est donc du texte que l'on peut retenir sous forme de variable en mmoire. On pourrait ainsi stocker le nom de l'utilisateur. Comme nous l'avons dit plus tt, notre ordinateur ne peut retenir que des nombres. Les lettres sont exclues. Comment diable les programmeurs font-ils pour manipuler du texte, alors ? Eh bien ils sont malins, vous allez voir !

ITW

CHAPITRE 13. LES CHANES DE CARACTRES

Le type char
hns e hpitreD nous llons porter une ttention prtiulire u type charF i vous vous souvenez ienD le type char permet de stoker des nomres ompris entre EIPV et IPUF
Si ce type char permet de stocker des nombres, il faut savoir qu'en C on l'utilise rarement pour a. En gnral, mme si le nombre est petit, on le stocke dans un int. Certes, a prend un peu plus de place en mmoire, mais aujourd'hui, la mmoire, ce n'est vraiment pas ce qui manque sur un ordinateur.

ve type char est en fit prvu pour stokerF F F une lettre 3 ettentionD j9i ien dit X xi lettreF gomme l mmoire ne peut stoker que des nomresD on invent une tle qui fit l onversion entre les nomres et les lettresF gette tle indique insi pr exemple que le nomre TS quivut l lettre eF ve lngge g permet de fire trs filement l trdution lettre `ab nomre orE respondntF our otenir le nomre ssoi une lettreD il su0t d9rire ette lettre entre postrophesD omme ei X 'A'F l ompiltionD 'A' ser rempl pr l vleur orrespondnteF estons X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { hr lettre a ' e ' Y printf @ 4 7 d n 4 D lettre A Y } TS return H Y

yn sit don que l lettre e mjusule est reprsente pr le nomre TSF f vut TTD g vut TUD etF estez ve des minusules et vous verrez que les vleurs sont di'rentesF in e'etD l lettre 'a' n9est ps identique l lettre 'A'D l9ordinteur fisnt l di'rene entre les mjusules et les minusules F v pluprt des rtres  de se sont ods entre les nomres H et IPUF ne tle fit l onversion entre les nomres et les lettres X l tle egss @prononez  eski AF ve site esiileFom est lre pour proposer ette tle mis e n9est ps le seulD on peut ussi l retrouver sur ikipdi et ien d9utres sites enoreF  le des rtres egss gode we X PSRUVP 
1

1. On dit qu'il  respecte la casse .

IUH

LE TYPE CHAR

Acher un caractre
v fontion printfD qui n9 didemment ps (ni de nous tonnerD peut ussi 0her un rtreF our elD on doit utiliser le symole %c @ omme rtreA X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { hr lettre a ' e ' Y printf @ 4 7 n 4 D lettre A Y } e return H Y

rourr 3 xous svons 0her une lettreF yn peut ussi demnder l9utilisteur d9entrer une lettre en utilisnt le %c dns un snf X
1 2 3 4 5 6 7 8 9

int min @ int rg D hr B rgv A { hr lettre a H Y snf @ 4 7 4 D 8 lettre A Y printf @ 4 7 n 4 D lettre A Y } return H Y

i je tpe l lettre fD je verri X


2

f f

oii peu prs tout e qu9il fut svoir sur le type charF etenez ien X ! le type char permet de stoker des nomres llnt de EIPV IPUD unsigned char des nomres de H PSS Y ! il y une tle que votre ordinteur utilise pour onvertir les lettres en nomres et inversementD l tle egss Y ! on peut don utiliser le type char pour stoker xi lettre Y ! 'A' est rempl l ompiltion pr l vleur orrespondnte @TS en l9ourreneAF yn utilise don les postrophes pour otenir l vleur d9une lettreF
2. Le premier des deux B est celui que j'ai tap au clavier, le second est celui ach par le printf.

IUI

CHAPITRE 13. LES CHANES DE CARACTRES

Les chanes sont des tableaux de char


gomme on ditD tout est dns le titreF in e'et X une hne de rtres n9est rien d9utre qu9un tleu de type charF n te tleu de rien du toutF i on re un tleu X
1

hr hine S Y

et qu9on met dns chaine[0] l lettre 'S'D dns chaine[1] l lettre 'a'F F F on peut insi former une hne de rtresD 9estEEdire du texteF v (gF IQFI vous donne une ide de l fon dont l hne est stoke en mmoire @ttention X je vous prviens de suiteD 9est un peu plus ompliqu que en rlitD je vous explique prs pourquoiAF

Figure IQFI ! ne hne de rtres en mmoire @simpli(eA

gomme on peut le voirD 9est un tleu qui prend S ses en mmoire pour reprsenter le mot  lut F our l vleurD j9i volontirement rit sur le shm les lettres entre postrophes pour indiquer que 9est un nomre qui est stokD et non une lettreF in rlitD dns l mmoireD e sont el et ien les nomres orrespondnt es lettres qui sont stoksF outefoisD une hne de rtres ne ontient ps que des lettres 3 ve shm de l (gF IQFI est en fit inompletF ne hne de rtre doit imprativement contenir un caractre spcial la n de la chaneD ppel  rtre de (n de hne F ge rtre s9rit '\0'F
Pourquoi faut-il que la chane de caractres se termine par un \0 ?

out simplement pour que votre ordinteur she qund s9rrte l hne 3 ve rtre IUP

LES CHANES SONT DES TABLEAUX DE CHAR

permet de dire X  topD 9est (niD y9 plus rien lire prsD irulez 3 r onsquentD pour stoker le mot  lut @qui omprend S lettresA en mmoireD il ne fut ps un tleu de S charD mis de T 3 ghque fois que vous rez une hne de rtresD vous llez don devoir penser prvoir de l ple pour le rtre de (n de hneF sl fut toujours toujours toujours jouter un lo de plus dns le tleu pour stoker e rtre \0D 9est imprtif 3 yulier le rtre de (n \0 est une soure d9erreurs impitoyle du lngge gF te le sis pour en voir fit les fris plus d9une foisF v (gF IQFP est le shm orret de l reprsenttion de l hne de rtres  lut en mmoireF
\0

Figure IQFP ! ne hne de rtres en mmoire

gomme vous le voyezD l hne prend T rtres et non ps SD il v flloir s9y fireF v hne se termine pr '\0'D le rtre de (n de hne qui permet d9indiquer l9ordinteur que l hne se termine lF oyez le rtre \0 omme un vntgeF qre luiD vous n9urez ps retenir l tille de votre tleu r il indique que le tleu s9rrte et endroitF ous pourrez psser votre tleu de char une fontion sns voir jouter t une vrile indiqunt l tille du tleuF gel n9est vlle que pour les hnes de rtres @9estEEdire le type char*D qu9on peut ussi rire char[]AF our les utres types de tleuxD vous tes toujours oligs de retenir l tille du tleu quelque prtF

Cration et initialisation de la chane


i on veut initiliser notre tleu chaine ve le texte  lut D on peut utiliser l mthode mnuelle mis peu e0e X IUQ

CHAPITRE 13. LES CHANES DE CARACTRES


1

hr hine T Y GG leu de T hr pour stoker E El Eu E t C le H hine H hine I hine P hine Q hine R hine S a a a a a a ' 'Y ' 'Y 'l 'Y 'u 'Y 't 'Y 'H 'Y

2 3 4 5 6 7 8

gette mthode mrheF yn peut le vri(er ve un printfF our fire un printf il fut utiliser le symole %s @s omme string D qui signi(e  hne en nglisAF oii le ode omplet qui re une hne  lut en mmoire et qui l90he X
1 2 3 4 5 6

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr hine T Y GG leu de T hr pour stoker E El Eu E t C le H GG snitilistion de l h ne @ on rit les rt res un un en m moire A hine H a ' ' Y hine I a ' ' Y hine P a ' l ' Y hine Q a ' u ' Y hine R a ' t ' Y hine S a ' H ' Y GG effihge de l h ne gr e u 7 s du printf printf @ 4 7 s 4 D hine A Y } return H Y

7 8

9 10 11 12 13 14 15 16 17 18 19 20

gopier e ode gode we X VTSUPI  sultt X


lut

ous remrquerez que 9est un peu ftignt et rptitif de devoir rire les rtres un un omme on l9 fit dns le tleu chaineF our initiliser une hneD il existe heureusement une mthode plus simple X
1

int min @ int rg D hr B rgv A

IUR

LES CHANES SONT DES TABLEAUX DE CHAR


2 3

hr hine a 4 lut 4 Y GG v tille du tleu hine est utomtiquement lul e printf @ 4 7 s 4 D hine AY

4 5 6 7 8

return H Y

gopier e ode gode we X SHVHSU 


lut

gomme vous le voyez l premire ligneD je re une vrile de type char[]F t9uris pu rire ussi char*D le rsultt urit t le mmeF in tpnt entre guillemets l hne que vous voulez mettre dns votre tleuD le ompilteur g lule utomtiquement l tille nessireF g9estEEdire qu9il ompte les lettres et joute I pour pler le rtre \0F sl rit ensuite une une les lettres du mot  lut en mmoire et joute le \0 omme on l9 fit nousEmmes mnuellement quelques instnts plus ttF frefD 9est ien plus prtiqueF sl y toutefois un dfut X ne mrhe que pour l9initilistion 3 ous ne pouvez ps rire plus loin dns le ode X
1

hine a 4 lut 4 Y

gette tehnique est don rserver l9initilistionF eprs elD il fudr rire les rtres mnuellement un un en mmoire omme on l9 fit u dutF

Rcupration d'une chane via un scanf


ous pouvez enregistrer une hne entre pr l9utilisteur vi un scanfD en utilisnt l enore le symole %sF eul prolme X vous ne svez ps omien de rtres l9utilisteur v entrerF i vous lui demndez son prnomD il s9ppelle peutEtre vu @Q rtresAD mis qui vous dit qu9il ne s9ppelle ps tenEidourd @euoup plus de rtresA c our D il n9y ps QT solutionsF sl v flloir rer un tleu de char trs grndD su0smment grnd pour pouvoir stoker le prnomF yn v don rer un char[100]F ous vez peutEtre l9impression de gher de l mmoireD mis souvenezEvous enore une fois que de l ple en mmoireD e n9est ps e qui mnque F
3 1 2 3 4

int min @ int rg D hr B rgv A { hr prenom IHH Y


3. Et il y a des programmes qui gchent la mmoire de faon bien pire que cela !

IUS

CHAPITRE 13. LES CHANES DE CARACTRES


5 6 7

printf @ 4 gomment t ' ppelles E tu petit ero c 4 A Y snf @ 4 7 s 4 D prenom A Y printf @ 4 lut 7s D je suis heureux de te renontrer 3 4 D prenom A Y } return H Y

8 9 10

gopier e ode gode we X UQSUVH 

gomment t 9 ppelles E tu petit ero c wteoPI lut wteoPI D je suis heureux de te renontrer 3

Fonctions de manipulation des chanes


ves hnes de rtres sontD vous vous en doutezD frquemment utilisesF ous les motsD tous les textes que vous voyez sur votre rn sont en fit des tleux de char en mmoire qui fontionnent omme je viens de vous l9expliquerF e(n de nous ider un peu mnipuler les hnesD on nous fournit dns l iliothque string.h une plthore de fontions ddies ux luls sur des hnesF te ne peux ps vriment toutes vous les prsenter iiD e serit un peu long et elles ne sont ps toutes indispenslesF te vis me ontenter de vous prler des priniples dont vous urez trs ertinement esoin dns peu de tempsF

Pensez inclure string.h


wme si el devrit vous prtre videntD je prfre vous le priser enore u s o X omme on v utiliser une nouvelle iliothque ppele string.hD vous devez l9inlure en hut des (hiers .c o vous en vez esoin X
1

5 inlude ` string Fh b

i vous ne le fites psD l9ordinteur ne onntr ps les fontions que je vis vous prsenter r il n9ur ps les prototypesD et l ompiltion plnterF in refD n9ouE liez ps d9inlure ette iliothque hque fois que vous utilisez des fontions de mnipultion de hnesF
strlen

: calculer la longueur d'une chane

strlen est une fontion qui lule l longueur d9une hne de rtres @sns ompter le rtre \0 AF ous devez lui envoyer un seul prmtre X votre hne de rtresF

gette fontion vous retourne l longueur de l hneF IUT

FONCTIONS DE MANIPULATION DES CHANES

wintennt que vous svez e qu9est un prototypeD je vis vous donner le prototype des fontions dont je vous prleF ves progrmmeurs s9en servent omme  mode d9emploi de l fontion @mme si quelques explitions t ne sont jmis super)uesA X
1

sizet strlen @ onst hr B hine A Y

size_t est un type spcial qui signie que la fonction renvoie un nombre correspondant une taille. Ce n'est pas un type de base comme int, long ou char, c'est un type  invent . Nous apprendrons nous aussi crer nos propres types de variables quelques chapitres plus loin. Pour le moment, on va se contenter de stocker la valeur renvoye par strlen dans une variable de type int (l'ordinateur convertira de size_t en int automatiquement). En toute rigueur, il faudrait plutt stocker le rsultat dans une variable de type size_t, mais en pratique un int est susant pour cela.

v fontion prend un prmtre de type const char*F ve const @qui signi(e onstnteD rppelezEvousA fit que l fontion strlen  s9interdit en quelque sorte de modi(er votre hneF und vous voyez un constD vous svez que l vrile n9est ps modi(e pr l fontionD elle est juste lueF estons l fontion strlen X
1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { hr hine a 4 lut 4 Y int longueurghine a HY GG yn r up re l longueur de l h ne dns longueurghine longueurghine a strlen @ hine A Y GG yn ffihe l longueur de l h ne printf @ 4 v hine 7 s fit 7 d rteres de long 4 D hine D longueurghine A Y } return H Y

11 12 13

gopier e ode gode we X VUSUIW 

v hine lut fit S rteres de long

gette fontion strlen est d9illeurs file rireF sl su0t de fire une oule sur le tleu de char qui s9rrte qund on tome sur le rtre \0F n ompteur s9inrmente hque tour de ouleD et 9est e ompteur que l fontion retourneF iensD tout m9 donn envie d9rire moiEmme une fontion similire strlenF vous permettr en plus de ien omprendre omment l fontion mrhe X IUU

CHAPITRE 13. LES CHANES DE CARACTRES


1 2 3 4 5 6 7 8 9 10

int longueurghine @ onst hr B hine A Y int min @ int rg D hr B rgv A { hr hine a 4 lut 4 Y int longueur a H Y longueur a longueurghine @ hine A Y printf @ 4 v hine 7 s fit 7 d rteres de long 4 D hine D longueur A Y return H Y

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

int longueurghine @ onst hr B hine A { int nomrehegrteres a H Y hr rtereetuel a H Y do {

} while @ rtereetuel 3a ' H ' A Y GG yn oule tnt qu ' on n ' est ps rriv l ' H nomrehegrteres E EY GG yn retire I rt re de long pour ne ps ompter le rt re H } return nomrehegrteres Y

rtereetuel a hine nomrehegrteres Y nomrehegrteres CCY

27 28

29 30 31

gopier e ode gode we X ISHUVS  v fontion longueurChaine fit une oule sur le tleu chaineF ille stoke les rtres un pr un dns caractereActuelF hs que caractreActuel vut '\0'D l oule s9rrteF hque pssge dns l ouleD on joute I u nomre de rtres qu9on nlyssF l (n de l ouleD on retire I rtre u nomre totl de rtres qu9on omptsF gel permet de ne ps ompter le rtre \0 dns le lotF in(nD on retourne nombreDeCaracteres et le tour est jou 3 IUV

FONCTIONS DE MANIPULATION DES CHANES

strcpy

: copier une chane dans une autre

v fontion strcpy @omme  string opy A permet de opier une hne l9intrieur d9une utreF on prototype est X
1

hr B strpy @ hr B opiehevghine D onst hr B hineegopier A Y

gette fontion prend deux prmtres X ! copieDeLaChaine X 9est un pointeur vers un char* @tleu de charAF g9est dns e tleu que l hne ser opie Y ! chaineACopier X 9est un pointeur vers un utre tleu de charF gette hne ser opie dns copieDeLaChaineF v fontion renvoie un pointeur sur copieDeLaChaineD e qui n9est ps trs utileF in gnrlD on ne rupre ps e que ette fontion renvoieF estons el X
1 2 3 4

5 6 7 8 9 10 11

int min @ int rg D hr B rgv A { GB yn r e une h ne 4 hine 4 qui ontient un peu de texte et une opie @ vide A de tille IHH pour tre s r d ' voir l ple pour l opie BG hr hine a 4 exte 4 D opie IHH a { H }Y strpy @ opie D hine AY GG yn opie 4 hine 4 dns 4 opie 4 GG i tout s ' est ien pss D l opie devrit tre identique hine printf @ 4 hine vut X 7 s n 4 D hine A Y printf @ 4 opie vut X 7 s n 4 D opie A Y } return H Y

12 13 14 15 16

gopier e ode gode we X IWQWHQ 


hine vut X exte opie vut X exte

yn voit que chaine vut  exte F tusqueElD 9est normlF r ontreD on voit ussi que l vrile copieD qui tit vide u dprtD t remplie pr le ontenu de chaineF v hne don ien t opie dns copieF IUW

CHAPITRE 13. LES CHANES DE CARACTRES

Vriez que la chane copie est assez grande pour accueillir le contenu de chaine. Si, dans mon exemple, j'avais dni copie[5] (ce qui n'est pas susant car il n'y aurait pas eu de place pour le \0), la fonction strcpy aurait  dbord en mmoire  et probablement fait planter votre programme. viter tout prix, sauf si vous aimez faire planter votre ordinateur, bien sr.

hmtiquementD l opie fontionn omme sur l (gF IQFQF

Figure IQFQ ! gopie d9une hne de rtres

ghque rtre de chaine t pl dns copieF v hne copie ontient de nomreux rtres inutilissD vous l9urez remrquF te lui i donn l tille IHH pr suritD mis en toute rigueurD l tille T urit su0tF v9vntge de rer un tleu un peu plus grndD 9est que de ette fon l hne copie ser ple de reevoir d9utres hnes peutEtre plus grndes dns l suite du progrmmeF
strcat

: concatner 2 chanes

gette fontion joute une hne l suite d9une utreF yn ppelle el l ontntionF upposons que l9on it les vriles suivntes X ! chaine1 = "Salut " ! chaine2 = "Mateo21" i je ontne chaine2 dns chaine1D lors chaine1 vudr "Salut Mateo21"F unt chaine2D elle n9ur ps hng et vudr don toujours "Mateo21"F eule chaine1 est modi(eF g9est extement e que fit strcatD dont voii le prototype X
1

hr B strt @ hr B hineI D onst hr B hineP A Y

gomme vous pouvez le voirD chaine2 ne peut ps tre modi(e r elle est d(nie omme onstnte dns le prototype de l fontionF v fontion retourne un pointeur vers chaine1D e quiD omme pour strcpyD ne sert ps grndEhose dns le s prsent X on peut don ignorer e que l fontion nous renvoieF v fontion joute chaine1 le ontenu de chaine2F egrdonsEy de plus prs X
1 2 3

int min @ int rg D hr B rgv A { GB yn r e P h nes F hineI doit tre ssez grnde pour ueillir le ontenu de hineP en plus D sinon risque de plntge BG

IVH

FONCTIONS DE MANIPULATION DES CHANES


5 6 7

hr hineI IHH a 4 lut 4 D hineP a 4 wteoPI 4 Y strt @ hineI D hineP A Y GG yn ont ne hineP dns hineI GG i tout s ' est ien pss D hineI vut 4 lut wteoPI 4 printf @ 4 hineI vut X 7 s n 4 D hineI A Y GG hineP n ' ps hng X printf @ 4 hineP vut toujours X 7 s n4 D hineP A Y } return H Y

8 9 10 11 12 13 14 15

gopier e ode gode we X PPHISQ 

hineI vut X lut wteoPI hineP vut toujours X wteoPI

ri(ez solument que chaine1 est ssez grnde pour qu9on puisse lui jouter le ontenu de chaine2D sinon vous ferez un dordement en mmoire qui peut onduire un plntgeF g9est pour el que j9i d(ni chaine1 de tille IHHF unt chaine2D j9i liss l9ordinteur luler s tille @je n9i don ps pris l tilleA r ette hne n9est ps modi(eD il n9y don ps esoin de l rendre plus grnde que nessireF v (gF IQFR rsume le fontionnement de l ontntionF

Figure IQFR ! gontntion de hnes

ve tleu chaine2 t jout l suite de chaine1 @qui omprenit une entine de sesAF ve \0 de chaine1 t supprim @en fitD il t rempl pr le w de wteoPIAF in e'etD il ne fut ps lisser un \0 u milieu de l hneD sinon elleEi urit t  oupe u milieu 3 yn ne met qu9un \0 l (n de l hneD une fois qu9elle est (nieF
strcmp
strcmp
1

: comparer 2 chanes

ompre P hnes entre ellesF oii son prototype X

int strmp @ onst hr B hineI D onst hr B hineP A Y

ves vriles chaine1 et chaine2 sont ompresF gomme vous le voyezD uune d9elles n9est modi(e r elles sont indiques omme onstntesF IVI

CHAPITRE 13. LES CHANES DE CARACTRES

sl est importnt de ruprer e que l fontion renvoieF in e'etD strcmp renvoie X ! H si les hnes sont identiques Y ! une utre vleur @positive ou ngtiveA si les hnes sont di'rentesF
Il aurait t plus logique, je le reconnais, que la fonction renvoie 1 si les chanes avaient t identiques pour dire  vrai  (rappelez-vous des boolens). La raison est simple : la fonction compare les valeurs de chacun des caractres un un. Si tous les caractres sont identiques, elle renvoie 0. Si les caractres de la chaine1 sont suprieurs ceux de la chaine2, la fonction renvoie un nombre positif. Si c'est l'inverse, la fonction renvoie un nombre ngatif. Dans la pratique, on se sert surtout de strcmp pour vrier si 2 chanes sont identiques ou non.

oii un ode de test X


1 2 3

int min @ int rg D hr B rgv A { hr hineI a 4 exte de test 4 D hineP a 4 exte de test 4 Y if @ strmp @ hineI D hineP A aa H A GG i h nes identiques { printf @ 4 ves hines sont identiques n4 A Y } else { printf @ 4 ves hines sont differentes n 4 A Y } } return H Y

4 5 6 7 8 9 10 11 12 13 14 15

gopier e ode gode we X RUIWRV 

ves hines sont identiques

ves hnes tnt identiquesD l fontion strcmp renvoy le nomre HF xotez que j9uris pu stoker e que renvoie strcmp dns une vrile de type intF outefoisD e n9est ps oligtoireD on peut diretement mettre l fontion dns le if omme je l9i fitF te n9i ps grndEhose jouter propos de ette fontionF ille est ssez simple utiliser en fitD mis il ne fut ps oulier que H signi(e  identique et une utre vleur signi(e  di'rent F g9est l seule soure d9erreurs possile iiF IVP

FONCTIONS DE MANIPULATION DES CHANES

strchr
1

: rechercher un caractre

v fontion strchr reherhe un rtre dns une hneF rototype X


hr B strhr @ onst hr B hine D int rtereeeherher A Y

v fontion prend P prmtres X ! chaine X l hne dns lquelle l reherhe doit tre fite Y ! caractereARechercher X le rtre que l9on doit reherher dns l hneF
Vous remarquerez que caractereARechercher est de type int et non de type char. Ce n'est pas rellement un problme car, au fond, un caractre est et restera toujours un nombre. Nanmoins, on utilise quand mme plus souvent un char qu'un int pour stocker un caractre en mmoire.

v fontion renvoie un pointeur vers le premier rtre qu9elle trouvD 9estEEdire qu9elle renvoie l9dresse de e rtre dns l mmoireF ille renvoie NULL si elle n9 rien trouvF hns l9exemple suivntD je rupre e pointeur dns suiteChaine X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { hr hine a 4 exte de test 4 D B suiteghine a xvv Y suiteghine a strhr @ hine D ' d ' A Y if @ suiteghine 3a xvv A GG i on trouv quelque hose { printf @ 4 oii l fin de l hine prtir du premier d X 7 s 4 D suiteghine A Y } } return H Y

9 10 11 12

gopier e ode gode we X ITIVWT 

oii l fin de l hine prtir du premier d X de test

evezEvous ien ompris e qu9il se psse ii c g9est un peu prtiulierF in fitD suiteChaine est un pointeur omme chaineD suf que chaine pointe sur le premier rtre @le 'T' mjusuleAD tndis que suiteChaine pointe sur le premier rtre 'd' qui t trouv dns chaineF ve shm de l (gF IQFS vous montre o pointe hque pointeur X chaine ommene u dut de l hine @'T' mjusuleAD tndis que suiteChaine pointe sur le 'd' minusuleF vorsque je fis un printf de suiteChaineD il est don norml que l9on m90he juste  de test F v fontion printf 0he tous les rtres qu9elle renontre @9d9D 9e9D 9 9D IVQ

CHAPITRE 13. LES CHANES DE CARACTRES

Figure IQFS ! ointeurs et hnes

9t9D 9e9D 9s9D 9t9A jusqu9 e qu9elle tome sur le \0 qui lui dit que l hne s9rrte lF
Variante

sl existe une fontion strrchr stritement identique strchrD suf que elleEl renvoie un pointeur vers le dernier caractre qu9elle trouv dns l hne plutt que vers le premierF
strpbrk

: premier caractre de la liste

gette fontion ressemle euoup l prdenteF gelleEi reherhe un des rtres dns l liste que vous lui donnez sous forme de hneD ontrirement strchr qui ne peut reherher qu9un seul rtre l foisF r exempleD si on forme l hne "xds" et qu9on en fit une reherhe dns "Texte de test"D l fontion renvoie un pointeur vers le premier de es rtres qu9elle y trouvF in l9ourreneD le premier rtre de "xds" qu9elle trouve dns "Texte de test" est le xD don strpbrk renverr un pointeur sur 'x'F rototype X
1

hr B strprk @ onst hr B hine D onst hr B lettreseeherher A Y

estons l fontion X
1 2 3 4 5

int min @ int rg D hr B rgv A { hr B suiteghine Y GG yn herhe l premi re ourrene de x D d ou s dns 4 exte de test 4 suiteghine a strprk @ 4 exte de test 4 D 4 xds 4 A Y if @ suiteghine 3a xvv A { printf @ 4 oii l fin de l hine prtir du premier des rteres trouves X 7 s 4 D suiteghine A Y } } return H Y

6 7 8 9 10

11 12 13 14

IVR

FONCTIONS DE MANIPULATION DES CHANES

gopier e ode gode we X VTTUUQ 

oii l fin de l hine prtir du premier des rteres trouves X xte de test

our et exempleD j9i diretement rit les vleurs envoyer l fontion @entre guilleE metsAF xous ne sommes en e'et ps oligs d9employer une vrile tous les oupsD on peut trs ien rire l hne diretementF sl fut simplement retenir l rgle suivnte X ! si vous utilisez les guillemets ""D el signi(e chane Y ! si vous utilisez les postrophes D el signi(e caractreF
strstr

: rechercher une chane dans une autre

gette fontion reherhe l premire ourrene d9une hne dns une utre hneF on prototype est X
1

hr B strstr @ onst hr B hine D onst hr B hineeeherher A Y

ve prototype est similire strpbrkD mis ttention ne ps onfondre X strpbrk reherhe x des rtresD tndis que strstr reherhe toute l hneF ixemple X
1 2 3 4 5

int min @ int rg D hr B rgv A { hr B suiteghine Y GG yn herhe l premi re ourrene de 4 test 4 dns 4 exte de test 4 X suiteghine a strstr @ 4 exte de test 4 D 4 test 4 A Y if @ suiteghine 3a xvv A { printf @ 4 remiere ourrene de test dns exte de test X 7 s n 4 D suiteghine A Y } } return H Y

6 7 8 9

10 11 12 13

gopier e ode gode we X PWQRUS 

remiere ourrene de test dns exte de test X test

IVS

CHAPITRE 13. LES CHANES DE CARACTRES

v fontion strstr reherhe l hne 4test4 dns 4exte de test4F ille renvoieD omme les utresD un pointeur qund elle trouv e qu9elle herhitF ille renvoie NULL si elle n9 rien trouvF tusqu9iiD je me suis ontent d90her l hne prtir du pointeur retourn pr les fontionsF hns l prtiqueD n9est ps trs utileF ous ferez juste un if (resultat != NULL) pour svoir si l reherhe ou non donn quelque hoseD et vous 0herez  ve texte que vous reherhiez t trouv F
sprintf

: crire dans une chane


Cette fonction se trouve dans stdio.h contrairement aux autres fonctions que nous avons tudies jusqu'ici, qui taient dans string.h.

ge nom doit vguement vous rppeler quelque hoseF gette fontion ressemle norE mment u printf que vous onnissez misD u lieu d9rire l9rnD sprintf rit dnsF F F une hne 3 h9o son nom d9illeursD qui ommene pr le  s de  string @hne en nglisAF g9est une fontion trs prtique pour mettre en forme une hneF etit exemple X
1 2 3 4 5 6 7 8 9 10 11 12

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr hine IHH Y int ge a IS Y GG yn rit 4 u s IS ns 4 dns hine sprintf @ hine D 4 u s 7 d ns 3 4 D ge A Y GG yn ffihe hine pour v rifier qu ' elle ontient ien el X printf @ 4 7 s 4 D hine A Y } return H Y

13 14 15 16

gopier e ode gode we X PUWWTQ 


u s IS ns 3

ille s9utilise de l mme mnire que printfD mis prt le fit que vous devez lui donner en premier prmtre un pointeur vers l hne qui doit reevoir le texteF IVT

FONCTIONS DE MANIPULATION DES CHANES

hns mon exempleD j9ris dns chaine  u s 7d ns D o %d est rempl pr le ontenu de l vrile ageF outes les rgles du printf s9ppliquentD vous pouvez don si vous le voulez mettre des %s pour insrer d9utres hnes l9intrieur de votre hne 3 gomme d9hitudeD vri(ez que votre hne est su0smment grnde pour ueillir tout le texte que le sprintf v lui envoyerF inonD omme on l9 vuD vous vous exposez des dpssements de mmoire et don un plntge de votre progrmmeF

En rsum
! n ordinteur ne sit ps mnipuler du texteD il ne onnt que les nomresF our rgler le prolmeD on ssoie hque lettre de l9lphet un nomre orrespondnt dns une tle ppele l table ASCIIF ! ve type char est utilis pour stoker une et une seule lettre F ! our rer un mot ou une phrseD on doit onstruire une chane de caractresF our elD on utilise un tableau de charF ! oute hne de rtre se termine pr un rtre spil ppel \0 qui signi(e  (n de hne F ! sl existe de nomreuses fontions toutes prtes de mnipultion des hnes dns l bibliothque stringF sl fut inlure string.h pour pouvoir les utiliserF
4

4. Il stocke en ralit un nombre mais ce nombre est automatiquement traduit par l'ordinateur l'achage.

IVU

CHAPITRE 13. LES CHANES DE CARACTRES

IVV

Chapitre

14
Dicult :

Le prprocesseur

prs ces derniers chapitres harassants sur les pointeurs, tableaux et chanes de caractres, nous allons faire une pause. Vous avez d intgrer un certain nombre de nouveauts dans les chapitres prcdents, je ne peux donc pas vous refuser de souer un peu. Ce chapitre va traiter du prprocesseur, ce programme qui s'excute juste avant la compilation. Ne vous y trompez pas : les informations contenues dans ce chapitre vous seront utiles. Elles sont en revanche moins complexes que ce que vous avez eu assimiler rcemment.

IVW

CHAPITRE 14. LE PRPROCESSEUR

Les include
gomme je vous l9i expliqu dns les tout premiers hpitres du oursD on trouve dns les odes soure des lignes un peu prtiulires ppeles directives de prprocesseurF ges diretives de prproesseur ont l rtristique suivnte X elles ommenent toujours pr le symole #F illes sont don files reonntreF v premire @et seuleA diretive que nous yons vue pour l9instnt est #includeF gette diretive permet d9inlure le ontenu d9un (hier dns un utreD je vous l9i dit plus ttF yn s9en sert en prtiulier pour inlure des (hiers .h omme les (hiers .h des iliothques @stdlib.hD stdio.hD string.hD math.hF F FA et vos propres (hiers .hF our inlure un (hier .h se trouvnt dns le dossier o est instll votre shiD vous devez utiliser les hevrons < > X
1

5 inlude ` stdli Fh b

our inlure un (hier .h se trouvnt dns le dossier de votre projetD vous devez en revnhe utiliser les guillemets X
1

5 inlude 4 monfihier F h 4

gonrtementD le prproesseur est dmrr vnt l ompiltionF sl prourt tous vos (hiers l reherhe de diretives de prproesseurD es fmeuses lignes qui omE menent pr un #F vorsqu9il renontre l diretive #includeD il insre littrlement le ontenu du (hier indiqu l9endroit du #includeF upposons que j9ie un fichier.c ontennt le ode de mes fontions et un fichier.h ontennt les prototypes des fontions de fichier.cF yn pourrit rsumer l sitution dns le shm de l (gF IRFIF

Figure IRFI ! snlusion de (hier

out le ontenu de fichier.h est mis l9intrieur de fichier.cD l9endroit o il y l diretive #include fichier.hF smginons qu9on it dns le fichier.c X
1 2 3 4 5

5 inlude 4 fihier F h 4 int mpontion @ int tru D doule idule A { GB gode de l fontion BG

IWH

LES DEFINE
6 7 8 9 10 11

} void utrepontion @ int vleur A { GB gode de l fontion BG }

it dns le fichier.h X
1 2

int mpontion @ int tru D doule idule A Y void utrepontion @ int vleur A Y

vorsque le prproesseur psse pr lD juste vnt l ompiltion de fichier.cD il insre fichier.h dns fichier.cF eu (nlD le ode soure de fichier.c juste avant l ompiltion ressemle X
1 2 3 4 5 6 7 8 9 10 11 12

int mpontion @ int tru D doule idule A Y void utrepontion @ int vleur A Y int mpontion @ int tru D doule idule A { GB gode de l fontion BG } void utrepontion @ int vleur A { GB gode de l fontion BG }

ve ontenu du .h est venu se mettre l9emplement de l ligne #includeF ge n9est ps ien ompliqu omprendreD je pense d9illeurs que on nomre d9entre vous devient se douter que fontionnit omme F eve es explitions supplE mentiresD j9espre voir mis tout le monde d9ordF ve #include ne fit rien d9utre qu9insrer un (hier dns un utreD 9est importnt de ien le omprendreF
Si on a dcid de mettre les prototypes dans les .h, au lieu de tout mettre dans les .c, c'est essentiellement par principe. On pourrait a priori mettre les prototypes en haut des .c (d'ailleurs, dans certains trs petits programmes on le fait parfois), mais pour des questions d'organisation il est vivement conseill de placer ses prototypes dans des .h. Lorsque votre programme grossira et que plusieurs chiers .c feront appel un mme .h, vous serez heureux de ne pas avoir copier-coller les prototypes des mmes fonctions plusieurs fois !

Les define
xous llons douvrir mintennt une nouvelle diretive de prproesseur X le #defineF IWI

CHAPITRE 14. LE PRPROCESSEUR

gette diretive permet de d(nir une constante de prprocesseurF gel permet d9ssoier une vleur un motF oii un exemple X
1

5 define xywfisisxssevi Q

ous devez rire dns l9ordre X ! le #define Y ! le mot uquel l vleur v tre ssoie Y ! l vleur du motF ettention X mlgr les pprenes @notmment le nom que l9on l9hitude de mettre en mjusulesAD el est trs di'rent des onstntes que nous vons tudies jusqu9iiD telles que X
1

onst int xywfisisxssevi a Q Y

ves onstntes oupient de l ple en mmoireF wme si l vleur ne hngeit psD votre nomre Q tit stok quelque prt dns l mmoireF ge n9est ps le s des onstntes de prproesseur 3 gomment fontionne c in fitD le #define remple dns votre ode soure tous les mots pr leur vleur orrespondnteF g9est un peu omme l fontion  eherher G empler de ord si vous voulezF einsiD l ligne X
1

5 define xywfisisxssevi Q

F F F remple dns le (hier hque NOMBRE_VIES_INITIALES pr QF oii un exemple de (hier .c vnt pssge du prproesseur X
1 2 3 4 5 6 7

5 define xywfisisxssevi Q int min @ int rg D hr B rgv A { int vies a xywfisisxssevi Y GB gode FFF BG

eprs pssge du prproesseur X


1 2 3 4 5

int min @ int rg D hr B rgv A { int vies a Q Y GB gode FFF BG

evnt l ompiltionD tous les #define uront don t rempls pr les vleurs orE respondntesF ve ompilteur  voit le (hier prs pssge du prproesseurD dns lequel tous les remplements uront t e'etusF
Quel intrt par rapport l'utilisation de constantes comme on l'a vu jusqu'ici ?

IWP

LES DEFINE

ih ienD omme je vous l9i ditD ne prend ps de ple en mmoireF g9est logiqueD vu que lors de l ompiltion il ne reste plus que des nomres dns le ode soureF n utre intrt est que le remplement se fit dns tout le (hier dns lequel se trouve le #defineF i vous viez d(ni une onstnte en mmoire dns une fontionD elleEi n9urit t vlle que dns l fontion puis urit t supprimeF ve #define en revnhe s9ppliquer toutes les fontions du (hierD e qui peut s9vrer prfois prtique selon les esoinsF n exemple onret d9utilistion des #define c in voii un que vous ne trderez ps utiliserF vorsque vous ouvrirez une fentre en gD vous urez prolement envie de d(nir des onstntes de prproesseur pour indiquer les dimensions de l fentre X
1 2

5 define veqipixii 5 define reipixii

VHH THH

v9vntge est que si plus trd vous didez de hnger l tille de l fentre @pre que vous semle trop petitAD il vous su0r de modi(er les #define puis de reompilerF noter X les #define sont gnrlement pls dns des .hD t des prototypes @vous pouvez d9illeurs ller voir les .h des iliothques omme stdlib.hD vous verrez qu9il y des #define 3AF ves #define sont don  files d9s D vous pouvez hnger les dimensions de l fentre en modi(nt les #define plutt que d9ller herher u fond de vos fontions l9endroit o vous ouvrez l fentre pour modi(er les dimensionsF g9est don du temps ggn pour le progrmmeurF in rsumD les onstntes de prproesseur permettent de  on(gurer votre proE grmme vnt s ompiltionF g9est une sorte de miniEon(gurtionF

Un define pour la taille des tableaux


yn utilise souvent les define pour d(nir l tille des tleuxF yn rit pr exemple X
1 2 3 4 5 6

5 define esvviwe

IHHH

int min @ int rg D hr B rgv A { hr hineI esvviwe D hineP esvviwe Y GG FFF

Mais. . . je croyais qu'on ne pouvait pas mettre de variable ni de constante entre les crochets lors d'une dnition de tableau ?

yuiD mis TAILLE_MAX n9est e une vrile ni une onstnteF in e'et je vous l9i ditD le prproesseur trnsforme le (hier vnt ompiltion en X
1 2 3 4

int min @ int rg D hr B rgv A { hr hineI IHHH D hineP IHHH Y GG FFF

IWQ

CHAPITRE 14. LE PRPROCESSEUR

F F F et el est vlide 3 in d(nissnt TAILLE_MAX insiD vous pouvez vous en servir pour rer des tleux d9une ertine tilleF i l9venir el s9vre insu0sntD vous n9urez qu9 modi(er l ligne du #defineD reompilerD et vos tleux de char prendront tous l nouvelle tille que vous urez indiqueF

Calculs dans les define


sl est possile de fire quelques petits luls dns les defineF r exempleD e ode re une onstnte LARGEUR_FENETRED une utre HAUTEUR_FENETRED puis une troisime NOMBRE_PIXELS qui ontiendr le nomre de pixels 0hs l9intrieur de l fentre @le lul est simple X lrgeur B huteurA X
1 2 3

5 define veqipixii 5 define reipixii 5 define xywfisiv

VHH THH @ veqipixii B reipixii A

v vleur de NOMBRE_PIXELS est remple vnt l ompiltion pr le ode suiE vnt X @LARGEUR_FENETRE * HAUTEUR_FENETREAD 9estEEdire pr @VHH B THHAD e qui fit RVHHHHF wettez toujours votre lul entre prenthses omme je l9i fit pr suE rit pour ien isoler l9oprtionF ous pouvez fire toutes les oprtions de se que vous onnissez X ddition @CAD soustrtion @EAD multiplition @BAD division @GA et modulo @7AF

Les constantes prdnies


in plus des onstntes que vous pouvez d(nir vousEmmesD il existe quelques onstntes prd(nies pr le prproesseurF ghune de es onstntes ommene et se termine pr deux symoles undersore _ F ! __LINE__ X donne le numro de l ligne tuelleF ! __FILE__ X donne le nom du (hier tuelF ! __DATE__ X donne l dte de l ompiltionF ! __TIME__ X donne l9heure de l ompiltionF ges onstntes peuvent tre utiles pour grer des erreursD en fisnt pr exemple ei X
1 1 2

printf @ 4 irreur l ligne 7 d du fihier 7 s n 4 D vsxi D psvi A Y printf @ 4 ge fihier ete ompile le 7 s 7 s n 4 D hei D swi A Y irreur l ligne W du fihier min F ge fihier ete ompile le tn IQ PHHT IWXPIXIH

1. Vous trouverez ce symbole sous le chire 8, tout du moins si vous avez un clavier AZERTY franais. Il faut appuyer sur les touches Alt Gr et 8 en mme temps.

IWR

LES MACROS

Les dnitions simples


sl est ussi possile de fire tout simplement X
1

5 define gyxexi

F F F sns priser de vleurF gel veut dire pour le prproesseur que le mot CONSTANTE est d(niD tout simplementF sl n9 ps de vleurD mis il  existe F
Quel peut en tre l'intrt ?

v9intrt est moins vident que tout l9heureD mis il y en un et nous llons le douvrir trs rpidementF

Les macros
xous vons vu qu9ve le #define on pouvit demnder u prproesseur de rempler un mot pr une vleurF r exemple X
1

5 define xywfi W

F F F signi(e que tous les NOMBRE de votre ode seront rempls pr WF xous vons vu qu9il s9gissit en fit d9un simple reherherErempler fit pr le prproesseur vnt l ompiltionF t9i du nouveu 3 in fitD le #define est enore plus puissnt que F sl permet de rempler ussi prF F F un ode soure tout entier 3 und on utilise #define pour reherherErempler un mot pr un ode soureD on dit qu9on re une macroF

Macro sans paramtres


oii un exemple de mro trs simple X
1

5 define gygy @A printf @ 4 gouou 4 A Y

ge qui hnge iiD e sont les prenthses qu9on joutes prs le motEl @ii COUCOU()AF xous verrons quoi elles peuvent servir tout l9heureF estons l mro dns un ode soure X
1 2 3 4 5 6 7 8

5 define gygy @A printf @ 4 gouou 4 A Y int min @ int rg D hr B rgv A { gygy @A } return H Y

IWS

CHAPITRE 14. LE PRPROCESSEUR

gouou

te vous l9ordeD e n9est ps originl pour le momentF ge qu9il fut dj ien omE prendreD 9est que les mros ne sont en fit que des outs de ode qui sont diretement rempls dns votre ode soure juste vnt l ompiltionF ve ode qu9on vient de voir ressemler en fit lors de l ompiltion X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { printf @ 4 gouou 4 A Y } return H Y

i vous vez ompris D vous vez ompris le prinipe de se des mrosF


Mais. . . on ne peut mettre qu'une seule ligne de code par macro ?

xonD heureusement il est possile de mettre plusieurs lignes de ode l foisF sl su0t de pler un \ vnt hque nouvelle ligneD omme ei X
1

5 define egyxiesi @A n4AY

printf @ 4 gouou D je m ' ppelle frie printf @ 4 t ' hite xie n 4 A Y printf @ 4 t ' ime l glisse n 4A Y

2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { egyxiesi @A } return H Y

gouou D je m 9 ppelle frie t 9 hite xie t 9 ime l glisse

emrquez dns le main que l9ppel de l mro ne prend ps de pointEvirgule l (nF in e'etD 9est une ligne pour le prproesseurD elle ne nessite don ps d9tre termine pr un pointEvirguleF

Macro avec paramtres


our le momentD on vu omment fire une mro sns prmtreD 9estEEdire ve des prenthses videsF ve prinipl intrt de e type de mrosD 9est de pouvoir IWT

LES MACROS

 rourir un ode un peu longD surtout s9il est men tre rpt de nomreuses fois dns votre ode soureF gependntD les mros deviennent rellement intressntes lorsqu9on leur met des pE rmtresF gel mrhe qusiment omme ve les fontionsF
1 2 3 4 5 6 7 8 9

5 define weti @ ge A if @ ge ba IV A printf @ 4 ous etes mjeur n 4 A Y int min @ int rg D hr B rgv A { weti @ PP A } return H Y

ous etes mjeur

Notez qu'on aurait aussi pu ajouter un else pour acher  Vous tes mineur . Essayez de le faire pour vous entraner, ce n'est pas bien dicile. N'oubliez pas de mettre un antislash \ avant chaque nouvelle ligne.

ve prinipe de notre mro est ssez intuitif X


1 2

5 define weti @ ge A if @ ge ba IV A printf @ 4 ous etes mjeur n 4 A Y

yn met entre prenthses le nom d9une  vrile qu9on nomme ageF hns tout notre ode de mroD age ser rempl pr le nomre qui est indiqu lors de l9ppel l mro @iiD 9est PPAF einsiD notre ode soure prdent ressemler ei juste prs le pssge du prproE esseur X
1 2 3 4 5 6 7

int min @ int rg D hr B rgv A { if @ PP ba IV A printf @ 4 ous etes mjeur n 4 A Y } return H Y

ve ode soure t mis l ple de l9ppel de l mroD et l vleur de l  vrile age t mise diretement dns le ode soure de remplementF sl est possile ussi de rer une mro qui prend plusieurs prmtres X
1 2 3 4

5 define weti @ ge D nom A if @ ge ba IV A printf @ 4 ous etes mjeur 7 s n 4 D nom AY int min @ int rg D hr B rgv A

IWU

CHAPITRE 14. LE PRPROCESSEUR


5 6 7 8 9

weti @ PP D 4 wxime 4A return H Y

oil tout e qu9on peut dire sur les mrosF sl fut don retenir que 9est un simple remplement de ode soure qui l9vntge de pouvoir prendre des prmtresF
Normalement, vous ne devriez pas avoir besoin d'utiliser trs souvent les macros. Toutefois, certaines bibliothques assez complexes comme wxWidgets ou Qt (bibliothques de cration de fentres que nous tudierons bien plus tard) utilisent beaucoup de macros. Il est donc prfrable de savoir comment cela fonctionne ds maintenant pour ne pas tre perdu plus tard.

Les conditions
enezEvous ien X il est possile de rliser des onditions en lngge prproesseur 3 oii omment el fontionne X
1 2 3 4

5 if ondition GB gode soure ompiler si l ondition est vrie BG 5 elif onditionP GB inon si l ondition P est vrie ompiler e ode soure BG 5 endif

ve motEl #if permet d9insrer une ondition de prproesseurF #elif signi(e else if @sinon siAF v ondition s9rrte lorsque vous insrez un #endifF ous noterez qu9il n9y ps d9oldes en prproesseurF v9intrtD 9est qu9on peut insi fire des compilations conditionnellesF in e'etD si l ondition est vrieD le ode qui suit ser ompilF inonD il ser tout simplement supE prim du (hier le temps de l ompiltionF sl n9pprtr don ps dns le progrmme (nlF
#ifdef, #ifndef

xous llons voir mintennt l9intrt de fire un #define d9une onstnte sns priser de vleurD omme je vous l9i montr pge IWU X
1

5 define gyxexi

#ifndefD

in e'etD il est possile d9utiliser #ifdef pour dire  i l onstnte est d(nie F luiD sert dire  i l onstnte n9est ps d(nie F yn peut lors imginer ei X IWV

LES CONDITIONS
1 2 3 4 5 6 7 8 9 10 11 12 13

5 define sxhy 5 ifdef sxhy GB gode soure pour indows BG 5 endif 5 ifdef vsx GB gode soure pour vinux BG 5 endif 5 ifdef weg GB gode soure pour w BG 5 endif

g9est omme que font ertins progrmmes multiEpltesEformes pour s9dpter l9y pr exempleF elorsD ien entenduD il fut reompiler le progrmme pour hque y @e n9est ps mgiqueAF i vous tes sous indowsD vous rivez un #define WINDOWS en hutD puis vous ompilezF i vous voulez ompiler votre progrmme pour vinux @ve l prtie du ode soure spi(que vinuxAD vous devrez lors modi(er le define et mettre l ple X #define LINUXF eompilezD et ette fois 9est l portion de ode soure pour vinux qui ser ompileD les utres prties tnt ignoresF
#ifndef
#ifndef

pour viter les inclusions innies

est trs utilis dns les .h pour viter les  inlusions in(nies F
Une inclusion innie ? C'est--dire ?

smginezD 9est trs simpleF t9i un (hier A.h et un (hier B.hF ve (hier A.h ontient un include du (hier B.hF ve (hier f est don inlus dns le (hier eF wisD et 9est l que ommene oinerD supposez que le (hier B.h ontienne son tour un include du (hier A.h 3 rrive quelques fois en progrmmtion 3 ve premier (hier esoin du seond pour fontionnerD et le seond esoin du premierF i on y r)hit un peuD on imgine vite e qu9il v se psser X IF l9ordinteur lit A.h et voit qu9il fut inlure B.h Y PF il lit B.h pour l9inlureD et l il voit qu9il fut inlure A.h Y QF il inlut don A.h dns B.hD mis dns A.h on lui indique qu9il doit inlure B.h 3 RF reeloteD il v voir B.h et voit nouveu qu9il fut inlure A.h Y SF etF ous vous doutez ien que tout el est sns (n 3 in fitD fore de fire trop d9inluE sionsD le prproesseur s9rrter en disnt  t9en i mrre des inlusions 3 e qui fer plnter votre ompiltionF IWW

CHAPITRE 14. LE PRPROCESSEUR

gomment dile fire pour viter et 'reux uhemr c oii l9stueF hsormisD je vous demnde de fire omme dans TOUS vos chiers .h sns exeption X
1

5 ifndef hipxywhpsgrsi GG i le fihier n ' jmis t 5 define hipxywhpsgrsi GG yn prohine fois le fihier

l onstnte n ' ps t d finie inlus d finit l onstnte pour que l ne soit plus inlus

3 4

GB gontenu de votre fihier F h @ utres inlude D prototypes D define FFFA BG 5 endif

5 6

gopier e ode gode we X TWVIIV  ous mettrez en fit tout le ontenu de votre (hier .h @ svoir vos utres includeD vos prototypesD vos defineF F FA entre le #ifndef et le #endifF gomprenezEvous ien omment e ode fontionne c v premire fois qu9on m9 prsent ette tehniqueD j9tis ssez dsorient X je vis essyer de vous l9expliquerF smginez que le (hier .h est inlus pour l premire foisF ve prproesseur lit l ondition  i l onstnte DEF_NOMDUFICHIER n9 ps t d(nie F gomme 9est l premire fois que le (hier est luD l onstnte n9est ps d(nieD don le prproesseur entre l9intrieur du ifF v premire instrution qu9il renontre est justement X
1

5 define hipxywhpsgrsi

wintenntD l onstnte est d(nieF v prohine fois que le (hier ser inlusD l ondition ne ser plus vrie et don le (hier ne risque plus d9tre inlus nouveuF fien entenduD vous ppelez votre onstnte omme vous voulezF woiD je l9ppelle DEF_NOMDUFICHIER pr hitudeF ge qui ompte en revnheD et j9espre que vous l9viez ien omprisD 9est de hnger de nom de onstnte hque (hier .h di'rentF sl ne fut ps que soit l mme onstnte pour tous les (hiers .hD sinon seul le premier (hier .h serit lu et ps les utres 3 ous remplerez don NOMDUFICHIER pr le nom de votre (hier .hF
Je vous invite aller consulter les .h des bibliothques standard sur votre disque dur. Vous verrez qu'ils sont TOUS construits sur le mme principe (un #ifndef au dbut et un #endif la n). Ils s'assurent ainsi qu'il ne pourra pas y avoir d'inclusions innies.

PHH

LES CONDITIONS

En rsum
! ve prproesseur est un progrmme qui nlyse votre ode soure et y e'etue des modi(tions vnt l ompiltionF ! v9instrution de prproesseur #include insre le ontenu d9un utre (hierF ! v9instrution #define d(nit une onstnte de prproesseurF ille permet de remE pler un motEl pr une vleur dns le ode soureF ! ves mros sont des moreux de ode tout prts d(nis l9ide d9un #defineF sls peuvent epter des prmtresF ! sl est possile d9rire des onditions en lngge prproesseur pour hoisir e qui ser ompilF yn utilise notmment les motsEls #ifD #elif et #endifF ! our viter qu9un (hier .h ne soit inlus un nomre in(ni de foisD on le protge l9ide d9une ominison de onstntes de prproesseur et de onditionsF ous vos futurs (hiers .h devront tre protgs de ette mnireF

PHI

CHAPITRE 14. LE PRPROCESSEUR

PHP

Chapitre

15
Dicult :

Crez vos propres types de variables

e langage C nous permet de faire quelque chose de trs puissant : crer nos propres types de variables. Des  types de variables personnaliss , nous allons en voir deux sortes : les structures et les numrations. Crer de nouveaux types de variables devient indispensable quand on cherche faire des programmes plus complexes. Ce n'est (heureusement) pas bien compliqu comprendre et manipuler. Restez attentifs tout de mme parce que nous rutiliserons les structures tout le temps partir du prochain chapitre. Il faut savoir que les bibliothques dnissent gnralement leurs propres types. Vous ne tarderez donc pas manipuler un type de variable Fichier ou encore, un peu plus tard, d'autres de types Fenetre, Audio, Clavier, etc.

PHQ

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

Dnir une structure


ne struture est un ssemlge de vriles qui peuvent voir di'rents typesF gontriE rement ux tleux qui vous oligent utiliser le mme type dns tout le tleuD vous pouvez rer une struture omportnt des vriles de types longD charD int et double l foisF ves strutures sont gnrlement d(nies dns les (hiers .hD u mme titre don que les prototypes et les defineF oii un exemple de struture X
1 2 3 4 5 6 7

strut xomheotretruture { int vrileI Y int vrileP Y int utrerile Y doule nomreheiml Y }Y

ne d(nition de struture ommene pr le motEl structD suivi du nom de votre struture @pr exemple FichierD ou enore EcranAF
J'ai personnellement l'habitude de nommer mes structures en suivant les mmes rgles que pour les noms de variables, except que je mets la premire lettre en majuscule pour pouvoir faire la dirence. Ainsi, quand je vois le mot ageDuCapitaine dans mon code, je sais que c'est une variable car cela commence par une lettre minuscule. Quand je vois MorceauAudio je sais qu'il s'agit d'une structure (un type personnalis) car cela commence par une majuscule.

eprs le nom de votre strutureD vous ouvrez les oldes et les fermez plus loinD omme pour une fontionF
Attention, ici c'est particulier : vous DEVEZ mettre un point-virgule aprs l'accolade fermante. C'est obligatoire. Si vous ne le faites pas, la compilation plantera.

it mintenntD que mettre entre les oldes c g9est simpleD vous y plez les vriles dont est ompose votre strutureF ne struture est gnrlement ompose d9u moins deux  sousEvriles D sinon elle n9 ps trop d9intrtF gomme vous le voyezD l rtion d9un type de vrile personnlis n9est ps ien omplexeF outes les strutures que vous verrez sont en fit des  ssemlges de vriles de type de seD omme longD intD doubleD etF sl n9y ps de mirleD un type Fichier n9est don ompos que de nomres de se 3 PHR

DFINIR UNE STRUCTURE

Exemple de structure
smginons pr exemple que vous vouliez rer une vrile qui stoke les oordonnes d9un point l9rnF ous urez trs ertinement esoin d9une struture omme el lorsque vous ferez des jeux Ph dns l prtie suivnteD 9est don l9osion de s9vner un peuF our eux hez qui le mot  gomtrie provoque des ppritions de outons inexpliE les sur tout le visgeD l (gF ISFI v fire o0e de petit rppel fondmentl sur l PhF

Figure ISFI ! esisses et ordonnes

vorsqu9on trville en Ph @P dimensionsAD on deux xes X l9xe des sisses @de guhe droiteA et l9xe des ordonnes @de s en hutAF yn l9hitude d9exprimer les sisses pr une vrile ppele xD et les ordonnes pr yF tesEvous ples d9rire une struture Coordonnees qui permette de stoker l fois l vleur de l9sisse @xA et elle de l9ordonne @yA d9un point c ellonsD llonsD e n9est ps ien di0ile X
1 2 3 4 5

strut goordonnees { int x Y GG esisses int y Y GG yrdonn es }Y

xotre struture s9ppelle Coordonnees et est ompose de deux vrilesD x et yD 9estE Edire de l9sisse et de l9ordonneF i on le voulitD on pourrit filement fire une struture Coordonnees pour de l Qh X il su0rit d9jouter une troisime vrile @pr exemple zA qui indiquerit l huteurF eve D nous urions une struture fite pour grer des points en Qh dns l9espe 3

Tableaux dans une structure


ves strutures peuvent ontenir des tleuxF tome ienD on v pouvoir insi pler des tleux de char @hnes de rtresA sns prolme 3 ellezD imginons une struture Personne qui stokerit diverses informtions sur une personne X PHS

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES


1 2 3 4 5 6 7 8 9

strut ersonne { hr nom IHH Y hr prenom IHH Y hr dresse IHHH Y int ge Y int gron Y GG fool en X I a gr on D H a fille

}Y

gette struture est ompose de inq sousEvrilesF ves trois premires sont des hnes qui stokeront le nomD le prnom et l9dresse de l personneF ves deux dernires stokent l9ge et le sexe de l personneF ve sexe est un oolenD I a vri a gronD H a fux a (lleF gette struture pourrit servir rer un progrmme de rnet d9dressesF fien enE tenduD vous pouvez rjouter des vriles dns l struture pour l omplter si vous le voulezF sl n9y ps de limite u nomre de vriles dns une strutureF

Utilisation d'une structure


wintennt que notre struture est d(nie dns le .hD on v pouvoir l9utiliser dns une fontion de notre (hier .cF oii omment rer une vrile de type Coordonnees @l struture qu9on d(nie plus hutA X
1

5 inlude 4 min F h 4 GG snlusion du F h qui ontient les prototypes et strutures int min @ int rg D hr B rgv A { strut goordonnees point Y GG gr tion d ' une vrile 4 point 4 de type goordonnees } return H Y

2 3 4 5

6 7 8

xous vons insi r une vrile point de type CoordonneesF gette vrile est uE tomtiquement ompose de deux sousEvriles X x et y @son sisse et son ordonneAF
Faut-il obligatoirement crire le mot-cl variable ?
struct

lors de la dnition de la

yui X el permet l9ordinteur de di'renier un type de se @omme intA d9un type personnlisD omme CoordonneesF outefoisD les progrmmeurs trouvent souvent un peu lourd de mettre le mot struct hque d(nition de vrile personnliseF our rgler e prolmeD ils ont invent une instrution spile X le typedefF PHT

UTILISATION D'UNE STRUCTURE

Le typedef
etournons dns le (hier .h qui ontient l d(nition de notre struture de type CoordonneesF xous llons jouter une instrution ppele typedef qui sert rer un lis de strutureD 9estEEdire dire qu9rire telle hose quivut rire telle utre hoseF xous llons jouter une ligne ommennt pr typedef juste vnt l d(nition de l struture X
1 2 3 4 5 6

typedef strut goordonnees goordonnees Y strut goordonnees { int x Y int y Y }Y

gette ligne doit tre doupe en trois moreux @nonD je n9i ps gy le mot Coordonnees 3A X ! typedef X indique que nous llons rer un lis de struture Y ! struct Coordonnees X 9est le nom de l struture dont vous llez rer un lis @9estEEdire un  quivlent A Y ! Coordonnees X 9est le nom de l9quivlentF in lirD ette ligne dit  rire le mot Coordonnees est dsormis quivlent rire struct Coordonnees F in fisnt elD vous n9urez plus esoin de mettre le mot struct hque d(nition de vrile de type CoordonneesF yn peut don retourner dns notre main et rire tout simplement X
1 2 3

4 5

int min @ int rg D hr B rgv A { goordonnees point Y GG v ' ordinteur omprend qu ' il s ' git de 4 strut goordonnees 4 gr e u typedef return H Y }

te vous reommnde de fire un typedef omme je l9i fit ii pour CoordonneesF v pluprt des progrmmeurs font omme elF leur vite d9voir rire le mot struct prtout F
1

Modier les composantes de la structure


wintennt que notre vrile point est reD nous voulons modi(er ses oordonnesF gomment der u x et u y de point c gomme ei X
1 2 3

int min @ int rg D hr B rgv A { goordonnees point Y


1. Un bon programmeur est un programmeur fainant ! Il en crit le moins possible.

PHU

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES


4 5 6 7 8 9

point F x a IH Y point F y a PH Y } return H Y

yn insi modi( l vleur de pointD en lui donnnt une sisse de IH et une ordonne de PHF xotre point se situe dsormis l position @IH Y PHA F our der don hque omposnte de l strutureD vous devez rire X
2 1

vrile F nomhevgomposnte

ve point fit l sprtion entre l vrile et l omposnteF i on prend l struture Personne que nous vons vue tout l9heure et qu9on demnde le nom et le prnomD on devr fire omme X
1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { ersonne utilisteur Y printf @ 4 uel est votre nom c 4 A Y snf @ 4 7 s 4 D utilisteur F nom A Y printf @ 4 otre prenom c 4 A Y snf @ 4 7 s 4 D utilisteur F prenom A Y printf @ 4 ous vous ppelez 7 s 7 s 4 D utilisteur F prenom D utilisteur F nom A Y } return H Y

11 12 13

uel est votre nom c hupont otre prenom c ten ous vous ppelez ten hupont

yn envoie l vrile utilisateur.nom scanf qui rir diretement dns notre vrile utilisateurF yn fit de mme pour prenomD et on pourrit ussi le fire pour l9dresseD l9ge et le sexeD mis je n9i gure envie de me rpter F ous uriez pu fire l mme hose sns onntre les struturesD en rnt juste une vrile nom et une utre prenomF wis l9intrt ii est que vous pouvez rer une utre vrile de type Personne qui ur ussi son propre nomD son propre prnomD etF yn peut don fire X
3 1

ersonne joueurI D joueurP Y


2. C'est la notation mathmatique d'une coordonne. 3. Je dois tre programmeur, c'est pour a. ;-)

PHV

UTILISATION D'UNE STRUCTURE

F F F et stoker insi les informtions sur hque joueurF ghque joueur son propre nomD son propre prnomD etF yn peut mme fire enore mieux X on peut rer un tleu de Personne 3 g9est file fire X
1

ersonne joueurs P Y

it ensuiteD vous dez pr exemple u nom du joueur no H en tpnt X


1

joueurs H F nom

v9vntge d9utiliser un tleu iiD 9est que vous pouvez fire une oule pour demnE der les infos du joueur I et du joueur PD sns voir rpter deux fois le mme odeF sl su0t de prourir le tleu joueur et de demnder hque fois nomD prnomD dresseF F F Exercice X rez e tleu de type Personne et demndez les infos de hun gre une oule @qui se rpte tnt qu9il y des joueursAF pites un petit tleu de P joueurs pour ommenerD mis si vous museD vous pourrez grndir l tille du tleu plus trdF e0hez l (n du progrmme les infos que vous vez reueillies sur hun des joueursF

Initialiser une structure


our les strutures omme pour les vrilesD tleux et pointeursD il est vivement onseill de les initiliser ds leur rtion pour viter qu9elles ne ontiennent  n9imE porte quoi F in e'etD je vous le rppelleD une vrile qui est re prend l vleur de e qui se trouve en mmoire l o elle t pleF rfois ette vleur est HD prfois 9est un rsidu d9un utre progrmme qui est pss pr l vnt vous et l vrile lors une vleur qui n9 uun sensD omme EVRSUHF our rppelD voii omment on initilise X ! une variable X on met s vleur H @s le plus simpleA Y ! un pointeur X on met s vleur NULLF NULL est en fit un #define situ dns stdlib.h qui vut gnrlement HD mis on ontinue utiliser NULLD pr onventionD sur les pointeurs pour ien voir qu9il s9git de pointeurs et non de vriles ordinires Y ! un tableau X on met hune de ses vleurs HF our les struturesD l9initilistion v un peu ressemler elle d9un tleuF in e'etD on peut fire l dlrtion de l vrile X
1

goordonnees point a {H D H }Y

gel d(nirD dns l9ordreD point.x = 0 et point.y = 0F evenons l struture Personne @qui ontient des hnesAF ous vez ussi le droit d9initiliser une hne en rivnt juste "" @rien entre les guillemetsAF te ne vous i ps prl de ette possiilit dns le hpitre sur les hnesD mis il n9est ps trop trd pour l9pprendreF yn peut don initiliser dns l9ordre nomD prenomD adresseD age et garcon omme ei X PHW

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES


1

ersonne utilisteur a { 4 4 D 4 4 D 4 4 D H D H }Y

outefoisD j9utilise ssez peu ette tehniqueD personnellementF te prfre envoyer pr exemple m vrile point une fontion initialiserCoordonnees qui se hrge de fire les initilistions pour moi sur m vrileF our fire el il fut envoyer un pointeur de m vrileF in e'et si j9envoie juste m vrileD une opie en ser rlise dns l fontion @omme pour une vrile de seA et l fontion modi(er les vleurs de l opie et non elle de m vrie vrileF evoyez le (l rouge du hpitre sur les pointeurs si vous vez ouli omment el fontionneF sl v don flloir pprendre utiliser des pointeurs sur des struturesF ves hoses vont ommener se orser un petit peu 3

Pointeur de structure
n pointeur de struture se re de l mme mnire qu9un pointeur de intD de double ou de n9importe quelle utre type de se X
1

goordonnees B point a xvv Y

yn insi un pointeur de Coordonnees ppel pointF gomme un rppel ne fer de ml personneD je tiens vous rpter que l9on urit ussi pu mettre l9toile devnt le nom du pointeurD el revient extement u mme X
1

goordonnees B point a xvv Y

te fis d9illeurs ssez souvent omme elD r pour d(nir plusieurs pointeurs sur l mme ligneD nous sommes oligs de pler l9toile devnt hque nom de pointeur X
1

goordonnees B pointI a xvv D B pointP a xvv Y

Envoi de la structure une fonction


ge qui nous intresse iiD 9est de svoir omment envoyer un pointeur de struture une fontion pour que elleEi puisse modi(er le ontenu de l vrileF yn v fire ei pour et exemple X on v simplement rer une vrile de type Coordonnees dns le main et envoyer son dresse initialiserCoordonneesF gette fontion ur pour rle de mettre tous les lments de l struture HF xotre fontion initialiserCoordonnees v prendre un prmtre X un pointeur sur une struture de type Coordonnees @un Coordonnees*D donAF
1 2 3 4 5 6

int min @ int rg D hr B rgv A { goordonnees monoint Y initilisergoordonnees @8 monoint A Y

PIH

POINTEUR DE STRUCTURE
7 8 9 10 11 12 13

return H Y

void initilisergoordonnees @ goordonnees B point A { GG snitilistion de hun des memres de l struture ii }

w vrile monPoint est don re dns le mainF yn envoie son dresse l fontion initialiserCoordonnees qui rupre ette vrile sous l forme d9un pointeur pE pel point @on urit d9illeurs pu l9ppeler n9importe omment dns l fontionD el n9urit ps eu d9inideneAF fien X mintennt que nous sommes dns initialiserCoordonneesD nous llons iniE tiliser hune des vleurs une uneF sl ne fut ps oulier de mettre une toile devnt le nom du pointeur pour der l vrileF i vous ne le fites psD vous risquez de modi(er l9dresseD et e n9est ps e que nous voulons fireF yui mis voilD prolmeF F F yn ne peut ps vriment fire X
1 2 3 4 5

void initilisergoordonnees @ goordonnees B point A { B point F x a H Y B point F y a H Y }

ge serit trop fileF F F ourquoi on ne peut ps fire c re que le point de sprE tion s9pplique sur le mot point et non sur *point en entierF yrD nous e qu9on veutD 9est der *point pour en modi(er l vleurF our rgler le prolmeD il fut pler des prenthses utour de *pointF gomme elD le point de sprtion s9ppliquer *point et non juste point X
1 2 3 4 5

void initilisergoordonnees @ goordonnees B point A { @B point A F x a H Y @B point A F y a H Y }

ge ode fontionneD vous pouvez testerF v vrile de type Coordonnees t trnsE mise l fontion qui initilis x et y HF
En langage C, on initialise gnralement nos structures avec la mthode simple qu'on a vue plus haut. En C++ en revanche, les initialisations sont plus souvent faites dans des  fonctions . Le C++ n'est en fait rien d'autre qu'une sorte de  super-amlioration  des structures. Bien entendu, beaucoup de choses dcoulent de cela et il faudrait un livre entier pour en parler .
4

4. Chaque chose en son temps.

PII

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

Un raccourci pratique et trs utilis


ous llez voir qu9on mnipuler trs souvent des pointeurs de struturesF our tre frnD je dois mme vous vouer qu9en gD on utilise plus souvent des pointeurs de strutures que des strutures tout ourt F gomme les pointeurs de strutures sont trs utilissD on ser souvent men rire ei X
5 1

@B point A F x a H Y

yui mis voilD enore une fois les progrmmeurs trouvent trop longF ves prenthses utour de *pointD quelle plie 3 elorsD omme les progrmmeurs sont des gens finnts @mis D je l9i dj ditD je roisAD ils ont invent le rouri suivnt X
1

point E b x a H Y

ge rouri onsiste former une )he ve un tiret suivi d9un hevron >F rire point->x est don sgiwix quivlent rire (*point).xF
N'oubliez pas qu'on ne peut utiliser la che que sur un pointeur ! Si vous travaillez directement sur la variable, vous devez utiliser le point comme on l'a vu au dbut.

eprenons notre fontion initialiserCoordonneesF xous pouvons don l9rire omme ei X


1 2 3 4 5

void initilisergoordonnees @ goordonnees B point A { point E b x a H Y point E b y a H Y }

etenez ien e rouri de l )heD nous llons le rutiliser un ertin nomre de foisF it surtoutD ne onfondez ps l )he ve le  point F v )he est rserve ux pointeursD le  point est rserv ux vrilesF tilisez e petit exemple pour vous en souvenir X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { goordonnees monoint Y goordonnees B pointeur a 8 monoint Y monoint F x a IH Y GG yn trville sur une vrile D on utilise le 4 point 4 pointeur E b x a IH Y GG yn trville sur un pointeur D on utilise l fl he

5. Quand je vous disais que les pointeurs vous poursuivraient jusque dans votre tombe, je ne le disais presque pas en rigolant !

PIP

LES NUMRATIONS
9 10

return H Y

yn modi(e l vleur du x IH de deux mnires di'rentesD ii X l premire fois en trvillnt diretement sur l vrileD l seonde fois en pssnt pr le pointeurF

Les numrations
ves numrtions onstituent une fon un peu di'rente de rer ses propres types de vrilesF ne numrtion ne ontient ps de  sousEvriles omme 9tit le s pour les struturesF g9est une liste de  vleurs possiles pour une vrileF ne numrtion ne prend don qu9une se en mmoire et ette se peut prendre une des vleurs que vous d(nissez @et une seule l foisAF oii un exemple d9numrtion X
1 2 3 4 5

typedef enum olume olume Y enum olume { pesfvi D wyix D py }Y

ous noterez qu9on utilise un typedef l ussiD omme on l9 fit jusqu9iiF our rer une numrtionD on utilise le motEl enumF xotre numrtion s9ppelle ii VolumeF g9est un type de vrile personnlis qui peut prendre une des trois vleurs qu9on indiques X soit FAIBLED soit MOYEND soit FORTF yn v pouvoir rer une vrile de type VolumeD pr exemple musiqueD qui stoker le volume tuel de l musiqueF yn peut pr exemple initiliser l musique u volume MOYEN X
1

olume musique a wyix Y

oil qui est fitF lus trd dns le progrmmeD on pourr modi(er l vleur du volume et l mettre soit FAIBLED soit FORTF

Association de nombres aux valeurs


ous vez remrqu que j9i rit les vleurs possiles de l9numrtion en mjusulesF gel devrit vous rppeler les onstntes et les defineD non c in e'etD 9est ssez similire mis e n9est pourtnt ps extement l mme hoseF ve ompilteur ssoie utomtiquement un nomre hune des vleurs possiles de l9numrtionF hns le s de notre numrtion VolumeD FAIBLE vut HD MOYEN vut I et FORT vut PF v9ssoition est utomtique et ommene HF PIQ

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

gontrirement u #defineD 9est le ompilteur qui ssoie MOYEN I pr exempleD et non le prproesseurF eu out du ompteD revient un peu u mmeF in fitD qund on initilis l vrile musique MOYEND on don mis l se en mmoire l vleur IF
En pratique, est-ce utile de savoir que MOYEN vaut 1, FORT vaut 2, etc. ?

xonF in gnrl nous est glF g9est le ompilteur qui ssoie utomtiquement un nomre hque vleurF qre D vous n9vez plus qu9 rire X
1 2 3 4

if @ musique aa wyix A { GG touer l musique u volume moyen }

eu importe l vleur de MOYEND vous lissez le ompilteur se hrger de grer les nomresF v9intrt de tout c g9est que de e fit votre ode est trs lisileF in e'etD tout le monde peut filement lire le if prdent @on omprend ien que l ondition signi(e  i l musique est u volume moyen AF

Associer une valeur prcise


our le momentD 9est le ompilteur qui dide d9ssoier le nomre H l premire vleurD puis ID PD Q dns l9ordreF sl est possile de demnder d9ssoier une vleur prise hque lment de l9numrtionF uel intrt estEe que peut ien voir c ih ien supposons que sur votre ordinteurD le volume soit gr entre H et IHH @H a ps de sonD IHH a IHH 7 du sonAF sl est lors prtique d9ssoier une vleur prise hque lment X
1 2 3 4 5

typedef enum olume olume Y enum olume { pesfvi a IH D wyix a SH D py a IHH }Y

siD le volume FAIBLE orrespondr IH 7 de volumeD le volume MOYEN SH 7D etF yn pourrit filement jouter de nouvelles vleurs possiles omme MUETF yn ssoierit dns e s MUET l vleurF F F H 3 ous vez omprisF

En rsum
! ne struture est un type de vrile personnlis que vous pouvez rer et utiliser dns vos progrmmesF g9est vous de l d(nirD ontrirement ux types de se tels que int et double que l9on retrouve dns tous les progrmmesF PIR

LES NUMRATIONS

! ne struture est ompose de  sousEvriles qui sont en gnrl des vriles de type de se omme int et doubleD mis ussi des tleuxF ! yn de un des omposnts de l struture en sprnt le nom de l vrile et l omposnte d9un point X joueur.prenomF ! i on mnipule un pointeur de struture et qu9on veut der une des omposntesD on utilise une )he l ple du point X pointeurJoueur->prenomF ! ne numrtion est un type de vrile personnlis qui peut seulement prendre une des vleurs que vous prd(nissez X FAIBLED MOYEN ou FORT pr exempleF

PIS

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

PIT

Chapitre

16
Dicult :

Lire et crire dans des chiers

e dfaut avec les variables, c'est qu'elles n'existent que dans la mmoire vive. Une fois votre programme arrt, toutes vos variables sont supprimes de la mmoire et il n'est pas possible de retrouver ensuite leur valeur. Comment peut-on, dans ce cas-l, enregistrer les meilleurs scores obtenus son jeu ? Comment peut-on faire un diteur de texte si tout le texte crit disparat lorsqu'on arrte le programme ? Heureusement, on peut lire et crire dans des chiers en langage C. Ces chiers seront crits sur le disque dur de votre ordinateur : l'avantage est donc qu'ils restent l, mme si vous arrtez le programme ou l'ordinateur. Pour lire et crire dans des chiers, nous allons avoir besoin de rutiliser tout ce que nous avons appris jusqu'ici : pointeurs, structures, chanes de caractres, etc.

PIU

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

Ouvrir et fermer un chier


our lire et rire dns des (hiersD nous llons nous servir de fontions situes dns l iliothque stdio que nous vons dj utiliseF yuiD ette iliothqueEl ontient ussi les fontions printf et scanf que nous onnissons ien 3 wis elle ne ontient ps que X il y ussi d9utres fontionsD notmment des fontions fites pour trviller sur des (hiersF
Toutes les bibliothques que je vous ai fait utiliser jusqu'ici (stdlib.h, stdio.h, math.h, string.h. . .) sont ce qu'on appelle des bibliothques standard. Ce sont des bibliothques automatiquement livres avec votre IDE qui ont la particularit de fonctionner sur tous les OS. Vous pouvez donc les utiliser partout, que vous soyez sous Windows, Linux, Mac ou autre. Les bibliothques standard ne sont pas trs nombreuses et ne permettent de faire que des choses trs basiques, comme ce que nous avons fait jusqu'ici. Pour obtenir des fonctions plus avances, comme ouvrir des fentres, il faudra tlcharger et installer de nouvelles bibliothques. Nous verrons cela bientt !

essurezEvous donD pour ommenerD que vous inluez ien u moins les iliothques stdio.h et stdlib.h en hut de votre (hier .c X
1 2

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b

ges iliothques sont tellement fondmentlesD tellement siquesD que je vous reomE mnde d9illeurs de les inlure dns tous vos futurs progrmmesD quels qu9ils soientF fienF wintennt que les onnes iliothques sont inlusesD nous llons pouvoir ttE quer les hoses srieusesF oii e qu9il fut fire hque fois dns l9ordre qund on veut ouvrir un (hierD que e soit pour le lire ou pour y rireF IF yn ppelle l fontion d9ouverture de chier fopen qui nous renvoie un poinE teur sur le (hierF PF On vrie si l'ouverture a russi @9estEEdire si le (hier existitA en testnt l vleur du pointeur qu9on reuF i le pointeur vut NULLD 9est que l9ouverture du (hier n9 ps fontionnD dns e s on ne peut ps ontinuer @il fut 0her un messge d9erreurAF QF i l9ouverture fontionn @si le pointeur est di'rent de NULL donAD lors on peut s9muser lire et crire dans le chier trvers des fontions que nous verrons un peu plus loinF RF ne fois qu9on termin de travailler sur le chierD il fut penser le  fermer ve l fontion fcloseF xous llons dns un premier temps pprendre nous servir de fopen et fcloseF ne fois que vous surez fire elD nous pprendrons lire le ontenu du (hier et y rire du texteF PIV

OUVRIR ET FERMER UN FICHIER

fopen

: ouverture du chier
1

hns le hpitre sur les hnesD nous nous sommes servis des prototypes des fontions omme d9un  mode d9emploi F g9est omme que les progrmmeurs font en gnrl X ils lisent le prototype et omprennent omment ils doivent utiliser l fontion F oyons justement le prototype de l fontion fopen X
1

psvi B fopen @ onst hr B nomhupihier D onst hr B modeyuverture AY

gette fontion ttend deux prmtres X ! le nom du (hier ouvrir Y ! le mode d9ouverture du (hierD 9estEEdire une indition qui mentionne e que vous voulez fire X seulement rire dns le (hierD seulement le lireD ou les deux l foisF gette fontion renvoieF F F un pointeur sur FILE 3 g9est un pointeur sur une struture de type FILEF gette struture est d(nie dns stdio.hF ous pouvez ouvrir e (hier pour voir de quoi est onstitu le type FILED mis n9 uun intrt en e qui nous onerneF
Pourquoi le nom de la structure est-il tout en majuscules (FILE) ? Je croyais que les noms tout en majuscules taient rservs aux constantes et aux define ?

gette  rgle D 9est moi qui me l suis (xe @et nomre d9utres progrmmeurs suivent l mmeD d9illeursAF n9 jmis t une oligtionF pore est de roire que eux qui ont progrmm stdio ne suivient ps extement les mmes rgles 3 gel ne doit ps vous perturer pour utntF ous verrez d9illeurs que les iliothques que nous tudierons ensuite respetent les mmes rgles que moiD svoir ii mettre juste l premire lettre d9une struture en mjusuleF evenons notre fontion fopenF ille renvoie un FILE*F sl est extrmement importnt de ruprer e pointeur pour pouvoir ensuite lire et rire dns le (hierF xous llons don rer un pointeur de FILE u dut de notre fontion @pr exemple l fontion mainA X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y } return H Y

ve pointeur est initilis NULL ds le dutF te vous rppelle que 9est une rgle fondmentle que d9initiliser ses pointeurs NULL ds le dut si on n9 ps d9utre vleur leur donnerF i vous ne le fites psD vous ugmentez onsidrlement le risque d9erreur pr l suiteF
1. Je reconnais nanmoins que l'on a toujours besoin de quelques petites explications ct quand mme !

PIW

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

Vous noterez qu'il n'est pas ncessaire d'crire struct FILE* fichier = Les crateurs de stdio ont donc fait un typedef comme je vous ai appris le faire il n'y a pas longtemps. Notez que la forme de la structure peut changer d'un OS l'autre (elle ne contient pas forcment les mmes sous-variables partout). Pour cette raison, on ne modiera jamais le contenu d'un FILE directement (on ne fera pas fichier.element par exemple). On passera par des fonctions qui manipulent le FILE notre place.
NULL.

wintenntD nous llons ppeler l fontion fopen et ruprer l vleur qu9elle renvoie dns le pointeur fichierF wis vnt D il fut que je vous explique omment se servir du seond prmtreD le prmtre modeOuvertureF in e'etD il y un ode envoyer qui indiquer l9ordinteur si vous ouvrez le (hier en mode de leture seuleD d9riture seuleD ou des deux l foisF oii les modes d9ouverture possilesF ! "r" : lecture seuleF ous pourrez lire le ontenu du (hierD mis ps y rireF Le ! !
chier doit avoir t cr au pralable.
"w" "a"

: mode d'ajoutF ous rirez dns le (hierD en prtnt de l (n du (hierF ous jouterez don du texte l (n du (hierF Si le chier n'existe pas, il sera cr. ! "r+" : lecture et critureF ous pourrez lire et rire dns le (hierF Le chier doit

Si le chier n'existe pas, il sera cr.

: criture seuleF ous pourrez rire dns le (hierD mis ps lire son ontenuF

! !

"w+" : lecture et criture, avec suppression du contenu au pralableF ve (hier est don d9ord vid de son ontenuD vous pouvez y rireD et le lire ensuiteF

avoir t cr au pralable.

: ajout en lecture / criture la nF ous rivez et lisez du texte prtir de l (n du (hierF Si le chier n'existe pas, il sera cr. our informtionD je ne vous i prsent qu9une prtie des modes d9ouvertureF sl y en le douleD en rlit 3 our hque mode qu9on vu lD si vous joutez un "b" prs le premier rtre @"rb"D "wb"D "ab"D "rb+"D "wb+"D "ab+"AD lors le (hier est ouvert en mode inireF g9est un mode un peu prtiulier que nous ne verrons ps iiF in fitD le mode texte est fit pour stokerF F F du texte omme le nom l9indique @uniquement des rtres 0hlesAD tndis que le mode inire permet de stokerF F F des informtions otet pr otet @des nomresD priniplementAF g9est sensilement di'rentF ve fontionnement est de toute fon qusiment le mme que elui que nous llons voir iiF ersonnellementD j9utilise souvent "r" @letureAD "w" @ritureA et "r+" @leture et riE tureAF ve mode "w+" est un peu dngereux pre qu9il vide de suite le ontenu du (hierD sns demnde de on(rmtionF sl ne doit tre utilis que si vous voulez d9ord rinitiliser le (hierF ve mode d9jout @"a"A peut tre utile dns ertins sD si vous voulez seulement jouter des informtions l (n du (hierF
"a+"

Si le chier n'existe pas, il sera cr.

Si vous avez juste l'intention de lire un chier, il est conseill de mettre "r". Certes, le mode "r+" aurait fonctionn lui aussi, mais en mettant "r" vous vous assurez que le chier ne pourra pas tre modi, ce qui est en quelque sorte une scurit.

PPH

OUVRIR ET FERMER UN FICHIER

i vous rivez une fontion chargerNiveau @pour hrger le niveu d9un jeuD pr exempleAD le mode "r" su0tF i vous rivez une fontion enregistrerNiveauD le mode "w" ser lors dptF ve ode suivnt ouvre le (hier test.txt en mode "r+" @leture G ritureA X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y } return H Y

ve pointeur fichier devient lors un pointeur sur test.txtF


O doit tre situ test.txt ?

sl doit tre situ dns le mme dossier que votre exutle @.exeAF our les esoins de e hpitreD rez un (hier test.txt omme moi dns le mme dossier que le .exe @(gF ITFIAF

Figure ITFI ! ve (hier doit tre pl dns le mme dossier que l9exutle

gomme vous le voyezD je trville tuellement ve l9shi gode: :floksD e qui explique PPI

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

l prsene d9un (hier de projet .cbp @u lieu de .slnD si vous vez isul gCC pr exempleAF frefD e qui ompte 9est de ien voir que mon progrmme @tests.exeA est situ dns le mme dossier que le (hier dns lequel on v lire et rire @test.txtAF
Le chier doit-il tre de type .txt ?

xonF g9est vous qui hoisissez l9extension lorsque vous ouvrez le (hierF ous pouvez trs ien inventer votre propre formt de (hier .niveau pour enregistrer les niveux de vos jeux pr exempleF
Le chier doit-il tre obligatoirement dans le mme rpertoire que l'excutable ?

xon plusF sl peut tre dns un sousEdossier X


1

fihier a fopen @ 4 dossier G test F txt 4 D 4 r C 4 A Y

siD le (hier test.txt est dns un sousEdossier ppel dossierF gette mthodeD que l9on ppelle chemin relatif est plus prtiqueF gomme D el fontionner peu importe l9endroit o est instll votre progrmmeF sl est ussi possile d9ouvrir un utre (hier n9importe o illeurs sur le disque durF hns e sD il fut rire le hemin omplet @e qu9on ppelle le chemin absolu A X
1

fihier a fopen @ 4 g X rogrm piles xotepd CC redme F txt 4 D 4 rC 4AY

ge ode ouvre le (hier readme.txt situ dns C:\Program

Files\Notepad++F

J'ai d mettre deux antislashs \ chaque fois comme vous l'avez remarqu. En eet, si j'en avais crit un seul, votre ordinateur aurait cru que vous essayiez d'insrer un symbole spcial comme \n ou \t. Pour crire un antislash dans une chane, il faut donc l'crire deux fois ! Votre ordinateur comprend alors que c'est bien le symbole \ que vous vouliez utiliser.

ve dfut des hemins solusD 9est qu9ils ne fontionnent que sur un y prisF ge n9est ps une solution portleD donF i vous viez t sous vinuxD vous uriez d rire un hemin ElElinuxD tel que X
1

fihier a fopen @ 4 G home G mteo G dossier G redme F txt 4 D 4 r C 4 A Y

te vous reommnde don d9utiliser des hemins reltifs plutt que des hemins solusF x9utilisez les hemins solus que si votre progrmme est fit pour un y pris et doit modi(er un (hier pris quelque prt sur votre disque durF PPP

OUVRIR ET FERMER UN FICHIER

Tester l'ouverture du chier


ve pointeur fichier devrit ontenir l9dresse de l struture de type FILE qui sert de desripteur de (hierF geluiEi t hrg en mmoire pour vous pr l fontion fopen()F prtir de lD deux possiilits X ! soit l9ouverture russiD et vous pouvez ontinuer @9estEEdire ommener lire et rire dns le (hierA Y ! soit l9ouverture hou pre que le (hier n9existit ps ou tit utilis pr un utre progrmmeF hns e sD vous devez rrter de trviller sur le (hierF tuste prs l9ouverture du (hierD il fut imprtivement vri(er si l9ouverture russi ou nonF our fire D 9est trs simple X si le pointeur vut NULLD l9ouverture houF 9il vut utre hose que NULLD l9ouverture russiF yn v don suivre systmtiquement le shm suivnt X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y if @ fihier 3a xvv A { GG yn peut lire et rire dns le fihier } else { GG yn ffihe un messge d ' erreur si on veut printf @ 4 smpossile d ' ouvrir le fihier test F txt 4 A Y } } return H Y

pites toujours el lorsque vous ouvrez un (hierF i vous ne le fites ps et que le (hier n9existe psD vous risquez un plntge du progrmme pr l suiteF
fclose

: fermer le chier

i l9ouverture du (hier russiD vous pouvez le lire et y rire @nous llons voir sous peu omment fireAF ne fois que vous urez (ni de trviller ve le (hierD il fudr le  fermer F yn utilise pour el l fontion fclose qui pour rle de lirer l mmoireD 9estEEdire supprimer votre (hier hrg dns l mmoire viveF on prototype est X
1

int flose @ psvi B pointeururpihier A Y

gette fontion prend un prmtre X votre pointeur sur le (hierF ille renvoie un int qui indique si elle russi fermer le (hierF get int vut X PPQ

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

! 0 X si l fermeture mrh Y ! EOF X si l fermeture houF EOF est un define situ dns stdio.h qui orrespond un nomre spilD utilis pour dire soit qu9il y eu une erreurD soit que nous sommes rrivs l (n du (hierF hns le s prsent el signi(e qu9il y eu une erreurF e prioriD l fermeture se psse toujours ien X je n9i don ps l9hitude de tester si le fclose mrhF ous pouvez nnmoins le fire si vous le voulezF our fermer le (hierD on v don rire X
1

flose @ fihier A Y

eu (nlD le shm que nous llons suivre pour ouvrir et fermer un (hier ser le suivnt X
1 2 3 4 5 6 7 8 9 10 11 12 13

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y if @ fihier 3a xvv A { GG yn lit et on rit dns le fihier GG FFF flose @ fihier A Y GG yn ferme le fihier qui t ouvert

14 15 16 17

} }

return H Y

te n9i ps mis le else ii pour 0her un messge d9erreur si l9ouverture houD mis vous pouvez le fire si vous le dsirezF sl fut toujours penser fermer son (hier une fois que l9on (ni de trviller veF gel permet de lirer de l mmoireF i vous ouliez de lirer l mmoireD votre progrmme risque l (n de prendre normment de mmoire qu9il n9utilise plusF ur un petit exemple omme e n9est ps )grntD mis sur un gros progrmmeD onjour les dgts 3 yulier de lirer l mmoireD rriveF vous rriver d9illeurs trs ertinementF hns e sD vous serez tmoins de e que l9on ppelle des fuites mmoire F otre proE grmme se mettr lors utiliser plus de mmoire que nessire sns que vous rriviez omprendre pourquoiF fien souventD il s9git simplement d9un ou deux  dtils omme des petits fclose oulisF PPR

DIFFRENTES MTHODES DE LECTURE / CRITURE

Direntes mthodes de lecture / criture


wintennt que nous vons rit le ode qui ouvre et ferme le (hierD nous n9vons plus qu9 insrer le ode qui le lit et y ritF xous llons ommener pr voir omment rire dns un (hier @e qui est un peu plus simpleAD puis nous verrons ensuite omment lire dns un (hierF

crire dans le chier


sl existe plusieurs fontions ples d9rire dns un (hierF ge ser vous de hoisir elle qui est l plus dpte votre sF oii les trois fontions que nous llons tudier X ! fputc X rit un rtre dns le (hier @x iv rtre l foisA Y ! fputs X rit une hne dns le (hier Y ! fprintf X rit une hne  formte dns le (hierD fontionnement qusiEidentique printfF
fputc

gette fontion rit un rtre l fois dns le (hierF on prototype est X


1

int fput @ int rtere D psvi B pointeururpihier A Y

ille prend deux prmtresF ! ve rtre rire @de type intD e qui omme je vous l9i dit revient plus ou moins utiliser un charD suf que le nomre de rtres utilisles est ii plus grndAF ous pouvez don rire diretement 'A' pr exempleF ! ve pointeur sur le (hier dns lequel rireF hns notre exempleD notre pointeur s9ppelle fichierF v9vntge de demnder le pointeur de (hier hque foisD 9est que vous pouvez ouvrir plusieurs (hiers en mme temps et don lire et rire dns hun de es (hiersF ous n9tes ps limits un seul (hier ouvert l foisF v fontion retourne un intD 9est un ode d9erreurF get int vut EOF si l9riture houD sinon il une utre vleurF gomme le (hier normlement t ouvert ve susD je n9i ps l9hitude de tester si hun de mes fputc russiD mis vous pouvez le fire enore une fois si vous le voulezF ve ode suivnt rit l lettre 'A' dns test.txt @si le (hier existeD il est rempl Y s9il n9existe psD il est rAF sl y tout dns e ode X ouvertureD test de l9ouvertureD riture et fermetureF
1 2 3 4 5 6 7

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A

PPS

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


8 9 10 11 12 13 14

{ } }

fput @ ' e ' D fihier A Y GG riture du rt re e flose @ fihier A Y

return H Y

gopier e ode gode we X SIUWRR  yuvrez votre (hier test.txtF ue voyezEvous c g9est mgiqueD le (hier ontient minE tennt l lettre 'A' omme le montre l (gF ITFPF

Figure ITFP ! ve (hier ontient dsormis l lettre 9e9


fputs

gette fontion est trs similire fputcD l di'rene prs qu9elle rit tout une hneD e qui est en gnrl plus prtique que d9rire rtre pr rtreF gel ditD fputc reste utile lorsque vous devez rire rtre pr rtreD e qui rrive frquemmentF rototype de l fontion X
1

hr B fputs @ onst hr B hine D psvi B pointeururpihier A Y

ves deux prmtres sont files omprendreF ! chaine X l hne rireF xotez que le type ii est const char* X en joutnt le mot const dns le prototypeD l fontion indique que pour elle l hne ser onsidre omme une onstnteF in un mot omme en ent X elle s9interdit de modi(er le ontenu de votre hneF g9est logique qund on y pense X fputs doit juste lire votre hneD ps l modi(erF g9est don pour vous une informtion @et une suritA omme quoi votre hne ne suir ps de modi(tionF ! pointeurSurFichier X omme pour fputcD il s9git de votre pointeur de type FILE* sur le (hier que vous vez ouvertF v fontion renvoie EOF s9il y eu une erreurD sinon 9est que el fontionnF v non plusD je ne teste en gnrl ps l vleur de retourF PPT

DIFFRENTES MTHODES DE LECTURE / CRITURE

estons l9riture d9une hne dns le (hier X


1 2 3 4 5 6 7 8 9

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A { fputs @ 4 lut les rHs ngomment llez E vous c 4 D fihier A Y flose @ fihier A Y } } return H Y

10 11 12 13 14

gopier e ode gode we X VRHTVU  v (gF ITFQ prsente le (hier une fois modi( pr le progrmmeF

Figure ITFQ ! ve (hier ontient dsormis notre hne


fprintf

oii un utre exemplire de l fontion printfF gelleEi peut tre utilise pour rire dns un (hierF ille s9utilise de l mme mnire que printf d9illeursD exept le fit que vous devez indiquer un pointeur de FILE en premier prmtreF ge ode demnde l9ge de l9utilisteur et l9rit dns le (hier @rsultt (gF ITFRA X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int ge a H Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A

PPU

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


9 10 11 12 13 14 15

GG yn demnde l ' ge printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 ge A Y GG yn l ' rit dns le fihier fprintf @ fihier D 4 ve wonsieur qui utilise le progrmme D il 7 d ns 4 D ge A Y flose @ fihier A Y

16 17 18 19 20

} }

return H Y

gopier e ode gode we X IIWHQW 

Figure ITFR ! riture dns un (hier ve fprintf

ous pouvez insi filement rutiliser e que vous svez de printf pour rire dns un (hier 3 g9est pour ette rison d9illeurs que j9utilise le plus souvent fprintf pour rire dns des (hiersF

Lire dans un chier


xous pouvons utiliser qusiment les mmes fontions que pour l9ritureD le nom hnge juste un petit peu X ! fgetc X lit un rtre Y ! fgets X lit une hne Y ! fscanf X lit une hne formteF te vis ette fois ller un peu plus vite dns l9explition de es fontions X si vous vez ompris e que j9i rit plus hutD ne devrit ps poser de prolmeF
fgetc

out d9ord le prototype X


1

int fget @ psvi B pointeurhepihier A Y

PPV

DIFFRENTES MTHODES DE LECTURE / CRITURE

gette fontion retourne un int X 9est le rtre qui t luF i l fontion n9 ps pu lire de rtreD elle retourne EOFF
Mais comment savoir quel caractre on lit ? Si on veut lire le troisime caractre, ainsi que le dixime caractre, comment doit-on faire ?

in fitD u fur et mesure que vous lisez un (hierD vous vez un  urseur qui vneF g9est un urseur virtuel ien entenduD vous ne le voyez ps l9rnF ous pouvez imginer que e urseur est omme l rre lignotnte lorsque vous ditez un (hier sous floExotesF sl indique o vous en tes dns l leture du (hierF xous verrons peu prs omment svoir quelle position le urseur est situ dns le (hier et glement omment modi(er l position du urseur @pour le remettre u dut du (hier pr exempleD ou le pler un rtre prisD omme le dixime rtreAF fgetc vne le urseur d9un rtre hque fois que vous en lisez unF i vous pE pelez fgetc une seonde foisD l fontion lir don le seond rtreD puis le troisime et insi de suiteF ous pouvez don fire une oule pour lire les rtres un pr un dns le (hierF yn v rire un ode qui lit tous les rtres d9un (hier un un et qui les rit hque fois l9rnF v oule s9rrte qund fgetc renvoie EOF @qui signi(e  ind yf pile D 9estEEdire  (n du (hier AF
1 2 3 4 5 6 7 8 9 10 11 12 13

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int rtereetuel a H Y fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { GG foule de leture des rt res un un do { rtereetuel a fget @ fihier A Y GG yn lit le rt re printf @ 4 7 4 D rtereetuel A Y GG yn l ' ffihe } while @ rtereetuel 3a iyp A Y GG yn ontinue tnt que fget n ' ps retourn iyp @ fin de fihier A } } flose @ fihier A Y

14 15

16 17 18 19 20 21

return H Y

PPW

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

gopier e ode gode we X UQPTQP  v onsole 0her tout le ontenu du (hierD pr exemple X
gouou D je suis le ontenu du fihier test F txt 3

fgets

gette fontion lit une hne dns le (hierF vous vite d9voir lire tous les rE tres un pr unF v fontion lit au maximum une ligne @elle s9rrte u premier \n qu9elle renontreAF i vous voulez lire plusieurs lignesD il fudr fire une ouleF oii le prototype de fgets X
1

hr B fgets @ hr B hine D int nrehegrteresevire D psvi B pointeururpihier A Y

gette fontion demnde un prmtre un peu prtiulierD qui v en fit s9vrer trs prtique X le nomre de rtres lireF gel demnde l fontion fgets de s9rrter de lire l ligne si elle ontient plus de rtresF evntge X nous permet de nous ssurer que l9on ne fer ps de dpssement de mmoire 3 in e'etD si l ligne est trop grosse pour rentrer dns chaineD l fontion urit lu plus de rtres qu9il n9y de pleD e qui urit prolement provoqu un plntge du progrmmeF xous llons d9ord voir omment lire une ligne ve fgets @nous verrons ensuite omment lire tout le (hierAF our elD on re une hne su0smment grnde pour stoker le ontenu de l ligne qu9on v lire F ous llez voir l tout l9intrt d9utiliser un define pour d(nir l tille du tleu X
2 1 2 3 4 5 6

5 define esvviwe IHHH GG leu de tille IHHH int min @ int rg D hr B rgv A { psvi B fihier a xvv Y hr hine esvviwe a 4 4 Y GG gh ne vide de tille esvviwe fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { fgets @ hine D esvviwe D fihier A Y GG yn lit mximum esvviwe rt res du fihier D on stoke le tout dns 4 hine 4 printf @ 4 7 s 4 D hine A Y GG yn ffihe l h ne
2. Du moins on l'espre, car on ne peut pas en tre sr 100 %.

7 8 9 10 11 12

13 14

PQH

DIFFRENTES MTHODES DE LECTURE / CRITURE


15 16 17 18 19

} }

flose @ fihier A Y

return H Y

gopier e ode gode we X VQHWWP  ve rsultt est le mme que pour le ode de tout l9heureD svoir que le ontenu s9rit dns l onsole X
gouou D je suis le ontenu du fihier test F txt 3

v di'reneD 9est qu9ii on ne fit ps de ouleF yn 0he toute l hne d9un oupF ous urez srement remrqu mintennt l9intrt que peut voir un #define dns son ode pour d(nir l tille mximle d9un tleu pr exempleF in e'etD TAILLE_MAX est ii utilis deux endroits du ode X ! une premire fois pour d(nir l tille du tleu rer Y ! une utre fois dns le fgets pour limiter le nomre de rtres lireF v9vntge iiD 9est que si vous vous rendez ompte que l hne n9est ps ssez grnde pour lire le (hierD vous n9vez qu9 hnger l ligne du define et reompilerF gel vous vite d9voir herher tous les endroits du ode qui indiquent l tille du tleuF ve prproesseur rempler tous les TAILLE_MAX dns le ode pr leur nouvelle vleurF gomme je vous l9i ditD fgets lit u mximum toute une ligne l foisF ille s9rrte de lire l ligne si elle dpsse le nomre mximum de rtres que vous utorisezF yui mis voil X pour le momentD on ne sit lire qu9une seule ligne l fois ve fgetsF gomment dile lire tout le (hier c v rponse est simple X ve une oule 3 v fontion fgets renvoie NULL si elle n9est ps prvenue lire e que vous vez demndF v oule doit don s9rrter ds que fgets se met renvoyer NULLF yn n9 plus qu9 fire un while pour ouler tnt que fgets ne renvoie ps NULL X
1 2 3 4 5 6 7 8 9 10 11 12

5 define esvviwe IHHH int min @ int rg D hr B rgv A { psvi B fihier a xvv Y hr hine esvviwe a 4 4 Y fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { while @ fgets @ hine D esvviwe D fihier A 3a xvv A GG yn lit le fihier tnt qu ' on ne re oit ps d ' erreur @ xvv A

PQI

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


13 14

{ } } }

printf @ 4 7 s 4 D hine A Y GG yn ffihe l h ne qu ' on vient de lire

15 16 17 18 19 20 21

flose @ fihier A Y

return H Y

gopier e ode gode we X RWWUWQ  ge ode soure lit et 0he tout le ontenu de mon (hierD ligne pr ligneF v ligne de ode l plus intressnte est elle du while X
1

while @ fgets @ hine D esvviwe D fihier A 3a xvv A

v ligne du while fit deux hoses X elle lit une ligne dns le (hier et vri(e si fgets ne renvoie ps NULLF ille peut don se trduire omme ei X  vire une ligne du (hier tnt que nous ne sommes ps rrivs l (n du (hier F
fscanf

g9est le mme prinipe que l fontion scanfD l enoreF gette fontion lit dns un (hier qui doit voir t rit d9une mnire priseF upposons que votre (hier ontienne trois nomres sprs pr un espeD qui sont pr exemple les trois plus huts sores otenus votre jeu X 15 20 30F ous voudriez ruprer hun de es nomres dns une vrile de type intF v fontion fscanf v vous permettre de fire rpidementF
1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int sore Q a { H }Y GG leu des Q meilleurs sores fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { fsnf @ fihier D 4 7 d 7 d 7 d 4 D 8 sore H D 8 sore I D 8 sore P A Y printf @ 4 ves meilleurs sores sont X 7d D 7 d et 7 d4 D sore H D sore I D sore P A Y } flose @ fihier A Y

11

12 13 14

PQP

SE DPLACER DANS UN FICHIER


15 16 17

return H Y

gopier e ode gode we X SQHSTI 

ves meilleurs sores sont X IS D PH et QH

gomme vous le voyezD l fontion fscanf ttend trois nomres sprs pr un espe @"%d %d %d"AF ille les stoke ii dns notre tleu de trois losF yn 0he ensuite hun des nomres ruprsF
Jusqu'ici, je ne vous avais fait mettre qu'un seul %d entre guillemets pour la fonction scanf. Vous dcouvrez aujourd'hui qu'on peut en mettre plusieurs, les combiner. Si votre chier est crit d'une faon bien prcise, cela permet d'aller plus vite pour rcuprer chacune des valeurs.

Se dplacer dans un chier


te vous i prl d9une espe de  urseur virtuel tout l9heureF xous llons l9tudier mintennt plus en dtilsF ghque fois que vous ouvrez un (hierD il existe en e'et un urseur qui indique votre position dns le (hierF ous pouvez imginer que 9est extement omme le urseur de votre diteur de texte @tel floExotesAF sl indique o vous tes dns le (hierD et don o vous llez rireF in rsumD le systme de urseur vous permet d9ller lire et rire une position prise dns le (hierF sl existe trois fontions onntre X ! ftell X indique quelle position vous tes tuellement dns le (hier Y ! fseek X positionne le urseur un endroit pris Y ! rewind X remet le urseur u dut du (hier @9est quivlent demnder l fontion fseek de positionner le urseur u dutAF
ftell

: position dans le chier

gette fontion est trs simple utiliserF ille renvoie l position tuelle du urseur sous l forme d9un long X
1

long ftell @ psvi B pointeururpihier A Y

ve nomre renvoy indique don l position du urseur dns le (hierF PQQ

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

fseek

: se positionner dans le chier

ve prototype de fseek est le suivnt X


1

int fseek @ psvi B pointeururpihier D long deplement D int origine A Y

v fontion fseek permet de dpler le urseur d9un ertin nomre de rtres @indiqu pr deplacementA prtir de l position indique pr origineF ! ve nomre deplacement peut tre un nomre positif @pour se dpler en vntAD nul @a HA ou ngtif @pour se dpler en rrireAF ! unt u nomre origineD vous pouvez mettre omme vleur l9une des trois onstntes @gnrlement des defineA listes iEdessous X ! SEEK_SET X indique le dut du (hier Y ! SEEK_CUR X indique l position tuelle du urseur Y ! SEEK_END X indique l (n du (hierF oii quelques exemples pour ien omprendre omment on jongle ve deplacement et origineF ! ve ode suivnt ple le urseur deux rtres aprs le dut X
1

fseek @ fihier D P D iiui A Y

! ve ode suivnt ple le urseur qutre rtres avant l position ournte X


1

fseek @ fihier D ER D iiug A Y

emrquez que deplacement est ngtif r on se dple en rrireF ! ve ode suivnt ple le urseur l (n du (hier X
1

fseek @ fihier D H D iiuixh A Y

i vous rivez prs voir fit un fseek qui mne l (n du (hierD el jouter vos informtions l suite dns le (hier @le (hier ser ompltAF in revnheD si vous plez le urseur u dut et que vous rivezD el rser le texte qui se trouvit lF sl n9y ps de moyen d9 insrer de texte dns le (hier F
3

Mais comment puis-je savoir quelle position je dois aller lire et crire dans le chier ?

g9est vous de le grerF i 9est un (hier que vous vez vousEmmes ritD vous svez omment il est onstruitF ous svez don o ller herher vos informtions X pr exemple les meilleurs sores sont en position HD les noms des derniers joueurs sont en position SHD etF xous trvillerons sur un un peu plus trd dns lequel vous omprendrezD si e n9est ps dj le sD omment on fit pour ller herher l9informtion qui nous intresseF
3. moins de coder soi-mme une fonction qui lit les caractres d'aprs pour s'en souvenir avant de les craser !

PQR

RENOMMER ET SUPPRIMER UN FICHIER

x9ouliez ps que 9est vous qui d(nissez omment votre (hier est onstruitF g9est don vous de dire X  je ple le sore du meilleur joueur sur l premire ligneD elui du seond meilleur joueur sur l seonde ligneD etF
La fonction fseek peut se comporter bizarrement sur des chiers ouverts en mode texte. En gnral, on l'utilise plutt pour se dplacer dans des chiers ouverts en mode binaire. Quand on lit et crit dans un chier en mode texte, on le fait gnralement caractre par caractre. La seule chose qu'on se permet en mode texte avec fseek c'est de revenir au dbut ou de se placer la n.
rewind

: retour au dbut

gette fontion est quivlente utiliser fseek pour nous renvoyer l position H dns le (hierF
1

void rewind @ psvi B pointeururpihier A Y

v9utilistion est ussi simple que le prototypeF ous n9vez ps esoin d9explition supplmentire 3

Renommer et supprimer un chier


xous terminerons e hpitre en doueur pr l9tude de deux fontions trs simples X ! rename X renomme un (hier Y ! remove X supprime un (hierF v prtiulrit de es fontions est qu9elles ne nessitent ps de pointeur de (hier pour fontionnerF sl su0r simplement d9indiquer le nom du (hier renommer ou supprimerF
rename

: renommer un chier

oii le prototype de ette fontion X


1

int renme @ onst hr B nienxom D onst hr B nouveuxom A Y

v fontion renvoie H si elle russi renommerD sinon elle renvoie une vleur di'rente de HF istEil nessire de vous donner un exemple c in voii un X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { renme @ 4 test F txt 4 D 4 testrenomme F txt 4 A Y } return H Y

PQS

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

remove

: supprimer un chier

gette fontion supprime un (hier sns demnder son reste X


1

int remove @ onst hr B fihiereupprimer A Y

Faites trs attention en utilisant cette fonction ! Elle supprime le chier indiqu sans demander de conrmation ! Le chier n'est pas mis dans la corbeille, il est littralement supprim du disque dur. Il n'est pas possible de rcuprer un tel chier supprim .
4

gette fontion tome pi pour l (n du hpitreD je n9i justement plus esoin du (hier test.txtD je peux don me permettre de le supprimer X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { remove @ 4 test F txt 4 A Y } return H Y

4. moins de faire appel des outils spciques de rcupration de chiers sur le disque, mais l'opration peut tre longue, complexe et ne pas russir.

PQT

Chapitre

17
Dicult :

L'allocation dynamique

outes les variables que nous avons cres jusqu'ici taient construites automatiquement par le compilateur du langage C. C'tait la mthode simple. Il existe cependant une faon plus manuelle de crer des variables que l'on appelle l'allocation dynamique. Un des principaux intrts de l'allocation dynamique est de permettre un programme de rserver la place ncessaire au stockage d'un tableau en mmoire dont il ne connaissait pas la taille avant la compilation. En eet, jusqu'ici, la taille de nos tableaux tait xe  en dur  dans le code source. Aprs lecture de ce chapitre, vous allez pouvoir crer des tableaux de faon bien plus exible ! Il est impratif de bien savoir manipuler les pointeurs pour pouvoir lire ce chapitre ! Si vous avez encore des doutes sur les pointeurs, je vous recommande d'aller relire le chapitre correspondant avant de commencer.

PQU

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

und on dlre une vrileD on dit qu9on demande allouer de la mmoire X


1

int monxomre a H Y

vorsque le progrmme rrive une ligne omme elleEiD il se psse en fit les hoses suivntes X IF votre progrmme demnde u systme d9exploittion @indowsD vinuxD w yF F FA l permission d9utiliser un peu de mmoire Y PF le systme d9exploittion rpond votre progrmme en lui indiqunt o il peut stoker ette vrile @il lui donne l9dresse qu9il lui rserveA Y QF lorsque l fontion est termineD l vrile est utomtiquement supprime de l mmoireF otre progrmme dit u systme d9exploittion X  te n9i plus esoin de l9espe en mmoire que tu m9vis rserv telle dresseD meri 3 F tusqu9iiD les hoses tient utomtiquesF vorsqu9on dlrit une vrileD le systme d9exploittion tit utomtiquement ppel pr le progrmmeF ue diriezEvous de fire el mnuellement c xon ps pr pur plisir de fire quelque hose de ompliqu @mme si 9est tentnt 3AD mis plutt pre que nous llons prfois tre oligs de proder omme elF hns e hpitreD nous llons X ! tudier le fontionnement de l mmoire @ouiD enore 3A pour douvrir l tille que prend une vrile en fontion de son type Y ! puis ttquer le sujet luiEmme X nous verrons omment demnder mnuellement de l mmoire u systme d9exploittionF yn fer e qu9on ppelle de l9llotion dynmique de mmoire Y ! en(nD douvrir l9intrt de fire une llotion dynmique de mmoire en pprennt rer un tleu dont l tille n9est onnue qu9 l9exution du progrmmeF
1

La taille des variables


elon le type de vrile que vous demndez de rer @charD intD doubleD floatF F FAD vous vez esoin de plus ou moins de mmoireF in e'etD pour stoker un nomre ompris entre EIPV et IPU @un charAD on n9 esoin que d9un otet en mmoireF g9est tout petitF in revnheD un int oupe gnrlement R otets en mmoireF unt u doubleD il oupe V otetsF ve prolme estF F F que e n9est ps toujours le sF gel dpend des mhines X peutE tre que hez vous un int oupe V otetsD qui sit c xotre ojetif ii est de vri(er quelle tille oupe hun des types sur votre ordinteurF sl y un moyen trs file pour svoir el X utiliser l9oprteur sizeof()F gontriE rement ux pprenesD e n9est ps une fontion mis une fontionnlit de se du
1. L'histoire ne prcise pas si le programme dit vraiment  merci  l'OS, mais c'est tout dans son intrt parce que c'est l'OS qui contrle la mmoire !

PQV

LA TAILLE DES VARIABLES

lngge gF ous devez juste indiquer entre prenthses le type que vous voulez nlyserF our onntre l tille d9un intD on devr don rire X
1

sizeof @ int A

l ompiltionD el ser rempl pr un nomre X le nomre d9otets que prend int en mmoireF ghez moiD sizeof(int) vut RD e qui signi(e que int oupe R otetsF ghez vousD 9est prolement l mme vleurD mis e n9est ps une rgleF estez pour voirD en 0hnt l vleur l9ide d9un printf pr exemple X
1 2 3 4

printf @ 4 hr X 7 d otets n 4 D sizeof @ hr A A Y printf @ 4 int X 7 d otets n 4 D sizeof @ int A A Y printf @ 4 long X 7 d otets n 4 D sizeof @ long A A Y printf @ 4 doule X 7d otets n 4 D sizeof @ doule A A Y

ghez moiD el 0he X


hr X I otets int X R otets long X R otets doule X V otets

te n9i ps mis tous les types que nous onnissonsD je vous lisse le soin de tester vousEmmes l tille des utres typesF ous remrquerez que long et int oupent l mme ple en mmoireF grer un long revient don ii extement rer un intD el prend R otets dns l mmoireF
En fait, le type long est quivalent un type appel long int, qui est ici quivalent au type. . . int. Bref, a fait beaucoup de noms dirents pour pas grand-chose, au nal ! Avoir de nombreux types dirents tait utile une poque o l'on n'avait pas beaucoup de mmoire dans nos ordinateurs. On cherchait utiliser le minimum de mmoire possible en utilisant le type le plus adapt. Aujourd'hui, cela ne sert plus vraiment car la mmoire d'un ordinateur est trs grande .
2

Peut-on acher la taille d'un type personnalis qu'on a cr (une structure) ?

yui 3 sizeof mrhe ussi sur les strutures 3


1 2 3 4

typedef strut goordonnees goordonnees Y strut goordonnees { int x Y

2. En revanche, tous ces types ont encore de l'intrt si vous crez des programmes pour de l'informatique embarque o la mmoire disponible est plus faible. Je pense par exemple aux programmes destins des tlphones portables, des robots, etc.

PQW

CHAPITRE 17. L'ALLOCATION DYNAMIQUE


5 6 7 8 9 10 11 12 13

}Y

int y Y

int min @ int rg D hr B rgv A { printf @ 4 goordonnees X 7 d otets n 4 D sizeof @ goordonnees A A Y } return H Y

goordonnees X V otets

lus une struture ontient de sousEvrilesD plus elle prend de mmoireF errilement logiqueD n9estEe ps c

Une nouvelle faon de voir la mmoire


tusqu9iiD mes shms de mmoire tient enore ssez imprisF yn v en(n pouvoir les rendre vriment pris et orrets mintennt qu9on onnt l tille de hun des types de vrilesF i on dlre une vrile de type int X
1

int nomre a IV Y

F F F et que sizeof(int) indique R otets sur notre ordinteurD lors l vrile ouper R otets en mmoire 3 upposons que l vrile nombre soit lloue l9dresse ITHH en mmoireF yn urit lors le shm de l (gF IUFIF siD on voit ien que notre vrile nombre de type int qui vut IV oupe R otets dns l mmoireF ille ommene l9dresse ITHH @9est son dresseA et termine l9dresse ITHQF v prohine vrile ne pourr don tre stoke qu9 prtir de l9dresse ITHR 3 i on vit fit l mme hose ve un charD on n9urit lors oup qu9un seul otet en mmoire @(gF IUFPAF smginez mintennt un tleu de int 3 ghque  se du tleu ouper R otetsF i notre tleu fit IHH ses X
1

int tleu IHH Y

on ouper lors en rlit R B IHH a RHH otets en mmoireF


Mme si le tableau est vide, il prend 400 octets ?

fien sr 3 v ple en mmoire est rserveD uun utre progrmme n9 le droit d9y touE her @ prt le vtreAF ne fois qu9une vrile est dlreD elle prend immditement PRH

LA TAILLE DES VARIABLES

Figure IUFI ! n int oupnt R otets en mmoire

Figure IUFP ! n char oupnt I otet en mmoire

PRI

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

de l ple en mmoireF xotez que si on re un tleu de type Coordonnees X


1

goordonnees tleu IHH Y

F F F on utiliser ette fois X V B IHH a VHH otets en mmoireF sl est importnt de ien omprendre es petits luls pour l suite du hpitreF

Allocation de mmoire dynamique


introns mintennt dns le vif du sujetF te vous rppelle notre ojetif X pprendre demnder de l mmoire mnuellementF yn v voir esoin d9inlure l iliothque <stdlib.h> F gette iliothque ontient deux fontions dont nous llons voir esoin X ! malloc @ wemory evvygtion D 9estEEdire  ellotion de mmoire A X demnde u systme d9exploittion l permission d9utiliser de l mmoire Y ! free @ virer A X permet d9indiquer l9y que l9on n9 plus esoin de l mmoire qu9on vit demndeF v ple en mmoire est lireD un utre progrmme peut mintennt s9en servir u esoinF und vous fites une llotion mnuelle de mmoireD vous devez toujours suivre es trois tpes X
3

IF ppeler malloc pour demnder de l mmoire Y PF vri(er l vleur retourne pr malloc pour svoir si l9y ien russi llouer l mmoire Y QF une fois qu9on (ni d9utiliser l mmoireD on doit l lirer ve freeF i on ne le fit psD on s9expose des fuites de mmoireD 9estEEdire que votre progrmme risque u (nl de prendre euoup de mmoire lors qu9il n9 en rlit plus esoin de tout et espeF ges trois tpes vous rppellentEelles le hpitre sur les (hiers c illes devrient 3 ve prinipe est extement le mme qu9ve les (hiers X on lloueD on vri(e si l9llotion mrhD on utilise l mmoireD puis on l lire qund on (ni de l9utiliserF
malloc

: demande d'allocation de mmoire

ve prototype de l fontion malloc est ssez omiqueD vous llez voir X


1

void B mllo @ sizet nomreytetsxeessires A Y

3. Si vous avez suivi mes conseils, vous devriez avoir inclus cette bibliothque dans tous vos programmes, de toute faon.

PRP

ALLOCATION DE MMOIRE DYNAMIQUE

v fontion prend un prmtre X le nomre d9otets rserverF einsiD il su0r d9rire sizeof(int) dns e prmtre pour rserver su0smment d9espe pour stoker un intF wis 9est surtout e que l fontion renvoie qui est urieux X elle renvoie unF F F void* 3 i vous vous souvenez du hpitre sur les fontionsD je vous vis dit que void signi(it  vide et qu9on utilisit e type pour indiquer que l fontion ne retournit uune vleurF elors iiD on urit une fontion qui retourne unF F F  pointeur sur vide c in voil une ien onne 3 ges progrmmeurs ont didment un sens de l9humour trs dveloppF ssurezEvousD il y une risonF in fitD ette fontion renvoie un pointeur indiqunt l9dresse que l9y rserve pour votre vrileF i l9y trouv de l ple pour vous l9dresse ITHHD l fontion renvoie don un pointeur ontennt l9dresse ITHHF ve prolmeD 9est que l fontion malloc ne sit ps quel type de vrile vous herhez rerF in e'etD vous ne lui donnez qu9un prmtre X le nomre d9otets en mmoire dont vous vez esoinF i vous demndez R otetsD pourrit ussi ien tre un int qu9un long pr exemple 3 gomme malloc ne sit ps quel type elle doit retournerD elle renvoie le type void*F ge ser un pointeur sur n'importe quel typeF yn peut dire que 9est un pointeur universelF ssons l prtiqueF i je veux m9muser @hum 3A rer mnuellement une vrile de type int en mmoireD je devris indiquer malloc que j9i esoin de sizeof(int) otets en mmoireF te rupre le rsultt du malloc dns un pointeur sur intF
1 2 3

int B memoireellouee a xvv Y GG yn r e un pointeur sur int memoireellouee a mllo @ sizeof @ int A A Y GG v fontion mllo insrit dns notre pointeur l ' dresse qui t reserv e F

l (n de e odeD memoireAllouee est un pointeur ontennt une dresse qui vous t rserve pr l9yD pr exemple l9dresse ITHH pour reprendre mes shms prE dentsF

Tester le pointeur
v fontion malloc don renvoy dns notre pointeur memoireAllouee l9dresse qui t rserve pour vous en mmoireF heux possiilits X ! si l9llotion mrhD notre pointeur ontient une dresse Y ! si l9llotion houD notre pointeur ontient l9dresse NULLF sl est peu prole qu9une llotion houeD mis el peut rriverF smginez que vous demndiez utiliser QR qo de mmoire viveD il y trs peu de hnes que l9y vous rponde fvorlementF sl est nnmoins reommnd de toujours tester si l9llotion mrhF yn v fire ei X si l9llotion houD 9est qu9il n9y vit plus de mmoire de lire @9est un s ritiqueAF hns un tel sD le mieux est d9rrter immditement le progrmme pre PRQ

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

queD de toute mnireD il ne pourr ps ontinuer onvenlementF yn v utiliser une fontion stndrd qu9on n9vit ps enore vue jusqu9ii X exit()F ille rrte immditement le progrmmeF ille prend un prmtre X l vleur que le progrmme doit retourner F
4 1 2 3 4 5 6 7 8 9 10 11 12 13 14

int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y if @ memoireellouee aa xvv A GG i l ' llotion hou { exit @ H A Y GG yn rr te imm ditement le progrmme } GG yn peut ontinuer le progrmme normlement sinon } return H Y

i le pointeur est di'rent de NULLD le progrmme peut ontinuerD sinon il fut 0her un messge d9erreur ou mme mettre (n u progrmmeD pre qu9il ne pourr ps ontinuer orretement s9il n9y plus de ple en mmoireF
free

: librer de la mmoire

out omme on utilisit l fontion fclose pour fermer un (hier dont on n9vit plus esoinD on v utiliser l fontion free pour lirer l mmoire dont on ne se sert plusF
1

void free @ void B pointeur A Y

v fontion free juste esoin de l9dresse mmoire lirerF yn v don lui envoyer notre pointeurD 9estEEdire memoireAllouee dns notre exempleF oii le shm omE plet et (nlD ressemlnt s9y mprendre e qu9on vu dns le hpitre sur les (hiers X
1 2 3 4 5 6

int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y if @ memoireellouee aa xvv A GG yn v rifie si l m moire t llou e { exit @ H A Y GG irreur X on rr te tout 3 } GG yn peut utiliser ii l m moire
4. Cela correspond en fait au return du main().

7 8 9 10 11

PRR

ALLOCATION DE MMOIRE DYNAMIQUE


12

free @ memoireellouee A Y GG yn n ' plus esoin de l m moire D on l li re } return H Y

13 14 15

Exemple concret d'utilisation


yn v progrmmer quelque hose qu9on ppris fire il y longtemps X demnder l9ge de l9utilisteur et le lui 0herF v seule di'rene ve e qu9on fisit vntD 9est qu9ii l vrile v tre lloue mnuellement @on dit ussi dynamiquement A plutt qu9utomtiquement omme uprvntF elors ouiD du oupD le ode est un peu plus ompliquF wis fites l9e'ort de ien le omprendreD 9est importnt X
1 2 3 4 5

int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y GG ellotion de l m moire if @ memoireellouee aa xvv A { exit @ H A Y } GG tilistion de l m moire printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D memoireellouee A Y printf @ 4 ous vez 7 d ns n 4 D B memoireellouee A Y free @ memoireellouee A Y GG vi rtion de m moire } return H Y

6 7 8 9 10 11 12 13 14 15 16 17 18 19

gopier e ode gode we X PWRUUR 


uel ge vez E vous c QI ous vez QI ns

PRS

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

Attention : comme memoireAllouee est un pointeur, on ne l'utilise pas de la mme manire qu'une vraie variable. Pour obtenir la valeur de la variable, il faut placer une toile devant : *memoireAllouee (regardez le printf). Tandis que pour indiquer l'adresse, on a juste besoin d'crire le nom du pointeur memoireAllouee (regardez le scanf). Tout cela a t expliqu dans le chapitre sur les pointeurs. Toutefois, on met gnralement du temps s'y faire et il est probable que vous confondiez encore. Si c'est votre cas, vous devez relire le chapitre sur les pointeurs, qui est fondamental.

evenons notre odeF yn y llou dynmiquement une vrile de type intF eu (nlD e qu9on rit revient extement u mme que d9utiliser l mthode  utoE mtique qu9on onnt ien mintennt X
1 2 3

int min @ int rg D hr B rgv A { int mrile a H Y GG ellotion de l m moire @ utomtique A GG tilistion de l m moire printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 mrile A Y printf @ 4 ous vez 7 d ns n 4 D mrile A Y return H Y } GG vi rtion de l m moire @ utomtique l fin de l fontion A

4 5 6 7 8 9 10 11

uel ge vez E vous c QI ous vez QI ns

in rsumD il y deux fons de rer une vrileD 9estEEdire d9llouer de l mmoireF oit on le fit X ! utomtiquement X 9est l mthode que vous onnissez et qu9on utilise jusqu9ii Y ! mnuellement @dynamiquement A X 9est l mthode que je vous enseigne dns e hpitreF
Je trouve la mthode dynamique complique et inutile !

n peu plus ompliqueF F F ertesF wis inutileD non 3 xous sommes prfois oligs d9llouer mnuellement de l mmoireD omme nous llons le voir mintenntF PRT

ALLOCATION DYNAMIQUE D'UN TABLEAU

Allocation dynamique d'un tableau


our le momentD on utilis l9llotion dynmique uniquement pour rer une petite vrileF yr en gnrlD on ne se sert ps de l9llotion dynmique pour elF yn utilise l mthode utomtique qui est plus simpleF und EtEon esoin de l9llotion dynmiqueD me direzEvous c ve plus souventD on s9en sert pour rer un tleu dont on ne onnt ps l tille vnt l9exution du progrmmeF smginons pr exemple un progrmme qui stoke l9ge de tous les mis de l9utilisteur dns un tleuF ous pourriez rer un tleu de int pour stoker les gesD omme ei X
1

int geemis IS Y

wis qui vous dit que l9utilisteur IS mis c eutEtre qu9il en plus que 3 vorsque vous rivez le ode soureD vous ne onnissez ps l tille que vous devez donner votre tleuF ous ne le surez qu9 l9exutionD lorsque vous demnderez l9utilisteur omien il d9misF v9intrt de l9llotion dynmique est l X on v demnder le nomre d9mis l9utiliE steurD puis on fer une llotion dynmique pour rer un tleu ynt extement l tille nessire @ni trop petitD ni trop grndAF i l9utilisteur IS misD on rer un tleu de IS int Y s9il en PVD on rer un tleu de PV intD etF gomme je vous l9i pprisD il est interdit en g de rer un tleu en indiqunt s tille l9ide d9une vrile X
1

int mis nomrehemis Y

Ce code fonctionne peut-tre sur certains compilateurs mais uniquement dans des cas prcis, il est recommand de ne pas l'utiliser !

v9vntge de l9llotion dynmiqueD 9est qu9elle nous permet de rer un tleu qui extement l tille de l vrile nombreDAmisD et el gre un ode qui fontionner prtout 3 yn v demnder u malloc de nous rserver nombreDAmis * sizeof(int) otets en mmoire X
1

mis a mllo @ nomrehemis B sizeof @ int A A Y

ge ode permet de rer un tleu de type int qui une tille orrespondnt exE tement u nomre d9mis 3 oii e que fit le progrmme dns l9ordre X IF demnder l9utilisteur omien il d9mis Y PF rer un tleu de int ynt une tille gle son nomre d9mis @vi mallocA Y PRU

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

QF demnder l9ge de hun de ses mis un unD qu9on stoke dns le tleu Y RF 0her l9ge des mis pour montrer qu9on ien mmoris tout el Y SF l (nD puisqu9on n9 plus esoin du tleu ontennt l9ge des misD le lirer ve l fontion freeF
1 2 3 4

int min @ int rg D hr B rgv A { int nomrehemis a H D i a H Y int B geemis a xvv Y GG ge pointeur v servir de tleu pr s l ' ppel du mllo GG yn demnde le nomre d ' mis l ' utilisteur printf @ 4 gomien d ' mis vez E vous c 4 A Y snf @ 4 7 d 4 D 8 nomrehemis A Y if @ nomrehemis b H A GG sl fut qu ' il it u moins un mi @ je le plins un peu sinon X p A { geemis a mllo @ nomrehemis B sizeof @ int A A Y GG yn lloue de l m moire pour le tleu if @ geemis aa xvv A GG yn v rifie si l ' llotion mrh ou non { exit @ H A Y GG yn rr te tout } GG yn demnde l ' ge des mis un un for @ i a H Y i ` nomrehemis Y i CCA { printf @ 4 uel ge l ' mi numero 7 d c 4 D i C I A Y snf @ 4 7 d 4 D 8 geemis i A Y } GG yn ffihe les ges stok s un un printf @ 4 n nos mis ont les ges suivnts X n 4 A Y for @ i a H Y i ` nomrehemis Y i CCA { printf @ 4 7 d ns n 4 D geemis i A Y } GG yn li re l m moire llou e ve mllo D on n ' en plus esoin free @ geemis A Y

5 6 7 8 9 10

11 12

13

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

33 34 35 36 37

} }

return H Y

gopier e ode gode we X RPQQSH  PRV

ALLOCATION DYNAMIQUE D'UN TABLEAU

gomien d 9 mis vez E vous c S uel ge l 9 mi numero I c IT uel ge l 9 mi numero P c IV uel ge l 9 mi numero Q c PH uel ge l 9 mi numero R c PT uel ge l 9 mi numero S c PU os mis ont les ges suivnts X IT ns IV ns PH ns PT ns PU ns

ge progrmme est tout fit inutile X il demnde les ges et les 0he ensuiteF t9i hoisi de fire el r 9est un exemple  simple @en(nD si vous vez ompris le mallocAF te vous rssure X dns l suite du oursD nous urons l9osion d9utiliser le malloc pour des hoses ien plus intressntes que le stokge de l9ge de ses mis 3

En rsum
! ne vrile oupe plus ou moins d9espe en mmoire en fontion de son typeF ! yn peut onntre le nomre d9otets oups pr un type l9ide de l9oprteur sizeof()F ! v9llotion dynmique onsiste rserver mnuellement de l9espe en mmoire pour une vrile ou un tleuF ! v9llotion est e'etue ve malloc() et il ne fut surtout ps oulier de lirer l mmoire ve free() ds qu9on n9en plus esoinF ! v9llotion dynmique permet notmment de rer un tleu dont l tille est dtermine pr une vrile u moment de l9exutionF

PRW

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

PSH

Chapitre

18
Dicult :

TP : ralisation d'un Pendu

e ne le rpterai jamais assez : pratiquer est essentiel. C'est d'autant plus essentiel pour vous car vous venez de dcouvrir de nombreux concepts thoriques et, quoi que vous en disiez, vous ne les aurez jamais vraiment compris tant que vous n'aurez pas pratiqu. Pour ce TP, je vous propose de raliser un Pendu. C'est un grand classique des jeux de lettres dans lequel il faut deviner un mot cach lettre par lettre. Le Pendu aura donc la forme d'un jeu en console en langage C. L'objectif est de vous faire manipuler tout ce que vous avez appris jusqu'ici. Au menu : pointeurs, chanes de caractres, chiers, tableaux. . . bref, que des bonnes choses !

PSI

CHAPITRE 18. TP : RALISATION D'UN PENDU

Les consignes
te tiens e qu9on se mette ien d9ord sur les rgles du endu rliserF te vis don vous donner ii les onsignesD 9estEEdire vous expliquer omment doit fontionner prisment le jeu que vous llez rerF out le monde onnt le enduD n9estEe ps c ellezD un petit rppel ne peut ps fire de ml X le ut du endu est de retrouver un mot h en moins de IH essis F
1

Droulement d'une partie


upposons que le mot h soit yqiF ous proposez une lettre l9ordinteurD pr exemple l lettre eF v9ordinteur vri(e si ette lettre se trouve dns le mot hF
Rappelez-vous : il y a une fonction toute prte dans string.h pour rechercher une lettre dans un mot ! Notez que vous n'tes cependant pas obligs de l'utiliser (personnellement, je ne m'en suis pas servi).

prtir de lD deux possiilits X ! l lettre se trouve e'etivement dns le mot X dns e sD on dvoile le mot ve les lettres qu9on dj trouves Y ! l lettre ne se trouve ps dns le mot @9est le s iiD r e n9est ps dns yqiA X on indique u joueur que l lettre ne s9y trouve ps et on diminue le nomre de oups restntsF und il ne nous reste plus de oups @H oupAD le jeu est termin et on perduF
Dans un  vrai  Pendu, il y aurait normalement le dessin d'un bonhomme qui se fait pendre au fur et mesure que l'on fait des erreurs. En console, ce serait un peu trop dicile de dessiner un bonhomme qui se fait pendre rien qu'avec du texte, on va donc se contenter d'acher une simple phrase comme  Il vous reste X coups avant une mort certaine .

upposons mintennt que le joueur tpe l lettre qF gelleEi se trouve dns le mot hD don on ne diminue ps le nomre de oups restnts u joueurF yn 0he le mot seret ve les lettres qu9on dj douvertesD 9estEEdire quelque hose omme X
wot seret X BBB q B

i ensuite on tpe un D omme l lettre s9y trouveD on l9joute l liste des lettres trouves et on 0he nouveu le mot ve les lettres dj douvertes X
wot seret X BB q B
1. Mais vous pouvez changer ce nombre maximal pour corser la dicult, bien sr !

PSP

LES CONSIGNES

Le cas des lettres multiples

hns ertins motsD une mme lettre peut pprtre deux ou trois foisD voire plus 3 r exempleD il y deux dns vi Y de mmeD il y trois i dns iviwixF ue fitEon dns un s omme c ves rgles du endu sont lires X si le joueur tpe l lettre iD toutes les lettres i du mot iviwix doivent tre douvertes d9un seul oup X
wot seret X i B i B i BB

sl ne fut don ps voir tper trois fois l lettre i pour que tous les i soient douvertsF
Exemple d'une partie complte

oii quoi devrit ressemler une prtie omplte en onsole lorsque votre progrmme ser termin X
fienvenue dns le endu 3 sl vous reste IH oups jouer uel est le mot seret c BBBBBB roposez une lettre X i sl vous reste W oups jouer uel est le mot seret c BBBBBB roposez une lettre X e sl vous reste W oups jouer uel est le mot seret c B e BBBB roposez une lettre X y sl vous reste W oups jouer uel est le mot seret c B e BB yB roposez une lettre X

it insi de suite jusqu9 e que le joueur it douvert toutes les lettres du mot @ou ien qu9il ne lui reste plus de oups jouerA X
sl vous reste V oups jouer uel est le mot seret c we BB yx roposez une lettre X qgne 3 ve mot seret etit ien X weyx

PSQ

CHAPITRE 18. TP : RALISATION D'UN PENDU

Saisie d'une lettre en console

v leture d9une lettre dns l onsole est plus omplique qu9il n9y prtF sntuitiveE mentD pour ruprer un rtreD vous devriez voir pens X
1

snf @ 4 7 4 D 8 mvettre A Y

it e'etivementD 9est ienF %c indique que l9on ttend un rtreD qu9on stoker dns maLettre @une vrile de type charAF out se psse trs ienF F F tnt qu9on ne refit ps un scanfF in e'etD vous pouvez tester le ode suivnt X
1 2 3 4 5 6 7 8 9 10 11 12

int min @ int rg D hr B rgv A { hr mvettre a HY snf @ 4 7 4 D 8 mvettre A Y printf @ 4 7 4 D mvettre A Y snf @ 4 7 4 D 8 mvettre A Y printf @ 4 7 4 D mvettre A Y } return H Y

xormlementD e ode est ens vous demnder une lettre et vous l90herD et el deux foisF estezF ue se psseEtEil c ous entrez une lettreD d9ordD misF F F le progrmme s9rrte de suite prsD il ne vous demnde ps l seonde lettre 3 yn dirit qu9il ignore le seond scanfF
Que s'est-il pass ?

in fitD qund vous entrez du texte en onsoleD tout e que vous tpez est stok quelque prt en mmoireD y compris l'appui sur la touche Entre @\nAF einsiD l premire fois que vous entrez une lettre @pr exemple eA puis que vous ppuyez sur EntreD 9est l lettre e qui est renvoye pr le scanfF wis l seonde foisD scanf renvoie le \n orrespondnt l touhe Entre que vous viez presse uprvnt 3 our viter elD le mieux 9est de rer notre propre petite fontion lireCaractere() X
1 2 3 4 5 6

hr liregrtere @A { hr rtere a H Y rtere a gethr @A Y GG yn lit le premier rt re rtere a toupper @ rtere A Y GG yn met l lettre en mjusule si elle ne l ' est ps d j

PSR

LES CONSIGNES
8

9 10 11

GG yn lit les utres rt res m moris s un un jusqu ' u n @ pour les effer A while @ gethr @A 3a ' n ' A Y return rtere Y GG yn retourne le premier rt re qu ' on lu

12

gopier e ode gode we X UTRITV  gette fontion utilise getchar() qui est une fontion de stdio qui revient extement rire scanf("%c", &lettre);F v fontion getchar renvoie le rtre que le joueur tpF eprsD j9utilise une fontion stndrd qu9on n9 ps eu l9osion d9tudier dns le ours X toupper()F gette fontion trnsforme l lettre indique en mjusuleF gomme D le jeu fontionner mme si le joueur tpe des lettres minusulesF sl fudr inlure ctype.h pour pouvoir utiliser ette fontion @ne l9ouliez ps 3AF ient ensuite l prtie l plus intressnte X elle o je vide les utres rtres qui urient pu voir t tpsF in e'etD en rppelnt getchar on prend le rtre suivnt que l9utilisteur tp @pr exemple l9Entre \nAF ge que je fis est simple et tient en une ligne X j9ppelle l fontion getchar en oule jusqu9 tomer sur le rtre \nF v oule s9rrte lorsD e qui signi(e qu9on  lu tous les utres rtresD ils ont don t vids de l mmoireF yn dit qu9on vide le buerF
Pourquoi y a-t-il un point-virgule la n du while et pourquoi ne voit-on pas d'accolades ?

in fitD je fis une oule qui ne ontient ps d9instrutions @l seule instrutionD 9est le getchar entre les prenthsesAF ves oldes ne sont ps nessires vu que je n9i rien d9utre fire qu9un getcharF te mets don un pointEvirgule pour rempler les oldesF ge pointEvirgule signi(e  ne rien fire hque pssge dns l oule F g9est un peu prtiulier je le reonnisD mis 9est une tehnique onntreD tehnique qu9utilisent les progrmmeurs pour fire des oules trs ourtes et trs simplesF hitesEvous que le while urit ussi pu tre rit omme ei X
1 2 3 4

while @ gethr @A 3a ' n ' A { }

sl n9y rien entre oldesD 9est volontireD vu qu9on n9 rien d9utre fireF w tehnique onsistnt pler juste un pointEvirgule est simplement plus ourte que elle des oldesF PSS

CHAPITRE 18. TP : RALISATION D'UN PENDU

in(nD l fontion lireCaractere retourne le premier rtre qu9elle lu X l vrile caractereF En rsumD pour ruprer une lettre dns votre odeD vous n9utiliserez ps X
1

snf @ 4 7 4 D 8 mvettre A Y

F F F vous utiliserez l ple notre superEfontion X


1

mvettre a liregrtere @A Y

Dictionnaire de mots
hns un premier temps pour vos testsD je vis vous demnder de (xer le mot seret diretement dns votre odeF ous rirez don pr exemple X
1

hr moteret a 4 weyx 4 Y

elors ouiD ien srD le mot seret ser toujours le mme si on lisse omme D e qui n9est ps trs rigoloF te vous demnde de fire omme dns un premier temps pour ne ps mlnger les prolmesF in e'etD une fois que votre jeu de endu fontionner orretement @et seulement prtir de e momentElAD vous ttquerez l seonde phse X l rtion du ditionnire de motsF
Qu'est-ce que c'est, le  dictionnaire de mots  ?

g9est un (hier qui ontiendr de nomreux mots pour votre jeu de enduF sl doit y voir un mot pr ligneF ixemple X
wesyx fvi esyx vyryxi efisvvi swwifvi qyhsx xisqi iy

hque nouvelle prtieD votre progrmme devr ouvrir e (hier et prendre un des mots u hsrd dns l listeF qre ette tehniqueD vous urez un (hier prt que vous pourrez diter tnt que vous voudrez pour jouter des mots serets possiles pour le enduF PST

LES CONSIGNES

Vous aurez remarqu que depuis le dbut je fais exprs d'crire tous les mots du jeu en majuscules. En eet, dans le Pendu on ne fait pas la distinction entre les majuscules et les minuscules, le mieux est donc de se dire ds le dbut :  tous mes mots seront en majuscules . vous de prvenir le joueur, dans le mode d'emploi du jeu par exemple, qu'il est cens entrer des lettres majuscules et non des minuscules. Par ailleurs, on fait exprs d'ignorer les accents pour simplier le jeu . Vous devrez donc crire vos mots dans le dictionnaire entirement en majuscules et sans accents.
2

ve prolme qui se poser rpidement vous ser de svoir omien il y de mots dns le ditionnireF in e'etD si vous voulez hoisir un mot u hsrdD il fudr tirer u sort un nomre entre H et D et vous ne svez ps priori omien de mots ontient votre (hierF our rsoudre le prolmeD il y deux solutionsF ous pouvez indiquer sur l premire ligne du (hier le nomre de mots qu9il ontient X
Q wesyx fvi esyx

gependnt ette tehnique est ennuyeuseD r il fudr reompter mnuellement le nomre de mots hque fois que vous en jouterez un F eussi je vous propose plutt de ompter utomtiquement le nomre de mots en lisnt une premire fois le (hier ve votre progrmmeF our svoir omien il y de motsD 9est simple X vous omptez le nomre de \n @retours l ligneA dns le (hierF ne fois que vous urez lu le (hier une premire fois pour ompter les \nD vous ferez un rewind pour revenir u dutF ous n9urez lors plus qu9 tirer un nomre u sort prmi le nomre de mots que vous vez omptsD puis vous rendre u mot que vous vez hoisi et le stoker dns une hne en mmoireF te vous lisse un peu r)hir tout elD je ne vis ps trop vous ider qund mmeD sinon ne serit plus un 3 hez que vous vez quis toutes les onnissnes qu9il fut dns les hpitres prdentsD vous tes don prfitement ples de rliser e jeuF v prendre plus ou moins de temps et 9est moins file qu9il n9y prtD mis en vous orgnisnt orretement @et en rnt su0smment de fontionsAD vous y rriverezF fon ourgeD et surtout X perEsEvErez 3
3

2. Si on doit commencer tester le , le , le , le . . . on n'a pas ni ! 3. Ou ajouter 1 ce nombre si vous tes malins plutt que de tout recompter, mais a reste quand mme une solution un peu bancale.

PSU

CHAPITRE 18. TP : RALISATION D'UN PENDU

La solution (1 : le code du jeu)


i vous lisez es lignesD 9est soit que vous vez termin le progrmmeD soit que vous n9rrivez ps le terminerF t9i personnellement mis plus de temps que je ne le pensis pour rliser e petit jeu ppremment tout teF g9est souvent omme X on se dit  h 9est file lors qu9en fitD il y plusieurs s grerF te persiste toutefois dire que vous tes tous ples de le fireF sl vous fudr plus ou moins de temps @quelques minutesD quelques heuresD quelques jours cAD mis n9 jmis t une ourseF te prfre que vous y pssiez euoup de temps et que vous y rriviezD plutt que vous n9essyiez que S minutes et que vous regrdiez l solutionF x9llez ps roire que j9i rit le progrmme d9une triteF woi ussiD omme vousD j9y suis ll ps psF t9i ommen pr fire quelque hose de trs simpleD puis petit petit j9i mlior le ode pour rriver u rsultt (nlF t9i fit plusieurs erreurs en odnt X j9i ouli un moment d9initiliser une vrile orretementD j9i ouli d9rire le prototype d9une fontion ou enore de supprimer une vrile qui ne servit plus dns mon odeF t9i mme ! je l9voue ! ouli un te pointEvirgule un moment l (n d9une instrutionF out pour dire quoi c ue je ne suis ps infillile et que je vis peu prs les mmes frustrtions que vous F te vis vous prsenter l solution en deux tempsF IF h9ord je vis vous montrer omment j9i fit le ode du jeu luiEmmeD en (xnt le mot h diretement dns le odeF t9i hoisi le mot weyx r il me permet de tester si je gre ien les lettres en douleD omme le iiF PF insuiteD je vous montreri omment dns un seond temps j9i jout l gestion du ditionnire de mots pour tirer u sort un mot seret pour le joueurF fien srD je pourris vous montrer tout le ode d9un oup misF F F ferit euoup l foisD et nomre d9entre vous n9urient ps le ourge de se penher sur le odeF te vis essyer de vous expliquer ps ps mon risonnementF etenez que e qui ompteD e n9est ps le rsulttD mis l fon dont on r)hitF
4

Analyse de la fonction main


gomme tout le monde le sitD tout ommene pr un mainF yn n9oulie ps d9inlure les iliothques stdioD stdlib et ctype @pour l fontion toupper()A dont on ur esoin X
1 2 3

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` type Fh b

4.  ESPCE DE PROGRAMME DE ***** TU VAS TE METTRE MARCHER, OUI OU NON ! ? .

PSV

LA SOLUTION (1 : LE CODE DU JEU)


4 5 6 7 8 9

int min @ int rg D hr B rgv A { } return H Y

ykD jusqueEl tout le monde devrit suivreF xotre main v grer l pluprt du jeu et fire ppel quelquesEunes de nos fontions qund il en ur esoinF gommenons pr dlrer les vriles nessires X
5 1 2 3 4 5 6 7

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` type Fh b int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret a 4 weyx 4 Y GG g ' est le mot trouver int lettrerouvee T a { H }Y GG leu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e int oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A int i a H Y GG ne petite vrile pour prourir les tleux } return H Y

8 9

10

11

12 13 14

t9i volontirement rit une dlrtion de vrile pr ligne insi que plusieurs omE mentires pour que vous ompreniez l9intrt de hque vrileF in prtiqueD vous n9urez ps forment esoin de mettre tous es ommentires et vous pourrez grouper plusieurs dlrtions de vriles sur l mme ligneF te pense que l pluprt de es vriles semlent logiques X l vrile lettre stoke l lettre que l9utilisteur tpe hque foisD motSecret le mot trouverD coupsRestants le nomre de oupsD etF v vrile i est une petite vrile que j9utilise pour prourir mes tleux ve des forF ille n9est don ps extrmement importnte mis nessire si on veut fire nos oulesF in(nD l vrile lquelle il fllit penserD elle qui fit l di'reneD 9est mon tleu de oolens lettreTrouveeF ous remrquerez que je lui i donn pour tille le nomre de lettres du mot seret @TAF ge n9est ps un hsrd X hque se de e tleu de oolens reprsente une lettre du mot seretF einsiD l premire se reprsente l premire lettreD l seonde l seonde lettreD etF ves ses du tleu sont u dprt initilises HD e qui signi(e  vettre non trouve F eu fur et mesure de l9vnement
5. Rassurez-vous, je n'ai pas pens de suite toutes ces variables, il y en avait un peu moins la premire fois que j'ai crit le code !

PSW

CHAPITRE 18. TP : RALISATION D'UN PENDU

du jeuD e tleu ser modi(F our hque lettre du mot seret trouveD l se orrespondnte du tleu lettreTrouvee ser mise IF r exempleD si un moment du jeu j9i l90hge wBBxD 9est que mon tleu d9int les vleurs IHIIHI @I pour hque lettre qui t trouveAF sl est insi file de svoir qund on ggn X il su0t de vri(er si le tleu de oolens ne ontient que des IF in revnheD on perdu si le ompteur coupsRestants tome HF ssons l suite X
1

printf @ 4 fienvenue dns le endu 3 n n 4 A Y

g9est un messge de ienvenueD il n9y rien de ien plpitntF in revnheD l oule priniple du jeu est plus intressnte X
1 2

while @ oupsestnts b H 88 3 ggne @ lettrerouvee A A {

ve jeu ontinue tnt qu9il reste des oups @coupsRestants > 0A et tnt qu9on n9 ps ggnF i on n9 plus de oups jouerD 9est qu9on perduF i on ggnD 9estF F F qu9on ggnF hns les deux sD il fut rrter le jeuD don rrter l oule du jeu qui redemnde hque fois une nouvelle lettreF gagne est une fontion qui nlyse le tleu lettreTrouveeF ille renvoie  vri @IA si le joueur ggn @le tleu lettreTrouvee ne ontient que des IAD  fux @HA si le joueur n9 ps enore ggnF te ne vous explique ps ii le fontionnement de ette fontion en dtilD on verr el plus trdF our le momentD vous vez juste esoin de svoir e que fit l fontionF v suite X
1 2 3 4

printf @ 4 n nsl vous reste 7 d oups jouer 4 D oupsestnts A Y printf @ 4 nuel est le mot seret c 4 A Y GB yn ffihe le mot seret en msqunt les lettres non trouv es ixemple X B e BB yx BG for @ i a H Y i ` T Y i CCA { if @ lettrerouvee i A GG i on trouv l lettre n i printf @ 4 7 4 D moteret i A Y GG yn l ' ffihe else printf @ 4 B 4 A Y GG inon D on ffihe une toile pour les lettres non trouv es }

5 6 7 8

9 10 11

12

yn 0he hque oup le nomre de oups restnts insi que le mot seret @msqu pr des B pour les lettres non trouvesAF v90hge du mot seret msqu pr des B se fit gre une oule forF yn nlyse hque lettre pour svoir si elle t trouve @if lettreTrouvee[i]AF i 9est le sD on 0he l lettreF inonD on 0he une B de remplement pour msquer l lettreF PTH

LA SOLUTION (1 : LE CODE DU JEU)

wintennt qu9on 0h e qu9il fllitD on v demnder u joueur de sisir une lettre X


1 2

printf @ 4 nroposez une lettre X 4 A Y lettre a liregrtere @A Y

te fis ppel notre fontion lireCaractere()F gelleEi lit le premier rtre tpD le met en mjusule et vide le u'erD 9estEEdire qu9elle vide les utres rtres qui urient pu persister dns l mmoireF
1 2 3 4 5 6

GG i e n ' tit e l onne lettre if @3 reherhevettre @ lettre D moteret D lettrerouvee A A { oupsestnts E EY GG yn enl ve un oup u joueur } }

yn vri(e si l lettre entre se trouve dns motSecretF yn fit ppel pour el une fontion mison ppele rechercheLettreF xous verrons peu prs le ode de ette fontionF our le momentD tout e que vous vez esoin de svoirD 9est que ette fontion renvoie  vri si l lettre se trouve dns le motD  fux si elle ne s9y trouve psF won ifD vous l9urez remrquD ommene pr un point d9exlmtion ! qui signi(e  non F v ondition se lit don  i l lettre n9 ps t trouve F ue fitEon si l lettre n9 ps t trouve c yn diminue le nomre de oups restntsF
Notez que la fonction rechercheLettre met aussi jour le tableau de boolens lettreTrouvee. Elle met des 1 dans les cases des lettres qui ont t trouves.

v oule priniple du jeu s9rrte lF yn reommene don u dut de l oule et on vri(e s9il reste des oups jouer et si on n9 ps dj ggnF vorsqu9on sort de l oule priniple du jeuD il reste 0her si on ggn ou non vnt que le progrmme ne s9rrte X
1 2

3 4 5 6 7

if @ ggne @ lettrerouvee A A printf @ 4 n nqgne 3 ve mot seret etit ien X 7 s4 D moteret A Y else printf @ 4 n nerdu 3 ve mot seret etit X 7 s 4 D moteret A Y return H Y }

yn fit ppel l fontion gagne pour vri(er si on ggnF i 9est le sD lors on 0he le messge  qgn 3 Y sinonD 9est qu9on n9vit plus de oups jouerD on t penduF PTI

CHAPITRE 18. TP : RALISATION D'UN PENDU

Analyse de la fonction gagne


oyons mintennt le ode de l fontion gagne X
1 2 3 4 5 6 7 8 9 10 11 12 13

int ggne @ int lettrerouvee A { int i a H Y int joueurqgne a I Y for @ i a H Y i ` T Y i CCA { if @ lettrerouvee i aa H A joueurqgne a H Y } } return joueurqgne Y

gette fontion prend le tleu de oolens lettreTrouvee pour prmtreF ille renE voie un oolen X  vri si on ggnD  fux si on perduF ve ode de ette fontion est plutt simpleD vous devriez tous le omprendreF yn prE ourt lettreTrouvee et on vri(e si xi des ses vut  fux @HAF i une des lettres n9 ps enore t trouveD 9est qu9on perdu X on met lors le oolen joueurGagne  fux @HAF inonD si toutes les lettres ont t trouvesD le oolen vut  vri @IA et l fontion renverr don  vri F

Analyse de la fonction rechercheLettre


v fontion rechercheLettre deux missions X ! renvoyer un oolen indiqunt si l lettre se trouvit ien dns le mot seret Y ! mettre jour @ IA les ses du tleu lettreTrouvee orrespondnt ux positions de l lettre qui t trouveF
1 2 3 4 5 6

int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A { int i a H Y int onnevettre a H Y GG yn prourt moteret pour v rifier si l lettre propos e y est for @ i a H Y moteret i 3a ' H ' Y i CCA { if @ lettre aa moteret i A GG i l lettre y est { onnevettre a I Y GG yn m morise que ' tit une onne lettre lettrerouvee i a I Y GG yn met I l se du tleu de ool ens orrespondnt l lettre

7 8 9 10 11

12

PTP

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


tuelle

13 14 15 16 17

} }

return onnevettre Y

yn prourt don l hne motSecret rtre pr rtreF hque foisD on vri(e si l lettre que le joueur propose est une lettre du motF i l lettre orrespondD lors on fit deux hoses X ! on hnge l vleur du oolen bonneLettre ID pour que l fontion retourne I r l lettre se trouvit e'etivement dns motSecret Y ! on met jour le tleu lettreTrouvee l position tuelle pour indiquer que ette lettre t trouveF v9vntge de ette tehniqueD 9est qu9insi on prourt tout le tleu @on ne s9rrte ps l premire lettre trouveAF gel nous permet de ien mettre jour le tleu lettreTrouveeD u s o une lettre serit prsente en plusieurs exemplires dns le mot seretD omme 9est le s pour les deux de weyxF

La solution (2 : la gestion du dictionnaire)


xous vons fit le tour des fontionnlits de se de notre progrmmeF sl ontient tout e qu9il fut pour grer une prtieD mis il ne sit ps sletionner un mot u hsrd dns un ditionnire de motsF ous pouvez voir quoi ressemle mon ode soure u omplet e stde de son riture sur le weF te ne l9i ps pl ii r il prend dj plusieurs pges et ferit doulon ve le ode soure (nl omplet que vous verrez un peu plus sF  gopier le ode gode we X QHHSQP  evnt d9ller plus loinD l premire hose fire mintennt est de rer e fmeux ditionnire de motsF wme s9il est ourt e n9est ps grveD il onviendr pour les testsF te vis don rer un (hier dico.txt dans le mme rpertoire que mon projetF our le momentD j9y mets les mots suivnts X
6 1 2 3 4 5 6 7 8

wesyx fvi esyx vyryxi efisvvi swwifvi qyhsx xisqi


6. Donc sans la gestion du dictionnaire.

PTQ

CHAPITRE 18. TP : RALISATION D'UN PENDU


9

iy

ne fois que j9uri termin de oder le progrmmeD je reviendri ien sr sur e ditionE nire et j9y jouteri videmment des tooonnes de mots tordus omme vyryxiD ou rllonge omme exsgyxssyxxivviwixF wis pour le momentD retournons nos instrutionsF

Prparation des nouveaux chiers


v leture du  dio v demnder ps ml de lignes de ode F te prends don les devnts en joutnt un nouveu (hier mon projet X dico.c @qui ser hrg de l leture du dioAF hns l fouleD je re le dico.h qui ontiendr les prototypes des fontions ontenues dns dico.cF hns dico.cD je ommene pr inlure les iliothques dont j9uri esoin insi que mon dico.hF e prioriD omme souventD j9uri esoin de stdio et stdlib iiF in plus de elD je vis tre men pioher un nomre u hsrd dns le dioD je vis don inlure time.h omme on l9vit fit pour notre premier projet  lus ou woins F te vis ussi voir esoin de string.h pour fire un strlen vers l (n de l fontion X
7 1 2 3 4 5 6

5 inlude 5 inlude 5 inlude 5 inlude

` stdio Fh b ` stdli Fh b ` time Fh b ` string Fh b

5 inlude 4 dio F h 4

La fonction piocherMot
gette fontion v prendre un prmtre X un pointeur sur l zone en mmoire o elle pourr rire le motF ge pointeur ser fourni pr le main()F v fontion renverr un int qui ser un oolen X I a tout s9est ien pssD H a il y eu une erreurF oii le dut de l fontion X
1 2 3

4 5

int pioherwot @ hr B motiohe A { psvi B dio a xvv Y GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a H D numwotghoisi a H D i a H Y int rterevu a H Y

te d(nis quelques vriles qui me seront indispenslesF gomme pour le main()D je n9i ps pens mettre toutes es vriles ds le dutD il y en ertines que j9i joutes pr l suite lorsque je me suis rendu ompte que j9en vis esoinF ves noms des vriles prlent d9euxEmmesF yn notre pointeur sur (hier dico dont on v se servir pour lire le (hier dico.txtD des vriles temporires qui vont
7. Du moins, j'en ai le pressentiment.

PTR

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)

stoker les rtresD etF xotez que j9utilise ii un int pour stoker un rtre @caractereLuA r l fontion fgetc que je vis utiliser renvoie un intF sl est don prfrle de stoker le rsultt dns un intF ssons l suite X
1

dio a fopen @ 4 dio F txt 4 D 4 r 4 A Y GG yn ouvre le ditionnire en leture seule GG yn v rifie si on r ussi ouvrir le ditionnire if @ dio aa xvv A GG i on n ' e r ussi ouvrir le fihier { printf @ 4 nsmpossile de hrger le ditionnire de mots 4 A Y return H Y GG yn retourne H pour indiquer que l fontion hou GG l leture du return D l fontion s ' rr te imm ditement F }

2 3 4 5 6 7

te n9i ps grndEhose jouter iiF t9ouvre le (hier dico.txt en leture seule @"r"A et je vri(e si j9i russi en testnt si dico vut NULL ou nonF i dico vut NULLD le (hier n9 ps pu tre ouvert @(hier introuvle ou utilis pr un utre progrmmeAF hns e sD j90he une erreur et je fis un return 0F ourquoi un return l c in fitD l9instrution return ommnde l9rrt de l fontionF i le dio n9 ps pu tre ouvertD l fontion s9rrte l et l9ordinteur n9ir ps lire plus loinF yn retourne H pour indiquer u main que l fontion houF hns l suite de l fontionD on suppose don que le (hier ien t ouvertF
1 2 3 4 5 6 7

GG yn ompte le nomre de mots dns le fihier @ il suffit de ompter les entr es n do { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A nomrewots CCY } while @ rterevu 3a iyp A Y

vD on prourt tout le (hier oups de fgetc @rtre pr rtreAF yn ompte le nomre de \n @entresA qu9on dteteF hque fois qu9on tome sur un \nD on inrE mente l vrile nombreMotsF qre e out de odeD on otient dns nombreMots le nomre de mots dns le (hier F
8 1

numwotghoisi a nomreeletoire @ nomrewots AY GG yn piohe un mot u hsrd

siD je fis ppel une fontion de mon ru qui v gnrer un nomre ltoire entre I et nombreMots @le prmtre qu9on envoie l fontionAF g9est une fontion toute simple que j9i ple ussi dns dico.c @je vous l dtilleri tout l9heureAF frefD elle
8. Rappelez-vous que le chier contient un mot par ligne.

PTS

CHAPITRE 18. TP : RALISATION D'UN PENDU

renvoie un nomre @orrespondnt un numro de ligne du (hierA u hsrd qu9on stoke dns numMotChoisiF
1 2 3 4 5 6 7 8

GG yn reommene lire le fihier depuis le d ut F yn s ' rr te lorsqu ' on est rriv u on mot rewind @ dio A Y while @ numwotghoisi b H A { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A numwotghoisi E EY }

wintennt qu9on le numro du mot qu9on veut pioherD on reprt u dut gre un ppel rewind()F yn prourt l enore le (hier rtre pr rtre en omptnt les \nF gette foisD on drmente l vrile numMotChoisiF i pr exemple on hoisi le mot numro SD hque entre l vrile v tre drmente de IF ille v don vloir SD puis RD QD PD IF F F et HF vorsque l vrile vut HD on sort du whileD l ondition numMotChoisi > 0 n9tnt plus remplieF ge out de odeD que vous devez imprtivement omprendreD vous montre don omE ment on prourt un (hier pour se pler l position voulueF ge n9est ps ien ompliquD mis e n9est ps non plus  vident F essurezEvous don de ien omE prendre e que je fis lF wintenntD on devrit voir un urseur positionn juste devnt le mot seret qu9on hoisi de pioherF yn v le stoker dns motPioche @le prmtre que l fontion reoitA gre un simple fgets qui v lire le mot X
1 2 3 4 5 6

GB ve urseur du fihier est positionn u on endroit F yn n ' plus qu ' fire un fgets qui lir l ligne BG fgets @ motiohe D IHH D dio A Y GG yn vire le n l fin motiohe strlen @ motiohe A E I a ' H ' Y

yn demnde u fgets de ne ps lire plus de IHH rtres @9est l tille du tleu motPiocheD qu9on d(ni dns le mainAF x9ouliez ps que fgets lit toute une ligneD y ompris le \nF gomme on ne veut ps grder e \n dns le mot (nlD on le supprime en le remplnt pr un \0F gel ur pour e'et de ouper l hne juste vnt le \nF itF F F voil qui est fit 3 yn rit le mot seret dns l mmoire l9dresse de motPiocheF yn n9 plus qu9 fermer le (hierD retourner I pour que l fontion s9rrte et pour dire que tout s9est ien pss X
1 2 3 4

flose @ dio A Y } return I Y GG out s ' est ien pss D on retourne I

s esoin de plus pour l fontion piocherMot 3 PTT

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)

La fonction nombreAleatoire
g9est l fontion dont j9vis promis de vous prler tout l9heureF yn tire un nomre u hsrd et on le renvoie X
1 2 3 4 5

int nomreeletoire @ int nomrewx A { srnd @ time @ xvv A A Y return @ rnd @A 7 nomrewx A Y }

v premire ligne initilise le gnrteur de nomres ltoiresD omme on ppris le fire dns le premier  lus ou woins F v seonde ligne prend un nomre u hsrd entre H et nombreMax et le renvoie F
9

Le chier dico.h
sl s9git juste des prototypes des fontionsF ous remrquerez qu9il y l  protetion #ifndef que je vous vis demnd d9inlure dns tous vos (hiers .h @revoyez le hpitre sur le prproesseur u esoinAF
1 2 3 4 5 6 7

5 ifndef hiphsgy 5 define hiphsgy int pioherwot @ hr B motiohe A Y int nomreeletoire @ int nomrewx A Y 5 endif

gopier e ode gode we X SRRHIW 

Le chier dico.c
oii le (hier dico.c en entier X
1 2 3 4 5 6 7

GB teu du endu dio F EEEEEE ges fontions piohent u hsrd un mot dns un fihier ditionnire pour le jeu du endu BG

8 9

9. Notez que j'ai fait tout a en une ligne, c'est tout fait possible, bien que peut-tre parfois moins lisible.

PTU

CHAPITRE 18. TP : RALISATION D'UN PENDU


10 11 12 13 14 15 16 17 18 19 20

5 inlude 5 inlude 5 inlude 5 inlude

` stdio Fh b ` stdli Fh b ` time Fh b ` string Fh b

5 inlude 4 dio F h 4 int pioherwot @ hr B motiohe A { psvi B dio a xvv Y GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a H D numwotghoisi a H D i a H Y int rterevu a H Y dio a fopen @ 4 dio F txt 4 D 4 r 4 A Y GG yn ouvre le ditionnire en leture seule GG yn v rifie si on r ussi ouvrir le ditionnire if @ dio aa xvv A GG i on n ' e r ussi ouvrir le fihier { printf @ 4 nsmpossile de hrger le ditionnire de mots 4AY return H Y GG yn retourne H pour indiquer que l fontion hou GG l leture du return D l fontion s ' rr te imm ditement F } GG yn ompte le nomre de mots dns le fihier @ il suffit de ompter les GG entr es n do { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A nomrewots CCY } while @ rterevu 3a iyp A Y numwotghoisi a nomreeletoire @ nomrewots A Y GG yn piohe un mot u hsrd GG yn reommene lire le fihier depuis le d ut F yn s ' rr te lorsqu ' on est rriv u on mot rewind @ dio A Y while @ numwotghoisi b H A { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A numwotghoisi E EY

21 22 23

24 25 26

27 28

29

30

31 32 33

34 35 36 37 38 39 40 41 42

43 44

45 46 47 48 49 50

PTV

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

} GB ve urseur du fihier est positionn u on endroit F yn n ' plus qu ' fire un fgets qui lir l ligne BG fgets @ motiohe D IHH D dio A Y GG yn vire le n l fin motiohe strlen @ motiohe A E I a ' H ' Y flose @ dio A Y } return I Y GG out s ' est ien pss D on retourne I

int nomreeletoire @ int nomrewx A { srnd @ time @ xvv A A Y return @ rnd @A 7 nomrewx A Y }

gopier e ode gode we X QTTQQR 

Il va falloir modier le main !


wintennt que le (hier dico.c est prtD on retourne dns le main() pour l9dpter un petit peu ux quelques hngements qu9on vient de fireF hjD on ommene pr inlure dico.h si on veut pouvoir fire ppel ux fontions de dico.cF he plusD on v ussi inlure string.h r on v devoir fire un strlen X
1 2

5 inlude ` string Fh b 5 inlude 4 dio F h 4

our ommenerD les d(nitions de vriles vont un peu hngerF hjD on n9initilise plus l hne motSecretD on re juste un grnd tleu de char @IHH sesAF unt u tleu lettreTrouveeF F F s tille dpendr de l longueur du mot seret qu9on ur piohF gomme on ne onnt ps enore ette tilleD on re un simple pointeurF out l9heureD on fer un malloc et pointer e pointeur vers l zone mmoire qu9on ur lloueF gei est un exemple prfit de l9solue nessit de l9llotion dynmique X on ne onnt ps l tille du tleu vnt l ompiltionD on est don olig de rer un pointeur et de fire un mallocF te ne dois ps oulier de lirer l mmoire ensuite qund je n9en i plus esoinD d9o l prsene d9un free() l (n du mainF yn v ussi voir esoin d9une vrile tailleMot qui v stokerF F F l tille du motF in e'etD si vous regrdez le main() tel qu9il tit dns l premire prtieD on supposit que le mot fisit T rtres prtout @et 9tit vri r weyx omporte T lettresAF wis mintennt que le mot peut hnger de tilleD il v flloir tre ple de s9dpter PTW

CHAPITRE 18. TP : RALISATION D'UN PENDU

tous les mots 3 oii don les d(nitions de vriles du main en version (nle X
1 2 3

4 5

int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret IHH a { H }Y GG ge ser le mot trouver int B lettrerouvee a xvv Y GG n tleu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e int oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A int i a H Y GG ne petite vrile pour prourir les tleux int tillewot a H Y

g9est priniplement le dut du main qui v hngerD don nlysonsEle de plus prs X
1 2

if @3 pioherwot @ moteret A A exit @ H A Y

yn fit d9ord ppel piocherMot diretement dns le ifF piocherMot v pler dns motSecret le mot qu9elle ur piohF he plusD piocherMot v renvoyer un oolen pour nous dire si l fontion russi ou houF ve rle du if est d9nlyser e oolenF i n9 e mrh @le ! permet d9exprimer l ngtionAD lors on rrte tout @exit(0)AF
1

tillewot a strlen @ moteret AY

yn stoke l tille du motSecret dns tailleMot omme je vous l9i dit tout l9heureF
1

2 3

lettrerouvee a mllo @ tillewot B sizeof @ int AA Y GG yn lloue dynmiquement le tleu lettrerouvee @ dont on ne onnissit ps l tille u d prt A if @ lettrerouvee aa xvv A exit @ H A Y

wintennt on doit llouer l mmoire pour le tleu lettreTrouveeF yn lui donne l tille du mot @tailleMotAF yn vri(e ensuite si le pointeur n9est ps NULLF i 9est le sD 9est que l9llotion houF hns e sD on rrte immditement le progrmme @on fit ppel exit()AF i les lignes suivntes sont luesD 9est don que tout s9est ien pssF oil tous les prprtifs qu9il vous fllit fire iiF t9i d ensuite modi(er le reste du (hier main.c pour rempler tous les nomres T @l9nienne longueur de weyx qu9on vit (xeA pr l vrile tailleMotF r exemple X
1 2

for @ i a H Y i ` tillewot Y i CCA lettrerouvee i a H Y

PUH

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)

ge ode met toutes les ses du tleu lettreTrouvee HD en s9rrtnt lorsqu9on prouru tailleMot sesF t9i d ussi remnier le prototype de l fontion gagne pour jouter l vrile tailleMotF ns elD l fontion n9urit ps su qund rrter s ouleF oii le (hier main.c (nl en entier X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

GB teu du endu min F EEEEEE pontions priniples de gestion du jeu BG 5 inlude 5 inlude 5 inlude 5 inlude ` stdio Fh b ` stdli Fh b ` type Fh b ` string Fh b

5 inlude 4 dio F h 4 int ggne @ int lettrerouvee D long tillewot A Y int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A Y hr liregrtere @A Y int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret IHH a { H }Y GG ge ser le mot trouver int B lettrerouvee a xvv Y GG n tleu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e long oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A long i a H Y GG ne petite vrile pour prourir les tleux long tillewot a H Y printf @ 4 fienvenue dns le endu 3 n n 4 A Y if @3 pioherwot @ moteret A A exit @ H A Y tillewot a strlen @ moteret A Y lettrerouvee a mllo @ tillewot B sizeof @ int A AY GG yn lloue dynmiquement le tleu lettrerouvee @ dont on

19 20 21 22 23

24 25

26

27

28 29 30 31 32 33 34 35 36 37

PUI

CHAPITRE 18. TP : RALISATION D'UN PENDU


ne onnissit ps l tille u d prt A if @ lettrerouvee aa xvv A exit @ H A Y for @ i a H Y i ` tillewot Y i CCA lettrerouvee i a H Y GB yn ontinue jouer tnt qu ' il reste u moins un oup jouer ou qu ' on n ' ps ggn BG while @ oupsestnts b H 88 3 ggne @ lettrerouvee D tillewot AA { printf @ 4 n nsl vous reste 7 ld oups jouer 4 D oupsestnts A Y printf @ 4 nuel est le mot seret c 4 A Y GB yn ffihe le mot seret en msqunt les lettres non trouv es ixemple X B e BB yx BG for @ i a H Y i ` tillewot Y i CCA { if @ lettrerouvee i A GG i on trouv l lettre n i printf @ 4 7 4 D moteret i A Y GG yn l ' ffihe else printf @ 4 B 4 A Y GG inon D on ffihe une toile pour les lettres non trouv es } printf @ 4 nroposez une lettre X 4 A Y lettre a liregrtere @A Y GG i e n ' tit e l onne lettre if @3 reherhevettre @ lettre D moteret D lettrerouvee A A { oupsestnts E EY GG yn enl ve un oup u joueur }

38 39 40 41 42 43 44

45 46

47 48

49 50 51

52 53 54 55

56 57 58

59 60 61 62 63 64 65 66 67 68 69 70 71 72

73 74

if @ ggne @ lettrerouvee D tillewot A A printf @ 4 n nqgne 3 ve mot seret etit ien X 7 s 4 D moteret A Y else printf @ 4 n nerdu 3 ve mot seret etit X 7 s 4 D moteret A Y free @ lettrerouvee A Y GG yn li re l m moire llou e mnuellement @ pr mllo A

75 76

77

PUP

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


78 79 80 81 82 83 84 85 86

return H Y

hr liregrtere @A { hr rtere a H Y rtere a gethr @A Y GG yn lit le premier rt re rtere a toupper @ rtere AY GG yn met l lettre en mjusule si elle ne l ' est ps d j GG yn lit les utres rt res m moris s un un jusqu ' u n while @ gethr @A 3a ' n ' A Y return rtere Y GG yn retourne le premier rt re qu ' on lu

87 88

89 90 91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

int ggne @ int lettrerouvee D long tillewot A { long i a H Y int joueurqgne a I Y for @ i a H Y i ` tillewot Y i CCA { if @ lettrerouvee i aa H A joueurqgne a H Y } } return joueurqgne Y

109 110 111 112 113

int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A { long i a H Y int onnevettre a H Y GG yn prourt moteret pour v rifier si l lettre propos e y est for @ i a H Y moteret i 3a ' H ' Y i CCA { if @ lettre aa moteret i A GG i l lettre y est { onnevettre a I Y GG yn m morise que ' tit une onne lettre lettrerouvee i a I Y GG yn met I l se du tleu de ool ens orrespondnt l lettre tuelle

114 115 116 117 118

119

PUQ

CHAPITRE 18. TP : RALISATION D'UN PENDU


120 121 122 123 124

} }

return onnevettre Y

gopier e ode gode we X IHSSSH 

Ides d'amlioration
Tlcharger le projet
our ommenerD je vous invite tlhrger le projet omplet du enduF  lhrger le projet gode we X SVUSRS  i vous tes sous vinux ou sous wD supprimez le (hier dico.txt et rerezEen unF ves (hiers sont enregistrs de mnire di'rente sous indows X don si vous utilisez le mienD vous risquez d9voir des ugsF x9ouliez ps qu9il fut qu9il y it une Entre prs hque mot du ditionnireF ensez en prtiulier mettre une Entre prs le dernier mot de l listeF gel v vous permettre de tester pr vousEmmes le fontionnement du projetD de proder des mliortions personnellesD etF fien entenduD le mieux serit que vous yez dj russi le endu pr vousEmmes et que vous n9yez mme ps esoin de voir mon projet pour voir omment j9i fit misF F F je suis rlisteD je sis que e d tre ssez dlit pour on nomre d9entre vousF ous trouverez dns e Fzip les (hiers .c et .h insi que le (hier .cbp du projetF g9est un projet fit sous gode: :floksF i vous utilisez un utre shiD ps de pniqueF ous rez un nouveu projet onsole et vous y joutez mnuellement les .c et .h que vous trouverez dns le FzipF ous trouverez ussi l9exutle @.exe indowsA insi qu9un ditionnire @dico.txtAF

Amliorez le Pendu !
wine de rienD le endu est dj ssez volu omme F yn un jeu qui lit un (hier de ditionnire et qui prend hque fois un mot u hsrdF oii qund mme quelques ides d9mliortion que je vous invite implmenterF ! etuellementD on ne vous propose de jouer qu9une foisF sl serit ien de pouvoir ouler nouveu l (n du main pour lancer une nouvelle partie si le joueur le dsireF PUR

IDES D'AMLIORATION

! ous pourriez rer un mode deux joueurs dns lequel le premier joueur entre un mot que le deuxime joueur doit devinerF ! ge n9est ps utile @don 9est indispensleA X pourquoi ne ps dessiner un bonhomme qui se fait pendre hque fois que l9on fit une erreur c renez ien le temps de omprendre e et mliorezEle u mximumF sl fut que vous soyez ples de refire e petit jeu de endu les yeux ferms 3 ellezD ourgeF
10

10. coups de printf bien sr : on est en console, rappelez-vous !

PUS

CHAPITRE 18. TP : RALISATION D'UN PENDU

PUT

Chapitre

19
Dicult :

La saisie de texte scurise

a saisie de texte est un des aspects les plus dlicats du langage C. Vous connaissez la fonction scanf, que vous avez vue au dbut du cours. Vous vous dites : quoi de plus simple et de plus naturel ? Eh bien gurez-vous que non, en fait, c'est tout sauf simple. Ceux qui vont utiliser votre programme sont des humains. Tout humain qui se respecte fait des erreurs et peut avoir des comportements inattendus. Si vous lui demandez :  Quel ge avez-vous ? , qu'est-ce qui vous garantit qu'il ne va pas vous rpondre  Je m'appelle Franois je vais bien merci  ? Le but de ce chapitre est de vous faire dcouvrir les problmes que l'on peut rencontrer en utilisant la fonction scanf et de vous montrer une alternative plus sre avec la fonction fgets.

PUU

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

Les limites de la fonction scanf


v fontion scanf()D que je vous i prsente ds le dut du ours de gD est une fontion doule trnhnt X ! elle est file utiliser qund on dute @9est pour que je vous l9i prsenteAF F F ! F F F mis son fontionnement interne est omplexe et elle peut mme tre dngereuse dns ertins sF g9est un peu ontrditoireD n9estEe ps c in fitD scanf a l'air file utiliserD mis elle ne l9est ps en prtiqueF te vis vous montrer ses limites pr deux exemples onretsF

Entrer une chane de caractres avec des espaces


upposons qu9on demnde une hne de rtres l9utilisteurD mis que eluiEi insre un espe dns s hne X
1 2 3 4 5 6 7 8 9 10 11 12 13

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr nom PH a { H }Y printf @ 4 uel est votre nom c 4 A Y snf @ 4 7 s 4 D nom A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y

gopier e ode gode we X IISUPW 

uel est votre nom c ten hupont eh 3 ous vous ppelez don ten 3

Pourquoi le  Dupont  a disparu ?

re que l fontion scanf s9rrte si elle tome u ours de s leture sur un espeD une tultion ou une entreF ous ne pouvez don ps ruprer l hne si elleEi omporte un espeF PUV

LES LIMITES DE LA FONCTION SCANF

En fait, le mot "Dupont" se trouve toujours en mmoire, dans ce qu'on appelle le buer . La prochaine fois qu'on appellera scanf, la fonction lira toute seule le mot  Dupont  qui tait rest en attente dans la mmoire.

yn peut utiliser l fontion scanf de telle sorte qu9elle lise les espesD mis 9est ssez ompliquF i vous voulez pprendre ien vous servir de scanfD on peut trouver des ours trs dtills sur le we F   epprofondir l fontion
1

scanf gode we 

X RVTRRH

Entrer une chane de caractres trop longue


sl y un utre prolmeD euoup plus grve enore X elui du dpassement de mmoireF hns le ode que nous venons de voirD il y l ligne suivnte X
1

hr nom S a { H }Y

ous voyez que j9i llou S ses pour mon tleu de char ppel nomF gel signi(e qu9il y l ple d9rire R rtresD le dernier tnt toujours rserv u rtre de (n de hne \0F evoyez solument le ours sur les hnes de rtres @pge IUIA si vous vez ouli tout elF v (gF IWFI vous prsente l9espe qui t llou pour nomF

Figure IWFI ! ellotion de mmoire

ue se psseEtEil si vous rivez plus de rtres qu9il n9y d9espe prvu pour les stoker c
uel est votre nom c trie eh 3 ous vous ppelez don trie 3

e prioriD il ne s9est rien pssF it pourtntD e que vous voyez l est un vritle uhemr de progrmmeur 3 yn dit qu9on vient de fire un dpassement de mmoireD ussi ppel buer overow en nglisF gomme vous le voyez sur l (gF IWFPD on vit llou S ses pour stoker le nomD mis en fit il en fllit VF u9 fit l fontion scanf c ille ontinu rire l suite en
1. Attention, c'est assez dicile.

PUW

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

mmoire omme si de rien n9tit 3 ille rit dns des zones mmoire qui n9tient ps prvues pour elF

Figure IWFP ! hpssement dns l mmoire

ves rtres en trop ont  rs d9utres informtions en mmoireF g9est e qu9on ppelle un buer overow @(gF IWFQAF

Figure IWFQ ! ve u'er over)ow


En quoi cela est-il dangereux ?

ns entrer dns les dtilsD r on pourrit en prler pendnt SH pges sns voir (ni D il fut svoir que si le progrmme ne ontrle ps e genre de sD l9utilisteur peut rire e qu9il veut l suite en mmoireF in prtiulierD il peut insrer du ode en mmoire et fire en sorte qu9il soit exut pr le progrmmeF g9est l9attaque par buer overowD une ttque de pirte lre mis di0ile rliserF ve ut de e hpitre ser de suriser l sisie de nos donnesD en emphnt l9utilisE teur de fire dorder et de provoquer un u'er over)owF fien srD on pourrit llouer un trs grnd tleu @IH HHH rtresAD mis ne hngerit rien u prolme X une personne qui veut fire dpsser de l mmoire n9ur qu9 envoyer plus de IH HHH rtres et son ttque mrher tout ussi ienF eussi te que el puisse prtreD tous les progrmmeurs n9ont ps toujours fit ttention elF 9ils vient fit les hoses proprement depuis le dutD une onne prtie des filles de surit dont on entend prler enore ujourd9hui ne serit jmis pprue 3
2

2. Si l'attaque par buer overow vous intresse, vous pouvez lire l'article  Dpassement de tampon  de Wikipdia (code web : 251507). Attention c'est quand mme assez compliqu.

PVH

RCUPRER UNE CHANE DE CARACTRES

Rcuprer une chane de caractres


sl existe plusieurs fontions stndrds en g qui permettent de ruprer une hne de texteF rormis l fontion scanf @trop omplique pour tre tudie iiAD il existe X ! gets X une fontion qui lit toute une hne de rtresD mis trs dngereuse r elle ne permet ps de ontrler les u'er over)ow 3 ! fgets X l9quivlent de gets mis en version suriseD permettnt de ontrler le nomre de rtres rits en mmoireF ous l9urez ompris X ien que e soit une fontion stndrd du gD gets est trs dngereuseF ous les progrmmes qui l9utilisent sont suseptiles d9tre vitimes de u'er over)owF xous llons don voir omment fontionne fgets et omment on peut l9utiliser en prtique dns nos progrmmes en remplement de scanfF

La fonction fgets
ve prototype de l fontion fgetsD situ dns stdio.hD est le suivnt X
1

hr B fgets @ hr B str D int num D psvi B strem A Y

sl est importnt de ien omprendre e prototypeF ves prmtres sont les suivntsF ! str X un pointeur vers un tleu llou en mmoire o l fontion v pouvoir rire le texte entr pr l9utilisteurF ! num X l tille du tleu str envoy en premier prmtreF xotez que si vous vez llou un tleu de IH charD fgets lir W rtres u mximum @il rserve toujours un rtre d9espe pour pouvoir rire le H de (n de hneAF ! stream X un pointeur sur le (hier lireF hns notre sD le  (hier lire est l9entre stndrdD 9estEEdire le lvierF our demnder lire l9entre stndrdD on enverr le pointeur stdinD qui est utomtiquement d(ni dns les heders de l iliothque stndrd du g pour reprsenter le lvierF outefoisD il est ussi possile d9utiliser fgets pour lire des (hiersD omme on pu le voir dns le hpitre sur les (hiersF v fontion fgets retourne le mme pointeur que str si l fontion s9est droule sns erreurD ou NULL s9il y eu une erreurF sl su0t don de tester si l fontion renvoy NULL pour svoir s9il y eu une erreurF estons 3
1 2 3 4 5 6 7 8 9

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y fgets @ nom D IH D stdin A Y

PVI

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


10 11 12 13

printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y

gopier e ode gode we X UTWWVU 

uel est votre nom c wteo eh 3 ous vous ppelez don wteo 3

fontionne trs ienD un dtil prs X qund vous pressez  intre D fgets onserve le \n orrespondnt l9ppui sur l touhe  intre F gel se voit dns l onsole r il y un sut l ligne prs  wteo dns mon exempleF yn ne peut rien fire pour empher fgets d9rire le rtre \nD l fontion est fite omme F in revnheD rien ne nous interdit de rer notre propre fontion de sisie qui v ppeler fgets et supprimer utomtiquement hque fois les \n 3

Crer sa propre fonction de saisie utilisant fgets


sl n9est ps trs di0ile de rer s propre petite fontion de sisie qui v fire quelques orretions hque fois pour nousF xous ppellerons ette fontion lireF ille renverr I si tout s9est ien pssD H s9il y eu une erreurF
liminer le saut de ligne \n

v fontion lire v ppeler fgets etD si tout s9est ien pssD elle v reherher le rtre \n l9ide de l fontion strchr que vous devriez dj onntreF i un \n est trouvD elle le remple pr un \0 @(n de hneA pour viter de onserver une  intre F oii le odeD omment ps ps X
1 2 3 4 5 6 7 8 9 10

5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` string Fh b GG enser inlure string F h pour strhr @A int lire @ hr B hine D int longueur A { hr B positionintree a xvv Y GG yn lit le texte sisi u lvier if @ fgets @ hine D longueur D stdin A 3a xvv A erreur de sisie c { GG s d '

11

PVP

RCUPRER UNE CHANE DE CARACTRES


12

13

14 15

16 17

18 19 20 21 22 23

} else { } }

positionintree a strhr @ hine D ' n ' A Y GG yn reherhe l ' 4 intr e 4 if @ positionintree 3a xvv A GG i on trouv le retour l ligne { B positionintree a ' H ' Y GG yn remple e rt re pr H } return I Y GG yn renvoie I si l fontion s ' est d roul e sns erreur

return H Y GG yn renvoie H s ' il y eu une erreur

gopier e ode gode we X SIWQIV  ous noterez que je me permets d9ppeler l fontion fgets diretement dns un ifF m9vite d9voir ruprer l vleur de fgets dns un pointeur juste pour tester si eluiEi est NULL ou nonF prtir du premier ifD je sis si fgets s9est ien droule ou s9il y eu un prolme @l9utilisteur rentr plus de rtres qu9il n9tit utorisAF i tout s9est ien pssD je peux lors prtir l reherhe du \n ve strchr et rempler et \n pr un \0 @(gF IWFRAF

Figure IWFR ! emplement du sut de ligne

ge shm montre que l hne rite pr fgets tit  Mateo\n\0 F xous vons rempl le \n pr un \0D e qui donn u (nl X  Mateo\0\0 F ge n9est ps grve d9voir deux \0 d90leF v9ordinteur s9rrte u premier \0 qu9il renontre et onsidre que l hne de rtres s9rrte lF ve rsultt c ih ien mrheF
1 2 3 4 5

int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y

PVQ

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


6 7 8 9 10

lire @ nom D IH A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y

uel est votre nom c wteo eh 3 ous vous ppelez don wteo 3

Vider le buer

xous ne sommes ps enore u out de nos ennuisF xous n9vons ps tudi e qui se pssit si l9utilisteur tentit de mettre plus de rtres qu9il n9y vit de ple 3
uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3

v fontion fgets tnt suriseD elle s9est rrte de lire u out du We rtre r nous vions llou un tleu de IH char @il ne fut ps oulier le rtre de (n de hne \0 qui oupe l IHe positionAF ve prolmeD 9est que le reste de l hne qui n9 ps pu tre luD svoir  rd elert Ier D n9 ps dispru 3 sl est toujours dns le buerF ve u'er est une sorte de zone mmoire qui reoit diretement l9entre lvier et qui sert d9intermdiire entre le lvier et votre tleu de stokgeF in gD on dispose d9un pointeur vers le u'erD 9est e fmeux stdin dont je vous prlis un peu plus ttF te rois qu9un petit shm ne ser ps de refus pour mettre les ides u lir @(gF IWFSAF vorsque l9utilisteur tpe du texte u lvierD le systme d9exploittion @indowsD pr exempleA opie diretement le texte tp dns le u'er stdinF ge u'er est l pour reevoir temporirement l9entre du lvierF ve rle de l fontion fgets est justement d9extrire du u'er les rtres qui s9y trouvent et de les opier dns l zone mmoire que vous lui indiquez @votre tleu chaineAF eprs voir e'etu son trvil de opieD fgets enlve du u'er tout e qu9elle pu opierF i tout s9est ien pssD fgets don pu opier tout le u'er dns votre hneD et insi le u'er se retrouve vide l (n de l9exution de l fontionF wis si l9utilisteur entre euoup de rtresD et que l fontion fgets ne peut opier qu9une prtie d9entre eux @pre que vous vez llou un tleu de IH char seulementAD seuls les rtres lus seront supprims du u'erF ous eux qui n9uront ps t lus y resteront 3 estons ve une longue hne X
1 2 3

int min @ int rg D hr B rgv A { hr nom IH Y

PVR

RCUPRER UNE CHANE DE CARACTRES

Figure IWFS ! veture du u'er du lvier


4 5 6 7 8 9 10

printf @ 4 uel est votre nom c 4 A Y lire @ nom D IH A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y

uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3

v fontion fgets n9 pu opier que les W premiers rtres omme prvuF ve proE lmeD 9est que les utres se trouvent toujours dns le u'er @(gF IWFTA 3 gel signi(e que si vous fites un utre fgets ensuiteD eluiEi v ller ruprer e qui tit rest en mmoire dns le u'er 3 estons e ode X
1 2 3 4 5 6 7 8

int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y lire @ nom D IH A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y lire @ nom D IH A Y

PVS

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

Figure IWFT ! veture du u'er du lvier ve dordement


9 10 11 12

printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y

xous ppelons deux fois l fontion lireF ourtntD vous llez voir qu9on ne vous lisse ps tper deux fois votre nom X en e'etD l fontion fgets ne demnde ps l9utilisteur de tper du texte l seonde fois r elle trouve du texte ruprer dns le u'er 3
uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3 eh 3 ous vous ppelez don rd eler 3

i l9utilisteur tpe trop de rtresD l fontion fgets nous protge ontre le dorE dement de mmoireD mis il reste toujours des tres du texte en trop dns le u'erF sl fut vider le u'erF yn v don mliorer notre petite fontion lire et ppeler " si esoin est " une sousEfontion viderBuffer pour fire en sorte que le u'er soit vid si on rentr trop de rtres X
1 2 3 4 5

void viderfuffer @A { int a H Y while @ 3a ' n ' 88 3a iyp A {

PVT

RCUPRER UNE CHANE DE CARACTRES


6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

a gethr @A Y

int lire @ hr B hine D int longueur A { hr B positionintree a xvv Y if @ fgets @ hine D longueur D stdin A 3a xvv A { positionintree a strhr @ hine D ' n ' A Y if @ positionintree 3a xvv A { B positionintree a ' H ' Y } else { viderfuffer @A Y } return I Y } else { viderfuffer @A Y return H Y }

gopier e ode gode we X RTVWTU  v fontion lire ppelle viderBuffer dns deux s X ! si l hne tit trop longue @on le sit pre qu9on n9 ps trouv de rtre \n dns l hne opieA Y ! s9il y eu une erreur @peu importe lquelleAD il fut vider l ussi le u'er pr surit pour qu9il n9y it plus rienF v fontion viderBuffer est ourte mis denseF ille lit dns le u'er rtre pr rtre gre getcharF gette fontion renvoie un int F yn se ontente de ruprer e int dns l vrile temporire cF yn oule tnt qu9on n9 ps rupr le rtre \n ou le symole EOF @(n de (hierAD qui signi(ent tous deux  vous tes rriv l (n du u'er F yn s9rrte don de ouler ds que l9on tome sur l9un de es deux rtresF g9est un peu ompliqu u premier ord et ssez tehniqueD mis fit son trE vilF x9hsitez ps relire es explitions plusieurs fois si nessire pour omprendre omment fontionneF
3

3. Et non un char, allez savoir pourquoi, peu importe.

PVU

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

Convertir la chane en nombre


xotre fontion lire est mintennt e0e et rousteD mis elle ne sit lire que du texteF ous devez vous demnder X  wis omment fitEon pour ruprer un nomre c in fitD lire est une fontion de seF eve fgetsD vous ne pouvez ruprer que du texteD mis il existe d9utres fontions qui permettent de onvertir ensuite un texte en nomreF
strtol

: convertir une chane en long

ve prototype de l fontion strtol est un peu prtiulier X


1

long strtol @ onst hr B strt D hr BB end D int se A Y

v fontion lit l hne de rtres que vous lui envoyez @startA et essie de l onvertir en long en utilisnt l base indique @gnrlementD on trville en se IH r on utilise IH hi'res di'rents de H WD don vous mettrez IHAF ille retourne le nomre qu9elle russi lireF unt u pointeur de pointeur endD l fontion s9en sert pour renvoyer l position du premier rtre qu9elle lu et qui n9tit ps un nomreF yn ne s9en servir psD on peut don lui envoyer NULL pour lui fire omprendre qu9on ne veut rien ruprerF v hne doit ommener pr un nomreD tout le reste est ignorF ille peut tre prde d9espesF uelques exemples d9utilistion pour ien omprendre le prinipe X
1 2 3 4 5 6 7 8

long i Y i i i i i i a a a a a a strtol @ 4 IRV 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV F PIS 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV F PIS 4 D xvv D IH AY GG i a IRV strtol @ 4 IRV C QR 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV feuilles mortes 4 D xvv D IH A Y GG i a IRV strtol @ 4 sl y IRV feuilles mortes 4 D xvv D IH A Y GG i a H @ erreur X l h ne ne ommene ps pr un nomre A

outes les hnes qui ommenent pr un nomre @ou ventuellement pr des espes suivis d9un nomreA seront onverties en long jusqu9 l premire lettre ou u premier rtre invlide @.D +D etFAF v dernire hne de l liste ne ommennt ps pr un nomreD elle ne peut ps tre onvertieF v fontion strtol renverr don HF yn peut rer une fontion lireLong qui v ppeler notre premire fontion lire @qui lit du texteA et ensuite onvertir le texte sisi en nomre X
1 2 3 4

long lirevong @A { hr nomreexte IHH a { H }Y GG IHH ses devrient suffire

PVV

CONVERTIR LA CHANE EN NOMBRE


5 6 7

8 9 10 11 12 13 14 15

if @ lire @ nomreexte D IHH A A { GG i leture du texte ok D onvertir le nomre en long et le retourner return strtol @ nomreexte D xvv D IH A Y } else { GG i prol me de leture D renvoyer H return H Y }

gopier e ode gode we X PPHVHW  ous pouvez tester dns un main trs simple X
1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { long ge a H Y printf @ 4 uel est votre ge c 4 A Y ge a lirevong @A Y printf @ 4 eh 3 ous vez don 7 d ns 3 n n 4 D ge A Y } return H Y

uel est votre ge c IV eh 3 ous vez don IV ns 3

strtod

: convertir une chane en double

v fontion strtod est identique strtolD l di'rene prs qu9elle essie de lire un nomre diml et renvoie un double X
1

doule strtod @ onst hr B strt D hr BB end A Y

ous noterez que le troisime prmtre base dispru iiD mis il y toujours le pointeur de pointeur end qui ne nous sert rienF gontrirement strtolD l fontion prend ette fois en ompte le  point dimlF ettentionD en revnhe X elle ne onnt ps l virgule F vous de jouer 3 rivez l fontion lireDoubleF ous ne devriez voir uun ml le fireD 9est extement omme lireLong prt que ette foisD on ppelle strtod et on retourne un doubleF
4

4. a se voit que a a t cod par des Anglais.

PVW

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

ous devriez lors pouvoir fire ei dns l onsole X


gomien pesez E vous c TUFR eh 3 ous pesez don TUFRHHHHH kg 3

issyez ensuite de modi(er votre fontion lireDouble pour qu9elle epte ussi le symole virgule omme sprteur dimlF v tehnique est simple X remplez l virgule pr un point dns l hne de texte lue @gre l fontion de reherhe strchrAD puis envoyez l hne modi(e strtodF

En rsum
! v fontion scanfD ien qu9en pprene simple d9utilistionD est en fit trs omplexe et nous oppose ertines limitesF yn ne peut psD pr exempleD rire plusieurs mots l fois filementF ! n buer overow survient lorsqu9on dpsse l9espe rserv en mmoireD pr exemple si l9utilisteur entre IH rtres lors qu9on n9vit rserv que S ses en mmoireF ! v9idl est de fire ppel l fontion fgets pour ruprer du texte sisi pr l9utilisteurF ! sl fut en revnhe viter tout prix d9utiliser l fontion gets qui n9o're ps de protetion ontre le u'er over)owF ! ous pouvez rire votre propre fontion de sisie du texte qui fit ppel fgets omme on l9 fit (n d9mliorer son fontionnementF

PWH

Troisime partie
Cration de jeux 2D en SDL

PWI

Chapitre

20
Dicult :

Installation de la SDL

partir de maintenant, ni la thorie : nous allons enn passer au concret ! Dans cette nouvelle et importante partie, nous allons nous faire plaisir et pratiquer grce une bibliothque que l'on appelle la SDL. Vous avez dj dcouvert la plupart des fonctionnalits du langage C, bien qu'il y ait toujours des petits dtails complexes et croustillants dcouvrir. Ce livre pourrait donc s'arrter l en annonant rement :  C'est bon, vous avez appris programmer en C ! . Pourtant, quand on dbute, on n'a en gnral pas le sentiment de savoir programmer tant qu'on n'est pas  sorti  de la console. La SDL est une bibliothque particulirement utilise pour crer des jeux en 2D. Nous allons dans ce premier chapitre en apprendre plus sur cette bibliothque et dcouvrir comment l'installer.

PWQ

CHAPITRE 20. INSTALLATION DE LA SDL

yn dit que l hv est une  iliothque tiere F sl fut svoir qu9il existe deux types de iliothquesF ! La bibliothque standard X 9est l iliothque de se qui fontionne sur tous les y @d9o le mot  stndrd A et qui permet de fire des hoses trs siques omme des printfF ille t utomtiquement instlle lorsque vous vez tlhrg votre shi et votre ompilteurF eu long des prties s et ssD nous vons uniquement utilis l iliothque stndrd @stdlib.hD stdio.hD string.hD time.hF F FAF ! Les bibliothques tierces X e sont des iliothques qui ne sont ps instlles pr dfutF ous devez les tlhrger sur snternet et les instller sur votre ordinE teurF gontrirement l iliothque stndrdD qui est reltivement simple et qui ontient ssez peu de fontionsD il existe des milliers de iliothques tieres rites pr d9utres progrmmeursF gertines sont onnesD d9utres moinsD ertines sont pyntesD d9utres grtuitesD etF l9idl tnt de trouver des iliothques de onne qulit et grtuites l fois 3 te ne peux ps fire un ours pour toutes les iliothques tieres qui existentF wme en y pssnt toute m vie PRh G PRD je ne pourris ps 3 t9i don fit le hoix de vous prsenter une et une seule iliothque rite en g et don utilisle pr des progrmmeurs en lngge g tels que vousF gette iliothque pour nom SDLF ourquoi iEje hoisi ette iliothque plutt qu9une utre c ue permetEelle de fire c eutnt de questions uxquelles je vis omE mener pr rpondreF
1

Pourquoi avoir choisi la SDL ?


Choisir une bibliothque : pas facile !
gomme je vous l9i dit l9instntD il existe des milliers et des milliers de iliothques tlhrgerF gertines d9entre elles sont simplesD d9utres plus omplexesF gertines sont tellement grosses que mme tout un ours omme elui que vous tes en trin de lire ne su0rit ps 3 pire un hoix est don durF he plusD 9est l premire iliothque que vous llez pprendre utiliser @si on ne ompte ps l iliothque stndrdAD il vut don mieux ommener pr une iliothque simpleF t9i rpidement onstt que l mjorit de mes leteurs souhitit douvrir omment ouvrir des fentresD rer des jeuxD etF unt moiD non seulement j9i ien envie de vous montrer omment on peut fire tout D mis en plus je tiens solument vous fire prtiquerF in e'etD nous vons ien fit quelques dns les prties s et ssD mis
2

1. Nous n'avons pas tudi la bibliothque standard dans son intgralit mais nous en avons vu un assez gros morceau. Si vous voulez tout savoir sur la bibliothque standard, faites une recherche sur Google, par exemple, en tapant  C standard library , et vous aurez la liste des prototypes ainsi qu'une brve explication de chacune des fonctions. 2. Enn, si vous aimez la console on peut continuer longtemps, si vous voulez. . . Non ? Ah bon, tiens c'est curieux !

PWR

POURQUOI AVOIR CHOISI LA SDL ?

e n9est ps ssezF g9est en forgent que l9on devient forgeronD et 9est en progrmmnt que euhF F F frefD vous m9vez ompris 3 te suis don prti pour vous l reherhe d9une iliothque l fois simple et puissnte pour que vous puissiez rpidement rliser vos rves les plus fous @presqueA sns douleur F
3

La SDL est un bon choix !


xous llons tudier l iliothque hv @(gF PHFIAF ourquoi elleEi et non ps une utre c

Figure PHFI ! vogo de l hv

! g9est une bibliothque crite en CD elle peut don tre utilise pr des progrmE meurs en g tels que vous F ! g9est une bibliothque libre et gratuite X el vous viter d9voir investir pour lire l suite du livreF gontrirement e que l9on pourrit penserD trouver des iliothques lires et grtuites n9est ps trs di0ileD il en existe euoup ujourd9huiF ne iliothque lire est tout simplement une iliothque dont vous pouvez otenir le ode soureF in e qui nous onerneD voir le ode soure de l hv ne nous intresser psF outefoisD le fit que l iliothque soit lire vous grntit plusieurs hosesD notmment s prennit @si le dveloppeur prinipl rrte de s9en ouperD d9utres personnes pourront l ontinuer s pleA insi que s grtuit le plus souventF v iliothque ne risque don ps de disprtre du jour u lendeminF ! Vous pouvez raliser des programmes commerciaux et propritaires avecF gertesD 9est peutEtre un peu trop vouloir ntiiperD mis utnt hoisir une ilioE thque grtuite qui vous lisse un mximum de liertsF in e'etD il existe deux types de iliothques lires X ! les iliothques sous license GPL X elles sont grtuites et vous pouvez voir le ode soureD mis vous tes oligs en ontreprtie de fournir le ode soure des progrmmes que vous rlisez ve Y ! les iliothques sous license LGPL X 9est l mme hoseD suf que ette fois vous n9tes ps oligs de fournir le ode soure de vos progrmmesF ous pouvez don rliser des progrmmes propritires veF
4

3. Tout est relatif, bien sr ! 4. Notez que comme la plupart des bibliothques crites en C, il est possible de les utiliser en C++ ainsi que dans d'autres langages.

PWS

CHAPITRE 20. INSTALLATION DE LA SDL

Bien qu'il soit possible juridiquement de ne pas diuser votre code source, je vous invite le faire quand mme. Vous pourrez ainsi obtenir des conseils de programmeurs plus expriments que vous. Cela vous permettra de vous amliorer. Aprs, c'est vous qui choisirez de raliser des programmes libres ou propritaires, c'est surtout une question de mentalit. Je ne rentrerai pas dans le dbat ici, pas plus que je ne prendrai position : on peut tirer du bon comme du mauvais dans chacun de ces deux types de programmes.

! g9est une bibliothque multi-plates-formesF ue vous soyez sous indowsD w ou vinuxD l hv fontionner hez vousF g9est mme d9illeurs e qui fit que ette iliothque est impressionnnte ux yeux des progrmmeurs X elle fontionne sur un trs grnd nomre de systmes d9exploittionF sl y indowsD w et vinux ertesD mis elle peut ussi fontionner sur etriD emigD yminD hremstD etF in lirD vos progrmmes pourrient trs ien fontionner sur de vieilles mhines omme l9etri 3 ! in(nD l iliothque permet de faire des choses amusantesF te ne dis ps qu9une iliothque mthmtique ple de rsoudre des qutions du qutrime degr n9est ps intressnteD mis je tiens e que e ours soit ludique utnt que possile (n de vous motiver progrmmerF v hv n9est ps une iliothque spilement onue pour rer des jeux vidoF te l9dmetsD l pluprt des progrmmes utilisnt l hv sont des jeux vidoD mis el ne veut ps dire que vous tes forment oligs d9en rerF e prioriD tout est possile ve plus ou moins de trvilD j9i dj eu l9osion de voir des diteurs de texte dvelopps l9ide de l hvD ien qu9il y it plus dpt F
5 6

Les possibilits oertes par la SDL


v hv est une iliothque s niveuF ous vous souvenez de e que je vous vis dit u tout dut du ours propos des lngges hut niveu et s niveu c ih ien s9pplique ussi ux iliothquesF ! Une bibliothque bas niveau X 9est une iliothque disposnt de fontions trs siquesF sl y en gnrl peu de fontions r on peut tout fire ve ellesF gomme les fontions restent siquesD elles sont trs rpidesF ves progrmmes rliss l9ide d9une telle iliothque sont don en gnrl e qui se fit de plus rpideF ! Une bibliothque haut niveau X elle possde euoup de fontions ples d9exuter de nomreuses tionsF gel l rend plus simple d9utilistionF outefoisD une iliothque de e genre est gnrlement  grosse D don plus di0ile tudier et onntre intgrlementF in outreD elle est souvent plus lente qu9une iliothque s niveu @ien que prfoisD ne soit ps vriment visileAF fien entenduD il fut nunerF yn ne peut ps dire  une iliothque s niveu est mieux qu9une iliothque hut niveu ou l9inverseF ghun des deux types prsente
5. Il faudrait nanmoins faire quelques petites adaptations et peut-tre utiliser un compilateur spcial. Nous n'en parlerons pas ici. 6. Si vous souhaitez dvelopper des interfaces graphiques classiques sous forme de fentres (boutons, menus, etc.), je vous invite vous renseigner plutt sur GTK+.

PWT

POURQUOI AVOIR CHOISI LA SDL ?

des qulits et des dfutsF v hv que nous llons tudier fit plutt prtie des iliothques s niveuF sl fut don retenir que l hv propose surtout des fontions siquesF ous vez pr exemple l possiilit de dessiner pixel pr pixelD de dessiner des retngles ou enore d90her des imgesF g9est toutD et 9est su0sntF ! in fisnt ouger une imgeD vous pouvez fire se dpler un personngeF ! in 0hnt plusieurs imges d90leD vous pouvez rer une nimtionF ! in ominnt plusieurs imges te teD vous pouvez rer un vritle jeuF our vous donner une ide de jeu rlisle ve l hvD shez que l9exellent  giviE liztion X gll to power t dpt pour vinux l9ide de l iliothque hv @(gF PHFPAF

Figure PHFP ! ve jeu giviliztion X gll to power utilise l hv

ge qu9il fut ien omprendreD 9est qu9en fit tout dpend de vous et ventuellement de votre quipeF ous pouvez fire des jeux enore plus eux si vous vez un grphiste dou sous l minF v seule limite de l hvD 9est l PhF ille n9est en e'et ps onue pour l QhF oii une liste de jeux que l9on peut prfitement onevoir en hv @e n9est qu9une petite listeD tout est possile priori tnt que reste de l PhA X ! gsseEriques Y ! fomermn Y ! etris Y ! jeux de plteEforme X uper wrio frosD oniD ymnF F F ! q Ph X eldD les premiers pinl pntsyD etF PWU

CHAPITRE 20. INSTALLATION DE LA SDL

sl m9est impossile de fire une liste omplteD l seule limite ii tnt l9imgintionF t9i d9illeurs vu un des leteurs de e ours rliser un roisement os entre un sseE riques et un etrisF edesendons sur erre et reprenons le (l de e oursF xous llons mintennt instller l hv sur notre ordinteur vnt d9ller plus loinF

Tlchargement de la SDL
ve site de l hv @www.libsdl.orgA devrit ientt devenir inontournle pour vousF vEsD vous trouverez tout e dont vous vez esoinD en prtiulier l iliothque elleEmme tlhrger insi que s doumenttionF  ite de l hv gode we X RVHUPR  ur le site de l hvD rendezEvous dns le menu guheD setion DownloadF lhrgez l version de l hv l plus rente que vous voyez F v pge de tlhrgement est spre en plusieurs prtiesF ! Source code X vous pouvez tlhrger le ode soure de l hvF gomme je vous l9i ditD le ode soure ne nous intresse psF te sis que vous tes urieux et que vous voudriez svoir omment 9est fit l9intrieurD mis tuellement ne vous pporter rienF ireD vous emrouiller et e n9est ps le utF ! Runtime libraries X e sont les (hiers que vous urez esoin de distriuer en mme temps que votre exutle lorsque vous donnerez votre progrmme d9utres personnesF ous indowsD il s9git tout simplement d9un (hier hvFdllF geluiEi devr se trouver X ! soit dns le mme dossier que l9exutle @e que je reommnde A Y ! soit dns le dossier c:\WindowsF ! Development libraries X e sont les (hiers .a @ou .lib sous isulA et .h vous permettnt de rer des progrmmes hvF ges (hiers ne sont nessires que pour vousD le progrmmeurF ous n9urez don ps les distriuer ve votre progrmme une fois qu9il ser (niF i vous tes sous indowsD on vous propose trois versions dpendnt de votre ompilteur X ! gT X pour eux qui utilisent isul tudio pynt dns une vieille version @e qui peu de hnes de vous onernerA Y vous y trouverez des (hiers .lib Y ! gV X pour eux qui utilisent isul tudio PHHS ixpress ou ultrieur Y vous y trouverez des (hiers Fli Y ! mingwQP X pour eux qui utilisent gode: :floks @il y ur don des (hiers .aAF v prtiulritD 9est que les  hevelopment lirries ontiennent tout e qu9il fut X
7 8

7. SDL 1.2 au moment o j'cris ces lignes. 8. L'idal est de toujours donner la DLL avec votre excutable et de la laisser dans le mme dossier. Si vous placez la DLL dans le dossier de Windows, vous n'aurez plus besoin de joindre une DLL dans chaque dossier contenant un programme SDL. Toutefois, cela peut poser des problmes de conits de version si vous crasez une DLL plus rcente.

PWV

CRER UN PROJET SDL

les .h et .a @ou .libA ien srD mis ussi l SDL.dll distriuer ve votre pplition insi que l doumenttion de l hv 3 frefD tout e que vous vez fire u (nl est de tlhrger les  hevelopment lirries F out e dont vous vez esoin s9y trouveF
Ne vous trompez pas de lien ! Prenez bien la SDL dans la section  Development libraries  et non le code source de la section  Source code  ! Qu'est-ce que la documentation ?

ne doumenttionD 9est l liste omplte des fontions d9une iliothqueF outes les doumenttions sont rites en nglis @ouiD mme les iliothques rites pr des prnis ont leur doumenttion en nglisAF oil une rison de plus pour progresser dns l lngue de hkespere 3 v doumenttion n9est ps un oursD elle est en gnrl ssez ustreF v9vntge pr rpport un oursD 9est qu9elle est omplteF ille ontient l liste de toutes les fontionsD 9est don ve rfrene du progrmmeurF fien souventD vous renontrerez des iliothques pour lesquelles il n9y ps de oursF ous urez uniquement l  do9 omme on l9ppelleD et vous devrez tre ples de vous drouiller ve seulement @mme si prfois 9est un peu dur de dmrrer sns ideAF n vri on progrmmeur peut don douvrir le fontionnement d9une iliothque uniquement en lisnt s do9F e prioriD vous n9urez ps esoin de l do9 de l hv de suite r je vis moiEmme vous expliquer omment elle fontionneF outefoisD 9est omme pour l iliothque stndrd X je ne pourri ps vous prler de toutes les fontionsF ous urez don erE tinement esoin de lire l do9 plus trdF v doumenttion se trouve dj dns le pkge  hevelopment lirries D mis si vous le voulez vous pouvez l tlhrger prt en vous rendnt dns le menu Documentation G DownloadableF te vous reommnde de pler les (hiers rwv de l doumenttion dns un dossier spil @intitul pr exemple Doc SDLA et de fire un rouri vers le sommire index.htmlF ve ut est que vous puissiez der rpideE ment l doumenttion lorsque vous en vez esoinF

Crer un projet SDL


v9instlltion d9une iliothque est en gnrl un petit peu plus omplique que les instlltions dont vous vez l9hitudeF siD il n9y ps d9instlleur utomtique qui vous demnde simplement de liquer sur Suivant - Suivant - Suivant - TerminerF in gnrlD instller une iliothque est ssez di0ile pour un dutntF ourtntD si peut vous remonter le morlD l9instlltion de l hv est euoup plus simple que ien d9utres iliothques que j9i eu l9osion d9utiliser @en gnrl on ne vous donne que le ode soure de l iliothqueD et 9est vous de l reompiler 3AF PWW

CHAPITRE 20. INSTALLATION DE LA SDL

in fitD le mot  instller n9est peutEtre ps elui qui onvient le mieuxF xous n9llons rien instller du tout X nous voulons simplement rriver rer un nouveu projet de type hv ve notre shiF yrD selon l9shi que vous utilisez l mnipultion ser un peu di'renteF te vis prsenter l mnipultion pour hun des shi que je vous i prsents u dut du ours pour que tout le monde puisse suivreF te vis mintennt vous montrer omment rer un projet hv sous hun de es trois shiF

Cration d'un projet SDL sous Code: :Blocks


1/ Extraction des chiers de la SDL

yuvrez le (hier ompress de  hevelopment virries que vous vez tlhrgF ge (hier est un .zip pour isul et un .tar.gz pour mingwQP @il vous fudr un logiiel omme inrr ou UEip pour dompresser le .tar.gzAF ve (hier ompress ontient plusieurs sousEdossiersF geux qui nous intressent sont les suivnts X ! bin X ontient l .dll de l hv Y ! docs X ontient l doumenttion de l hv Y ! include X ontient les .h Y ! lib X ontient les .a @ou .lib pour isulAF ous devez extrire tous es (hiers et dossiers quelque prt sur votre disque durF ous pouvez pr exemple les pler dns le dossier de gode: :floksD dns un sousEdossier SDL @(gF PHFQAF hns mon sD l hv ser instlle dns le dossier X etenez ien le nom du dossier dns lequel vous l9vez instlleD vous llez en voir esoin pour on(gurer gode: :floksF wintenntD il v flloir fire une petite mnipultion pour simpli(er l suiteF ellez dns le sousEdossier include/SDL F ous devriez y voir de nomreux petits (hiers .hF gopiezEles dns le dossier prentD 9estEEdire dns X
9

C:\Program Files\CodeBlocks\SDL-1.2.13

v hv est instlle 3 sl fut mintennt on(gurer gode: :floksF


2/ Cration du projet SDL

C:\Program Files\CodeBlocks\SDL-1.2.13\include

yuvrez mintennt gode: :floks et demndez rer un nouveu projetF eu lieu de rer un projet Console Application omme vous viez l9hitude de fireD vous llez demnder rer un projet de type SDL projectF
9. Dans mon cas, il se trouve dans C:\Program Files\CodeBlocks\SDL-1.2.13\include\SDL.

QHH

CRER UN PROJET SDL

Figure PHFQ ! ve dossier de l hv dzipp

v premire fentre de l9ssistnt qui pprt ne sert rienD liquez sur NextF yn vous demnde ensuite le nom de votre projet et le dossier dns lequel il doit tre plD omme vous l9vez toujours fit @(gF PHFRAF ient ensuite l prtie o vous devez indiquer o se trouve instlle l hv @(gF PHFSAF gliquez sur le outon ... droiteF ne nouvelle fentre un peu omplexe s9ouvre @(gF PHFTAF ous devez simplement remplir le hmp nomm baseF sndiquez le dossier o vous vez dompress l hvF hns mon sD 9est X
C:\Program Files\CodeBlocks\SDL-1.2.13

gliquez sur CloseF ne nouvelle fentre pprtF g9est une fentreEpige @dont je n9i toujours ps sisi l9intrtAF ille vous demnde un dossierF gliquez sur Annuler pour ne rien fireF gliquez ensuite sur Next dns l9ssistntD puis hoisissez de ompiler en mode Release ou Debug @peu importeA et en(nD hoisissez FinishF gode: :floks v rer un petit projet hv de test omprennt un main.c et un (hier .bmpF evnt d9essyer de le ompilerD opiez l hvv de l hv dns le dossier de votre projetF issyez ensuite de ompiler X une fentre ve une imge devrit s90herF frvoD fontionne 3
10

10. Vous devriez l'avoir copie dans C:\Program Files\CodeBlocks\SDL-1.2.13\bin\SDL.dll.

QHI

CHAPITRE 20. INSTALLATION DE LA SDL

Figure PHFR ! essistnt hv et nom de projet

Figure PHFS ! essistnt hv et on(gurtion

QHP

CRER UN PROJET SDL

Figure PHFT ! volistion de l hv


Si on vous dit  Cette application n'a pas pu dmarrer car SDL.dll est introuvable , c'est que vous n'avez pas copi le chier SDL.dll dans le dossier de votre projet ! Il faudra penser fournir cette .dll en plus de votre .exe vos amis si vous voulez qu'ils puissent eux aussi excuter le programme. En revanche, vous n'avez pas besoin de leur joindre les .h et .a qui n'intressent que vous.

ous pouvez supprimer le .bmp du progrmmeD on n9en ur ps esoinF unt u (hier main.cD il est un peu longD on ne v ps dmrrer ve F upprimez tout son ontenu et remplezEle pr X
1 2 3 4 5 6 7 8 9

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { } return H Y

gopier e ode gode we X SUVWQH  g9est en fit un ode de se trs similire eux que l9on onnt @un include de stdlibD un utre de stdioD un mainF F FAF v seule hose qui hngeD 9est le include d9un (hier SDL.hF g9est le (hier .h de se de l hv qui se hrger d9inlure tous QHQ

CHAPITRE 20. INSTALLATION DE LA SDL

les utres (hiers .h de l hvF

Cration d'un projet SDL sous Visual C++


1/ Extraction des chiers de la SDL

ur le site de l hvD tlhrgez l dernire version de l hvF hns l setion  heE velopment virries D prenez l version pour isul gCC PHHS ervie k IF yuvrez le (hier zipF sl ontient l do9 @dossier docsAD les .h @dossier includeAD et les .lib @dossier libA qui sont l9quivlent des .a pour le ompilteur de isulF ous trouverez ussi le (hier SDL.dll dns e dossier libF ! gopiez SDL.dll dns le dossier de votre projetF ! gopiez les .lib dns le dossier lib de isul gCCF r exemple hez moi il s9git du dossier X C:\Program Files\Microsoft Visual Studio 8\VC\libF ! gopiez les .h dns le dossier includes de isul gCCF grez un dossier SDL dns e dossier includes pour regrouper les .h de l SDL entre euxF ghez moiD je mets don les .h dns X C:\Program Files\Microsoft Visual Studio 8\VC\include\SDLF
2/ Cration d'un nouveau projet SDL

ous isul gCCD rez un nouveu projet de type Application console Win32F eppelez votre projet testsdl pr exempleF gliquez sur yuF n ssistnt v s9ouvrirF ellez dns Paramtres de l'application et vri(ez que Projet vide est oh @(gF PHFUAF ve projet est lors rF sl est videF ejoutezEy un nouveu (hier en fisnt un li droit sur Fichiers sourcesD Ajouter G Nouvel lment @(gF PHFVAF hns l fentre qui s9ouvreD demndez rer un nouveu (hier de type Fichier C++ (.cpp) que vous ppellerez main.cF in utilisnt l9extension .c dns le nom du (hierD isul rer un (hier .c et non un (hier .cppF rivez @ou opiezEollezA le ode  de se mentionn prdemment dns votre nouveu (hier videF
3/ Conguration du projet SDL sous Visual C++

v on(gurtion du projet est un peu plus dlite que pour gode: :floksD mis elle reste huminement fisleF ellez dns les proprits de votre projet X Projet G Proprits de testsdlF ! hns l setion C / C++ => Gnration de codeD mettez le hmp Bibliothque runtime DLL multithread (/MD)F ! hns l setion C/C++ => AvancD sletionnez Compilation sous et optez pour l vleur Compiler comme code C (/TC) @sinon isul vous ompiler votre projet omme tnt du gCCAF QHR

CRER UN PROJET SDL

Figure PHFU ! gohez Projet

vide

Figure PHFV ! ejout d9un nouveu (hier

QHS

CHAPITRE 20. INSTALLATION DE LA SDL

! hns l setion diteur de liens => EntreD modi(ez l vleur de Dpendances supplmentaires pour y jouter SDL.lib SDLmain.libF ! hns l setion diteur de liens => SystmeD modi(ez l vleur de Sous-systme et mettezEl Windows @(gF PHFWAF

Figure PHFW ! gon(gurtion de isul pour l hv

lidez ensuite vos modi(tions en liqunt sur OK et enregistrez le toutF ous pouvez mintennt ompiler en llnt dns le menu Gnrer / Gnrer la solutionF endezEvous dns le dossier de votre projet pour y trouver votre exutle @il ser peutEtre dns un sousEdossier DebugAF x9ouliez ps que le (hier SDL.dll doit se trouver dns le mme dossier que l9exutleF houleEliquez sur votre .exe X si tout v ienD il ne devrit rien se psserF inonD s9il y une erreur 9est prolement que le (hier SDL.dll ne se trouve ps dns le mme dossierF

Cration d'un projet SDL avec Xcode (Mac OS X)


gette setion t l9origine rdige pr ouetforever du ite du roD que je remerie nouveu u pssgeF out d9ordD rendezEvous sur le site de l hv pour tlhrger l version IFP pour w yF hns l9roresene de guheD liquez sur SDL 1.2 dns l prtie DownloadD omme indiqu l (gure PHFIHF in s de l pgeD vous trouverez une prtie Runtime LibrariesF lhrgez le (hier onernnt votre rhiteture @sntel ou owergAD omme sur l (gure PHFIIF our onntre votre rhitetureD il su0t d9ller dns le menu Pomme en hut guhe et de liquer sur propos de ce MacF ur l ligne ProcesseurD vous verrez soit sntelD QHT

CRER UN PROJET SDL

Figure PHFIH ! gliquez sur hv IFP

soit owergF

Figure PHFII ! ghoisissez le type d9rhiteture

ne fois le (hier tlhrgD montezEle @douleEliquez dessusA Y il devrit lors s9ouvrir tout seulF hns e dossierD vous trouverez un dossier SDL.frameworkF gopiezEle et ollezE le dns le dossier /Library/Frameworks @en frnis /Bibliothque/FrameworksAF y estD notre iliothque est instlle 3 ous trouverez un utre dossier qui se nomme devel-lite Y grdezEle ouvertD nous nous en servirons pr l suiteF wintenntD rez un nouveu projet goo epplitionD puis liquez sur NextF hns QHU

CHAPITRE 20. INSTALLATION DE LA SDL


Product NameD nommez votre projet @ hv

pr exempleA et dns Company IdentifierD mettez e que vous voulez @votre pseudo pr exempleAF vissez le reste tel quel puis liquez sur NextF ghoisissez o vous souhitez mettre votre projetF n dossier ser rD don ps esoin d9en rer un et d9y pler votre projetF ne fois votre projet rD vous pouvez supprimer tous les (hiers qui ne nous serviront ps X AppDelegate.hD AppDelegate.mD MainMenu.xibD InfoPlist.stringsD main.m et Credits.rtf @(gure PHFIPAF

Figure PHFIP ! ous pouvez supprimer les (hiers inutiles

letionnez votre projet dns l9roresene de guhe @Install SDL sur l (gure PHFIPAF hns l Pe roreseneD sletionnez le nom de votre projet sous PROJECT @et ps TARGETSA @(gure PHFIQAF

Figure PHFIQ ! letionnez votre projet

ous pouvez ventuellement hnger l lolistion de English FrenchF letionnez liquez sur le - pour le supprimer et liquez sur le + pour jouter French @si vous ne le fites psD n9ur uune inideneAF yn v mintennt on(gurer notre projet en QPits @l hv ne fontionnnt ps en TR itsA et jouter les hemins pour les frmeworks insi que les di'rents hedersF
EnglishD

QHV

CRER UN PROJET SDL

gliquez sur l9onglet Build SettingsD puis AllF insuite dns ArchitecturesD liquez sur 64-bit Intel et sletionnez 32-bit IntelD omme l (gure PHFIRF

Figure PHFIR ! sl fut on(gurer le projet en QP its

ellez dns le hmp de reherhe en hut droite et tpez  serh pths Y vous devriez trouver les P lignes qui nous intressent X Header search paths et Framework search pathsF houle liquez sur l zone droite de l ligne Framework search pathsD liE quez sur le + et joutez le hemin /Library/FrameworksF our Header Search paths joutez le hemin /Library/Frameworks/SDL.framework/HeadersF ous devriez voir le mme rsultt qu9 l (gure PHFISF

Figure PHFIS ! emplissez les hmps orrespondnts

letionnez mintennt votre  ile @en dessous de TARGETS ette foisEiAD omme l (gure PHFITF

Figure PHFIT ! letionnez l ile

ellez dns l9onglet SummaryF hns Application CategoryD vous pouvez mettre e que vous voulezD mis n9pporte ps grnd hoseD 9est pour l9epptoreF wodi(ez l ligne Main Interface et mettez  hvwin F ve dre App IconD omme son nom l9indiqueD est pour d(nir une ine votre progrmmeF sl su0t de fire glisser l9imge souhite dns le dre @ve un drag & drop AF hns l prtie Linked Frameworks and LibrariesD on v jouter notre frmework X SDL.frameworkF gliquez sur le + et dns le hmp de reherheD tpez  hv F und vous vez repr le frmeE work D liquez sur  edd F i vous ne trouvez ps le frmework dns l liste drouE lnteD 9est que vous ne l9vez ps pl dns le on dossier @/Library/Frameworks ou /Bibliothque/Frameworks en frnisAF QHW

CHAPITRE 20. INSTALLATION DE LA SDL

Les icnes sous Mac OS sont de type .icns. Si vous mettez un autre format, vous remarquerez que votre icne n'apparat pas. Il faut donc que vous utilisiez une icne au format .icns. Si vous voulez convertir une image en icne, vous pouvez utiliser le logiciel Icon Composer qui se situe dans le dossier /Developer/Applications/Utilities. Il vous sut simplement de glisser votre image dans le cadre souhait et d'enregistrer votre image.

hns l9onglet InfoD on peut indiquer euoup d9informtions onernnt le proE grmme Y je ne m9ttrderi ps dessusD si vous voulez des informtionsD je vous onseille de lire l do d9epple e sujetF ves deux seules hoses que vous pouvez ventuellement modi(er sont l LocalizationD de en en frD insi que le Copyright pour y mettre e que vous voulez @le __MyCompanyName__ n9est ps gnilAF ellez ensuite dns l9onglet Build Phases et liquez sur Add Build Phase > Copy Files en s droite de l fentreF houle liquez sur le nom Copy Files et renomE mez le en  gopy frmeworks into pp F hns DestinationD sletionnez FrameworksF our jouter vos frmeworksD glissezEles de l9roresene de guhe dns votre Build phaseD omme l (gure PHFIUF

Figure PHFIU ! qlissez vos frmeworks dns le Build

phase

te vous onseille de rnger tous vos frmeworks dns le dossier FrameworkF gel vous permettr de vous y retrouver plus filementF he mme pour les (hiers souresD je vous onseille de rer des dossiers pour les rnger orretementF our rer un dossierD il fut fire un li droit et New GroupD ensuite vous glissez vos (hiers dednsF xous llons mintennt jouter les (hiers SDLMain.h et SDLMain.mF ellez dns le dossier devel-lite ouvert prdemment et joutez les P (hiers u projetF i une fentre vous demndnt de hoisir des options pour l opie s90heD ohez l se Copy items into destination group's folder (if needed)F hernire ligne droite X rez un (hier main.cF ellez dns le menu File > New > New FileD puis dns C and C++F letionnez C File puis NextF xommez votre (hier et QIH

CRER UN PROJET SDL

le tour est jou 3

Et sous Linux ?
i vous ompilez sous vinux ve un shiD il fudr modi(er les proprits du projet @l mnipultion ser qusiment l mmeAF i vous utilisez gode: :floks @qui existe ussi en version vinuxA vous pouvez suivre l mme produre que elle que j9i drite plus hutF
Et pour ceux qui compilent la main ?

sl y en peutEtre prmi vous qui ont pris l9hitude de ompiler l min sous vinux l9ide d9un Makele @(hier ommndnt l ompiltionAF i 9est votre sD je vous invite tlhrger un Makele que vous pouvez utiliser pour ompiler des projets hvF  lhrger le Makele gode we X TIWSPS  v seule hose un peu prtiulireD 9est l9jout de l iliothque hv pour le linker @LDFLAGSAF sl fudr que vous yez tlhrg l hv version vinux et que vous l9yez instlle dns le dossier de votre ompilteurD de l mme mnire qu9on le fit sous indows @dossiers include/SDL et libA insuiteD vous pourrez utiliser les ommndes suivntes dns l onsole X
mke 5 our ompiler le projet mke len 5 our effer les fihiers de ompiltion @F o inutiles A mke mrproper 5 our tout supprimer suf les fihiers soure

En rsum
! v hv est une iliothque de s niveu qui permet d9ouvrir des fentres et d9y fire des mnipultions grphiques en PhF ! ille n9est ps instlle pr dfutD il fut l tlhrger et on(gurer votre shi pour l9utiliserF ! ille est lire et grtuiteD e qui vous permet de l9utiliser rpidement et vous grntit s prennitF ! sl existe des milliers d9utres iliothques dont euoup sont de trs onne qulitF g9est l hv qui t sletionne pour l suite de e ours pour son spet ludiqueF i vous souhitez dvelopper des interfes ompltes ve menus et outons pr l suiteD je vous invite vous penher sur l iliothque quC pr exempleF QII

CHAPITRE 20. INSTALLATION DE LA SDL

QIP

Chapitre

21
Dicult :

Cration d'une fentre et de surfaces

ans le chapitre prcdent, nous avons fait un petit tour d'horizon de la SDL pour dcouvrir les possibilits que cette bibliothque nous ore. Vous l'avez normalement tlcharge et vous tes capables de crer un nouveau projet SDL valide sans aucun problme. Celui-ci est toutefois encore trs vide. Nous attaquons le vif du sujet ds ce chapitre. Nous allons poser les bases de la programmation en C avec la SDL. Comment charger la SDL ? Comment ouvrir une fentre aux dimensions dsires ? Comment dessiner l'intrieur de la fentre ? Nous avons du pain sur la planche. Allons-y !

QIQ

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

Charger et arrter la SDL


n grnd nomre de iliothques rites en g nessitent d9tre initilises et fermes pr des ppels des fontionsF v hv n9hppe ps l rgleF in e'etD l iliothque doit hrger un ertin nomre d9informtions dns l mmoire pour pouvoir fontionner orretementF ges informtions sont hrges en mmoire dyE nmiquement pr des malloc @ils sont trs utiles ii 3AF yrD omme vous le svezD qui dit malloc ditF F F free 3 ous devez lirer l mmoire que vous vez lloue mnuellement et dont vous n9vez plus esoinF i vous ne le fites psD votre progrmme v prendre plus de ple en mmoire que nessireD et dns ertins s peut tre rrment tstrophique F oii don les deux premires fontions de l hv onntre X ! SDL_Init X hrge l hv en mmoire @des malloc y sont fitsA Y ! SDL_Quit X lire l hv de l mmoire @des free y sont fitsAF v toute premire hose que vous devrez fire dns votre progrmme ser don un ppel SDL_InitD et l dernire un ppel SDL_QuitF
1

SDL_Init

: chargement de la SDL

v fontion SDL_Init prend un prmtreF ous devez indiquer quelles prties de l hv vous souhitez hrgerF
Ah bon, la SDL est compose de plusieurs parties ?

ih oui 3 sl y une prtie de l hv qui gre l90hge l9rnD une utre qui gre le sonD etF v hv met votre disposition plusieurs onstntes pour que vous puissiez indiquer quelle prtie vous vez esoin d9utiliser dns votre progrmme @tF PIFIAF i vous ppelez l fontion omme ei X
1

hvsnit @ hvsxsshiy A Y

F F F lors le systme vido ser hrg et vous pourrez ouvrir une fentreD y dessinerD etF in fitD tout e que vous fites 9est envoyer un nomre SDL_Init l9ide d9une onstnteF ous ne svez ps de quel nomre il s9gitD et justement 9est qui est ienF ous vez juste esoin d9rire l onstnteD 9est plus file lire et retenirF v fontion SDL_Init regrder le nomre qu9elle reoit et en fontion de elD elle sur quels systmes elle doit hrgerF wintenntD si vous fites X
1. Imaginez que vous fassiez une boucle innie de malloc sans le faire exprs : en quelques secondes, vous saturerez toute votre mmoire !

QIR

CHARGER ET ARRTER LA SDL

Constante

ghrge le systme d90hge @vidoAF g9est l prtie que nous hrgerons le plus souventF SDL_INIT_AUDIO ghrge le systme de sonF ous permettr don pr exemple de jouer de l musiqueF SDL_INIT_CDROM ghrge le systme de ghEywF ous permettr de mniE puler votre leteur de ghEyw SDL_INIT_JOYSTICK ghrge le systme de gestion du joystikF SDL_INIT_TIMER ghrge le systme de timerF gel vous permet de grer le temps dns votre progrmme @trs prtiqueAF SDL_INIT_EVERYTHING ghrge tous les systmes lists iEdessus l foisF Table PIFI ! viste des onstntes de hrgement de l hv
SDL_INIT_VIDEO
1

Description

hvsnit @ hvsxsiirsxq A Y

F F F vous hrgez tous les sytmes de l hvF xe fites el que si vous vez vriment esoin de toutD il est inutile de surhrger votre ordinteur en hrgent des modules dont vous ne vous servirez psF
Supposons que je veuille charger l'audio et la vido seulement. Dois-je utiliser SDL_INIT_EVERYTHING ?

ous n9llez ps utiliser SDL_INIT_EVERYTHING juste pre que vous vez esoin de deux modulesD puvres fous 3 reureusementD on peut ominer les options l9ide du symole | @l rre vertileAF
1 2

GG ghrgement de l vid o et de l ' udio hvsnit @ hvsxsshiy | hvsxsehsy A Y

ous pouvez ussi en ominer trois sns prolme X


1 2

GG ghrgement de l vid o D de l ' udio et du timer hvsnit @ hvsxsshiy | hvsxsehsy | hvsxsswi A Y

Ces  options  que l'on envoie SDL_Init sont aussi appeles ags . C'est quelque chose que vous rencontrerez assez souvent. Retenez bien qu'on utilise la barre verticale | pour combiner les options. a agit un peu comme une addition.
SDL_Quit

: arrt de la SDL

v fontion SDL_Quit est trs simple utiliser vu qu9elle ne prend ps de prmtre X


1

hvuit @A Y

QIS

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

ous les systmes initiliss seront rrts et lirs de l mmoireF frefD 9est un moyen de quitter l hv proprementD fire l (n de votre progrmmeF

Canevas de programme SDL


in rsumD voii quoi v ressemler votre progrmme hv dns s version l plus simple X
1 2 3 4 5 6 7

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y GG h mrrge de l hv @ ii X hrgement du syst me vid o A GB v hv est hrg e F ous pouvez mettre ii le ontenu de votre progrmme BG hvuit @A Y GG err t de l hv @ li rtion de l m moire A F } return H Y

8 9 10 11 12 13 14 15 16 17

gopier e ode gode we X QSUHWT  fien entenduD uun progrmme  srieux ne tiendr dns le mainF ge que je fis l est shmtiqueF hns l rlitD votre main ontiendr ertinement de nomreux ppels des fontions qui feront elles ussi plusieurs ppels d9utres fontionsF ge qui ompte u (nlD 9est que l hv soit hrge u dut et qu9elle soit ferme l (n qund vous n9en vez plus esoinF

Grer les erreurs


v fontion SDL_Init renvoie une vleur X ! EI en s d9erreur Y ! H si tout s9est ien pssF ous n9y tes ps oligsD mis vous pouvez vri(er l vleur retourne pr SDL_InitF peut tre un on moyen de triter les erreurs de votre progrmme et don de vous ider les rsoudreF QIT

CHARGER ET ARRTER LA SDL

Mais comment acher l'erreur qui s'est produite ?

ixellente question 3 yn n9 plus de onsole mintenntD don omment fire pour stoker et 0her des messges d9erreurs c heux possiilits X ! soit on modi(e les options du projet pour qu9il 0he nouveu l onsoleF yn pourr lors fire des printf Y ! soit on rit dns un (hier les erreursF yn utiliser fprintfF t9i hoisi d9rire dns un (hierF gependntD rire dns un (hier implique de fire un fopenD un fcloseF F F refD 9est un peu moins file qu9un printfF reureusementD il y une solution plus simple X utiliser l sortie d9erreur stndrdF sl y une vrile stderr qui est d(nie pr stdio.h et qui pointe vers un endroit o l9erreur peut tre rite F gette vrile est utomtiquement re u dut du progrmme et supprime l (nF ous n9vez don ps esoin de fire de fopen ou de fcloseF ous pouvez don fire un fprintf sur stderr sns utiliser fopen ou fclose X
2 1 2 3 4 5 6 7

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { if @ hvsnit @ hvsxsshiy A aa EI A GG h mrrge de l hv F i erreur X { fprintf @ stderr D 4 irreur d ' initilistion de l hv X 7 s n 4 D hvqetirror @A A Y GG riture de l ' erreur exit @ ispesvi A Y GG yn quitte le progrmme } hvuit @A Y } return isggi Y

8 9

10 11 12 13 14 15 16 17

gopier e ode gode we X UIPTWH  uoi de neuf dns e ode c ! yn rit dns stderr notre erreurF ve %s permet de lisser l hv indiquer les dtils de l9erreur X l fontion SDL_GetError() renvoie en e'et l dernire erreur de l hvF
2. Gnralement sous Windows, ce sera un chier stderr.txt tandis que sous Linux, l'erreur apparatra le plus souvent dans la console.

QIU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

! yn quitte en utilisnt exit()F tusqueElD rien de nouveuF outefoisD vous urez remrqu que j9utilise une onstnte @EXIT_FAILUREA pour indiquer l vleur que renvoie le progrmmeF he plusD l (n j9utilise EXIT_SUCCESS u lieu de HF u9estE e que j9i hng c in fit j9mliore petit petit nos odes soureF in e'etD le nomre qui signi(e  erreur pr exemple peut tre di'rent selon les ordinteurs 3 gel dpend l enore de l9yF our pllier e prolmeD stdlib.h nous fournit deux onstntes @des defineA X ! EXIT_FAILURE X vleur renvoyer en s d9he du progrmme Y ! EXIT_SUCCESS X vleur renvoyer en s de russite du progrmmeF in utilisnt es onstntes u lieu de nomresD vous tes ertins de renvoyer une vleur orrete quel que soit l9yF ourquoi c re que le (hier stdlib.h hnge selon l9y sur lequel vous tesD don les vleurs des onstntes sont dptesF otre ode soureD luiD n9 ps esoin d9tre modi( 3 g9est e qui rend le lngge g omE ptile ve tous les y F
3

Cela n'a pas de grandes consquences pour nous pour le moment, mais c'est plus srieux d'utiliser ces constantes. C'est donc ce que nous ferons partir de maintenant.

Ouverture d'une fentre


fon X l hv est initilise et ferme orretementD mintenntF v prohine tpeD si vous le voulez ienD et je suis sr que vous le voulez ienD 9est l9ouverture d9une fentre 3 our ommener djD ssurezEvous d9voir un main qui ressemle ei X
1 2 3 4 5 6 7 8 9 10 11 12

int min @ int rg D hr B rgv A { if @ hvsnit @ hvsxsshiy A aa EI A { fprintf @ stderr D 4 irreur d ' initilistion de l hv 4 A Y exit @ ispesvi A Y } hvuit @A Y } return isggi Y

gel devrit tre le s si vous vez ien suivi le dut du hpitreF our le moment donD on initilise juste l vido @SDL_INIT_VIDEOAD 9est tout e qui nous intresseF
3. Pour peu que vous programmiez correctement en utilisant les outils fournis, comme ici.

QIV

OUVERTURE D'UNE FENTRE

Choix du mode vido


v premire hose fire prs SDL_Init()D 9est indiquer le mode vido que vous vouE lez utiliserD 9estEEdire l rsolutionD le nomre de ouleurs et quelques utres optionsF yn v utiliser pour el l fontion SDL_SetVideoMode() qui prend qutre prmtres X ! l lrgeur de l fentre dsire @en pixelsA Y ! l huteur de l fentre dsire @en pixelsA Y ! le nomre de ouleurs 0hles @en its G pixelA Y ! des options @des ags AF our l lrgeur et l huteur de l fentreD je rois que je ne vis ps vous fire l9'ront de vous expliquer e que 9estF r ontreD les deux prmtres suivnts sont plus intressntsF ! Le nombre de couleurs X 9est le nomre mximl de ouleurs 0hles dns votre fentreF i vous jouez ux jeux vidoD vous devriez voir l9hitude de elF ne vleur de QP its G pixel permet d90her des millirds de ouleurs @9est le mximumAF g9est ette vleur que nous utiliserons le plus souvent r dsormis tous les ordinteurs grent les ouleurs en QP its F ! Les options X omme pour SDL_Init on doit utiliser des )gs pour d(nir des optionsF oii les prinipux )gs que vous pouvez utiliser @et ominer ve le symole |AF ! SDL_HWSURFACE X les donnes seront hrges dns l mmoire vidoD 9estEEdire dns l mmoire de votre rte QhF evntge X ette mmoire est plus rpideF hfut X il y en gnrl moins d9espe dns ette mmoire que dns l9utre @SDL_SWSURFACEAF ! SDL_SWSURFACE X les donnes seront hrges dns l mmoire systme @9estEE dire l ewD prioriAF evntge X il y euoup d9espe dns ette mmoireF hfut X 9est moins rpide et moins optimisF ! SDL_RESIZABLE X l fentre ser redimensionnleF r dfut elle ne l9est psF ! SDL_NOFRAME X l fentre n9ur ps de rre de titre ni de ordureF ! SDL_FULLSCREEN X mode plein rnF hns e modeD uune fentre n9est ouverteF otre progrmme prendr toute l ple l9rnD en hngent utomtiquement l rsolution de eluiEi u esoinF ! SDL_DOUBLEBUF X mode double bueringF g9est une tehnique trs utilise dns les jeux PhD et qui permet de fire en sorte que les dplements des ojets l9rn soient )uidesD sinon sintille et 9est ssez lidF te vous expliqueri les dtils de ette tehnique trs intressnte plus loinF honD si je fis X
4 1

hvetideowode @ TRH D RVH D QP D hvrpegi A Y

F F F el ouvre une fentre de tille TRH x RVH en QP its G pixel @millirds de ouleursA qui ser hrge en mmoire vido @9est l plus rpideD on prfrer utiliser elleElAF
4. Sachez aussi que vous pouvez mettre des valeurs plus faibles comme 16 bits / pixel (65536 couleurs), ou 8 bits / pixel (256 couleurs). Cela peut tre utile surtout si vous faites un programme pour un petit appareil genre PDA ou tlphone portable.

QIW

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

eutre exempleD si je fis X


1

hvetideowode @ RHH D QHH D QP D hvrpegi | hvisefvi | hvhyfvifp A Y

F F F el ouvre une fentre redimensionnle de tille initile RHH x QHH @QP its G pixelA en mmoire vidoD ve le doule u'ering tivF oii un premier ode soure trs simple que vous pouvez essyer X
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvuit @A Y } return isggi Y

gopier e ode gode we X IWRHRW  estezF ue se psseEtEil c v fentre pprt et disprt l vitesse de l lumireF in e'etD l fontion SDL_SetVideoMode est immditement suivie de SDL_QuitD don tout s9rrte immditementF

Mettre en pause le programme


Comment faire en sorte que la fentre se maintienne ?

sl fut fire omme le font tous les progrmmesD que e soit des jeux vido ou utre X une oule in(nieF in e'etD l9ide d9une te oule in(nie on emphe notre progrmme de s9rrterF ve prolme est que ette solution est trop e0e r du oupD il n9y ps de moyen d9rrter le progrmme F oii un ode qui fontionne mis ne pas testerD je vous le donne juste titre explitif X
6

5. J'ai volontairement retir la gestion d'erreur pour rendre le code plus lisible et plus court, mais vous devriez dans un vrai programme prendre toutes les prcautions ncessaires et grer les erreurs. 6. part un bon vieux CTRL + ALT + SUPPR la rigueur mais c'est. . . brutal.

QPH

OUVERTURE D'UNE FENTRE


1 2 3 4 5 6 7 8 9 10 11 12

int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y while @ I A Y hvuit @A Y } return isggi Y

ous reonnissez le while(1); X 9est l oule in(nieF gomme I signi(e  vri @rppelezEvous les oolensAD l oule est toujours vrie et tourne en rond ind(niment sns qu9il y it moyen de l9rrterF ge n9est don ps une trs onne solutionF our mettre en puse notre progrmme (n de pouvoir dmirer notre elle fentre sns fire de oule interminleD on v utiliser une petite fontion moiD l fontion pause() X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

void puse @A { int ontinuer a I Y hvivent event Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y } }

gopier e ode gode we X ISUUPP  te ne vous explique ps le dtil de ette fontion pour le momentF g9est volontireD r el fit ppel l gestion des vnements que je vous expliqueri seulement dns un prohin hpitreF i je vous explique tout l fois mintenntD vous risquez de tout mlnger 3 pites don pour l9instnt on(ne m fontion de puseD nous ne trderons ps l9expliquerF oii un ode soure omplet et orret que vous pouvez @en(n 3A tester X
1 2 3

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b

QPI

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


4 5 6 7 8 9 10 11

void puse @A Y int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y GG snitilistion de l hv hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG yuverture de l fen tre puse @A Y GG wise en puse du progrmme hvuit @A Y GG err t de l hv } return isggi Y GG permeture du progrmme

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

void puse @A { int ontinuer a I Y hvivent event Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y } }

gopier e ode gode we X WIVTUI  ous remrquerez que j9i mis le prototype de m fontion pause() en hut pour tout vous prsenter sur un seul (hierF te fis ppel l fontion pause() qui fit une oule in(nie un peu plus intelligente que tout l9heureF gette oule s9rrter en e'et si vous liquez sur l roix pour fermer l fentre 3 v (gF PIFI vous donne une ide de e quoi devrit ressemler l fentre que vous vez sous les yeux @iiD une fentre TRH x RVHAF (ou 3 xous y sommes en(n rrivs 3 i vous voulezD vous pouvez mettre le )g  redimensionnle pour utoriser le rediE mensionnement de votre fentreF outefoisD dns l pluprt des jeux on prfre voir une fentre de tille (xe @9est plus simple grer 3AD nous grderons don notre fentre (xe pour le momentF QPP

OUVERTURE D'UNE FENTRE

Figure PIFI ! ne fentre vide en TRH x RVH


Attention au mode plein cran (SDL_FULLSCREEN) et au mode sans bordure (SDL_NOFRAME). Comme il n'y a pas de barre de titre dans ces deux modes, vous ne pourrez pas fermer le programme et vous serez alors obligs d'utiliser la commande CTRL + ALT + SUPPR. Attendez d'apprendre manipuler les vnements SDL (dans quelques chapitres) et vous pourrez alors coder un moyen de sortir de votre programme avec une technique un peu moins brutale que le CTRL + ALT + SUPPR.

Changer le titre de la fentre


our le momentD notre fentre un titre pr dfut X @SDL_app sur l (gF PIFIAF ue diriezEvous de hnger el c g9est extrmement simpleD il su0t d9utiliser l fontion SDL_WM_SetCaptionF gette fontion prend deux prmtresF ve premier est le titre que vous voulez donner l fentreD le seond est le titre que vous voulez donner l9ineF gontrirement e qu9on pourrit roireD donner un titre l9ine ne orrespond ps hrger une ine qui s90herit dns l rre de titre en hut guheF gel ne fontionne ps prtout F ersonnellementD j9envoie l vleur NULL l fontionF hez qu9il est possile de hnger l9ine de l fentreD mis nous verrons omment le fire dns le hpitre suivnt seulementD r e n9est ps enore de notre niveuF oii don le mme main que tout l9heure ve l fontion SDL_WM_SetCaption en plus X
7

7. ma connaissance, cela donne un rsultat sous Gnome sous Linux.

QPQ

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


1 2 3 4 5 6 7 8 9 10 11 12 13

int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y puse @A Y hvuit @A Y } return isggi Y

gopier e ode gode we X IPISUP 

Vous aurez remarqu que j'ai mis NULL pour le fameux second paramtre peu utile. En C, il est obligatoire de renseigner tous les paramtres mme si certains ne vous intressent pas, quitte envoyer NULL comme je l'ai fait ici. Le C++ permet, lui, de ne pas renseigner certains paramtres facultatifs lors des appels de fonctions.

v fentre mintennt un titre @f (gF PIFPAF

Figure PIFP ! ne fentre ve un titre

QPR

MANIPULATION DES SURFACES

Manipulation des surfaces


our le moment nous vons une fentre ve un fond noirF g9est l fentre de seF ge qu9on veut fireD 9est l remplirD 9estEEdire  dessiner dednsF v hvD je vous l9i dit dns le hpitre prdentD est une iliothque s niveuF gel veut dire qu9elle ne nous propose que des fontions de seD trs simplesF it en e'etD l seule forme que l hv nous permet de dessinerD 9est le retngle 3 out e que vous llez fireD 9est ssemler des retngles dns l fentreF yn ppelle es retngles des surfacesF v surfe est l rique de se de l hvF
Il est bien sr possible de dessiner d'autres formes, comme des cercles, des triangles, etc. Mais pour le faire, il faudra crire nous-mmes des fonctions, en dessinant pixel par pixel la forme, ou bien utiliser une bibliothque supplmentaire avec la SDL. C'est un peu compliqu et de toute manire, vous verrez que nous n'en aurons pas vraiment besoin dans la pratique.

Votre premire surface : l'cran


hns tout progrmme hvD il y u moins une surfe que l9on ppelle gnrlement ecran @ou screen en nglisAF g9est une surfe qui orrespond toute l fentreD 9estEEdire toute l zone noire de l fentre que vous voyezF hns notre ode soureD hque surfe ser mmorise dns une vrile de type SDL_SurfaceF yuiD 9est un type de vrile r pr l hv @une strutureD en l9oE urreneAF gomme l premire surfe que nous devons rer est l9rnD llonsEy X
1

hvurfe B ern a xvv Y

ous remrquerez que je re un pointeurF ourquoi je fis c re que 9est l hv qui v llouer de l9espe en mmoire pour notre surfeF ne surfe n9 en e'et ps toujours l mme tille et l hv est olige de fire une llotion dynmique pour nous @iiD dpendr de l tille de l fentre que vous vez ouverteAF te ne vous l9i ps dit tout l9heureD mis l fontion SDL_SetVideoMode renvoie une vleur 3 ille renvoie un pointeur sur l surfe de l9rn qu9elle re en mmoire pour nousF rfitD on v don pouvoir ruprer e pointeur dns ecran X
1

ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y

xotre pointeur peut mintennt vloir X ! NULL X ecran vut NULL si l SDL_SetVideoMode n9 ps russi hrger le mode vido demndF gel rrive si vous demndez une trop grnde rsolution ou un trop grnd nomre de ouleurs que ne supporte ps votre ordinteur Y ! une utre vleur X si l vleur est di'rente de NULLD 9est que l hv pu llouer l surfe en mmoireD don que tout est on 3 QPS

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

sl serit ien ii de grer les erreursD omme on ppris le fire tout l9heure pour l9initilistion de l hvF oii don notre main ve l gestion de l9erreur pour SDL_SetVideoMode X
1 2 3

int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y GG ve pointeur qui v stoker l surfe de l ' rn hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG yn tente d ' ouvrir une fen tre if @ ern aa xvv A GG i l ' ouverture hou D on le note et on rr te { fprintf @ stderr D 4 smpossile de hrger le mode vid o X 7 s n 4 D hvqetirror @A A Y exit @ ispesvi A Y } hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y puse @A Y hvuit @A Y } return isggi Y

4 5 6 7

9 10

11 12 13 14 15 16 17 18 19 20 21

gopier e ode gode we X UVVIQR  ve messge que nous lisser SDL_GetError() nous ser trs utile pour svoir e qui n9 ps mrhF
Petite anecdote : une fois, je me suis tromp en voulant faire du plein cran. Au lieu de demander une rsolution de 1024 * 768, j'ai crit 10244 * 768. Je ne comprenais pas au dpart pourquoi a ne voulait pas charger, car je ne voyais pas le double 4 dans mon code (oui, je devais tre un peu fatigu). Un petit coup d'il au chier stderr.txt qui contenait l'erreur et j'ai tout de suite compris que c'tait ma rsolution qui avait t rejete (tiens, comme c'est curieux !).

Colorer une surface


sl n9y ps QT fons de remplir une surfeF F F in fitD il y en deux X QPT

MANIPULATION DES SURFACES

! soit vous remplissez l surfe ve une ouleur unie Y ! soit vous remplissez l surfe en hrgent une imgeF
Il est aussi possible de dessiner pixel par pixel dans la surface mais c'est assez compliqu, nous ne le verrons pas ici.

xous llons dns un premier temps voir omment remplir une surfe ve une ouleur unieF hns le hpitre suivntD nous pprendrons hrger une imgeF v fontion qui permet de olorer une surfe ve une ouleur unie s9ppelle SDL_FillRect @FillRect a  remplir retngle en nglisAF ille prend trois prmtresD dns l9ordre X ! un pointeur sur l surfe dns lquelle on doit dessiner @pr exemple ecranA Y ! l prtie de l surfe qui doit tre remplieF i vous voulez remplir toute l surfe @et 9est e qu9on veut fireAD envoyez NULL Y ! l ouleur utiliser pour remplir l surfeF in rsum X
1

hvpillet @ surfe D xvv D ouleur A Y

La gestion des couleurs en SDL

in hvD une ouleur est stoke dns un nomre de type Uint32F


long,

Si c'est un nombre, pourquoi ne pas avoir utilis le type de variable int ou tout simplement ?

v hv est une iliothque multiEpltesEformesF yrD omme vous le svez mintenntD l tille oupe pr un int ou un long peut vrier selon votre yF our s9ssurer que le nomre ouper toujours l mme tille en mmoireD l hv don  invent des types pour stoker des entiers qui ont l mme tille sur tous les systmesF sl y pr exemple X ! Uint32 X un entier de longueur QP its @soit R otets A Y ! Uint16 X un entier od sur IT its @P otetsA Y ! Uint8 X un entier od sur V its @I otetAF v hv ne fit qu9un simple typedef qui hnger selon l9y que vous utilisezF eE grdez de plus prs le (hier SDL_types.h si vous tes urieuxF yn ne v ps s9ttrder lEdessus plus longtemps r les dtils de tout el ne sont ps importntsF ous vez juste esoin de retenir que Uint32 est un type qui stoke un entierD omme un intF
8

8. Je rappelle que 1 octet = 8 bits.

QPU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

D'accord, mais comment je sais quel nombre je dois mettre pour utiliser la couleur verte, azur, gris fonc ou encore jaune ple points roses avec des petites eurs violettes ?
9

sl existe une fontion qui sert X SDL_MapRGBF ille prend qutre prmtres X ! le formt des ouleursF ge formt dpend du nomre de its G pixel que vous vez demnd ve SDL_SetVideoModeF ous pouvez le ruprerD il est stok dns l sousEvrile ecran->format Y ! l quntit de rouge de l ouleur Y ! l quntit de vert de l ouleur Y ! l quntit de leu de l ouleurF gertins d9entre vous ne le svent peutEtre psD mis toute ouleur sur un ordinteur est onstruite prtir de trois ouleurs de se X le rougeD le vert et le leuF ghque quntit peut vrier de H @ps de ouleurA PSS @toute l ouleurAF honD si on rit X
1

hvwpqf @ ern E b formt D PSS D H D H A

F F F on re une ouleur rougeF sl n9y ps de vert ni de leuF eutre exempleD si on rit X


1

hvwpqf @ ern E b formt D H D H D PSS A

F F F ette foisD 9est une ouleur leueF


1

hvwpqf @ ern E b formt D PSS D PSS D PSS A

F F F lD il s9git d9une ouleur lnhe @toutes les ouleurs s9dditionnentAF i vous voulez du noirD il fut don rire 0, 0, 0F
On ne peut que mettre du rouge, du vert, du bleu, du noir et du blanc ?

xonD 9est vous de ominer intelligemment les quntits de ouleursF our vous iderD ouvrez pr exemple le logiiel PaintF ellez dns le menu Couleurs / Modifier les couleursF gliquez sur le outon Dfinir les couleurs personnalisesF vD hoisissez l ouleur qui vous intresse @(gF PIFQAF ves omposntes de l ouleur sont 0hes en s droiteF siD j9i sletionn un leuEvertF gomme l9indique l fentreD il se re l9ide de IU de rougeD PHT de vert et IIP de leuF
Coloration de l'cran

v fontion SDL_MapRGB renvoie un Uint32 qui orrespond l ouleur demndeF yn peut don rer une vrile bleuVert qui ontiendr le ode de l ouleur leuEvert X
9. Bien entendu, cette dernire couleur n'existe pas.

QPV

MANIPULATION DES SURFACES

Figure PIFQ ! letion d9une ouleur et de ses omposntes


1

intQP leuert a hvwpqf @ ern E b formt D IU D PHT D IIP A Y

outefoisD e n9est ps toujours l peine de psser pr une vrile pour stoker l ouleur @ moins que vous en yez esoin trs souvent dns votre progrmmeAF ous pouvez tout simplement envoyer diretement l ouleur donne pr SDL_MapRGB SDL_FillRectF i on veut remplir notre rn de leuEvertD on peut don rire X
1

hvpillet @ ern D xvv D hvwpqf @ ern E b formt D IU D PHT D IIP A A Y

yn omine ii deux fontionsD mis omme vous devriez mintennt le svoirD ne pose uun prolme u lngge gF
Mise jour de l'cran

xous y sommes presqueF outefois il mnque enore une petite hose X demnder l mise jour de l9rnF in e'etD l9instrution SDL_FillRect olorie ien l9rn mis el ne se fit que dns l mmoireF sl fut ensuite demnder l9ordinteur de mettre jour l9rn ve les nouvelles donnesF our elD on v utiliser l fontion SDL_FlipD dont nous reprlerons plus longuement plus loin dns le oursF gette fontion prend un prmtre X l9rnF
1

hvplip @ ern AY GB wise jour de l ' rn BG

On rsume !

oii une fontion main() qui re une fentre ve un fond leuEvert X QPW

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


1 2 3 4 5 6 7 8 9 10 11

int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y GG golortion de l surfe ern en leu E vert hvpillet @ ern D xvv D hvwpqf @ ern E b formt D IU D PHT D IIP A A Y hvplip @ ern A Y GB wise jour de l ' rn ve s nouvelle ouleur BG puse @A Y hvuit @A Y } return isggi Y

12 13

14 15 16 17 18 19 20

gopier e ode gode we X PTTVRI  ve rsultt est prsent sur l (gF PIFRF

Figure PIFR ! v fentre est remplie d9un fond leuEvert

QQH

MANIPULATION DES SURFACES

Dessiner une nouvelle surface l'cran


g9est ienD mis ne nous rrtons ps en si on heminF our le moment on n9 qu9une seule surfeD 9estEEdire l9rnF yn imerit pouvoir y dessinerD 9estEEdire  oller des surfes ve une utre ouleur prEdessusF our ommenerD nous llons voir esoin de rer une vrile de type SDL_Surface pour ette nouvelle surfe X
1

hvurfe B retngle a xvv Y

xous devons ensuite demnder l hv de nous llouer de l9espe en mmoire pour ette nouvelle surfeF our l9rnD nous vons utilis SDL_SetVideoModeF outefoisD ette fontion ne mrhe que pour l9rn @l surfe gloleAD on ne v ps rer une fentre di'rente pour hque retngle que l9on veut dessiner 3 sl existe don une utre fontion pour rer une surfe X SDL_CreateRGBSurfaceF g9est elle que nous utiliserons hque fois que nous voudrons rer une surfe unie omme iiF gette fontion prendF F F euoup de prmtres @huit 3AF h9illeursD peu d9entre eux nous intressent pour l9instntD je vis don viter de vous dtiller eux qui ne nous serviront ps de suiteF gomme en g nous sommes oligs d9indiquer tous les prmtresD nous enverrons l vleur H qund le prmtre ne nous intresse psF egrdons de plus prs les qutre premiers prmtresD les plus intressnts @ils deE vrient vous rppeler l rtion de l9rnAF ! ne liste de )gs @des optionsAF ous vez le hoix entre X ! SDL_HWSURFACE X l surfe ser hrge en mmoire vidoF sl y moins d9espe dns ette mmoire que dns l mmoire systme D mis ette mmoire est plus optimise et lre Y ! SDL_SWSURFACE X l surfe ser hrge en mmoire systme o il y euoup de pleD mis el oliger votre proesseur fire plus de lulsF i vous viez hrg l surfe en mmoire vidoD 9est l rte Qh qui urit fit l pluprt des lulsF ! v lrgeur de l surfe @en pixelsAF ! v huteur de l surfe @en pixelsAF ! ve nomre de ouleurs @en its G pixelAF oii don omment on lloue notre nouvelle surfe en mmoire X
10 1

retngle a hvgreteqfurfe @ hvrpegi D PPH D IVH D QP D H D HD HD HAY

ves qutre derniers prmtres sont mis HD omme je vous l9i ditD r ils ne nous intressent psF gomme notre surfe t lloue mnuellementD il fudr penser l lirer de l mmoire ve l fontion SDL_FreeSurface()D utiliser juste vnt SDL_Quit() X
1

hvpreeurfe @ retngle A Y
10. Quoique, avec les cartes 3D qu'on sort de nos jours, il y a de quoi se poser des questions. . .

QQI

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


2

hvuit @A Y

La surface ecran n'a pas besoin d'tre libre avec cela est fait automatiquement lors de SDL_Quit().

SDL_FreeSurface(),

yn peut mintennt olorer notre nouvelle surfe en l remplissnt pr exemple de ln X


1

hvpillet @ retngle D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y

Coller la surface l'cran

ellezD 9est presque (niD ourge 3 xotre surfe est prteD mis si vous testez le proE grmme vous verrez qu9elle ne s90her ps 3 in e'etD l hv n90he l9rn que l surfe ecranF our que l9on puisse voir notre nouvelle surfeD il v flloir blitter la surfaceD 9estEEdire l oller sur l9rnF yn utiliser pour el l fontion SDL_BlitSurfaceF gette fontion ttend X ! l surfe oller @iiD e ser rectangleA Y ! une informtion sur l prtie de l surfe oller @fulttiveAF ne nous intresse ps r on veut oller toute l surfeD don on enverr NULL Y ! l surfe sur lquelle on doit ollerD 9estEEdire ecran dns notre s Y ! un pointeur sur une vrile ontennt des oordonnesF ges oordonnes indiquent o devr tre olle notre surfe sur l9rnD 9estEEdire s positionF our indiquer les oordonnesD on doit utiliser une vrile de type SDL_RectF g9est une struture qui ontient plusieurs sousEvrilesD dont deux qui nous intressent ii X ! x X l9sisse Y ! y X l9ordonneF sl fut svoir que le point de oordonnes @HD HA est situ tout en hut guheF in s droiteD le point les oordonnes @TRHD RVHA si vous vez ouvert une fentre de tille TRH x RVH omme moiF eidezEvous du shm de l (gF PIFS pour vous situerF i vous vez dj fit des mths une fois dns votre vieD vous ne devriez ps tre trop pertursF grons don une vrile positionF yn v mettre x et y H pour oller l surfe en hut guhe de l9rn X
1 2 3 4

hvet position Y position F x a H Y position F y a H Y

wintennt qu9on notre vrile positionD on peut litter notre retngle sur l9rn X QQP

MANIPULATION DES SURFACES

Figure PIFS ! goordonnes sur l fentre


1

hvfliturfe @ retngle D xvv D ern D 8 position AY

emrquez le symole &D r il fut envoyer l9dresse de notre vrile positionF


Rsum du code source

te rois qu9un petit ode pour rsumer tout ne ser ps super)u 3


1 2 3 4 5 6 7 8 9 10

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B retngle a xvv Y hvet position Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG ellotion de l surfe retngle a hvgreteqfurfe @ hvrpegi D PPH D IVH D QP D H D H D H D H A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y hvpillet @ ern D xvv D hvwpqf @ ern E b formt D IU D PHT D IIP A A Y position F x a H Y GG ves oordonn es de l surfe seront @H D HA position F y a H Y GG emplissge de l surfe ve du ln

11 12 13

14 15

16 17

QQQ

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


18

19

hvpillet @ retngle D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ retngle D xvv D ern D 8 position A Y GG gollge de l surfe sur l ' rn hvplip @ ern A Y GG wise jour de l ' rn puse @A Y hvpreeurfe @ retngle A Y GG vi rtion de l surfe hvuit @A Y } return isggi Y

20 21 22 23 24 25 26 27 28 29

gopier e ode gode we X TVUPTS  it voil le trvil @(gF PIFTA 3

Figure PIFT ! ne surfe lnhe en hut guhe de l fentre

Centrer la surface l'cran


yn sit 0her l surfe en hut guheF sl serit ussi file de l pler en s droiteF ves oordonnes serient @TRH E PPHD RVH E IVHAD r il fut retrnher l tille de notre retngle pour qu9il s90he entirementF wisF F F omment fire pour entrer le retngle ln c i vous r)hissez ien deux QQR

EXERCICE : CRER UN DGRAD

seondesD 9est mathmatique F


11 1 2

position F x a @ TRH G P A E @ PPH G P A Y position F y a @ RVH G P A E @ IVH G P A Y

v9sisse du retngle ser l moiti de l lrgeur de l9rn @TRH G PAF wisD en plus de D il fut retrnher l moiti de l lrgeur du retngle @PPH G PAD r sinon ne ser ps prfitement entr @essyez de ne ps le fireD vous verrez e que je veux direAF g9est l mme hose pour l9ordonne ve l huteur de l9rn et du retngleF sultt X l surfe lnhe est prfitement entre @(gF PIFUAF

Figure PIFU ! ne surfe lnhe u entre de l fentre

Exercice : crer un dgrad


yn v (nir le hpitre pr un petit exerie @orrigA suivi d9une srie d9utres exeries @non orrigs pour vous forer trviller 3AF v9exerie orrig n9est vriment ps di0ile X on veut rer un dgrd vertil llnt du noir u lnF ous llez devoir rer PSS surfes de I pixel de huteurF ghune ur une ouleur di'renteD de plus en plus noireF oii e que vous devez rriver otenir u (nlD une imge similire l (gF PIFVF g9est mignonD non c it le pire 9est qu9il su0t de quelques petites oules seulement pour y rriverF our fire D on v devoir rer PST surfes @PST lignesA ynt les omposntes rougeE vertEleu suivntes X
11. C'est l qu'on comprend l'intrt des maths et de la gomtrie ! Et encore, tout ceci est d'un niveau trs simple ici.

QQS

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

Figure PIFV ! hgrd du noir u ln


1 2 3 4 5 6 7 8 9

@H D H D HA GG xoir @I D I D IA GG qris tr s tr s prohe du noir @P D P D PA GG qris tr s prohe du noir FFF @ IPV D IPV D IPV A GG qris moyen @ SH 7A FFF @ PSQ D PSQ D PSQ A GG qris tr s prohe du ln @ PSR D PSR D PSR A GG qris tr s tr s prohe du ln @ PSS D PSS D PSS A GG fln

out le monde devrit voir vu venir une oule pour fire @on ne v ps fire PST opierEoller 3AF ous llez devoir rer un tleu de type SDL_Surface* de PST ses pour stoker hune des lignesF ellez u oulotD je vous donne S minutes 3

Correction !
h9ordD il fllit rer notre tleu de PST SDL_Surface*F yn l9initilise NULL X
1

hvurfe B lignes PST a { xvv }Y

yn re ussi une vrile i dont on ur esoin pour nos forF yn hnge ussi l huteur de l fentre pour qu9elle soit plus dpte dns notre sF yn lui donne don PST pixels de huteurD pour hune des PST lignes 0herF insuiteD on fit un for pour llouer une une hune des PST surfesF ve tleu reevr PST pointeurs vers hune des surfes res X
1 2

for @ i a H Y i `a PSS Y i CCA lignes i a hvgreteqfurfe @ hvrpegi D TRH D I D QP D HD HD HD HAY

insuiteD on remplit et on litte hune de es surfes une pr uneF QQT

EXERCICE : CRER UN DGRAD


1 2 3 4

for @ i a H Y i `a PSS Y i CCA { position F x a H Y GG ves lignes sont guhe @ sisse de H A position F y a i Y GG v position vertile d pend du num ro de l ligne hvpillet @ lignes i D xvv D hvwpqf @ ern E b formt D i D i D i A A Y GG hessin hvfliturfe @ lignes i D xvv D ern D 8 position AY GG gollge

5 6

xotez que j9utilise l mme vrile position tout le tempsF s esoin d9en rer PST en e'etD r l vrile ne sert que pour tre envoye SDL_BlitSurfaceF yn peut don l rutiliser sns prolmeF ghque foisD je mets jour l9ordonne @yA pour litter l ligne l onne huteurF v ouleur hque pssge dns l oule dpend de i @e ser HD HD H l premire foisD et PSSD PSSD PSS l dernire foisAF
Mais pourquoi x est toujours 0 ? Comment se fait-il que toute la ligne soit remplie si x est tout le temps 0 ?

xotre vrile position indique quel endroit est pl le oin en hut guhe de notre surfe @iiD notre ligneAF ille n9indique ps l lrgeur de l surfeD juste s position sur l9rnF gomme toutes nos lignes ommenent guhe de l fentre @le plus guhe possileAD on met une sisse de HF issyez de mettre une sisse de SH pour voir e que fit X toutes les lignes seront dles vers l droiteF gomme l surfe fit TRH pixels de lrgeurD l hv dessine TRH pixels vers l droite @de l mme ouleurA en prtnt des oordonnes indiques dns l vrile positionF ur le shm de l (gF PIFWD je vous montre les oordonnes du point en hut guhe de l9rn @position de l premire ligneA et elui du point en s droite de l9rn @position de l dernire ligneAF

Figure PIFW ! goordonnes sur l fentre de dgrd

QQU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

gomme vous le voyezD de hut en s l9sisse ne hnge ps @x reste gl H tout le longAF g9est seulement y qui hnge pour hque nouvelle ligneD d9o le position.y = i;F in(nD il ne fut ps oulier de lirer l mmoire pour hune des PST surfes resD le tout l9ide d9une petite oule ien entenduF
1 2

for @ i a H Y i `a PSS Y i CCA GG x ' ouliez ps de li rer les PST surfes hvpreeurfe @ lignes i A Y

Rsum du main

oii don l fontion main u omplet X


1 2 3 4 5 6 7 8 9 10 11 12

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B lignes PST a { xvv }Y hvet position Y int i a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D PST D QP D hvrpegi A Y for @ i a H Y i `a PSS Y i CCA lignes i a hvgreteqfurfe @ hvrpegi D TRH D I D QP D H D H D H D H A Y hvwetgption @ 4 won d grd en hv 3 4 D xvv A Y hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D H D H AAY for @ i a H Y i `a PSS Y i CCA { position F x a H Y GG ves lignes sont guhe @ sisse de H A position F y a i Y GG v position vertile d pend du num ro de l ligne hvpillet @ lignes i D xvv D hvwpqf @ ern E b formt D iD iD iAAY hvfliturfe @ lignes i D xvv D ern D 8 position A Y } hvplip @ ern A Y puse @A Y for @ i a H Y i `a PSS Y i CCA GG x ' ouliez ps de li rer les PST surfes

13 14 15 16

17 18 19 20

21

22

23 24 25 26 27 28 29

QQV

EXERCICE : CRER UN DGRAD


30 31 32 33 34

hvpreeurfe @ lignes i A Y hvuit @A Y } return isggi Y

gopier e ode gode we X PTQWTH 

 Je veux des exercices pour m'entraner ! 


s de prolmeD gnrteur d9exeries tiv 3 ! grez le dgrd inverseD du ln u noirF gel ne devrit ps tre trop di0ile pour ommener 3 ! ous pouvez ussi fire un doule dgrdD en llnt du noir u ln omme on fit iiD puis du ln u noir @l fentre fer lors le doule de huteurAF ! qure plus di0ileD vous pouvez ussi vous entrner fire un dgrd horizontl u lieu d9un dgrd vertilF ! pites des dgrds en utilisnt d9utres ouleurs que le ln et le noirF issyez pour ommener du rouge u noirD du vert u noir et du leu u noirD puis du rouge u lnD etF

En rsum
! v hv doit tre hrge ve SDL_Init u dut du progrmme et dhrge ve SDL_Quit l (nF ! ves )gs sont des onstntes que l9on peut dditionner entre elles ve le symole  | F illes jouent le rle d9optionsF ! v hv vous fit mnipuler des surfes qui ont l forme de retngles ve le type SDL_SurfaceF ve dessin sur l fentre se fit l9ide de es surfesF ! sl y toujours u moins une surfe qui prend toute l fentreD que l9on ppelle en gnrl ecranF ! ve remplissge d9une surfe se fit ve SDL_FillRect et le ollge sur l9rn l9ide de SDL_BlitSurfaceF ! ves ouleurs sont d(nies l9ide d9un mlnge de rougeD de vert et de leuF

QQW

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

QRH

Chapitre

22
Dicult :

Acher des images

ous venons d'apprendre charger la SDL, ouvrir une fentre et grer des surfaces. C'est vraiment la base de ce qu'il faut connatre sur cette bibliothque. Cependant, pour le moment nous ne pouvons crer que des surfaces unies, c'est--dire ayant la mme couleur, ce qui est un peu monotone. Dans ce chapitre, nous allons apprendre charger des images dans des surfaces, que ce soit des BMP, des PNG, des GIF ou des JPG. La manipulation d'images est souvent trs motivante car c'est en assemblant ces images (aussi appeles  sprites ) que l'on fabrique les premires briques d'un jeu vido.

QRI

CHAPITRE 22. AFFICHER DES IMAGES

Charger une image BMP


v hv est une iliothque trs simpleF ille ne propose l se que le hrgement d9imges de type  itmp @extension .bmpAF xe pniquez ps pour utntD r gre une extension de l hv @l iliothque SDL_ImageAD nous verrons qu9il est possile de hrger de nomreux utres typesF our ommenerD nous llons nous ontenter de e que l hv o're l seF xous llons don tudier le hrgement de fwF

Le format BMP
n fw @rvition de  fitmp A est un formt d9imgeF ves imges que vous voyez sur votre ordinteur sont stokes dns des (hiersF sl existe plusieurs formts d9imgesD 9estEEdire plusieurs fons de oder l9imge dns un (hierF elon le formtD l9imge prend plus ou moins d9espe disque et se trouve tre de plus ou moins onne qulitF ve fitmp est un formt non ompress @ontrirement ux tqD xqD qspD etFAF gonrtementD el signi(e les hoses suivntes X ! le (hier est trs rpide lireD ontrirement ux formts ompresss qui doivent tre dompresssD e qui prend un peu plus de temps Y ! l qulit de l9imge est prfiteF gertins formts ompresss dtriorent l qulit de l9imgeD e n9est ps le s du fw Y ! mis le (hier est ussi ien plus gros puisqu9il n9est ps ompress 3 sl don des qulits et des dfutsF our l hvD l9vntge 9est que e type de (hier est simple et rpide lireF i vous vez souvent esoin de hrger des imges u ours de l9exution de votre progrmmeD il vut mieux utiliser des fw X ertes le (hier est plus grosD mis il se hrger plus vite qu9un qsp pr exempleF gel peut se rvler utile si votre progrmme doit hrger de trs nomreuses imges en peu de tempsF
1

Charger un Bitmap
Tlchargement du pack d'images

xous llons trviller ve plusieurs imges dns e hpitreF i vous voulez fire les tests en mme temps que vous lisez @et vous devriez 3AD je vous reommnde de tlE hrger un pk qui ontient toutes les imges dont on v voir esoinF  lhrger les imges gode we X VTRIUS  fien entenduD vous pouvez utiliser vos propres imgesF sl fudr en revnhe dpter l tille de votre fentre ellesEiF
1. Je pense au JPG plus particulirement, car les PNG et GIF n'altrent pas l'image.

QRP

CHARGER UNE IMAGE BMP

lez toutes les imges dns le dossier de votre projetF xous llons ommener pr trviller ve le (hier lac_en_montagne.bmp F
2

Charger l'image dans une surface

xous llons utiliser une fontion qui v hrger l9imge fw et l mettre dns une surfeF gette fontion pour nom SDL_LoadBMPF ous llez voir quel point 9est simple X
1

murfe a hvvodfw @ 4 imge F mp 4 A Y

v fontion SDL_LoadBMP remple deux fontions que vous onnissez X ! SDL_CreateRGBSurface X elle se hrgeit d9llouer de l mmoire pour stoker une surfe de l tille demnde @quivlent u mallocA Y ! SDL_FillRect X elle remplissit l struture d9une ouleur unieF ourquoi estEe que remple es deux fontions c g9est trs simple X ! l tille llouer en mmoire pour l surfe dpend de l tille de l9imge X si l9imge une tille de PSH x QHHD lors votre surfe ur une tille de PSH x QHH Y ! d9utre prtD votre surfe ser remplie pixel pr pixel pr le ontenu de votre imge fwF godons sns plus trder X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv Y hvet positionpond Y positionpond F x a H Y positionpond F y a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y GB ghrgement d ' une imge fitmp dns une surfe BG imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y GB yn litte pr E dessus l ' rn BG hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y hvplip @ ern AY puse @A Y hvpreeurfe @ imgehepond A Y GB yn li re l surfe BG

2. C'est une scne 3D d'exemple tire de l'excellent logiciel de modlisation de paysages Vue d'Esprit 4, qui n'est aujourd'hui plus commercialis. Depuis, le logiciel a t renomm en  Vue  et a beaucoup volu. Si vous voulez en savoir plus, rendez-vous sur e-onsoftware.com.

QRQ

CHAPITRE 22. AFFICHER DES IMAGES


23 24 25 26

hvuit @A Y } return isggi Y

gopier e ode gode we X QIPUUS  t9i don r un pointeur vers une surfe @imageDeFondA insi que les oordonnes orrespondntes @positionFondAF v surfe est re en mmoire et remplie pr l fontion SDL_LoadBMPF yn l litte ensuite sur l surfe ecran et 9est tout 3 edmirez le rsultt sur l (gF PPFIF

Figure PPFI ! ne imge fw hrge dns l fentre

gomme vous voyez e n9tit ps ien di0ile 3

Associer une icne son application


wintennt que nous svons hrger des imgesD nous pouvons douvrir omment ssoier une ine notre progrmmeF v9ine ser 0he en hut guhe de l fentre @insi que dns l rre des thesAF our le moment nous vons une ine pr dfutF QRR

CHARGER UNE IMAGE BMP

Mais, les icnes des programmes ne sont-elles pas des .ico, normalement ?

xonD ps forment 3 h9illeurs les .ico n9existent que sous indowsF v hv ronilie tout le monde en utilisnt un systme ien elle X une surfe 3 ih ouiD l9ine d9un progrmme hv n9est rien d9utre qu9une simple surfeF
Votre icne doit normalement tre de taille 16 x 16 pixels. Toutefois, sous Windows il faut que l'icne soit de taille 32 x 32 pixels, sinon elle sera dforme. Ne vous en faites pas, la SDL  rduira  les dimensions de l'image pour qu'elle rentre dans 16 x 16 pixels.

our jouter l9ine l fentreD on utilise l fontion SDL_WM_SetIconF gette fontion prend deux prmtres X l surfe qui ontient l9imge 0her insi que des inforE mtions sur l trnsprene @NULL si on ne veut ps de trnspreneAF v gestion de l trnsprene d9une ine est un peu omplique @il fut priser un un quels sont les pixels trnsprentsAD nous ne l9tudierons don psF yn v ominer deux fontions en une X
1

hvwetson @ hvvodfw @ 4 sdlione F mp 4 A D xvv A Y

v9imge est hrge en mmoire pr SDL_LoadBMP et l9dresse de l surfe est direE tement envoye SDL_WM_SetIconF
La fonction SDL_WM_SetIcon doit tre appele avant que la fentre ne soit ouverte, c'est--dire qu'elle doit se trouver avant SDL_SetVideoMode dans votre code source.

oii le ode soure ompletF ous noterez que j9i simplement jout le SDL_WM_SetIcon pr rpport u ode prdent X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv Y hvet positionpond Y positionpond F x a H Y positionpond F y a H Y hvsnit @ hvsxsshiy A Y GB ghrgement de l ' i ne eex hvetideowode BG hvwetson @ hvvodfw @ 4 sdlione F mp 4 A D xvv A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y

QRS

CHAPITRE 22. AFFICHER DES IMAGES


17 18 19 20 21 22 23 24 25 26 27

imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y hvplip @ ern A Y puse @A Y hvpreeurfe @ imgehepond A Y hvuit @A Y } return isggi Y

sulttD l9ine est hrge et 0he sur l fentre @(gF PPFPAF


Figure PPFP ! ne ine ssoie u progrmme

Gestion de la transparence
Le problme de la transparence
xous vons tout l9heure hrg une imge itmp dns notre fentreF upposons que l9on veuille litter une imge prEdessusF vous rriver trs frquemment r dns un jeuD en gnrlD le personnge que l9on dple est un fitmp et il se dple sur une imge de fondF yn v litter l9imge de ozor sur l sne X
3 1 2 3

4 5 6 7 8 9 10 11 12 13 14 15 16

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv D B zozor a xvv Y hvet positionpond D positionozor Y positionpond F x a H Y positionpond F y a H Y positionozor F x a SHH Y positionozor F y a PTH Y hvsnit @ hvsxsshiy A Y hvwetson @ hvvodfw @ 4 sdlione F mp 4 A D xvv A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y
3. Il s'agit de la bonne vieille mascotte du Site du Zro pour ceux qui ne le connatraient pas.

QRT

GESTION DE LA TRANSPARENCE
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y GB ghrgement et littge de ozor sur l s ne BG zozor a hvvodfw @ 4 zozor F mp 4 A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y hvplip @ ern AY puse @A Y hvpreeurfe @ imgehepond A Y hvpreeurfe @ zozor A Y hvuit @A Y } return isggi Y

yn juste rjout une surfe pour y stoker ozorD que l9on litte ensuite un endroit sur l sne @(gF PPFQAF

Figure PPFQ ! ozor litt prEdessus l9imge de fond

g9est plutt lidD non c QRU

CHAPITRE 22. AFFICHER DES IMAGES

Je sais pourquoi, c'est parce que tu as mis un fond bleu tout moche sur l'image de Zozor !

re que vous royez qu9ve un fond noir ou un fond mrron derrire ozorD urit t plus joli c ih ien nonD le prolme ii 9est que notre imge est forment retngulireD don si on l olle sur l sne on voit son fondD e qui ne rend ps trs ienF reureusementD l hv gre l trnsprene 3

Rendre une image transparente


tape 1 : prparer l'image

our ommenerD il fut prprer l9imge que vous voulez litter sur l sneF ve formt fw ne gre ps l trnspreneD ontrirement ux qsp et xqF sl v don flloir utiliser une stueF sl fut mettre l mme ouleur de fond sur toute l9imgeF gelleEi ser rendue trnsE prente pr l hv u moment du litF yservez quoi ressemle mon zozor.bmp de plus prs @(gF PPFRAF

Figure PPFR ! v9imge zozor.bmp un fond leu

ve fond leu derrire est don volontireF xotez que j9i hoisi le leu u hsrdD j9uris trs ien pu mettre un fond vert ou rouge pr exempleF ge qui ompteD 9est que ette ouleur soit unique et unieF t9i hoisi le leu pre qu9il n9y en vit ps dns l9imge de ozorF i j9vis hoisi le vertD j9uris pris le risque que l9here que mhouille ozor @en s guhe de l9imgeA soit rendue trnsprenteF vous don de vous drouiller ve votre logiiel de dessin @intD hotoshopD he qimpD hun ses gotsA pour donner un fond uni votre imgeF
tape 2 : indiquer la couleur transparente

our indiquer l hv l ouleur qui doit tre rendue trnsprenteD vous devez utiliser l fontion SDL_SetColorKeyF gette fontion doit tre ppele vnt de litter l9imgeF oii omment je m9en sers pour rendre le leu derrire ozor trnsprent X
1

hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y

sl y trois prmtres X QRV

GESTION DE LA TRANSPARENCE

! l surfe qui doit tre rendue trnsprente @iiD 9est zozorA Y ! une liste de )gs X utilisez SDL_SRCCOLORKEY pour tiver l trnspreneD H pour l dstiver Y ! indiquez ensuite l ouleur qui doit tre rendue trnsprenteF t9i utilis SDL_MapRGB pour rer l ouleur u formt nomre @Uint32A omme on l9 dj fit pr le pssF gomme vous le voyezD 9est le leu pur @HD HD PSSA que je rends trnsprentF in rsumD on hrge d9ord l9imge ve SDL_LoadBMPD on indique l ouleur trnsE prente ve SDL_SetColorKeyD puis on peut litter ve SDL_BlitSurface X
1 2 3 4

5 6

GB yn hrge l ' imge X BG zozor a hvvodfw @ 4 zozor F mp 4 A Y GB yn rend le leu derri re ozor trnsprent X BG hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB yn litte l ' imge mintennt trnsprente sur le fond X BG hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y

sultt X ozor est prfitement intgr l sne @(gF PPFSA 3

Figure PPFS ! ozor trnsprent sur l9imge de fond

oil ve tehnique de se que vous rutiliserez tout le temps dns vos futurs proE grmmesF epprenez ien mnier l trnsprene r 9est fondmentl pour rliser un jeu un minimum rlisteF QRW

CHAPITRE 22. AFFICHER DES IMAGES

La transparence Alpha
g9est un utre type de trnspreneF tusqu9iiD on se ontentit de d(nir xi ouleur de trnsprene @pr exemple le leuAF gette ouleur n9pprissit ps une fois l9imge litteF v trnsprene elph orrespond tout utre hoseF ille permet de rliser un  mE lnge entre une imge et le fondF g9est une sorte de fonduF v trnsprene elph d9une surfe peut tre tive pr l fontion SDL_SetAlpha X
1

hvetelph @ zozor D hvgevre D IPV A Y

sl y l enore trois prmtres X ! l surfe en question @zozorA Y ! une liste de )gs X mettez SDL_SRCALPHA pour tiver l trnspreneD H pour l dstiver Y ! trs importnt X l vleur Alpha de l trnspreneF g9est un nomre ompris entre H @imge totlement trnsprenteD don invisileA et PSS @imge totlement opqueD omme s9il n9y vit ps de trnsprene elphAF lus le nomre Alpha est petitD plus l9imge est trnsprente et fondueF oii pr exemple un ode qui pplique une trnsprene elph de IPV notre ozor X
1 2

3 4 5

zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB rnsprene elph moyenne @ IPV A X BG hvetelph @ zozor D hvgevre D IPV A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor AY

ous noterez que j9i onserv l trnsprene de SDL_SetColorKeyF ves deux types de trnsprene sont en e'et ominlesF v (gF PPFT vous montre quoi ressemle ozor selon l vleur AlphaF
La transparence Alpha 128 (transparence moyenne) est une valeur spciale qui est optimise par la SDL. Ce type de transparence est plus rapide calculer pour votre ordinateur que les autres. C'est peut tre bon savoir si vous utilisez beaucoup de transparence Alpha dans votre programme.

Charger plus de formats d'image avec SDL_Image


v hv ne gre que les fitmp @fwA omme on l9 vuF e prioriD e n9est ps un trs gros prolme pre que l leture des fw est rpide pour l hvD mis il fut reonntre qu9ujourd9hui on plutt l9hitude d9utiliser d9utres formtsF in prtiulierD nous sommes hitus ux formts d9imges  ompresss omme le xqD QSH

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

Figure PPFT ! xiveux de trnsprene elph

QSI

CHAPITRE 22. AFFICHER DES IMAGES

le qsp et le tiqF tome ienD il existe justement une iliothque SDL_Image qui gre tous les formts suivnts X ! qe Y ! fw Y ! xw Y ! w Y ! gp Y ! g Y ! qsp Y ! tq Y ! sp Y ! vfw Y ! xqF sl est en fit possile de rjouter des extensions l hvF ge sont des iliothques qui ont esoin de l hv pour fontionnerF yn peut voir omme des add-ons F SDL_Image est l9une d9entre ellesF
4

Installer SDL_image sous Windows


Tlchargement

ne pge spile du site de l hv rfrene les iliothques utilisnt l hvF gette pge s9intitule LibrariesD vous trouverez un lien dns le menu de guheF ous pourrez voir qu9il y euoup de iliothques disponilesF gellesEi ne proviennent gnrleE ment ps des uteurs de l hvD e sont plutt des utilisteurs de l hv qui proposent leurs iliothques pour mliorer l hvF gertines sont trs onnes et mritent le dtourD d9utres sont moins onnes et enore oguesF sl fut rriver fire le triF gherhez SDL_Image dns l listeF F F vous rriverez sur l pge ddie SDL_ImageF  lhrger SDL_Image gode we X RQRTUP  lhrgez l version de SDL_Image qui vous orrespond dns l setion Binary @ne prenez e l soureD on n9en ps esoin 3AF i vous tes sous indowsD tlhrgez SDL_image-devel-1.2.10-VC.zipD et e mme si vous n9utilisez ps isul gCC 3
Installation

hns e FzipD vous trouverez X ! SDL_image.h X le seul heder dont esoin l iliothque SDL_ImageF lezEle dns C:\Program Files\CodeBlocks\SDL-1.2.13\includeD 9estEEdire t des utres heders de l hv Y
4. On emploie aussi parfois le mot  greon , plus franais.

QSP

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

! !

donAF insuiteD vous devez modi(er les options de votre projet pour  linker ve le (hier SDL_image.libF i vous tes sous gode: :floks pr exempleD llez dns le menu Projects / Build optionsF hns l9onglet LinkerD liquez sur le outon Add et indiquez o se trouve le (hier SDL_image.lib @(gF PPFUAF

SDL_image.lib X opiez dns C:\Program Files\CodeBlocks\SDL-1.2.13\libF yuiD je sisD je vous i dit que normlement les .lib tient des (hiers rservs isulD mis ii exeptionnellement le .lib fontionner mme ve le ompilteur mingw Y plusieurs hvv X plezEles toutes dns le dossier de votre projet @ t de SDL.dllD

Figure PPFU ! letion de SDL_image.lib

i on vous demnde Keep as a relative path ?D rpondez e que vous voulezD ne hnger rien dns l9immditF te reommnde de rpondre pr l ngtiveD personnelE lementF insuiteD vous n9vez plus qu9 inlure le heder SDL_image.h dns votre ode soureF elon l9endroit o vous vez pl le (hier SDL_image.hD vous devrez soit utiliser e ode X
1

5 inlude ` hv G hvimge Fh b

QSQ

CHAPITRE 22. AFFICHER DES IMAGES

F F F soit eluiEi X
1

5 inlude ` hvimge Fh b

issyez les deuxD l9un des deux devrit fontionnerF


Si vous tes sous Visual Studio, la manipulation est quasiment la mme. Si vous avez russi installer la SDL, vous n'aurez aucun problme pour installer SDL_image.

Installer SDL_image sous Mac OS X


i vous utilisez w y D tlhrgez le (hier .dmg sur le site de l hv et mettezEle dns le dossier /Library/Frameworks @/Bibliothque/Frameworks en frnisAF  lhrger SDL_Image gode we X RQRTUP  insuiteD tpez  serh pths dns le hmp de reherhe de odeF eprez l ligne Header search paths Y douleEliquez sur l ligne droiteD et joutez  GvirryGprE meworksGhvimgeFfrmeworkGreders F sl ne vous reste plus qu9 jouter le frmework votre projetF v (gure PPFV vous montre quoi ressemle le Header search paths du projet prs voir instll SDL_imageF

Figure PPFV ! ve Header


1

search paths

du projet

sl fudr en revnhe inlure le (hier .h dns votre ode omme ei X


5 inlude 4 hvimge F h 4

F F F u lieu d9utiliser des hevrons < >F emplez don l ligne d9include de SDL_image dns le ode qui v suivre pr elle que je viens de vous donnerF QSR

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

Charger les images


in fitD instller SDL_image est IHH fois plus ompliqu que de l9utiliserD 9est vous dire l omplexit de l iliothque 3 sl y xi seule fontion onntre X IMG_LoadF ille prend un prmtre X le nom du (hier ouvrirF ge qui est prtiqueD 9est que ette fontion est ple d9ouvrir tous les types de (hiers que gre SDL_image @qspD xqD tqD mis ussi fwD spF F FAF ille dteter toute seule le type du (hier en fontion de son extensionF
Comme SDL_image peut aussi ouvrir les BMP, vous pouvez mme oublier maintenant la fonction SDL_LoadBMP et ne plus utiliser que IMG_Load pour le chargement de n'importe quelle image.

eutre on point X si l9imge que vous hrgez gre l trnsprene @omme 9est le s des xq et des qspAD lors SDL_image tiver utomtiquement l trnsprene pour ette imge 3 gel vous vite don d9voir ppeler SDL_SetColorKeyF te vis vous prsenter le ode soure qui hrge sapin.png et l90he F xotez ien que j9inlue SDL/SDL_image.h et que je ne fis ps ppel SDL_SetColorKey r mon xq est nturellement trnsprentF ous llez voir que j9utilise IMG_Load prtout dns e ode en remplement de SDL_LoadBMPF
5 1 2 3 4

5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b 5 inlude ` hv G hvimge Fh b GB snlusion du heder de hvimge @ dpter le dossier u esoin A BG int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv D B spin a xvv Y hvet positionpond D positionpin Y GB FFF ghrgement de l hv et d ' une imge de fond BG GB ghrgement d ' un xq ve swqvod gelui E i est utomtiquement rendu trnsprent r les informtions de trnsprene sont od es l ' int rieur du fihier xq BG spin a swqvod @ 4 spin F png 4A Y hvfliturfe @ spin D xvv D ern D 8 positionpin A Y hvplip @ ern AY

5 6 7 8

9 10 11 12 13 14

15 16 17 18 19

5. Je l'ai un peu raccourci pour ne pas encombrer le livre de codes source rptitifs que vous avez dj vus plusieurs fois. Si vous voulez obtenir le code source complet, n'hsitez pas vous rendre au code web indiqu.

QSS

CHAPITRE 22. AFFICHER DES IMAGES


20 21 22 23 24 25 26 27

puse @A Y hvpreeurfe @ imgehepond A Y hvpreeurfe @ spin A Y hvuit @A Y } return isggi Y

gopier e ode gode we X SPVSRV  gomme on peut le voir sur l (gF PPFWD l9imge xq t insre ve l trnsprene sur l9imge de fond 3

Figure PPFW ! ne imge xq trnsprente insre l9ide de SDL_image

En rsum
! v hv permet de hrger des imges dns des surfesF r dfutD elle ne gre que les fw ve SDL_LoadBMPF ! yn peut d(nir une ouleur trnsprente ve SDL_SetColorKeyF ! yn peut rendre l9ensemle de l9imge plus ou moins trnsprent ve l fontion SDL_SetAlpha F QST

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

! v iliothque SDL_image permet d9insrer n9importe quel type d9imge @xqD tiqF F FA ve IMG_LoadF sl fut ependnt l9instller en plus de l hvF

QSU

CHAPITRE 22. AFFICHER DES IMAGES

QSV

Chapitre

23
Dicult :

La gestion des vnements

a gestion des vnements est une des fonctionnalits les plus importantes de la SDL. C'est probablement une des sections les plus passionnantes dcouvrir. C'est partir de l que vous allez vraiment tre capables de contrler votre application. Chacun de vos priphriques (clavier, souris. . .) peut produire des vnements. Nous allons apprendre intercepter ces vnements et ragir en consquence. Votre application va donc devenir enn rellement dynamique !

QSW

CHAPITRE 23. LA GESTION DES VNEMENTS

gonrtementD qu9estEe qu9un vnement c g9est un  signl envoy pr un priphE rique @ou pr le systme d9exploittionA votre pplitionF oii quelques exemples d9vnements ournts X ! qund l9utilisteur ppuie sur une touhe du lvier Y ! qund il lique ve l souris Y ! qund il ouge l souris Y ! qund il rduit l fentre Y ! qund il demnde fermer l fentre Y ! etF ve rle de e hpitre ser de vous pprendre triter es vnementsF ous serez ples de dire l9ordinteur  i l9utilisteur lique et endroitD fis D sinon fis elF F F 9il ouge l sourisD fis eiF 9il ppuie sur l touhe D rrte le proE grmmeF F F D etF

Le principe des vnements


our nous hituer ux vnementsD nous llons pprendre triter le plus simple d9entre eux X la demande de fermeture du programmeF g9est un vnement qui se produit lorsque l9utilisteur lique sur l roix pour fermer l fentre @(gF PQFIAF
Figure PQFI ! v roix permettnt de fermer l fentre

g9est vriment l9vnement le plus simpleF in plusD 9est un vnement que vous vez utilis jusqu9ii sns vriment le svoirD r il tit situ dns l fontion pause() 3 in e'etD le rle de l fontion pause tit d9ttendre que l9utilisteur demnde fermer le progrmmeF i on n9vit ps r ette fontionD l fentre se serit 0he et ferme en un lir 3
partir de maintenant, vous pouvez oublier la fonction pause. Supprimez-la de votre code source, car nous allons apprendre la reproduire.

La variable d'vnement
our triter des vnementsD vous urez esoin de dlrer une vrile @juste une seuleD rssurezEvousA de type SDL_EventF eppelezEl omme vous voulez X moiD je vis l9ppeler eventD e qui signi(e  vnement en nglisF
1

hvivent event Y

QTH

LE PRINCIPE DES VNEMENTS

our nos tests nous llons nous ontenter d9un main trs sique qui 0he juste une fentreD omme on l9 vu quelques hpitres plus ttF oii quoi doit ressemler votre main X
1 2 3 4

int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y GG gette vrile servir plus trd g rer les v nements hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y hvuit @A Y } return isggi Y

5 6 7 8 9 10 11 12 13 14

gopier e ode gode we X VRPPTS  g9est don un ode trs siqueD il ne ontient qu9une nouveut X l dlrtion de l vrile event dont nous llons ientt nous servirF estez e ode X omme prvuD l fentre v s90her et se fermer immditement prsF

La boucle des vnements


vorsqu9on veut ttendre un vnementD on fit gnrlement une ouleF gette oule se rpter tnt qu9on n9 ps eu l9vnement vouluF yn v voir esoin d9utiliser un oolen qui indiquer si on doit ontinuer l oule ou nonF grez don e oolen que vous ppellerez pr exemple continuer X
1

int ontinuer a I Y

ge oolen est mis I u dprt r on veut que l oule se rpte ex i l vrile continuer vut I @vriAF hs qu9elle vudr H @fuxAD lors on sortir de l oule et le progrmme s9rrterF oii l oule rer X
1 2 3 4

while @ ontinuer A { GB ritement des v nements BG }

oil X on pour le moment une oule in(nie qui ne s9rrter que si on met l vrile continuer HF g9est e que nous llons rire l9intrieur de ette oule qui est le plus intressntF QTI

CHAPITRE 23. LA GESTION DES VNEMENTS

Rcupration de l'vnement
wintenntD fisons ppel une fontion de l hv pour demnder si un vnement s9est produitF yn dispose de deux fontions qui font elD mis d9une mnire di'rente X ! SDL_WaitEvent X elle ttend qu9un vnement se produiseF gette fontion est dite loqunte r elle suspend l9exution du progrmme tnt qu9uun vnement ne s9est produit Y ! SDL_PollEvent X ette fontion fit l mme hose mis n9est ps loqunteF ille vous dit si un vnement s9est produit ou nonF wme si uun vnement ne s9est produitD elle rend l min votre progrmme de suiteF ges deux fontions sont utilesD mis dns des s di'rentsF our fire simpleD si vous utilisez SDL_WaitEvent votre progrmme utiliser trs peu de proesseur r il ttenE dr qu9un vnement se produiseF in revnheD si vous utilisez SDL_PollEventD votre progrmme v prourir votre oule while et rppeler SDL_PollEvent ind(niment jusqu9 e qu9un vnement se soit produitF tous les oupsD vous utiliserez IHH 7 du proesseurF
Mais alors, il faut tout le temps utiliser utilise moins le processeur, non ?
SDL_WaitEvent

si cette fonction

xonD r il y des s o SDL_PollEvent se rvle indispensleF g9est le s des jeux dns lesquels l9rn se met jour mme qund il n9y ps d9vnementF renons pr exemple etris X les los desendent tout seulsD il n9y ps esoin que l9utilisteur re d9vnement pour 3 i on vit utilis SDL_WaitEventD le progrmme serit rest  loqu dns ette fontion et vous n9uriez ps pu mettre jour l9rn pour fire desendre les los 3
Comment fait SDL_WaitEvent pour ne pas consommer de processeur ? Aprs tout, la fonction est bien oblige de faire une boucle innie pour tester tout le temps s'il y a un vnement ou non, n'est-ce pas ?

g9est une question que je me posis il y enore peu de tempsF v rponse est un petit peu omplique r onerne l fon dont l9y gre les proessus @les progrmmesAF i vous voulez ! mis je vous en prle rpidement !D ve SDL_WaitEventD le proessus de votre progrmme est mis  en puse F otre progrmme n9est don plus trit pr le proesseurF sl ser  rveill pr l9y u moment o il y ur un vnementF hu oupD le proesseur se remettr trviller sur votre progrmme e momentElF gel explique pourquoi votre progrmme ne onsomme ps de proesseur pendnt qu9il ttend l9vnementF te omprends que e soit un peu strit pour vous pour le momentF it dire vriD vous n9vez ps esoin de omprendre mintenntF ous ssimilerez mieux toutes les di'renes plus loin en prtiquntF our le momentD nous llons utiliser SDL_WaitEvent r notre progrmme reste trs simpleF ges deux fontions s9utilisent de toute fon de l mme mnireF QTP

LE PRINCIPE DES VNEMENTS

ous devez envoyer l fontion l9dresse de votre vrile event qui stoke l9vneE mentF gomme ette vrile n9est ps un pointeur @regrdez l dlrtion nouveuAD nous llons mettre le symole & devnt le nom de l vrile (n de donner l9dresse X
1

hvitivent @8 event A Y

eprs ppel de ette fontionD l vrile event ontient oligtoirement un vnementF


Cela n'aurait pas forcment t le cas si on avait utilis cette fonction aurait pu renvoyer  Pas d'vnement .
SDL_PollEvent

Analyse de l'vnement
wintenntD nous disposons d9une vrile event qui ontient des informtions sur l9vnement qui s9est produitF sl fut regrder l sousEvrile event.type et fire un test sur s vleurF qnrlement on utilise un switch pour tester l9vnementF
Mais comment sait-on quelle valeur correspond l'vnement  Quitter , par exemple ?

v hv nous fournit des onstntesD e qui simpli(e grndement l9riture du proE grmmeF sl en existe euoup @utnt qu9il y d9vnements possilesAF xous les verrons u fur et mesure tout u long de e hpitreF
1 2 3

4 5 6

7 8 9 10

while @ ontinuer A { hvitivent @8 event A Y GB up rtion de l ' v nement dns event BG swith @ event F type A GB est du type d ' v nement BG { se hvs X GB i ' est un v nement de type 4 uitter 4 BG ontinuer a H Y rek Y } }

oii omment fontionneF IF hs qu9il y un vnementD l fontion SDL_WaitEvent renvoie et vnement dns eventF PF yn nlyse le type d9vnement gre un switchF ve type de l9vnement se trouve dns event.type QF yn teste l9ide de case dns le switch le type de l9vnementF our le momentD on ne teste que l9vnement SDL_QUIT @demnde de fermeture du progrmmeAD r 9est le seul qui nous intresseF QTQ

CHAPITRE 23. LA GESTION DES VNEMENTS

! i 9est un vnement SDL_QUITD 9est que l9utilisteur demnd quitter le progrmmeF hns e s on met le oolen continuer HF eu prohin tour de ouleD l ondition ser fusse et don l oule s9rrterF ve progrmme s9rrter ensuiteF ! i e n9est ps un vnement SDL_QUITD 9est qu9il s9est pss utre hose X l9utilisteur ppuy sur une touheD liqu ou tout simplement oug l souris dns l fentreF gomme es utres vnements ne nous intressent psD on ne les trite psF yn ne fit don rien X l oule reommene et on ttend nouveu un vnement @on reprt l9tpe IAF ge que je viens de vous expliquer ii est extrmement importntF i vous vez ompris e odeD vous vez tout ompris et le reste du hpitre ser trs file pour vousF

Le code complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14

int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y GB v vrile ontennt l ' v nement BG int ontinuer a I Y GB xotre ool en pour l oule BG hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y while @ ontinuer A GB ex i l vrile ne vut ps H BG { hvitivent @8 event A Y GB yn ttend un v nement qu ' on r up re dns event BG swith @ event F type A GB yn teste le type d ' v nement BG { se hvs X GB i ' est un v nement si BG ontinuer a H Y GB yn met le ool en H D don l oule v s ' rr ter BG rek Y } } hvuit @A Y } return isggi Y

15 16 17 18

19 20 21 22 23 24 25 26

gopier e ode gode we X VSWVPQ  oil le ode ompletF sl n9y rien de ien di0ile X si vous vez suivi jusqu9iiD ne QTR

LE CLAVIER

devrit ps vous surprendreF h9illeursD vous remrquerez qu9on n9 fit que reproduire e que fisit l fontion pause F
1

Le clavier
xous llons mintennt tudier les vnements produits pr le lvierF i vous vez ompris le dut du hpitreD vous n9urez uun prolme pour triter les utres types d9vnementsF sl n9y rien de plus fileF ourquoi estEe si simple c re que mintennt que vous vez ompris le fontionneE ment de l oule in(nieD tout e que vous llez voir fireD 9est d9jouter d9utres case dns le switch pour triter d9utres types d9vnementsF ne devrit ps tre trop durF

Les vnements du clavier


sl existe deux vnements di'rents qui peuvent tre gnrs pr le lvier X ! SDL_KEYDOWN X qund une touhe du lvier est enfone Y ! SDL_KEYUP X qund une touhe du lvier est relheF ourquoi y EtEil es deux vnements c re que qund vous ppuyez sur une touheD il se psse deux hoses X vous enfonez l touhe @SDL_KEYDOWNAD puis vous l relhez @SDL_KEYUPAF v hv vous permet de triter es deux vnements prtD e qui ser ien prtiqueD vous verrezF our le momentD nous llons nous ontenter de triter l9vnement SDL_KEYDOWN @ppui de l touheA X
1 2 3 4 5 6 7 8 9 10 11 12 13

while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X GB i ppui sur une touhe BG ontinuer a H Y rek Y } }

i on ppuie sur une touheD le progrmme s9rrteF estezD vous verrez 3


1. Comparez avec le code de la fonction pause : c'est le mme, sauf qu'on a cette fois tout mis dans le main. Bien entendu, il est prfrable de placer ce code dans une fonction part, comme pause, car cela allge la fonction main et la rend plus lisible.

QTS

CHAPITRE 23. LA GESTION DES VNEMENTS

Rcuprer la touche
voir qu9une touhe t enfone 9est ienD mis svoir lquelleD 9est qund mme mieux 3 yn peut otenir l nture de l touhe enfone gre une sousEsousEsousEvrile @oufA qui s9ppelle event.key.keysym.symF gette vrile ontient l vleur de l touhe qui t enfone F
2

L'avantage, c'est que la SDL permet de rcuprer la valeur de toutes les touches du clavier. Il y a les lettres et les chires, bien sr (ABCDE0123. . .), mais aussi la touche Echap, ou encore Impr. Ecran, Suppr, Entre, etc.

sl y une onstnte pour hune des touhes du lvierF ous trouverez ette liste dns l doumenttion de l hvD que vous vez trs prolement tlhrge ve l iliothque qund vous vez d l9instllerF i tel n9est ps le sD je vous reommnde fortement de retourner sur le site de l hv et d9y tlhrger l doumenttionD r elle est trs utileF ous trouverez l liste des touhes du lvier dns l setion Keysym definitionsF gette liste est trop longue pour tre prsente ii @voir un peru (gF PQFPAD ussi je vous propose pour el de onsulter l doumenttion sur le we diretementF  gonsulter l doumenttion gode we X PQSSPW 

Figure PQFP ! eperu de l doumenttion des onstntes du lvier

fien entenduD l doumenttion est en nglis et donF F F l liste ussiF i vous voulez vriment progrmmerD il est importnt d9tre ple de lire l9nglis r toutes les doumenttions sont dns ette lngueD et vous ne pouvez ps vous en psser 3 sl y deux tleux dns ette liste X un grnd @u dutA et un petit @ l (nAF xous nous intresserons u grnd tleuF hns l premire olonne vous vez l onstnteD dns l seonde l reprsenttion quivlente en egss et en(nD dns l troisime olonneD vous vez une desription de l touheF renons pr exemple l touhe Echap @ ispe en nglisAF yn peut vri(er si l
3

2. Elle fonctionne aussi lors d'un relchement de la touche SDL_KEYUP. 3. Notez que certaines touches comme Maj (ou Shift) n'ont pas de valeur ASCII correspondante.

QTT

LE CLAVIER

touhe enfone est Echap omme ei X


1 2 3

4 5 6

swith @ event F key F keysym F sym A { se hvuigei X GB eppui sur l touhe ihp D on rr te le progrmme BG ontinuer a H Y rek Y }

J'utilise un switch pour faire mon test mais j'aurais aussi bien pu utiliser un if. Toutefois, j'ai plutt tendance me servir des switch quand je traite les vnements car je teste beaucoup de valeurs direntes (en pratique, j'ai beaucoup de case dans un switch, contrairement ici).

oii une oule d9vnement omplte que vous pouvez tester X


1 2 3 4 5 6 7 8 9 10 11 12

13 14 15 16 17 18

while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X GB eppui sur l touhe ihp D on rr te le progrmme BG ontinuer a H Y rek Y } rek Y } }

gette foisD le progrmme s9rrte si on ppuie sur Echap ou si on lique sur l roix de l fentreF
Maintenant que vous savez comment arrter le programme en appuyant sur une touche, vous tes autoriss faire du plein cran si a vous amuse . Auparavant, je vous avais demand d'viter de le faire car on ne savait pas comment arrter un programme en plein cran (il n'y a pas de croix sur laquelle cliquer pour arrter !).
4

4. Flag SDL_FULLSCREEN dans SDL_SetVideoMode, pour rappel.

QTU

CHAPITRE 23. LA GESTION DES VNEMENTS

Exercice : diriger Zozor au clavier


ous tes mintennt ples de dpler une imge dns l fentre l9ide du lvier 3 g9est un exerie trs intressnt qui v d9illeurs nous permettre de voir omment utiliser le doule u'ering et l rptition de touhesF he plusD e que je vis vous pprendre l est l se de tous les jeux rliss en hvD don ce n'est pas un exercice facultatif 3 te vous invite le lire et le fire trs soigneusementF

Charger l'image
our ommenerD nous llons hrger une imgeF yn v fire simple X on v reprendre l9imge de ozor utilise dns le hpitre prdentF grez don l surfe zozorD hrgez l9imge et rendezEl trnsprente @9tit un fwD je vous le rppelleAF
1 2

zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y

insuiteD et 9est ertinement le plus importntD vous devez rer une vrile de type SDL_Rect pour retenir les oordonnes de ozor X
1

hvet positionozor Y

te vous reommnde d9initiliser les oordonnesD en mettnt soit x a H et y a H @position en hut guhe de l fentreAD soit en entrnt ozor dns l fentre omme vous vez ppris le fire il n9y ps si longtempsF
1 2 3

GB yn entre ozor l ' rn BG positionozor F x a ern E b w G P E zozor E b w G P Y positionozor F y a ern E b h G P E zozor E b h G P Y

Vous devez initialiser positionZozor aprs avoir charg les surfaces ecran et zozor. En eet, j'utilise la largeur (w) et la hauteur (h) de ces deux surfaces pour calculer la position centre de Zozor l'cran, il faut donc que ces surfaces aient t initialises auparavant.

i vous vous tes ien drouillsD vous devriez voir russi 0her ozor u entre de l9rn @(gF PSFIAF t9i hoisi de mettre le fond en ln ette fois @en fisnt un SDL_FillRect sur ecranAD mis e n9est ps une oligtionF

Schma de la programmation vnementielle


und vous odez un progrmme qui rgit ux vnements @omme on v le fire iiAD vous devez suivre l pluprt du temps le mme  shm de odeF ge shm est connatre par curF ve voii X QTV

EXERCICE : DIRIGER ZOZOR AU CLAVIER

Figure PQFQ ! ozor entr dns l fentre


1 2 3 4 5 6

8 9 10 11

while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvg X GB qestion des v nements de type g BG se hvfshvi X GB qestion des v nements de type fshvi BG } GB yn effe l ' rn @ ii fond ln A X BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GB yn fit tous les hvfliturfe n essires pour oller les surfes l ' rn BG GB yn met jour l ' ffihge X BG hvplip @ ern AY

12 13

14 15 16 17

oil dns les grndes lignes l forme de l oule priniple d9un progrmme hvF yn oule tnt qu9on n9 ps demnd rrter le progrmmeF QTW

CHAPITRE 23. LA GESTION DES VNEMENTS

IF On attend un vnement @SDL_WaitEventA ou ien on vri(e s9il y un vnement mis on n9ttend ps qu9il y en it un @SDL_PollEventAF our le moment on se ontente de SDL_WaitEventF PF yn fit un @grndA switch pour svoir de quel type d9vnement il s9git @vE nement de type TRUCD de type BIDULED omme vous hnte 3AF On traite l'vnement qu'on a reu X on e'etue ertines tionsD ertins lulsF QF ne fois sorti du switchD on prpre un nouvel 0hge X @A premire hose fire X on eace l'cran ve un SDL_FillRectF i on ne le fisit psD on urit des  tres de l9nien rn qui susisterientD et formentD e ne serit ps trs joli Y @A ensuiteD on fit tous les blits nessires pour oller les surfes sur l9rn Y @A en(nD une fois que 9est fitD on met jour l'achage ux yeux de l9utiE listeurD en ppelnt l fontion SDL_Flip(ecran)F

Traiter l'vnement SDL_KEYDOWN


oyons mintennt omment on v triter l9vnement SDL_KEYDOWNF xotre ut est de diriger ozor u lvier ve les )hes diretionnellesF yn v don modi(er ses oordonnes l9rn en fontion de l )he sur lquelle on ppuie X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvu X GG pl he hut positionozor Fy E EY rek Y se hvuhyx X GG pl he s positionozor F y CCY rek Y se hvusqr X GG pl he droite positionozor F x CCY rek Y se hvuvip X GG pl he guhe positionozor Fx E EY rek Y } rek Y }

gomment j9i trouv es onstntes c hns l do9 3 te vous i donn tout l9heure un lien vers l pge de l do9 qui liste toutes les touhes du lvier X 9est l que je me suis serviF QUH

EXERCICE : DIRIGER ZOZOR AU CLAVIER

gonsulter l doumenttion gode we X PQSSPW  ge qu9on fit l est trs simple X ! si on ppuie sur l )he  hut D on diminue l9ordonne @yA de l position de ozor d9un pixel pour le fire  monter Y ! si on v vers le sD on doit u ontrire ugmenter @inrmenterA l9ordonne de ozor @yA Y ! si on v vers l droiteD on ugmente l vleur de l9sisse @xA Y ! si on v vers l guheD on doit diminuer l9sisse @xAF it mintennt c in vous idnt du shm de ode donn prdemmentD vous devriez tre ples de diriger ozor u lvier 3
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B zozor a xvv Y hvet positionozor Y hvivent event Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y GB ghrgement de ozor BG zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB yn entre ozor l ' rn BG positionozor F x a ern E b w G P E zozor E b w G P Y positionozor F y a ern E b h G P E zozor E b h G P Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvu X GG pl he hut positionozor Fy E EY

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

5. Notez que nous ne sommes pas obligs de le dplacer d'un pixel, on pourrait trs bien le dplacer de 10 pixels en 10 pixels.

QUI

CHAPITRE 23. LA GESTION DES VNEMENTS


34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

} rek Y

rek Y se hvuhyx X GG pl he s positionozor F y CCY rek Y se hvusqr X GG pl he droite positionozor F x CCY rek Y se hvuvip X GG pl he guhe positionozor Fx E EY rek Y

50 51 52 53 54 55 56 57 58 59 60

GB yn effe l ' rn BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GB yn ple ozor s nouvelle position BG hvfliturfe @ zozor D xvv D ern D 8 positionozor AY GB yn met jour l ' ffihge BG hvplip @ ern A Y

hvpreeurfe @ zozor A Y hvuit @A Y } return isggi Y

gopier e ode gode we X PSPIVV  sl est primordil de ien omprendre omment est ompose l oule priniple du progrmmeF sl fut tre ple de l refire de tteF elisez le shm de ode que vous vez vu plus hutD u esoinF hon en rsumD on une grosse oule ppele  foule priniple du progrmme F ille ne s9rrter que si on le demnde en mettnt le oolen continuer HF hns ette ouleD on rupre d9ord un vnement triterF yn fit un switch pour dterminer de quel type d9vnement il s9gitF in fontion de l9vnementD on e'etue di'rentes tionsF siD je mets jour les oordonnes de ozor pour donner l9impression qu9on le dpleF insuiteD prs le switch vous devez mettre jour votre rn omme suitF IF remirementD vous e'ez l9rn vi un SDL_FillRect @de l ouleur de fond que vous voulezAF PF insuiteD vous littez vos surfes sur l9rnF siD je n9i eu esoin de litter que ozor r il n9y que luiF ous noterezD et 9est trs importntD que je litte ozor positionZozor 3 g9est l que l di'rene se fit X si j9i mis jour QUP

EXERCICE : DIRIGER ZOZOR AU CLAVIER


positionZozor uprvntD lors ozor pprtr un utre endroit et on ur l9impression qu9on l9 dpl 3 QF in(nD toute dernire hose fire X SDL_FlipF gel ordonne l mise jour de l9rn ux yeux de l9utilisteurF yn peut don dpler ozor o l9on veut sur l9rnD mintennt @(gF PQFRA 3

Figure PQFR ! ozor en lde

Quelques optimisations
Rptition des touches

our l9instntD notre progrmme fontionne mis on ne peut se dpler que d9un pixel l foisF xous sommes oligs d9ppuyer nouveu sur les )hes du lvier si on veut enore se dpler d9un pixelF te ne sis ps vousD mis moi m9muse moyennement de m9exiter frntiquement sur l mme touhe du lvier juste pour dpler le personnge de PHH pixelsF reureusementD il y SDL_EnableKeyRepeat 3 gette fontion permet d9tiver l rE ptition des touhesF ille fit en sorte que l hv rgnre un vnement de type SDL_KEYDOWN si une touhe est mintenue enfone un ertin tempsF gette fontion peut tre ppele qund vous voulezD mis je vous onseille de l9ppeler de prfrene vnt l oule priniple du progrmmeF ille prend deux prmtres X QUQ

CHAPITRE 23. LA GESTION DES VNEMENTS

! l dure @en milliseondesA pendnt lquelle une touhe doit rester enfone vnt d9tiver l rptition des touhes Y ! le dli @en milliseondesA entre hque gnrtion d9un vnement SDL_KEYDOWN une fois que l rptition t tiveF ve premier prmtre indique u out de omien de temps on gnre une rptition l premire foisD et le seond indique le temps qu9il fut ensuite pour que l9vnement se rpteF ersonnellementD pour des risons de )uiditD je mets l mme vleur es deux prmtresD le plus souventF issyez ve une rptition de IH ms X
1

hvinleueyepet @ IH D IH A Y

wintenntD vous pouvez lisser une touhe du lvier enfoneF ous llez voirD 9est qund mme mieux 3
Travailler avec le double buer

prtir de mintenntD il serit on d9tiver l9option de double buering de l hvF ve doule u'ering est une tehnique ourmment utilise dns les jeuxF ille permet d9viter un sintillement de l9imgeF ourquoi l9imge sintilleritEelle c re que qund vous dessinez l9rnD l9utilisteur  voit qund vous dessinez et don qund l9rn s9e'eF wme si v trs viteD notre erveu peroit un lignotement et 9est trs dsgrleF v tehnique du doule u'ering onsiste utiliser deux  rns X l9un est rel @elui que l9utilisteur est en trin de voir sur son moniteurAD l9utre est virtuel @9est une imge que l9ordinteur est en trin de onstruire en mmoireAF ges deux rns lternent X l9rn e est 0h pendnt que l9utre @l9rn fA en  rrireEpln prpre l9imge suivnte @(gF PQFSAF

Figure PQFS ! in doule u'eringD l9imge suivnte est prpre en the de fond

ne fois que l9imge en rrireEpln @l9rn fA t dessineD on intervertit les deux QUR

EXERCICE : DIRIGER ZOZOR AU CLAVIER

rns en ppelnt l fontion SDL_Flip @(gF PQFTAF

Figure PQFT ! SDL_Flip intervertit les rns pour 0her l nouvelle imge

v9rn e prt en rrireEpln prprer l9imge suivnteD tndis que l9imge de l9rn f s90he diretement et instntnment ux yeux de l9utilisteurF sultt X uun sintillement 3 our rliser elD tout e que vous vez fire est de hrger le mode vido en joutnt le )g SDL_DOUBLEBUF X
1

ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y

ous n9vez rien d9utre hnger dns votre odeF


Le double buering est une technique bien connue de votre carte graphique. C'est donc directement gr par le matriel et a va trs trs vite.

ous vous demndez peutEtre pourquoi on dj utilis SDL_Flip uprvnt sns le doule u'ering c in fitD ette fontion deux utilits X ! si le doule u'ering est tivD elle sert ommnder  l9hnge des rns qu9on vient de voir Y ! si le doule u'ering n9est ps tivD elle ommnde un rfrhissement mnuel de l fentreF gette tehnique est vlle dns le s d9un progrmme qui ne ouge ps euoupD mis pour l pluprt des jeuxD je reommnde de l9tiverF hornvntD j9uri toujours le doule u'ering tiv dns mes odes soure F i vous le souhitezD vous pouvez ruprer le ode soure omplet qui fit usge du doule u'ering et de l rptition des touhesF sl est trs similire elui que l9on vu prdemmentD on y seulement jout les nouvelles instrutions qu9on vient d9pprendreF
6

6. a ne cote pas plus cher et c'est mieux : de quoi se plaint-on ?

QUS

CHAPITRE 23. LA GESTION DES VNEMENTS




gopier le ode soure gode we X TIVVUH 

La souris
ous vous dites peutEtre que grer l souris est plus ompliqu que le lvier c ue nenni 3 g9est mme plus simpleD vous llez voir 3 v souris peut gnrer trois types d9vnements di'rentsF ! SDL_MOUSEBUTTONDOWN X lorsqu9on lique ve l sourisF gel orrespond u moment o le outon de l souris est enfonF ! SDL_MOUSEBUTTONUP X lorsqu9on relhe le outon de l sourisF out el fontionne extement sur le mme prinipe que les touhes du lvier X il y d9ord un ppuiD puis un relhement du outonF ! SDL_MOUSEMOTION X lorsqu9on dple l sourisF hque fois que l souris ouge dns l fentre @ne seritEe que d9un pixel 3AD un vnement SDL_MOUSEMOTION est gnr 3 xous llons d9ord trviller ve les lis de l souris et plus prtiulirement ve SDL_MOUSEBUTTONUPF yn ne trviller ps ve SDL_MOUSEBUTTONDOWN iiD mis vous svez de toute mnire que 9est extement preil suf que el se produit plus ttD u moment de l9enfonement du outon de l sourisF xous verrons un peu plus loin omment triter l9vnement SDL_MOUSEMOTIONF

Grer les clics de la souris


xous llons don pturer un vnement de type SDL_MOUSEBUTTONUP @li de l sourisA puis voir quelles informtions on peut ruprerF gomme d9hitudeD on v devoir jouter un case dns notre switch de testD lors llonsEy giement X
1 2 3 4 5 6 7 8

swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X GB gli de l souris BG rek Y }

tusqueElD ps de di0ult mjeureF uelles informtions peutEon ruprer lors d9un li de l souris c sl y en deux X ! le bouton de la souris ve lequel on liqu @li guhe c li droit c li outon du milieu cA Y ! les coordonnes de la souris u moment du li @x et yAF QUT

LA SOURIS

Rcuprer le bouton de la souris

yn v d9ord voir ve quel outon de l souris on liquF our elD il fut nlyser l sousEvrile event.button.button @nonD je ne gie psA et omprer s vleur ve l9une des S onstntes suivntes X ! SDL_BUTTON_LEFT X li ve le outon guhe de l souris Y ! SDL_BUTTON_MIDDLE X li ve le outon du milieu de l souris Y ! SDL_BUTTON_RIGHT X li ve le outon droit de l souris Y ! SDL_BUTTON_WHEELUP X molette de l souris vers le hut Y ! SDL_BUTTON_WHEELDOWN X molette de l souris vers le sF
7

Les deux dernires constantes correspondent au mouvement vers le haut ou vers le bas auquel on procde avec la molette de la souris. Elles ne correspondent pas un  clic  sur la molette comme on pourrait le penser tort.

yn v fire un test simple pour vri(er si on fit un li droit ve l sourisF i on fit un li droitD on rrte le progrmme @ouiD je sisD e n9est ps trs originl pour le moment mis permet de testerA X
1 2 3 4 5 6 7

8 9 10

swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X if @ event F utton F utton aa hvfyxsqr A GB yn rr te le progrmme si on fit un li droit BG ontinuer a H Y rek Y }

ous pouvez testerD vous verrez que le progrmme s9rrte si on fit un li droitF
Rcuprer les coordonnes de la souris

oil une informtion trs intressnte X les oordonnes de l souris u moment du li 3 yn les rupre l9ide de deux vriles @pour l9sisse et l9ordonneA X event.button.x et event.button.yF emusonsEnous un petit peu X on v litter ozor l9endroit du li de l sourisF gomE pliqu c s du tout 3 issyez de le fireD 9est un jeu d9enfnt 3 oii l orretion X
1 2 3

while @ ontinuer A { hvitivent @8 event A Y


7. Tout le monde n'en a pas forcment un, c'est en gnral un clic avec la molette.

QUU

CHAPITRE 23. LA GESTION DES VNEMENTS


4 5 6 7 8 9 10 11 12 13 14 15

swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X positionozor F x a event F utton F x Y positionozor F y a event F utton F y Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor AY GB yn ple ozor s nouvelle position BG hvplip @ ern A Y

16

17 18

ressemle s9y mprendre e que je fisis ve les touhes du lvierF vD 9est mme enore plus simple X on met diretement l vleur de x de l souris dns positionZozor.xD et de mme pour yF insuite on litte ozor es oordonnesElD et voil le trvil @(gF PQFUA 3

Figure PQFU ! ozor pprt l9endroit du li

etit exerie trs simple X pour le momentD on dple ozor quel que soit le outon de QUV

LA SOURIS

l souris utilis pour le liF issyez de ne dpler ozor que si on fit un li guhe ve l sourisF i on fit un li droitD rrtez le progrmmeF

Grer le dplacement de la souris


n dplement de l souris gnre un vnement de type SDL_MOUSEMOTIONF xotez ien qu9on gnre utnt d9vnements que l9on prourt de pixels pour se dpler 3 i on ouge l souris de IHH pixels @e qui n9est ps euoupAD il y ur don IHH vnements gnrsF
Mais a ne fait pas beaucoup d'vnements grer pour notre ordinateur, tout a ?

s du tout X rssurezEvousD il en vu d9utres 3 fonD que peutEon ruprer d9intressnt ii c ves oordonnes de l sourisD ien sr 3 yn les trouve dns event.motion.x et event.motion.yF
Faites attention : on n'utilise pas les mmes variables que pour le clic de souris de tout l'heure (avant, c'tait event.button.x). Les variables utilises sont direntes en SDL en fonction de l'vnement.

yn v pler ozor ux mmes oordonnes que l sourisD l enoreF ous llez voirD 9est rudement e0e et toujours ussi simple 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyiwysyx X positionozor F x a event F motion F x Y positionozor F y a event F motion F y Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y GB yn ple ozor s nouvelle position BG hvplip @ ern AY

16

17 18

fougez votre ozor l9rnF ue voyezEvous c sl suit nturellement l souris o que QUW

CHAPITRE 23. LA GESTION DES VNEMENTS

vous lliezF g9est euD 9est rpideD 9est )uide @vive le doule u'eringAF

Quelques autres fonctions avec la souris


xous llons voir deux fontions trs simples en rpport ve l sourisD puisque nous y sommesF ges fontions vous seront trs prolement utiles ienttF
Masquer la souris

yn peut msquer le urseur de l souris trs filementF sl su0t d9ppeler l fontion SDL_ShowCursor et de lui envoyer un )g X ! SDL_DISABLE X msque le urseur de l souris Y ! SDL_ENABLE X r0he le urseur de l sourisF r exemple X
1

hvhowgursor @ hvhsefvi A Y

ve urseur de l souris rester msqu tnt qu9il ser l9intrieur de l fentreF wsquez de prfrene le urseur vnt l oule priniple du progrmmeF s l peine en e'et de le msquer hque tour de ouleD une seule fois su0tF
Placer la souris un endroit prcis

yn peut pler mnuellement le urseur de l souris ux oordonnes que l9on veut dns l fentreF yn utilise pour el SDL_WarpMouse qui prend pour prmtres les oordonnes x et y o le urseur doit tre plF r exempleD le ode suivnt ple l souris u entre de l9rn X
1

hvrpwouse @ ern E b w G P D ern E b h G P A Y

Lorsque vous faites un WarpMouse, un vnement de type SDL_MOUSEMOTION sera gnr. Eh oui, la souris a boug ! Mme si ce n'est pas l'utilisateur qui l'a fait, il y a quand mme eu un dplacement.

Les vnements de la fentre


v fentre elleEmme peut gnrer un ertin nomre d9vnements X ! lorsqu9elle est redimensionne Y ! lorsqu9elle est rduite en rre des thes ou resture Y ! lorsqu9elle est tive @u premier plnA ou lorsqu9elle n9est plus tive Y ! lorsque le urseur de l souris se trouve l9intrieur de l fentre ou lorsqu9il en sortF QVH

LES VNEMENTS DE LA FENTRE

gommenons pr tudier le premier d9entre eux X l9vnement gnr lors du redimenE sionnement de l fentreF

Redimensionnement de la fentre
r dfutD une fentre hv ne peut ps tre redimensionne pr l9utilisteurF te vous rppelle que pour hnger D il fut jouter le )g SDL_RESIZABLE dns l fontion SDL_SetVideoMode X
1

ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp | hvisefvi A Y

ne fois que vous vez jout e )gD vous pouvez redimensionner l fentreF vorsque vous fites elD un vnement de type SDL_VIDEORESIZE est gnrF ous pouvez ruprer X ! l nouvelle lrgeur dns event.resize.w Y ! l nouvelle huteur dns event.resize.hF yn peut utiliser es informtions pour fire en sorte que notre ozor soit toujours entr dns l fentre X
1 2 3 4

se hvshiyisi X positionozor F x a event F resize F w G P E zozor E b w G P Y positionozor F y a event F resize F h G P E zozor E b h G P Y rek Y

Visibilit de la fentre
v9vnement SDL_ACTIVEEVENT est gnr lorsque l visiilit de l fentre hngeF gel peut tre d de nomreuses hoses X ! l fentre est rduite en rre des thes ou resture Y ! le urseur de l souris se trouve l9intrieur de l fentre ou en sort Y ! l fentre est tive @u premier plnA ou n9est plus tiveF
En programmation, on parle de focus . Lorsqu'on dit qu'une application a le focus, c'est que le clavier ou la souris de l'utilisateur s'y trouve. Tous les clics sur la souris ou appuis sur les touches du clavier que vous ferez seront envoys la fentre qui a le focus et non aux autres. Une seule fentre peut avoir le focus un instant donn (vous ne pouvez pas avoir deux fentres au premier plan en mme temps !).

tnt donn le nomre de risons qui peuvent voir provoqu et vnementD il fut imprtivement regrder dns des vriles pour en svoir plusF ! event.active.gain X indique si l9vnement est un gin @IA ou une perte @HAF r exempleD si l fentre est psse en rrireEpln 9est une perte @HAD si elle est remise u premier pln 9est un gin @IAF QVI

CHAPITRE 23. LA GESTION DES VNEMENTS

qui s9est produitF oii l liste des )gs possiles X ! SDL_APPMOUSEFOCUS X le urseur de l souris vient de rentrer ou de sortir de l fentreF sl fut regrder l vleur de event.active.gain pour svoir si elle est rentre @gin a IA ou sortie @gin a HA de l fentre Y ! SDL_APPINPUTFOCUS X l9pplition vient de reevoir le fous du lvier ou de le perdreF gel signi(e en fit que votre fentre vient d9tre mise u premier pln ou en rrireEplnF inore une foisD il fut regrder l vleur de event.active.gain pour svoir si l fentre t mise u premier pln @gin a IA ou en rrireEpln @gin a HA Y ! SDL_APPACTIVE X l9ppliton t icnieD 9estEEdire rduite dns l rre des thes @gin a HAD ou remise dns son tt norml @gin a IAF ous suivez toujours c sl fut ien omprer les vleurs des deux sousEvriles gain et state pour svoir extement e qui s9est produitF
Tester la valeur d'une combinaison de ags
event.active.state est une ominison de )gsF gel signi(e que dns un vneE mentD il peut se produire deux hoses l fois @pr exempleD si on rduit l fentre dns l rre des thesD on perd ussi le fous du lvier et de l sourisAF sl v don flloir fire un test un peu plus ompliqu qu9un simpleF F F
1

event.active.state X 9est une ominison de )gs indiqunt le type d9vnement

texttt { if @ event F tive F stte aa hv eegsi A }

Pourquoi est-ce plus compliqu ?

re que 9est une ominison de itsF te ne vis ps vous fire un ours sur les oprtions logiques it it iiD serit un peu trop pour e ours et vous n9vez ps nessirement esoin d9en onntre dvntgeF te vis vous proposer un ode prt l9emploi qu9il fut utiliser pour tester si un )g est prsent dns une vrile sns rentrer dns les dtilsF our tester pr exemple s9il y eu un hngement de fous de l sourisD on doit rire X
1

if @@ event F tive F stte 8 hvewyipyg A aa hvewyipyg A

sl n9y ps d9erreurF ettentionD 9est pris X il fut un seul & et deux =D et il fut ien utiliser les prenthses omme je l9i fitF gel fontionne de l mme mnire pour les utres vnementsF r exemple X
1

if @@ event F tive F stte 8 hveegsi A aa hveegsi A

QVP

LES VNEMENTS DE LA FENTRE

Tester l'tat et le gain la fois

hns l prtiqueD vous voudrez srement tester l9tt et le gin l foisF ous pourrez insi svoir extement e qui s9est pssF upposons que vous yez un jeu qui fit fire euoup de luls l9ordinteurF ous voulez que le jeu se mette en puse utomtiquement lorsque l fentre est rduiteD et qu9il se relne lorsque l fentre est restureF gel vite que le jeu ontinue pendnt que le joueur n9est plus tif et el vite ussi u proesseur de fire trop de luls pr l mme osionF ve ode iEdessous met en puse le jeu en tivnt un oolen pause IF sl remet en mrhe le jeu en dstivnt le oolen HF
1 2 3 4 5

6 7

if @@ event F tive F stte 8 hveegsi A aa hveegsi A { if @ event F tive F gin aa H A GB v fen tre t r duite BG puse a I Y else if @ event F tive F gin aa I A GB v fen tre t restur e BG puse a H Y }

Bien entendu, ce code n'est pas complet. Ce sera vous de tester l'tat de la variable pause pour savoir s'il faut ou non eectuer les calculs de votre jeu.

te vous lisse fire d9utres tests pour les utres s @pr exempleD vri(er si le urseur de l souris est l9intrieur ou l9extrieur de l fentreAF ous pouvez " pour vous entrner " fire ouger ozor vers l droite lorsque l souris rentre dns l fentreD et le fire ouger vers l guhe lorsqu9elle en sortF

En rsum
! ves vnements sont des signux que vous envoie l hv pour vous informer d9une tion de l prt de l9utilisteur X ppui sur une touheD mouvement ou li de l sourisD fermeture de l fentreD etF ! ves vnements sont ruprs dns une vrile de type SDL_Event ve l fonE tion SDL_WaitEvent @fontion loqunte mis file grerA ou ve l fontion SDL_PollEvent @fontion non loqunte mis plus omplexe mnipulerAF ! sl fut nlyser l sousEvrile event.type pour onntre le type d9vnement qui s9est produitF yn le fit en gnrl dns un switchF ! ne fois le type d9vnement dterminD il est le plus souvent nessire d9nlyser l9vnement dns le dtilF r exempleD lorsqu9une touhe du lvier t enfone @SDL_KEYDOWNA il fut nlyser event.key.keysym.sym pour onntre l touhe en questionF ! ve doule u'ering est une tehnique qui onsiste hrger l9imge suivnte en the QVQ

CHAPITRE 23. LA GESTION DES VNEMENTS

de fond et l90her seulement une fois qu9elle est prteF gel permet d9viter des sintillements dsgrles l9rnF

QVR

Chapitre

24
Dicult :

TP : Mario Sokoban

a bibliothque SDL fournit, comme vous l'avez vu, un grand nombre de fonctions prtes l'emploi. Il est facile de s'y perdre les premiers temps, surtout si on ne pratique pas. Ce premier TP de la section SDL est justement l pour vous faire dcouvrir un cas pratique et surtout vous inviter manipuler. Cette fois, vous l'aurez compris je crois, notre programme ne sera pas une console mais bel et bien une fentre ! Quel va tre le sujet de ce TP ? Il va s'agir d'un jeu de Sokoban ! Peut-tre que ce nom ne vous dit rien, mais le jeu est pourtant un grand classique des casse-ttes. Il consiste pousser des caisses pour les amener des points prcis dans un labyrinthe.

QVS

CHAPITRE 24. TP : MARIO SOKOBAN

Cahier des charges du Sokoban


propos du Sokoban
 okon est un terme jponis qui signi(e  wgsinier F sl s9git d9un sseEtte invent dns les nnes VH pr riroyuki smyshiF ve jeu remport un onours de progrmmtion ette poqueF
Le but du jeu

sl est simple omprendre X vous dirigez un personnge dns un lyrintheF sl doit pousser des isses pour les mener des endroits prisF ve joueur ne peut ps dpler deux isses l foisF i le prinipe se omprend vite et ienD el ne veut ps dire pour utnt que le jeu est toujours fileF sl est en e'et possile de rliser des sseEttes vrimentF F F prise de tte 3 v (gF PRFI vous donne un peru du jeu que nous llons rliserF

Figure PRFI ! ve jeu wrio okon que nous llons rliser


Pourquoi avoir choisi ce jeu ?

re que 9est un jeu populireD qu9il fit un on sujet de progrmmtion et qu9on peut le rliser ve les onnissnes que l9on quisesF elors ien srD demnde de l9orgnistionF v di0ult n9est ps vriment dns le ode luiEmme mis dns QVT

CAHIER DES CHARGES DU SOKOBAN

l9orgnistionF sl v en e'et flloir douper notre progrmme en plusieurs (hiers .c intelligemment et essyer de rer les onnes fontionsF g9est ussi pour ette rison que j9i did ette fois de ne ps onstruire le omme les prdents X je ne vis ps vous donner des indies suivis d9une orretion l (nF eu ontrireD je vis vous montrer omment je rlise tout le projet de e F
Et si je veux m'entraner tout seul ?

s de prolme 3 ellezEy lnezEvousD 9est mme trs ien 3 sl vous fudr ertinement un peu de temps X personnellement m9 pris une onne petite journeD et enore 9est pre que j9i un peu l9hitude de progrmmer et que j9vite ertins piges ournts F hez qu9un tel jeu peut tre rlis de nomreuses fons di'rentesF te vis vous montrer m fon de fire X e n9est ps l meilleureD mis e n9est ps l plus muvise non plusF ve se terminer pr une srie de suggestions d9mliortions et je vous proposeri de tlhrger le ode soure omplet ien entenduF inore une fois X je vous onseille d9essyer de vous y lner pr vousEmmesF ssezEy deux ou trois jours et fites de votre mieuxF sl est importnt que vous prtiquiezF
1

Le cahier des charges


ve hier des hrges est un doument dns lequel on rit tout e que le progrmme doit svoir fireF in l9oureneD que veutEon que notre jeu soit ple de fire c g9est le moment de se dider 3 oii e que je propose X ! le joueur doit pouvoir se dpler dns un lyrinthe et pousser des isses Y ! il ne peut ps pousser deux isses l fois Y ! une prtie est onsidre omme ggne lorsque toutes les isses sont sur des ojeE tifs Y ! les niveux de jeu seront enregistrs dns un (hier @pr exemple niveaux.lvlA Y ! un diteur ser intgr u progrmme pour que n9importe qui puisse rer ses propres niveux F oil qui nous donner ien ssez de trvilF noter qu9il y des hoses que notre progrmme ne sur ps fireD ussi il fut le direF ! xotre progrmme ne pourr grer qu9un seul niveu l foisF i vous voulez oder une  venture ve une suite de niveuxD vous n9urez qu9 le fire vousEmmes l (n de e F ! sl n9y ur ps de gestion du temps oul @on ne sit ps enore fire A ni du
2

1. Cela ne m'a pas empch de me prendre la tte plusieurs reprises quand mme. ;-) 2. Ce n'est pas indispensable mais a ajoutera du piment !

QVU

CHAPITRE 24. TP : MARIO SOKOBAN

soreF in fitD ve tout e qu9on veut dj fire @notmment l9diteur de niveuxAD il y en pour un petit momentF
Je vous indiquerai la n du TP une liste d'ides pour amliorer le programme. Et ce ne seront pas des paroles en l'air, car ce sont des ides que j'aurai moimme implmentes dans une version plus complte du programme que je vous proposerai de tlcharger. En revanche, je ne vous donnerai pas les codes source de la version complte pour vous forcer travailler .
3

Rcuprer les sprites du jeu


hns l pluprt des jeux PhD que e soient des jeux de plteEforme ou de sseEtte omme iiD on ppelle les imges qui omposent le jeu des sprites F hns notre sD j9i did qu9on rerit un okon mettnt en sne wrio @d9o le nom  wrio okon AF gomme wrio est un personnge populire dns le monde de l PhD on n9ur ps trop de ml trouver des sprites de wrioF sl fudr ussi trouver des sprites pour les murs de riquesD les issesD les ojetifsD etF i vous fites une reherhe sur qoogle pour  sprites D vous trouverez de nomreuses rponsesF in e'etD il y euoup de sites qui proposent de tlhrger des sprites de jeux Ph uxquels vous vez srement jou pr le pssF oii les sprites que nous llons utiliser X
Sprite Description

n murF ne isseF ne isse ple sur un ojetifF n ojetif @o l9on doit pler une isseAF ve joueur @wrioA orient vers le sF wrio vers l droiteF wrio vers l guheF wrio vers le hutF ve plus simple pour vous ser de tlhrger un pk que j9i prpr ontennt toutes es imgesF
3. Je vais pas tout vous servir sur un plateau d'argent non plus ! ;-)

QVV

LE MAIN ET LES CONSTANTES

lhrger les imges gode we X SRPSTT 

Notez que j'aurais trs bien pu n'utiliser qu'un sprite pour le joueur. J'aurais pu faire en sorte que Mario soit toujours orient vers le bas, mais le fait de pouvoir le diriger dans les quatre directions ajoute un peu plus de ralisme. a ne fera qu'un petit d de plus relever !

t9i ussi r une petite imge qui pourr servir de menu d9ueil u lnement du progrmme @(gF PRFPAD vous l trouverez dns le pk que vous venez normlement de tlhrgerF

Figure PRFP ! v9rn d9ueil du progrmme

ous noterez que les imges sont dns di'rents formtsF sl y des qspD des xq et des tiqF xous llons don voir esoin de l iliothque SDL_ImageF ensez on(gurer votre projet pour qu9il gre l hv et SDL_ImageF i vous vez ouli omment fireD revoyez les hpitres prdentsF i vous ne on(gurez ps votre projet orretementD on vous dir que les fontions que vous utilisez @omme IMG_LoadA n9existent ps 3

Le main et les constantes


ghque fois qu9on ommene un projet ssez importntD il est nessire de ien s9orE gniser ds le dprtF in gnrlD je ommene pr me rer un (hier de onstntes constantes.h insi qu9un (hier main.c qui ontiendr l fontion main @et uniqueE ment elleElAF ge n9est ps une rgle X 9est juste m fon de fontionnerF ghun s propre mnire de fireF QVW

CHAPITRE 24. TP : MARIO SOKOBAN

Les dirents chiers du projet


te propose de rer ds prsent tous les (hiers du projet @mme s9ils restent vides u dprtAF oii don les (hiers que je re X ! constantes.h X les d(nitions de onstntes gloles tout le progrmme Y ! main.c X le (hier qui ontient l fontion main @fontion priniple du progrmmeA Y ! jeu.c X fontions grnt une prtie de okon Y ! jeu.h X prototypes des fontions de jeu.c Y ! editeur.c X fontions grnt l9diteur de niveux Y ! editeur.h X prototypes des fontions de editeur.c Y ! fichiers.c X fontions grnt l leture et l9riture de (hiers de niveux @omme niveaux.lvl pr exempleA Y ! fichiers.h X prototypes des fontions de fichiers.cF yn v ommener pr rer le (hier des onstntesF

Les constantes : constantes.h


oii le ontenu de mon (hier de onstntes X
1 2 3 4 5 6 7

GB onstntes F h EEEEEEEEEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X d finit des onstntes pour tout le progrmme @ tille de l fen tre FFFA BG 5 ifndef hipgyxexi 5 define hipgyxexi 5 define esvvifvyg en pixels 5 define xffvygveqi 5 define xffvygrei 5 define veqipixii 5 define reipixii QR GG ille d ' un lo @ rr A IP IP esvvifvyg B xffvygveqi esvvifvyg B xffvygrei

8 9 10 11 12 13

14 15 16 17 18 19 20 21 22

enum { re D fe D qegri D hysi }Y enum { shi D w D gesi D yftigsp D wesy D gesiyu }Y 5 endif

gopier e ode gode we X PSHTHW  ous noterez plusieurs points intressnts dns e petit (hierF QWH

LE MAIN ET LES CONSTANTES

! ve (hier ommene pr un ommentire d9enEtteF te reommnde de mettre e type de ommentire u dut de hun de vos (hiers @que e soient des .h ou des .cAF qnrlementD un ommentire d9enEtte ontient X ! le nom du (hier Y ! l9uteur Y ! le rle du (hier @e quoi servent les fontions qu9il ontientA Y ! je ne l9i ps fit lD mis gnrlementD on met ussi l dte de rtion et l dte de dernire modi(tionF permet de s9y retrouverD surtout dns les gros projets plusieursF ! ve (hier est protg ontre les inlusions in(niesF sl utilise l tehnique que l9on pprise l (n du hpitre sur le prproesseurF si ette protetion ne sert ps vrimentD mis j9i pris l9hitude de fire pour hun de mes (hiers .h sns exeptionF ! in(nD le ur du (hierF ous vez une srie de defineF t9indique l tille d9un petit lo en pixels @tous mes sprites sont des rrs de QR pxAF t9indique que m fentre omporter IP x IP los de lrgeurF te lule omme les dimensions de l fentre pr une simple multiplition des onstntesF ge que je fis l n9est ps oligtoireD mis un norme vntge X si plus trd je veux hnger l tille du jeuD je n9uri qu9 diter e (hier @et reompilerA et tout mon ode soure s9dpter en onsqueneF ! in(nD j9i d(ni d9utres onstntes vi des numrations anonymesF g9est lgE rement di'rent de e qu9on ppris dns le hpitre sur les types de vriles personnlissF siD je ne re ps un type personnlisD je d(nis juste des onstntesF gel ressemle ux define une di'rene prs X 9est l9ordinteur qui ttriue uE tomtiquement un nomre hune des vleurs @en ommennt pr HAF einsiD on HAUT a HD BAS a ID GAUCHE a PD etF gel permettr de rendre notre ode soure euoup plus lir pr l suiteD vous verrez 3 in rsumD j9utilise X ! des define lorsque je veux ttriuer une vleur prise une onstnte @pr exemple  QR pixels A Y ! des numrtions lorsque l vleur ttriue une onstnte ne m9importe psF siD je me moque ien de svoir que HAUT vut H @ pourrit ussi ien vloir ISHD ne hngerit rienA Y tout e qui ompte pour moiD 9est que ette onstnte it une vleur di'rente de BASD GAUCHE et DROITEF
Inclure les dnitions de constantes

ve prinipe ser d9inlure e (hier de onstntes dns hun de mes (hiers .cF einsiD prtout dns mon ode je pourri utiliser les onstntes que je viens de d(nirF sl fudr don tper l ligne suivnte u dut de hun des (hiers .c X
1

5 inlude 4 onstntes F h 4

QWI

CHAPITRE 24. TP : MARIO SOKOBAN

Le main : main.c
v fontion main priniple est extrmement simpleF ille pour rle d90her l9rn d9ueil du jeu et de rediriger vers l onne setionF
1 2 3 4 5 6 7

GB min F EEEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X menu du jeu F ermet de hoisir entre l ' diteur et le jeu lui E m me F BG 5 inlude 5 inlude 5 inlude 5 inlude ` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` hv G hvimge Fh b

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

5 inlude 4 onstntes F h 4 5 inlude 4 jeu F h 4 5 inlude 4 editeur F h 4 int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B menu a xvv Y hvet positionwenu Y hvivent event Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y hvwetson @ swqvod @4 isse F jpg 4 A D xvv AY GG v ' i ne doit tre hrg e vnt hvetideowode ern a hvetideowode @ veqipixii D reipixii D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 wrio okon 4 D xvv A Y menu a swqvod @ 4 menu F jpg 4 A Y positionwenu F x a H Y positionwenu F y a H Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y

30

31 32 33 34 35 36 37 38 39 40 41 42 43

QWP

LE MAIN ET LES CONSTANTES


44 45 46 47 48 49 50 51 52 53 54

55 56 57 58 59 60 61 62

rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X GG eut rr ter le jeu ontinuer a H Y rek Y se hvuuI X GG hemnde jouer jouer @ ern A Y rek Y se hvuuP X GG hemnde l ' diteur de niveux editeur @ ern A Y rek Y } rek Y

63 64 65 66 67 68 69 70 71

GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ menu D xvv D ern D 8 positionwenu A Y hvplip @ ern AY

hvpreeurfe @ menu A Y hvuit @A Y } return isggi Y

gopier e ode gode we X UQQQTW  v fontion main se hrge d9e'etuer les initilistions de l hvD de donner un titre l fentre insi qu9une ineF l (n de l fontionD SDL_Quit() est ppele pour rrter l hv proprementF v fontion 0he un menuF ve menu est hrg en utilisnt l fontion IMG_Load de SDL_Image X
1

menu a swqvod @ 4 menu F jpg 4 A Y

Vous remarquerez que, pour donner les dimensions de la fentre, j'utilise les constantes LARGEUR_FENETRE et HAUTEUR_FENETRE qu'on a dnies dans constantes.h.

QWQ

CHAPITRE 24. TP : MARIO SOKOBAN

La boucle des vnements

v oule in(nie gre les vnements suivnts X ! arrt du programme @SDL_QUITA X si on demnde fermer le progrmme @li sur l roix en hut droite de l fentreAD lors on psse le oolen continuer HD et l oule s9rrterF frefD lssique Y ! appui sur la touche Echap X rrt du progrmme @omme SDL_QUITA Y ! appui sur la touche 1 du pav numrique X lnement du jeu @ppel de l fontion jouerA Y ! appui sur la touche 2 du pav numrique X lnement de l9diteur @ppel de l fontion editeurAF gomme vous le voyezD 9est vriment trs simpleF i on ppuie sur ID le jeu est lnF ne fois que le jeu est terminD l fontion jouer s9rrte et on retourne dns le main dns lequel on refit un tour de ouleF ve main oule l9in(ni tnt qu9on ne demnde ps rrter le jeuF qre ette petite orgnistion trs simpleD on peut don grer le menu dns le main et lisser des fontions spiles @omme jouerD ou editeurA grer les di'rentes prties du progrmmeF

Le jeu
ettquons mintennt le gros du sujet X l fontion jouer 3 gette fontion est l plus importnte du progrmmeD ussi soyez ttentifs r 9est vriment l qu9il fut omE prendreF ous verrez prs que rer l9diteur de niveux n9est ps si ompliqu que en l9irF

Les paramtres envoys la fonction


v fontion jouer esoin d9un prmtre X l surfe ecranF in e'etD l fentre t ouverte dns le mainD et pour que l fontion jouer puisse y dessinerD il fut qu9elle rupre le pointeur sur ecran 3 i vous regrdez le main nouveuD vous voyez qu9on ppelle jouer en lui envoynt ecran X
1

jouer @ ern AY

ve prototype de l fontionD que vous pouvez mettre dns jeu.hD est don le suivnt X
1

void jouer @ hvurfe B ern A Y

La fonction ne renvoie aucune valeur (d'o le void), mais on pourrait en renvoyer une, si on voulait. On pourrait par exemple renvoyer un boolen pour dire si oui ou non on a gagn.

QWR

LE JEU

Les dclarations de variables


gette fontion v voir esoin de nomreuses vrilesF te n9i ps pens toutes les vriles dont j9i eu esoin du premier oupF sl y en don ertines que j9i joutes pr l suiteF
Variables de types dnis par la SDL

oii pour ommener toutes les vriles de types d(nis pr l hv dont j9i esoin X
1 2

3 4

hvurfe B mrio R a { xvv }Y GG R surfes pour R diretions de mrio hvurfe B mur a xvv D B isse a xvv D B isseyu a xvv D B ojetif a xvv D B mrioetuel a xvv Y hvet position D positiontoueur Y hvivent event Y

t9i r un tleu de SDL_Surface ppel marioF g9est un tleu de qutre ses qui stoker wrio dns hune des diretions @un vers le sD un utre vers l guheD vers le hut et vers l droiteAF sl y ensuite plusieurs surfes orrespondnt hun des sprites que je vous i fit tlhrger plus hut X murD caisseD caisseOK @une isse sur un ojetifA et objectifF
quoi sert marioActuel ?

g9est un pointeur vers une surfeF sl pointe sur l surfe orrespondnt u wrio orient dns l diretion tuelleF g9est don marioActuel que l9on litter l9rnF i vous regrdez tout en s de l fontion jouerD vous verrez justement X
1

hvfliturfe @ mrioetuel D xvv D ern D 8 position A Y

yn ne litte don ps un lment du tleu marioD mis le pointeur marioActuelF einsiD en littnt marioActuelD on litte soit le wrio vers le sD soit elui vers le hutD etF ve pointeur marioActuel pointe vers une des ses du tleu marioF uoi d9utre prt c ne vrile position de type SDL_Rect dont on se servir pour d(nir l position des lments litter @on s9en servir pour tous les spritesD inutile de rer un SDL_Rect pour hque surfe 3AF positionJoueur est en revnhe un peu di'rente X elle indique quelle se sur l rte se trouve tuellement le joueurF in(nD l vrile event triter les vnementsF
Variables plus  classiques 

t9i ussi esoin de me rer des vriles un peu plus lssiques de type int @entierAF
1 2

int ontinuer a I D ojetifsestnts a H D i a H D j a H Y int rte xffvygveqi xffvygrei a { H }Y

QWS

CHAPITRE 24. TP : MARIO SOKOBAN


continuer et objectifsRestants sont des oolensF i et j sont des petites vriles qui vont me permettre de prourir le tleu carteF g9est l que les hoses deviennent vriment intressntesF t9i en e'et r un tleu deux dimensionsF te ne vous i ps prl de e type de tleux uprvnt D mis 9est justement le moment idl pour vous pprendre e que 9estF ge n9est ps ien ompliquD vous llez voirF egrdez l d(nition de plus prs X
4 1

int rte xf fvyg veqi xf fvyg rei a { H }Y

in fitD il s9git d9un tleu d9int @entiersA qui l prtiulrit d9voir deux pires de rohets [ ]F i vous vous souvenez ien de constantes.hD NB_BLOCS_LARGEUR et NB_BLOCS_HAUTEUR sont des onstntes qui vlent toutes les deux IPF ge tleu ser don l ompiltion r omme ei X
1

int rte IP IP a {H }Y

Mais qu'est-ce que a veut dire ?

veut dire que pour hque  se de carteD il y IP sousEsesF sl y ur don les vriles suivntes X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

rte H H rte H I rte H P rte H Q rte H R rte H S rte H T rte H U rte H V rte H W rte H IH rte H II rte I H rte I I rte I P rte I Q rte I R rte I S rte I T rte I U rte I V rte I W

4. Je n'ai pas eu l'occasion d'en parler auparavant ; de plus, ajouter ces explications dans le chapitre sur les tableaux l'aurait rendu un peu indigeste.

QWT

LE JEU
23 24 25 26 27 28 29 30 31 32 33 34

rte I IH FFF rte II P rte II Q rte II R rte II S rte II T rte II U rte II V rte II W rte II IH rte II II

g9est don un tleu de IP B IP a IRR ses 3 ghune des es ses reprsente une se de l rteF v (gF PRFQ vous donne une ide de l fon dont l rte est reprsenteF

Figure PRFQ ! houpge de l rte

einsiD l se en hut guhe est stoke dns carte[0][0]F v se en hut droite est stoke dns carte[0][11]F v se en s droite @l toute dernireA est stoke dns carte[11][11]F elon l vleur de l se @qui est un nomre entierAD on sit si l se ontient un murD une isseD un ojetifD etFAF g9est justement l que v servir notre numrtion de tout l9heure 3 QWU

CHAPITRE 24. TP : MARIO SOKOBAN


1

enum { shi D w D gesi D yftigsp D wesy D gesiyu }Y

i l se vut VIDE @HA on sit que ette prtie de l9rn devr rester lnheF i elle vut MUR @IAD on sit qu9il fudr litter une imge de murD etF

Initialisations
Chargement des surfaces

wintennt qu9on pss en revue toutes les vriles de l fontion jouerD on peut ommener fire quelques initilistions X
1 2 3 4 5 6 7 8 9

GG ghrgement des sprites @ d ors D personnge FFFA mur a swqvod @ 4 mur F jpg 4 A Y isse a swqvod @ 4 isse F jpg 4 A Y isseyu a swqvod @ 4 isseok F jpg 4 A Y ojetif a swqvod @ 4 ojetif F png 4 A Y mrio fe a swqvod @ 4 mrios F gif 4 A Y mrio qegri a swqvod @ 4 mrioguhe F gif 4 A Y mrio re a swqvod @ 4 mriohut F gif 4 A Y mrio hysi a swqvod @ 4 mriodroite F gif 4 A Y

ien de sorier lEdedns X on hrge tout gre IMG_LoadF 9il y une petite prE tiulritD 9est le hrgement de marioF yn hrge en e'et wrio dns hune des diretions dns le tleu mario en utilisnt les onstntes HAUTD BASD GAUCHED DROITEF ve fit d9utiliser les onstntes rend ii " omme vous le voyez " le ode plus lirF yn urit trs ien pu rire mario[0]D mis 9est qund mme plus lisile d9voir mario[HAUT] pr exemple 3
Orientation initiale du Mario (marioActuel)

yn initilise ensuite marioActuel pour qu9il it une diretion u dprt X


1

mrioetuel a mrio fe Y GG wrio ser dirig vers le s u d prt

t9i trouv plus logique de ommener l prtie ve un wrio qui regrde vers le s @9estEEdire vers nousAF i vous voulezD vous pouvez hnger ette ligne et mettre X
1

mrioetuel a mrio hysi Y

ous verrez que wrio ser lors orient vers l droite u dut du jeuF
Chargement de la carte

wintenntD il v flloir remplir notre tleu deux dimensions carteF our l9instntD e tleu ne ontient que des HF sl fut lire le niveu qui est stok dns le (hier niveaux.lvlF QWV

LE JEU
1 2 3

GG ghrgement du niveu if @3 hrgerxiveu @ rte A A exit @ ispesvi A Y GG yn rr te le jeu si on n ' ps pu hrger le niveu

t9i hoisi de fire grer le hrgement @et l9enregistrementA de niveux pr des fontions situes dns fichiers.cF siD on ppelle don l fontion chargerNiveauF yn l9tudier plus en dtils plus loin @elle n9est ps trs ompliqueD de toute mnireAF out e qui nous intresse ii 9est de svoir que notre niveu t hrg dns le tleu carteF
Si le niveau n'a pas pu tre charg (parce que niveaux.lvl n'existe pas), la fonction renverra  faux . Sinon, elle renverra  vrai .

yn teste don le rsultt du hrgement dns une onditionF i le rsultt est ngtif @d9o le point d9exlmtion qui sert exprimer l ngtionAD on rrte tout X on ppelle exitF inonD 9est que tout v ien et on peut ontinuerF xous possdons mintennt un tleu carte qui drit le ontenu de hque se X MURD VIDED CAISSEF F F
Recherche de la position de dpart de Mario

sl fut mintennt initiliser l vrile positionJoueurF gette vrileD de type SDL_RectD est un peu prtiulireF yn ne s9en sert ps pour stoker des oordonnes en pixelsF yn s9en sert pour stoker des oordonnes en  ses sur l rteF einsiD si on X F F F 9est que le joueur se trouve dns l toute dernire se en s droite de l rteF eportezEvous u shm de l rte de l (gF PRFQ pour ien voir quoi orrespond si vous vez @djA ouliF yn doit prourir notre tleu carte deux dimensions l9ide d9une doule ouleF yn utilise l petite vrile i pour prourir le tleu vertilement et l vrile j pour le prourir horizontlement X
1 2 3 4 5 6

positionJoueur.x == 11 positionJoueur.y == 11

7 8 9 10 11

GG eherhe de l position de wrio u d prt for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { if @ rte i j aa wesy A GG i wrio se trouve ette position { positiontoueur F x a i Y positiontoueur F y a j Y rte i j a shi Y }

QWW

CHAPITRE 24. TP : MARIO SOKOBAN


12 13

hque seD on teste si elle ontient MARIO @9estEEdire le dprt du joueur sur l rteAF i 9est le sD on stoke les oordonnes tuelles @situes dns i et jA dns l vrile positionJoueurF yn e'e ussi l se en l mettnt VIDE pour qu9elle soit onsidre omme une se vide pr l suiteF
Activation de la rptition des touches

hernire hoseD trs simple X on tive l rptition des touhes pour qu9on puisse se dpler sur l rte en lissnt une touhe enfoneF
1 2

GG etivtion de l r p tition des touhes hvinleueyepet @ IHH D IHH A Y

La boucle principale
(ou 3 xos initilistions sont fitesD on peut mintennt s9ouper de l oule prinE ipleF g9est une oule lssique qui fontionne sur le mme shm que elles qu9on vues jusqu9iiF ille est juste un peu plus grosse et un peu plus omplte @fut 9qui fut omme on dit 3AF egrdons de plus prs le switch qui teste l9vnement X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X ontinuer a H Y rek Y se hvu X mrioetuel a mrio re Y deplertoueur @ rte D 8 positiontoueur D re A Y rek Y se hvuhyx X mrioetuel a mrio fe Y deplertoueur @ rte D 8 positiontoueur D fe A Y rek Y se hvusqr X mrioetuel a mrio hysi Y deplertoueur @ rte D 8 positiontoueur D hysi A Y

RHH

LE JEU
23 24 25 26 27 28 29 30

} rek Y

rek Y se hvuvip X mrioetuel a mrio qegri Y deplertoueur @ rte D 8 positiontoueur D qegri A Y rek Y

i on ppuie sur l touhe EchapD le jeu s9rrter et on retourner u menu priniplF gomme vous le voyezD il n9y ps QT vnements di'rents grer X on teste juste si le joueur ppuie sur les touhes  hut D  s D  guhe ou  droite de son lvierF elon l touhe enfoneD on hnge l diretion de wrioF g9est l qu9intervient marioActuel 3 i on ppuie vers le hutD lors X
1

mrioetuel a mrio re Y

i on ppuie vers le sD lors X


1

mrioetuel a mrio fe Y

marioActuel pointe don sur l surfe reprsentnt wrio dns l position tuelleF g9est insi qu9en littnt marioActuel tout l9heureD on ser ertin de litter wrio dns l onne diretionF wintenntD hose trs importnte X on ppelle une fontion deplacerJoueurF gette fontion v dpler le joueur sur l rte s9il le droit de le fireF ! r exempleD on ne peut ps fire monter wrio d9un rn vers le hut s9il se trouve dj tout en hut de l rteF ! yn ne peut ps non plus le fire monter s9il y un mur uEdessus de luiF ! yn ne peut ps le fire monter s9il y deux isses uEdessus de luiF ! r ontreD on peut le fire monter s9il y juste une isse uEdessus de luiF ! wis ttentionD on ne peut ps le fire monter s9il y une isse uEdessus de lui et que l isse se trouve u ord de l rte 3

Oh la la, c'est quoi ce bazar ?

g9est e qu9on ppelle la gestion des collisionsF i peut vous rssurerD ii 9est une gestion des ollisions extrmement simpleD vu que le joueur se dple pr  ses et dns seulement qutre diretions possiles l foisF hns un jeu Ph o on peut se dpler dns toutes les diretions pixel pr pixelD l gestion des ollisions est ien plus omplexeF wis il y pire X l QhF v gestion des ollisions dns un jeu Qh est vriment l te noire des progrmmeursF reureusementD il existe des iliothques de gestion des ollisions en Qh qui font le gros du trvil notre pleF RHI

CHAPITRE 24. TP : MARIO SOKOBAN

evenons l fontion deplacerJoueur et onentronsEnousF yn lui envoie trois prE mtres X ! l rte X pour qu9elle puisse l lire mis ussi l modi(erD si on dple une isse pr exemple Y ! l position du joueur X l ussiD l fontion devr lire et ventuellement modi(er l position du joueur Y ! l diretion dns lquelle on demnde ller X on utilise l enore les onstntes HAUTD BASD GAUCHED DROITE pour plus de lisiilitF xous tudierons l fontion deplacerJoueur plus loinF t9uris trs ien pu mettre tous les tests dns le switchD mis eluiEi serit devenu norme et illisileF g9est l que douper son progrmme en fontions prend tout son intrtF
Blittons, blittons, la queue du cochon

xotre switch est termin X e stde du progrmmeD l rte et le joueur ont proE lement hngF uoi qu9il en soitD 9est l9heure du lit 3 yn ommene pr e'er l9rn en lui donnnt une ouleur de fond lnhe X
1 2

GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y

it mintenntD on prourt tout notre tleu deux dimensions carte pour svoir quel lment litter quel endroit sur l9rnF yn e'etue une doule oule omme on l9 vu plus tt pour prourir toutes les IRR ses du tleu X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

GG lement des ojets l ' rn ojetifsestnts a H Y for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { position F x a i B esvvifvyg Y position F y a j B esvvifvyg Y swith @ rte i j A { se w X hvfliturfe @ mur D xvv D ern D 8 position A Y rek Y se gesi X hvfliturfe @ isse D xvv D ern D 8 position A Y rek Y se gesiyu X hvfliturfe @ isseyu D xvv D ern D 8 position A Y

18 19 20

RHP

LE JEU
21 22 23

24 25 26 27 28

rek Y se yftigsp X hvfliturfe @ ojetif D xvv D ern D 8 position A Y ojetifsestnts a I Y rek Y

our hune des sesD on prpre l vrile position @de type SDL_RectA pour pler l9lment tuel l onne position sur l9rnF ve lul est trs simple X
1 2

position F x a i B esvvifvyg Y position F y a j B esvvifvyg Y

sl su0t de multiplier i pr TAILLE_BLOC pour voir position.xF einsiD si on se trouve l troisime seD 9est que i vut P @n9ouliez ps que i ommene H 3AF yn fit don le lul P B QR a TVF yn litter don l9imge TV pixels vers l droite sur ecranF yn fit l mme hose pour les ordonnes yF insuiteD on fit un switch sur l se de l rte qu9on est en trin d9nlyserF v enoreD voir d(ni des onstntes est vriment prtique et rend les hoses plus lisilesF yn teste don si l se vut MURD dns e s on litte un murF he mme pour les isses et les ojetifsF
Test de victoire

ous remrquerez qu9vnt l doule ouleD on initilise le oolen objectifsRestants HF ge oolen ser mis I ds qu9on ur dtet un ojetif sur l rteF 9il ne reste plus d9ojetifsD 9est que toutes les isses sont sur des ojetifs @il n9y plus que des CAISSE_OKAF sl su0t de tester si le oolen vut  fux D 9estEEdire s9il ne reste plus d9ojetifsF hns e sD on met l vrile continuer H pour rrter l prtie X
1 2 3

GG i on n ' trouv uun ojetif sur l rte D ' est qu ' on ggn if @3 ojetifsestnts A ontinuer a H Y

Le joueur

sl nous reste litter le joueur X


1 2 3 4

GG yn ple le joueur l onne position position F x a positiontoueur F x B esvvifvyg Y position F y a positiontoueur F y B esvvifvyg Y hvfliturfe @ mrioetuel D xvv D ern D 8 position A Y

RHQ

CHAPITRE 24. TP : MARIO SOKOBAN

yn lule s position @en pixels ette foisA en fisnt une simple multiplition entre positionJoueur et TAILLE_BLOCF yn litte ensuite le joueur l position indiqueF
Flip !

yn tout fitD il ne nous reste plus qu9 0her l9rn u joueur X


1

hvplip @ ern A Y

Fin de la fonction : dchargements


eprs l oule prinipleD on doit fire quelques FreeSurface pour lirer l mmoire des sprites qu9on hrgsF yn dstive ussi l rptition des touhes en envoynt les vleurs H l fontion SDL_EnableKeyRepeat X
1 2 3 4 5 6 7 8 9 10

GG h stivtion de l r p tition des touhes @ remise H A hvinleueyepet @H D H A Y GG vi rtion des surfes hrg es hvpreeurfe @ mur A Y hvpreeurfe @ isse A Y hvpreeurfe @ isseyu A Y hvpreeurfe @ ojetif A Y for @ i a H Y i ` R Y i CCA hvpreeurfe @ mrio i A Y

La fonction deplacerJoueur
v fontion deplacerJoueur se trouve elle ussi dns jeu.cF g9est une fontionF F F ssez dlite rireF g9est peutEtre l priniple di0ult que l9on renontre lorsqu9on ode un jeu de okonF Rappel X l fontion deplacerJoueur vri(e si on le droit de dpler le joueur dns l diretion demndeF ille met jour l position du joueur @positionJoueurA et ussi l rte si une isse t dpleF oii le prototype de l fontion X
1

void deplertoueur @ int rte xffvygrei D hvet B pos D int diretion A Y

ge prototype est un peu prtiulierF ous voyez que j9envoie le tleu carte et que je prise l tille de l deuxime dimension @NB_BLOCS_HAUTEURAF ourquoi el c v rponse est un peu omplique pour que je l dveloppe u milieu de e oursF our fire simpleD le g ne devine ps qu9il s9git d9un tleu deux dimensions et il fut u moins donner l tille de l seonde dimension pour que fontionneF honD lorsque vous envoyez un tleu deux dimensions une fontionD vous devez indiquer l tille de l seonde dimension dns le prototypeF g9est omme D 9est oligtoireF RHR

LE JEU

eutre hose X vous noterez que positionJoueur s9ppelle en fit pos dns ette fonE tionF t9i hoisi de rourir le nom pre que 9est plus ourt rireD et vu qu9on v voir esoin de l9rire de nomreuses foisD utnt ne ps se ftiguerF gommenons pr tester l diretion dns lquelle on veut ller vi un grnd switch X
1 2 3 4

swith @ diretion A { se re X GB et F BG

Et c'est parti pour des tests de folie !

sl fut mintennt rire tous les tests de tous les s possilesD en essynt de ne ps en oulier un seulF oii omment je prode X je teste toutes les possiilits de ollision s pr sD et ds que je dtete une ollision @qui fit que le joueur ne peut ps ougerAD je fis un break; pour sortir du switchD et don empher le dplementF oii pr exemple toutes les possiilits de ollision qui existent pour un joueur qui veut se dpler vers le hut X ! le joueur est dj tout en hut de l rte Y ! il y un mur uEdessus du joueur Y ! il y deux isses uEdessus du joueur @et il ne peut ps dpler deux isses l foisD rppelezEvousA Y ! il y une isse puis le ord de l rteF i tous es tests sont okD lors je me permets de dpler le joueurF te vis vous montrer les tests pour un dplement vers le hutF our les utres sensD il su0r d9dpter un petit peu le odeF
1 2

if @ pos E b y E I ` H A GG i le joueur d psse l ' rn D on rr te rek Y

yn ommene pr vri(er si le joueur est dj tout en hut de l9rnF in e'etD si on essyit d9ppeler carte[5][-1] pr exempleD e serit le plntge du progrmme ssur 3 yn ommene don pr vri(er qu9on ne v ps  dorder de l9rnF insuite X
1 2

if @ rte pos E b x pos E b y E I aa w A GG ' il y un mur D on rr te rek Y

v enore 9est simpleF yn vri(e s9il n9y ps un mur uEdessus du joueurF i tel est le sD on rrte @breakAF insuite @ttention les yeuxA X
1

GG i on veut pousser une isse D il fut v rifier qu ' il n ' y ps de mur derri re @ ou une utre isse D ou l limite du monde A

RHS

CHAPITRE 24. TP : MARIO SOKOBAN


2

3 4

if @@ rte pos E b x pos E b y E I aa gesi || rte pos E b x pos E b y E I aa gesiyu A 88 @ pos E b y E P ` H || rte pos E b x pos E b y E P aa w || rte pos E b x pos E b y E P aa gesi || rte pos E b x pos E b y E P aa gesiyu A A rek Y

ge gros test peut se trduire omme ei X  s uEdessus du joueur il y une caisse @ou une caisse_okD 9estEEdire une isse ien pleA i s uEdessus de ette isse il y soit le vide @on dorde du niveu r on est tout en hutAD soit une utre isseD soit une isseok X evy on ne peut ps se dpler X breakF i on rrive psser e testD on le droit de dpler le joueurF yuf 3 yn ppelle d9ord une fontion qui v dpler une isse si nessire X
1 2 3

GG i on rrive l D ' est qu ' on peut d pler le joueur 3 GG yn v rifie d ' ord s ' il y une isse d pler deplergisse @8 rte pos E b x pos E b y E I D 8 rte pos E b x pos Eb y E P A Y

Le dplacement de caisse : deplacerCaisse

t9i hoisi de grer le dplement de isse dns une utre fontion r 9est le mme ode pour les qutre diretionsF yn doit juste s9tre ssur vnt qu9on le droit de se dpler @e qu9on vient de fireAF yn envoie l fontion deux prmtres X le ontenu de l se dns lquelle on veut ller et le ontenu de l se d9prsF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

void deplergisse @ int B premieregse D int B seondegse A { if @B premieregse aa gesi || B premieregse aa gesiyu A { if @B seondegse aa yftigsp A B seondegse a gesiyu Y else B seondegse a gesi Y if @B premieregse aa gesiyu A B premieregse a yftigsp Y else B premieregse a shi Y

gette fontion met jour l rte r elle prend en prmtres des pointeurs sur les ses onernesF te vous lisse l lireD 9est ssez simple omprendreF sl ne fut ps oulier que si on dple une CAISSE_OKD il fut rempler l se o elle se trouvit pr un OBJECTIFF inonD si 9est une simple CAISSED lors on remple l se en question pr du VIDEF RHT

LE JEU

Dplacer le joueur

yn retourne dns l fontion deplacerJoueurF gette fois 9est l onneD on peut dE pler le joueurF gomment fitEon c g9est trs trs simple X
1

pos E by E EY GG yn peut enfin fire monter le joueur @ oufff 3A

sl su0t de diminuer l9ordonne y @r le joueur veut monterAF


Rsum

in guise de rsumD voii tous les tests pour le s re X


1 2 3 4

5 6

7 8

10

11

12 13 14

swith @ diretion A { se re X if @ pos E b y E I ` H A GG i le joueur d psse l ' rn D on rr te rek Y if @ rte pos E b x pos E b y E I aa w A GG ' il y un mur D on rr te rek Y GG i on veut pousser une isse D il fut v rifier qu ' il n ' y ps de mur derri re @ ou une utre isse D ou l limite du monde A if @@ rte pos E b x pos E b y E I aa gesi || rte pos E b x pos E b y E I aa gesiyu A 88 @ pos E b y E P ` H || rte pos E b x pos E b y E P aa w || rte pos E bx pos E b y E P aa gesi || rte pos E b x pos E b y E P aa gesiyu A A rek Y GG i on rrive l D ' est qu ' on peut d pler le joueur 3 GG yn v rifie d ' ord s ' il y une isse d pler deplergisse @8 rte pos E b x pos E b y E I D 8 rte pos E b x pos E b y E P A Y pos E by E EY GG yn peut enfin fire monter le joueur @ oufff 3A rek Y

15 16

17 18

19

te vous lisse le soin de fire du opierEoller pour les utres s @ttentionD il fudr dpter le odeD e n9est ps extement preil hque fois 3AF it voilD on vient de (nir de oder le jeu 3 in(n presque X il nous reste voir l fontion de hrgement @et de suvegrdeA de niveuxF yn verr ensuite omment RHU

CHAPITRE 24. TP : MARIO SOKOBAN

rer l9diteur F
5

Chargement et enregistrement de niveaux


ve (hier fichiers.c ontient deux fontions X ! chargerNiveau Y ! sauvegarderNiveauF gommenons pr le hrgement de niveuF
chargerNiveau

gette fontion prend un prmtre X l rteF v enoreD il fut priser l tille de l seonde dimension r il s9git d9un tleu deux dimensionsF v fontion renvoie un oolen X  vri si le hrgement russiD  fux si 9est un heF ve prototype est don X
1

int hrgerxiveu @ int niveu xffvygrei A Y

oyons le dut de l fontion X


1 2

3 4 5 6 7

psvi B fihier a xvv Y hr lignepihier xffvygveqi B xffvygrei C I a { H }Y int i a H D j a H Y fihier a fopen @ 4 niveux F lvl 4 D 4 r 4 A Y if @ fihier aa xvv A return H Y

yn re un tleu de char pour stoker temporirement le rsultt du hrgement du niveuF yn ouvre le (hier en leture seule @"r"AF yn rrte l fontion en renvoynt H @ fux A si l9ouverture houF glssiqueF ve (hier niveaux.lvl ontient une ligne qui est une suite de nomresF ghque nomre reprsente une se du niveuF r exemple X
1

IIIIIHHIIIIIIIIIIRHHHHHIIIIIHHHIIHHIHQQIHIHIIHIIHHHHHPHHIPIIIH FFF

yn v don lire ette ligne ve un fgets X


1

fgets @ lignepihier D xffvygveqi B xffvygrei C I D fihier A Y

yn v nlyser le ontenu de ligneFichierF yn sit que les IP premiers rtres reprsentent l premire ligneD les IP suivnts l seonde ligneD etF
5. Rassurez-vous, a ira bien plus vite !

RHV

CHARGEMENT ET ENREGISTREMENT DE NIVEAUX


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { swith @ lignepihier @ i B xffvygveqi A C j A { se ' H ' X niveu j i a H Y rek Y se ' I ' X niveu j i a I Y rek Y se ' P ' X niveu j i a P Y rek Y se ' Q ' X niveu j i a Q Y rek Y se ' R ' X niveu j i a R Y rek Y } } }

r un simple petit lulD on prend le rtre qui nous intresse dns ligneFichier et on nlyse s vleurF
Ce sont des  lettres  qui sont stockes dans le chier. Je veux dire par l que '0' est stock comme le caractre ASCII '0', et sa valeur n'est pas 0 ! Pour analyser le chier, il faut tester avec case '0' et non avec case 0 ! Attention ne pas mlanger les chires et les lettres !

ve switch fit l onversion '0' ab HD '1' ab ID etF sl ple tout dns le tleu carte F ne fois que 9est fitD on peut fermer le (hier et renvoyer I pour dire que tout s9est ien pss X
6 1 2

flose @ fihier A Y return I Y

pinlementD le hrgement du niveu dns le (hier n9tit ps ien ompliquF ve seul pige viter 9tit de ien penser onvertir l vleur egss '0' en un nomre H @et de mme pour ID PD QD RF F FAF
6. La carte s'appelle niveau dans cette fonction d'ailleurs, mais a ne change rien.

RHW

CHAPITRE 24. TP : MARIO SOKOBAN

sauvegarderNiveau

gette fontion est l enore simple X


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

int suvegrderxiveu @ int niveu xffvygrei A { psvi B fihier a xvv Y int i a H D j a H Y fihier a fopen @ 4 niveux F lvl 4 D 4 w 4 A Y if @ fihier aa xvv A return H Y for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { fprintf @ fihier D 4 7 d 4 D niveu j i A Y } } flose @ fihier A Y return I Y

t9utilise fprintf pour  trduire les nomres du tleu niveau en rtres egssF g9tit l enore l seule di0ult @mis l9enversA X il ne fut ps rire H mis '0'F

L'diteur de niveaux
v9diteur de niveux est plus file rer qu9on ne pourrit l9imginerF in plus 9est une fontionnlit qui v onsidrlement llonger l dure de vie de notre jeuD lors pourquoi s9en priver c oil omment l9diteur v fontionnerF ! yn utilise l souris pour pler les los qu9on veut sur l9rnF ! n li droit e'e le lo sur lequel se trouve l sourisF ! n li guhe ple un ojetF get ojet est mmoris X pr dfutD on pose des murs ve le li guheF yn peut hnger l9ojet en ours en ppuynt sur les touhes du pv numrique X ! I X murD ! P X isseD ! Q X ojetifD ! R X dprt du joueur wrioF ! in ppuynt sur D le niveu ser suvegrdF ! yn peut revenir u menu prinipl en ppuynt sur EchapF RIH

L'DITEUR DE NIVEAUX

Figure PRFR ! dition d9un niveu ve l9diteur

Initialisations
qlolementD l fontion ressemle elle du jeuF t9i d9illeurs ommen l rer en fisnt un simple opierEoller de l fontion de jeuD puis en enlevnt e qui ne servit plus et en joutnt de nouvelles fontionnlitsF ve dut y ressemle dj ps ml X
1 2 3

4 5 6 7

void editeur @ hvurfe B ern A { hvurfe B mur a xvv D B isse a xvv D B ojetif a xvv D B mrio a xvv Y hvet position Y hvivent event Y int ontinuer a I D liquheingours a H D lihroitingours a HY int ojetetuel a w D i a H D j a H Y int rte xffvygveqi xffvygrei a { H }Y GG ghrgement des ojets et du niveu mur a swqvod @ 4 mur F jpg 4A Y isse a swqvod @4 isse F jpg 4 A Y ojetif a swqvod @ 4 ojetif F png 4 A Y mrio a swqvod @ 4 mrios F gif 4 A Y if @3 hrgerxiveu @ rte A A exit @ ispesvi A Y

8 9 10 11 12 13 14 15 16 17 18

RII

CHAPITRE 24. TP : MARIO SOKOBAN

vD vous vez les d(nitions de vriles et les initilistionsF ous remrquerez que je ne hrge qu9un wrio @elui dirig vers le sAF in e'etD on ne v ps diriger wrio u lvier lD on juste esoin d9un sprite reprsentnt l position de dprt de wrioF v vrile objetActuel retient l9ojet tuellement sletionn pr l9utilisteurF r dfutD 9est un MURF ve li guhe rer don un mur u dprtD mis el pourr tre hng pr l9utilisteur en ppuynt sur ID PD Q ou RF ves oolens clicGaucheEnCours et clicDroitEnCoursD omme leurs noms l9indiquentD permettent de mmoriser si un li est en ours @si le outon de l souris est enfonAF gel nous permettr de poser des ojets l9rn en lissnt le outon de l souris enfon F te vous expliqueri le prinipe un peu plus loinF in(nD l rte tuellement suvegrde dns niveaux.lvl est hrgeF ge ser notre point de dprtF
7

La gestion des vnements


gette foisD on v devoir grer un nomre importnt d9vnements di'rentsF ellonsEyD un pr unF
SDL_QUIT
1 2 3

se hvs X ontinuer a H Y rek Y


8

i on lique sur l roixD l oule s9rrte et on revient u menu prinipl F


SDL_MOUSEBUTTONDOWN
1 2 3 4

7 8

se hvwyifyxhyx X if @ event F utton F utton aa hvfyxvip A { GG yn met l ' ojet tuellement hoisi @ mur D isse FFFA l ' endroit du li rte event F utton F x G esvvifvyg event F utton F y G esvvifvyg a ojetetuel Y liquheingours a I Y GG yn retient qu ' un outon est enfon } else if @ event F utton F utton aa hvfyxsqr A GG gli droit pour effer {

7. Sinon on est oblig de cliquer frntiquement avec la souris pour placer plusieurs fois le mme objet dirents endroits, ce qui est un peu fatigant. 8. Notez que ce n'est pas ce qu'il y a de plus ergonomique pour l'utilisateur : celui-ci s'attend plutt ce que le programme s'arrte quand on clique sur la croix, or ce n'est pas ce qu'il se passe ici car on ne fait que revenir au menu. Il faudrait peut-tre trouver un moyen d'arrter le programme en renvoyant une valeur spciale la fonction main par exemple. Je vous laisse rchir une solution.

RIP

L'DITEUR DE NIVEAUX
10

11 12 13

} rek Y

rte event F utton F x G esvvifvyg event F utton F y G esvvifvyg a shi Y lihroitingours a I Y

yn ommene pr tester le outon qui est enfon @on vri(e si 9est le li guhe ou le li droitA X ! si 9est un li guheD on ple l9objetActuel sur l rte l position de l souris Y ! si 9est un li droitD on e'e e qu9il y et endroit sur l rte @on met VIDE omme je vous vis ditAF
Comment sait-on sur quelle  case  de la carte on se trouve ?

yn le retrouve gre un petit lulF sl su0t de prendre les oordonnes de l souE ris @event.button.x pr exempleA et de diviser ette vleur pr l tille d9un lo @TAILLE_BLOCAF g9est une division de nomres entiersF gomme en g une division de nomres entiers donne un nomre entierD on est sr d9voir une vleur qui orresponde une des ses de l rteF r exempleD si je suis u USe pixel sur l rte @sur l9xe des sisses xAD je divise e nomre pr TAILLE_BLOC qui vut ii QRF
75 / 34 = 2

x9ouliez ps que le reste est ignorF yn ne grde que l prtie entire de l division en g r il s9git d9une divison de nomres entiersF yn sit don qu9on se trouve sur l se no P @9estEEdire l troisime seD r un tleu ommene HD souvenezEvousAF eutre exemple X si je suis u IHe pixel @9estEEdire trs prohe du ordAD v donner le lul suivnt X
10 / 34 = 0

yn est don l se no H 3 g9est omme qu9un simple petit lul nous permet de svoir sur quelle se de l rte on se situeF
1

rte event F utton F x G esvvi fvyg event F utton Fy G esvvi fvyg a ojetetuel Y

eutre hose trs importnte X on met un oolen clicGaucheEnCours @ou clicDroit selon le sA IF gel nous permettr de svoir lors d9un vnement MOUSEMOTION si un outon de l souris est enfon pendnt le dplementF
SDL_MOUSEBUTTONUP
1

se hvwyifyx X GG yn d stive le ool en qui disit qu ' un outon tit enfon

RIQ

CHAPITRE 24. TP : MARIO SOKOBAN


2 3 4 5 6

if @ event F utton F utton aa hvfyxvip A liquheingours a H Y else if @ event F utton F utton aa hvfyxsqr A lihroitingours a H Y rek Y

v9vnement MOUSEBUTTONUP sert simplement remettre le oolen HF yn sit que le li est termin et don qu9il n9y plus de  li en ours F
SDL_MOUSEMOTION
se hvwyiwysyx X if @ liquheingours A GG i on d ple l souris et que le outon guhe de l souris est enfon { rte event F motion F x G esvvifvyg event F motion F y G esvvifvyg a ojetetuel Y } else if @ lihroitingours A GG reil pour le outon droit de l souris { rte event F motion F x G esvvifvyg event F motion F y G esvvifvyg a shi Y } rek Y

1 2

3 4

5 6

7 8

9 10

g9est l que nos oolens prennent toute leur importneF yn vri(e qund on ouge l souris si un li est en oursF i tel est le sD on ple sur l rte un ojet @ou du vide si 9est un li droitAF gel nous permet don de pler d90le plusieurs ojets du mme type sns voir liquer plusieurs foisF yn juste dpler l souris en mintennt son outon enfon 3 in lir X hque fois qu9on ouge l souris @ne seritEe que d9un pixelAD on vri(e si un des oolens est tivF i tel est le sD lors on pose un ojet sur l rteF inonD on ne fit rienF Rsum X je rsume l tehniqueD r vous vous en servirez ertinement dns d9utres progrmmesF gette tehnique permet de svoir si un outon de l souris est enfon lorsqu9on l dpleF yn peut s9en servir pour oder un glisserEdplerF IF vors d9un MOUSEBUTTONDOWN X on met un oolen clicEnCours IF PF vors d9un MOUSEMOTION X on teste si le oolen clicEnCours vut  vri F 9il vut  vri D on sit qu9on est en trin de fire une sorte de glisserEdpler ve l sourisF QF vors d9un MOUSEBUTTONUP X on remet le oolen clicEnCours HD r le li est termin @relhement du outon de l sourisAF RIR

L'DITEUR DE NIVEAUX
SDL_KEYDOWN

ves touhes du lvier permettent de hrger et de suvegrder le niveu insi que de hnger l9ojet tuellement sletionn pour le li guhe de l sourisF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X ontinuer a H Y rek Y se hvus X suvegrderxiveu @ rte A Y rek Y se hvu X hrgerxiveu @ rte A Y rek Y se hvuuI X ojetetuel a w Y rek Y se hvuuP X ojetetuel a gesi Y rek Y se hvuuQ X ojetetuel a yftigsp Y rek Y se hvuuR X ojetetuel a wesy Y rek Y } rek Y

ge ode est trs simpleF yn hnge l9ojet tuel si on ppuie sur une des touhes numriquesD on enregistre le niveu si on ppuie sur D ou on hrge le dernier niveu enregistr si on ppuie sur gF

Blit time !
oil X on pss en revue tous les vnementsF wintenntD on n9 plus qu9 litter hun des lments de l rte l9ide d9une doule ouleF g9est peu de hoses prs le mme ode que elui de l fontion de jeuF te vous le redonneD mis ps l peine de vous le rexpliquer iiF
1 2

GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GG lement des ojets l ' rn for @ i a H Y i ` xffvygveqi Y i CCA {

3 4 5 6

RIS

CHAPITRE 24. TP : MARIO SOKOBAN


7 8 9 10 11 12 13 14 15 16 17 18

for @ j a H Y j ` xffvygrei Y j CCA { position F x a i B esvvifvyg Y position F y a j B esvvifvyg Y swith @ rte i j A { se w X hvfliturfe @ mur D xvv D ern D 8 position A Y rek Y se gesi X hvfliturfe @ isse D xvv D ern D 8 position A Y rek Y se yftigsp X hvfliturfe @ ojetif D xvv D ern D 8 position A Y rek Y se wesy X hvfliturfe @ mrio D xvv D ern D 8 position A Y rek Y }

19 20 21

22 23 24 25 26 27 28 29 30 31

GG wise jour de l ' rn hvplip @ ern A Y

sl ne fut ps oulier prs l oule priniple de fire les s9imposent X


1 2 3 4

SDL_FreeSurface

qui

hvpreeurfe @ mur A Y hvpreeurfe @ isse A Y hvpreeurfe @ ojetif A Y hvpreeurfe @ mrio A Y

eve D le mnge est fitF XEA

Rsum et amliorations
fienD on fit le tourF v9heure est u rsumF

Alors rsumons !
it quel meilleur rsum pourritEon imginer que le ode soure omplet du progrmme ve les ommentires c our viter de vous proposer des dizines de pges de ode qui rptent tout e qu9on RIT

RSUM ET AMLIORATIONS

vient de voirD je vous propose plutt de tlhrger le ode soure omplet du proE grmme insi que l9exutle F  lhrger le progrmme gode we X UVWHQW  ge (hier Fzip ontient X ! l9exutle pour indows @si vous tes sous un utre yD il su0r de reompilerA Y ! les hvv de l hv et de SDL_Image Y ! toutes les imges dont esoin le progrmme @je vous les i fit tlhrger plus tt dns le pk  sprites A Y ! les soures ompltes du progrmme Y ! le (hier .cbp de projet gode: :floksF i vous voulez ouvrir le projet sous un utre shiD rez un nouveu projet de type hv @on(gurezEle orretement pour l hvA et joutezEy mnuellement tous les (hiers .c et .hF ge n9est ps ien ompliquD vous verrezF ous noterez que le projet ontientD en plus des .c et des .hD un (hier ressources.rcF g9est un (hier qui peut tre jout u projet @uniquement sous indowsA et qui permet d9intgrer des (hiers dns l9exutleF siD je me sers du (hier de ressoures pour intgrer une ine dns l9exutleF gel ur pour e'et de donner une ine l9exutleD visile dns l9explorteur indows @(gF PRFSAF
9

Figure PRFS ! sntgrtion d9une ine l9exutle

evouez que 9est qund mme plus symp que d9voir l9ine pr dfut de indows pour les exutles 3 ous trouverez plus d9informtions sur ette tehnique sur le ite du roF
9. Compil pour Windows.

RIU

CHAPITRE 24. TP : MARIO SOKOBAN




grer une ine pour son proE grmme gode we X VTPPQU  

Amliorez !
ge progrmme n9est ps prfitD loin de l 3 ous voulez des ides pour l9mliorer c ! sl mnque un mode d'emploiF e0hez un rn d9explitions juste vnt le lnE ement d9une prtie et vnt le lnement de l9diteurF sndiquez en prtiulier les touhes utiliserF ! hns l9diteur de niveuxD on ne sit ps quel est l9ojet tuellement sletionnF ge qui serit ienD 9est que l'objet actuellement slectionn suive le urseur de l sourisF gomme D l9utilisteur verrit e qu9il s9pprte mettre sur l rteF g9est file fire X on dj fit un ozor qui suit le urseur de l souris dns le hpitre prdent 3 ! hns l9diteur de niveuxD on pprierit de pouvoir hoisir une CAISSE_OK @une isse ien ple sur un ojetif ds le dprtAF in e'etD je me suis rendu ompte pr l suite qu9il y de nomreux niveux qui ommenent ve des isses ien ples ds le dprt @ ne veut ps dire que le niveu est plus fileD loin de lAF ! hns l9diteur toujoursD il fudrit empcher que l'on puisse placer plus d'un dpart de joueur sur une mme carte 3 ! vorsqu9on russit un niveuD on retourne immditement u menuF g9est un peu rutF ue diriezEvous d9acher un message  Bravo  u entre de l9rn qund on ggne c ! in(nD il serit ien que le progrmme puisse grer plus d9un niveu l foisF sl fudrit que l9on puisse rer une vritable petite aventure d'une vingtaine de niveaux pr exempleF g9est un petit peu plus ompliqu oder mis fisleF sl fudr dpter le jeu et l9diteur de niveux en onsquene F gomme promisD pour vous prouver que 9est fisleF F F je l9i fit 3 te ne vous donne ps le ode soureD en revnhe @je rois que je vous en i dj ssez donn jusqu9ii 3AD mis je vous donne le progrmme omplet ompil pour indows et vinuxF ve progrmme omporte une venture de PH niveux @de trs trs file F F F super di0ileAF our rliser ertins de es niveuxD je me suis s sur le site d9un pssionn de okon @sokoban.online.frAF our tlhrger le wrio okon mlior pour indows X   wrio okon pour inE dows gode we X RHITQT  
10 11

10. Je vous suggre de mettre un niveau par ligne dans niveaux.lvl. 11. Le programme d'installation a t cr l'aide d'Inno Setup. Pour plus d'informations, voir l'annexe du Site du Zro (code web : 851504)

RIV

RSUM ET AMLIORATIONS

it pour tlhrger l version vinux X  wrio okon pour vinux gode we X TQHUIS 

RIW

CHAPITRE 24. TP : MARIO SOKOBAN

RPH

Chapitre

25
Dicult :

Matrisez le temps !

e chapitre est d'une importance capitale : il va vous apprendre contrler le temps en SDL. Il est rare que l'on cre un programme SDL sans faire appel aux fonctions de gestion du temps, bien que le TP Mario Sokoban constitue un contre-exemple. Il n'en reste pas moins que pour la majorit des jeux, la gestion du temps est fondamentale. Par exemple, comment vous y prendriez-vous pour raliser un Tetris ou un Snake (jeu du serpent) ? Il faut bien que les blocs bougent toutes les X secondes, ce que vous ne savez pas faire. Du moins, pas avant d'avoir lu ce chapitre. ;-)

RPI

CHAPITRE 25. MATRISEZ LE TEMPS !

Le Delay et les ticks


hns un premier tempsD nous llons pprendre utiliser deux fontions trs simples X ! SDL_Delay X permet de mettre en puse le progrmme un ertin nomre de milliseE ondes Y ! SDL_GetTicks X retourne le nomre de milliseondes oules depuis le lnement du progrmmeF ges deux fontions sont trs simples omme nous llons le voirD mis ien les utiliser n9est ps si vident que en l9irF F F
SDL_Delay

gette fontion e'etue une puse sur le progrmme durnt un ertin tempsF endnt que le progrmme est en puseD on dit qu9il dort @ sleep en nglisA X il n9utilise ps le proesseurF SDL_Delay peut don tre utilise pour rduire l9utilistion du proesseur F qre SDL_DelayD vous pourrez rendre votre progrmme moins gourmnd en ressoures proE esseurF sl fer don moins  rmer votre g si SDL_Delay est utilise intelligemmentF
1

Tout dpend du programme que vous crez : parfois, on aimerait bien que notre programme utilise le moins de CPU possible pour que l'utilisateur puisse faire autre chose en mme temps, comme c'est le cas pour un lecteur MP3 qui tourne en fond pendant que vous naviguez sur Internet. Mais. . . d'autres fois, on se moque compltement que notre programme utilise tout le temps 100 % de CPU. C'est le cas de la quasi-totalit des jeux.

evenons l fontion qui nous intresseF on prototype est d9une simpliit dsolnte X
1

void hvhely @ intQP ms A Y

in lirD vous envoyez l fontion le nomre de milliseondes pendnt lesquelles votre progrmme doit  dormir F g9est une simple mise en puseF r exempleD si vous voulez que votre progrmme se mette en puse I seondeD vous devrez rire X
1

hvhely @ IHHH A Y

x9ouliez ps que e sont des milliseondes X ! IHHH milliseondes a I seonde Y ! SHH milliseondes a IGP seonde Y ! PSH milliseondes a IGR seondeF
cessing Unit,

1. Notez que j'abrgerai CPU , dsormais. C'est une abrviation courante qui signie Central soit  Unit centrale de calcul .

Pro-

RPP

LE DELAY ET LES TICKS

Vous ne pouvez rien faire dans votre programme pendant qu'il est en pause ! Un programme qui  dort  ne peut rien faire puisqu'il n'est pas actif pour l'ordinateur.
Le problme de la granularit du temps

xonD rssurezEvousD je ne vis ps vous fire un trit de physique quntique u eu milieu d9un hpitre hv 3 outefoisD j9estime qu9il y quelque hose que vous devez svoir X SDL_Delay n9est ps une fontion  prfite F it e n9est ps de s futeD 9est l fute de votre y @indowsD vinuxD w y F F FAF ourquoi l9y intervientEil lEdedns c out simplement pre que 9est lui qui ontrle les progrmmes qui tournent 3 otre progrmme v don dire l9y X  te dorsD rveilleE moi dns I seonde F wis l9y ne v ps forment le rveiller extement u out d9une seondeF in e'etD il ur peutEtre un peu de retrd @un retrd de IH ms en moyenne environD dpend des gAF ourquoi c re que votre g ne peut trviller que sur un progrmme l foisF ve rle de l9y est de dire u g e sur quoi il doit trviller X  elorsD pendnt RH ms tu vs trviller sur firefox.exeD puis pendnt IIH ms sur explorer.exe Y ensuiteD pendnt VH ms tu vs trviller sur programme_sdl.exeD puis retrviller sur firefox.exe pendnt TS ms D etF v9y est le vritle hef d9orhestre de l9ordinteur 3 wintenntD imginez qu9u out d9une seonde un utre progrmme soit enore en trin de trviller X il fudr qu9il it (ni pour que votre progrmme puisse  reprendre l min omme on ditD 9estEEdire tre trit nouveu pr le gF u9estEe qu9il fut retenir c ue votre g ne peut ps grer plus d9un progrmme l fois F our donner l9impression que l9on peut fire tourner plusieurs progrmmes en mme temps sur un ordinteurD l9y  doupe le temps et utorise les progrmmes trviller tour tourF yrD ette gestion des progrmmes est trs omplexe et on ne peut don ps voir l grntie que notre progrmme ser rveill u out d9une seonde extementF outefoisD el dpend des g omme je vous l9i dit plus hutF ghez moiD j9i pu onstter que l fontion SDL_Delay tit ssez priseF
2

cause de ce problme de granularit du temps, vous ne pouvez donc pas mettre en pause votre programme pendant un temps trop court. Par exemple, si vous faites SDL_Delay(1);, vous pouvez tre certains que votre programme ne sera pas mis en pause 1 ms mais un peu plus (peut-tre 9-10 ms).
SDL_Delay est don ien prtiqueD mis ne lui fites ps trop on(neF ille ne mettr

ps en puse votre progrmme pendnt le temps exact que vous indiquezF ge n9est ps
2. C'est toutefois de moins en moins vrai. Les CPU double cur ont en eet la capacit de travailler sur deux programmes la fois, maintenant.

RPQ

CHAPITRE 25. MATRISEZ LE TEMPS !

pre que l fontion est ml odeD 9est pre que le fontionnement d9un ordinteur est trs omplexe et ne permet ps d9tre trs pris e niveuF
SDL_GetTicks

gette fontion renvoie le nomre de milliseondes oules depuis le lnement du progrmmeF g9est un inditeur de temps indispensleF gel vous permet de vous reprer dns le tempsD vous llez voir 3 oii le prototype X
1

intQP hvqetiks @ void A Y

v fontion n9ttend uun prmtreD elle renvoie juste le nomre de milliseondes oulesF ge nomre ugmente u fur et mesure que le temps psseD inlsslementF our infoD l do9 de l hv indique que le nomre tteint son mximum et est rE initilis u out de RW jours 3 e priori votre progrmme hv devrit tourner moins longtemps que D don ps de soui de e tElF

Utiliser SDL_GetTicks pour grer le temps


i SDL_Delay est ssez file omprendre et utiliserD e n9est ps le s de l fontion SDL_GetTicksF sl est temps d9pprendre ien s9en servirF F F oii un exemple 3 xous llons reprendre notre on vieux progrmme ve l fentre 0hnt ozor l9rn @(gF PSFIAF gette foisD u lieu de le diriger u lvier ou l sourisD nous llons fire en sorte qu9il ouge tout seul sur l9rn 3 our fire simpleD on v le fire ouger horizontlement sur l fentreF yn reprend pour ommener extement le mme ode soure que elui qu9on vit utilis dns le hpitre sur les vnementsF ous devriez pouvoir rer un progrmme ussi simple sns voir esoin de mon ideD iiF i nnmoins vous en vez esoinD vous pouvez ruprer le ode soure de se sur snternetF  gopier le ode gode we X SQRWIV  sntressonsEnous ozorF xous voulons le fire ougerF our elD le mieux est d9utiliser SDL_GetTicksF yn v voir esoin de deux vriles X tempsPrecedent et tempsActuelF illes vont stoker le temps retourn pr SDL_GetTicks des moments di'rentsF sl nous su0r de fire l di'rene entre tempsActuel et tempsPrecedent pour voir le temps qui s9est oulF i le temps oul est pr exemple suprieur QH msD lors on hnge les oordonnes de ozorF gommenez don pr rer es deux vriles dont on v voir esoin X
1

int tempsreedent a H D tempsetuel a H Y

wintenntD dns notre oule in(nieD nous llons jouter le ode suivnt X RPR

LE DELAY ET LES TICKS

Figure PSFI ! ozor u entre de l9rn


1 2

3 4 5

tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A GB i QH ms se sont oul es BG { positionozor F x CCY GB yn ouge ozor BG tempsreedent a tempsetuel Y GB ve temps 4 tuel 4 devient le temps 4 preedent 4 pour nos futurs luls BG }

gomprenez ien e qui se psseF IF yn prend le temps tuel gre SDL_GetTicksF PF yn ompre u temps prdemment enregistrF 9il y un rt de QH ms u moinsD lorsF F F QF F F F on ouge ozorD r on veut qu9il se dple toutes les QH msF siD on le dle juste vers l droite toutes les QH ms F RF uisD et 9est vriment e qu9il ne fut ps oulierD on ple le temps  tuel dns le temps  prdent F in e'etD imginez le prohin tour de oule X le temps  tuel ur hngD et on pourr le omprer u temps prdentF nouveuD on pourr vri(er si QH ms se seront oules et ouger ozorF
3

3. Il faut vrier si le temps est suprieur 30 ms, et non gal 30 ms ! En eet, il faut vrier si au moins 30 ms se sont coules. Rien ne vous garantit que l'instruction sera excute pile poil toutes les 30 ms.

RPS

CHAPITRE 25. MATRISEZ LE TEMPS !

Et que se passe-t-il si la boucle met moins de temps que 30 ms ?

visez mon ode X il ne se psse rien 3 yn ne rentre ps dns le ifD on ne fit don rienF yn ttend le prohin tour de oule o on vri(er nouveu si QH ms se seront oules depuis l dernire fois qu9on fit ouger ozorF ge ode est ourtD mis il fut le omprendre 3 elisez mes explitions utnt de fois que nessireD pre que 9tit prolement le pssge le plus importnt du hpitreF
Un changement dans la gestion des vnements

xotre ode est prfit un dtil prs X l fontion SDL_WaitEventF ille tit trs prtique jusqu9iiD puisqu9on n9vit ps grer le tempsF gette fontion mettit en puse le progrmme @un peu l mnire de SDL_DelayA tnt qu9il n9y vit ps d9vnementF yr iiD on n9 ps esoin d9ttendre un vnement pour fire ouger ozor 3 sl doit ouger tout seulF ous n9llez qund mme ps ouger l souris juste pour gnrer des vnements et don fire sortir le progrmme de l fontion SDL_WaitEvent 3 v solution c SDL_PollEventF te vous vis dj prsent ette fontion X ontrirement SDL_WaitEventD elle renvoie une vleurD qu9il y it eu un vnement ou nonF yn dit que l fontion n9est ps bloquante X elle ne met ps en puse le progrmmeD l oule in(nie v don tourner tout le tempsF
Code complet

oii le ode (nl que vous pouvez tester X


1 2 3 4 5 6 7 8 9 10 11

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B zozor a xvv Y hvet positionozor Y hvivent event Y int ontinuer a I Y int tempsreedent a H D tempsetuel a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du temps en hv 4 D xvv A Y zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y

12 13 14 15

16

RPT

LE DELAY ET LES TICKS


17 18 19 20 21 22 23 24

positionozor F x a ern E b w G P E zozor E b w G P Y positionozor F y a ern E b h G P E zozor E b h G P Y hvinleueyepet @ IH D IH AY while @ ontinuer A { hvollivent @8 event A Y GB yn utilise ollivent et non itivent pour ne ps loquer le progrmme BG swith @ event F type A { se hvs X ontinuer a H Y rek Y } tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A GB i QH ms se sont oul es depuis le dernier tour de oule BG { positionozor F x CCY GB yn ouge ozor BG tempsreedent a tempsetuel Y GB ve temps 4 tuel 4 devient le temps 4 preedent 4 pour nos futurs luls BG } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y hvplip @ ern AY

25 26 27 28 29 30 31 32 33

34 35 36

37 38 39

40 41 42 43 44 45 46 47 48

hvpreeurfe @ zozor A Y hvuit @A Y } return isggi Y

gopier e ode gode we X VVUTRP  ous devriez voir ozor ouger tout seul sur l9rnF sl se dle vers l droiteF issyez pr exemple de hnger le temps de QH ms en IS ms X ozor devrit se dpler deux fois plus vite 3 in e'etD il se dpler une fois toutes les IS ms u lieu d9une fois toutes les QH ms uprvntF RPU

CHAPITRE 25. MATRISEZ LE TEMPS !

Consommer moins de CPU

etuellementD notre progrmme tourne en oule ind(niment l vitesse de l lumire @en(nD presqueAF sl onsomme don IHH 7 du gF our voir elD il vous su0t pr exemple de fire gv C ev C @onglet ProcessusA sous indows @(gF PSFPAF

Figure PSFP ! gonsommtion du g pr le progrmme

gomme vous pouvez le voirD notre g est utilis IHH 7 pr notre progrmme testsdl.exeF te vous l9i dit plus tt X si vous odez un jeu @surtout un jeu plein rnAD e n9est ps grve si vous utilisez IHH 7 du gF wis si 9est un jeu dns une fentre pr exempleD il vut mieux qu9il utilise le moins de g possile pour que l9utilisteur puisse fire utre hose sns que son g ne  rme F v solution c yn v reprendre extement le mme ode que iEdessusD mis on v lui jouter en plus un SDL_Delay pour ptienter le temps qu9il fut (n que fsse QH msF yn v juste jouter un SDL_Delay dns un else X
1 2 3 4 5 6 7

8 9 10

tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A { positionozor F x CCY tempsreedent a tempsetuel Y } else GB i fit moins de QH ms depuis le dernier tour de oule D on endort le progrmme le temps qu ' il fut BG { hvhely @ QH E @ tempsetuel E tempsreedent A A Y }

gomment el fontionneEtEilD ette fois c g9est simpleD il y deux possiilits @d9prs le ifA X ! soit fit plus de QH ms qu9on n9 ps oug ozorD dns e s on le ouge Y ! soit fit moins de QH msD dns e s on fit dormir le progrmme ve SDL_Delay le temps qu9il fut pour tteindre les QH ms environF h9o mon petit lul 30 (tempsActuel - tempsPrecedent)F i l di'rene entre le temps tuel et le temps prdent est pr exemple de PH msD lors on endormir le progrmme @QH E PHA a IH ms (n d9tteindre les QH msF
Rappelez-vous que plus que prvu. . .
SDL_Delay

mettra peut-tre quelques millisecondes de

RPV

LE DELAY ET LES TICKS

eve e odeD notre progrmme v  dormir l pluprt du temps et don onsommer trs peu de g @(gF PSFQAF

Figure PSFQ ! gonsommtion de g rduite

in moyenneD le progrmme utilise mintennt entre H et I 7 de gF F F rfois il utilise lgrement plusD mis il retome rpidement H 7 de gF
Contrler le nombre d'images par seconde

ous vous demndez ertinement omment on peut limiter @(xerA le nomre d9imges pr seonde 0hes pr l9ordinteurF ih ien 9est extement e qu9on est en trin de fire 3 siD on 0he une nouvelle imge toutes les QH ms en moyenneF hnt qu9une seonde vut IHHH msD pour trouver le nomre de p @imges pr seondeAD il su0t de fire une division X IHHH G QH a QQ imges pr seonde environF our l9il huminD une nimtion est )uide si elle ontient u moins PS imges G seE ondeF eve QQ imges G seondeD notre nimtion ser don tout fit )uideD elle n9pprtr ps  sde F i vous voulez plus d9imges pr seondeD il fut rduire l limite de temps entre deux imgesF ssez de QH PH msD et vous fer du IHHH G PH a SH pF
4

Exercices

v mnipultion du temps n9est ps videnteD il serit ien de vous entrner un peuD qu9en ditesEvous c oii quelques exeriesF ! our le momentD ozor se dle vers l droite puis disprt de l9rnF ge serit mieux s9il reprtit dns l9utre sens une fois rriv tout droiteD non c gel donnerit l9impression qu9il reonditF te vous onseille de rer un oolen versLaDroite qui vut  vri si ozor se dple vers l droite @et  fux s9il v vers l guheAF i le oolen vut vriD vous dlez don ozor vers l droiteD sinon vous le dlez vers l guheF urtoutD n9ouliez ps de hnger l vleur du oolen lorsque ozor tteint le ord droit ou le ord guheF ih ouiD il fut ien qu9il reprte dns l9utre sens 3 ! lutt que de fire reondir ozor de droite guheD fites le reondir en digoE nle sur l9rn 3 sl vous su0r de modi(er positionZozor.x et positionZozor.y simultnmentF ous pouvez essyer de voir e que fit si on ugmente x et si on diminue y en mme tempsD ou ien si on ugmente les deux en mme tempsD etF
4. Couramment abrg FPS pour  Frames per second .

RPW

CHAPITRE 25. MATRISEZ LE TEMPS !

! pites en sorte qu9un ppui sur l touhe emphe ozor de se dplerD et qu9un nouvel ppui sur l touhe relne le dplement de ozorF g9est un te oolen tiver et dstiverF

Les timers
L'utilisation des timers est un peu complexe. Elle fait intervenir une notion qu'on n'a pas vue jusqu'ici : les pointeurs de fonctions. Il n'est pas indispensable d'utiliser les timers : si vous les trouvez trop dlicats utiliser, vous pouvez passer votre chemin sans problme.

ves timers onstituent une utre fon de rliser e qu9on vient de fire ve l fonE tion SDL_GetTicksF g9est une tehnique un peu prtiulireF gertins l trouveront prtiqueD d9utres nonF gel dpend don des gots du progrmmeurF u9estEe qu9un timer c g9est un systme qui permet de demnder l hv d9pE peler une fontion toutes les milliseondesF ous pourriez insi rer une fontion bougerEnnemi() que l hv ppellerit utomtiquement toutes les SH ms (n que l9ennemi se dple intervlles rguliersF
Comme je viens de vous le dire, cela est aussi faisable avec SDL_GetTicks en utilisant la technique qu'on a vue plus haut. Quel avantage, alors ? Eh bien disons que les timers nous obligent mieux structurer notre programme en fonctions.

Initialiser le systme de timers


our pouvoir utiliser les timersD vous devez d9ord initiliser l hv ve un )g spil X SDL_INIT_TIMERF ous devriez don ppeler votre fontion SDL_Init omme ei X
1

hvsnit @ hvsxsshiy | hvsxsswi A Y

v hv est mintennt prte utiliser les timers 3

Ajouter un timer
our jouter un timerD on fit ppel l fontion SDL_AddTimer dont voii le protoE type X
5

5. Il existe en fait deux fonctions permettant d'ajouter un timer en SDL : SDL_AddTimer et SDL_SetTimer. Elles sont quasiment identiques. Cependant, SDL_SetTimer est une fonction ancienne qui existe toujours pour des raisons de compatibilit. Aujourd'hui, si on veut bien faire les choses, on nous recommande donc d'utiliser SDL_AddTimer.

RQH

LES TIMERS
1

hvimersh hveddimer @ intQP intervl D hvxewimergllk llk D void B prm A Y

yn envoie trois prmtres l fontion X ! l'intervalle de temps @en msA entre hque ppel de l fontion Y ! le nom de la fonction appelerF yn ppelle el un callback X le progrmme se hrge de rppeler ette fontion de llk rgulirement Y ! les paramtres envoyer votre fontion de llkF
Comment ? Un nom de fonction peut servir de paramtre ? Je croyais qu'on ne pouvait envoyer que des variables !

in fitD les fontions sont ussi stokes en mmoire u hrgement du progrmmeF illes ont don elles ussi une dresseF hu oupD on peut rer desF F F pointeurs de fonctions 3 sl su0t d9rire le nom de l fontion ppeler pour indiquer l9dresse de l fontionF einsiD l hv sur quelle dresse en mmoire elle doit se rendre pour ppeler votre fontion de llkF SDL_AddTimer renvoie un numro de timer @un  sh AF ous devez stoker e rsultt dns une vrile de type SDL_TimerIDF gel vous permettr pr l suite de dstiver le timer X il vous su0r d9indiquer l9sh du timer rrterF v hv vous permet d9tiver plusieurs timers en mme tempsF gel explique l9intrt de stoker un sh de timer pour pouvoir les di'renierF yn v don rer un sh de timer X
6 1

hvimersh timer Y GB rile pour stoker le num ro du timer BG

F F F puis on v rer notre timer X


1

timer a hveddimer @ QH D ougerozor D 8 positionozor A Y GB h mrrge du timer BG

siD je re un timer qui les proprits suivntes X ! il ser ppel toutes les QH ms Y ! il ppeller l fontion de llk bougerZozor Y ! il lui enverr omme prmtre un pointeur sur l position de ozor pour qu9il puisse l modi(erF ous l9urez ompris X le rle de l fontion bougerZozor ser de hnger l position de ozor toutes les QH msF
6. Si vous souhaitez en savoir plus sur les pointeurs de fonctions, je vous invite lire le tutoriel rdig par mleg sur le Site du Zro qui traite de ce sujet (code web : 199183).

RQI

CHAPITRE 25. MATRISEZ LE TEMPS !

Cration de la fonction de callback

ettention X il fut tre prtiulirement vigilnt iiF otre fontion de llk doit obligatoirement voir le prototype suivnt X
1

intQP nomhevpontion @ intQP intervlle D void B prmetre A Y

our rer le llk bougerZozorD je devri don rire l fontion omme ei X


1

intQP ougerozor @ intQP intervlle D void B prmetre A Y

oii mintennt le ontenu de m fontion bougerZozorD qui est plus dlite qu9il n9y prt X
1 2 3 4

5 6 7 8

GB pontion de llk @ ser ppel e toutes les QH ms A BG intQP ougerozor @ intQP intervlle D void B prmetre A { hvet B positionozor a prmetre Y GB gonversion de void B en hvet B BG positionozor E b x CCY } return intervlle Y

v fontion bougerZozor ser don utomtiquement ppele toutes les QH ms pr l hvF v hv lui enverr toujours deux prmtres @ni plusD ni moinsA X ! l'intervalle de temps qui spre deux ppels de l fontion @iiD ser QH msA Y ! le paramtre  personnalis  que vous vez demnd envoyer l fontionF emrquezD et 9est trs importntD que e prmtre est un pointeur sur voidF gel signi(e que 9est un pointeur qui peut pointer sur n9importe quoi X un intD une struture personnliseD ou omme ii un SDL_Rect @positionZozorAF ve prolmeD 9est que e prmtre est un pointeur de type inonnu @voidA pour l fontionF sl v don flloir dire l9ordinteur que e prmtre est un SDL_Rect* @un pointeur sur SDL_RectAF our fire D je re un pointeur sur SDL_Rect dns m fontion qui prend omme vleurF F F le pointeur parametreF
7

Quel intrt d'avoir cr un DEUXIME pointeur qui contient la mme adresse ?

v9intrtD 9est que positionZozor est de type SDL_Rect* ontrirement l vrile parametre qui tit de type void*F ous pourrez don der positionZozor->x et positionZozor->yF i vous viez fit parametre->x ou parametre->yD le ompilteur urit tout rejet en lo pre
7. Il n'est pas possible d'envoyer plus d'un paramtre personnalis la fonction de callback. Heureusement, vous pouvez toujours crer un type personnalis (ou un tableau) qui sera un assemblage des variables que vous voulez transmettre.

RQP

LES TIMERS

que le type void ne ontient ps de sousEvrile x et yF eprsD l ligne suivnte est simple X on modi(e l vleur de positionZozor->x pour dler ozor vers l droiteF hernire hoseD trs importnte X vous devez retourner l vrile intervalleF gel indiquer l hv qu9on veut ontinuer fire en sorte que l fontion soit ppele toutes les QH msF i vous voulez hnger l9intervlle d9ppelD il su0t de renvoyer une utre vleur @mis ien souventD on ne hnge ps et intervlleAF
Arrter le timer

our rrter le timerD 9est trs simple X


1

hvemoveimer @ timer A Y GB err t du timer BG

sl su0t d9ppeler SDL_RemoveTimer en indiqunt l9sh du timer rrterF siD j9rrte le timer juste prs l oule in(nieD u mme endroit que les SDL_FreeSurfaceF

En rsum
! v fontion SDL_Delay permet de mettre en puse le progrmme un ertin nomre de milliseondesF gel permet de rduire l9utilistion du g qui n9est lors plus monopolis pr votre progrmmeF ! yn peut onntre le nomre de milliseondes oules depuis le lnement du proE grmme ve SDL_GetTicksF eve quelques petits lulsD on peut s9en servir pour e'etuer une gestion des vnements non loqunte ve SDL_PollEventF ! ves timers onstituent un systme qui permet de rppeler une de vos fontions @dite de callback A intervlles rguliersF ve mme rsultt peut tre otenu ve SDL_GetTicks mis les timers ident rendre le progrmme plus lisile et mieux struturF

RQQ

CHAPITRE 25. MATRISEZ LE TEMPS !

RQR

Chapitre

26
Dicult :

crire du texte avec SDL_ttf

e suis persuad que la plupart d'entre vous se sont dj pos cette question :  Mais bon sang, il n'y a donc aucune fonction pour crire du texte dans une fentre SDL ? . Il est temps de vous apporter la rponse : c'est non. Cependant, il y a quand mme moyen d'y arriver. Il sut d'utiliser. . . la ruse ! On peut par exemple blitter des images de lettres une une l'cran. a fonctionne, mais ce n'est pas ce qu'il y a de plus pratique. Heureusement, il y a plus simple : on peut utiliser la bibliothque SDL_ttf. C'est une bibliothque qui vient s'ajouter par-dessus la SDL, tout comme SDL_image. Son rle est de crer une SDL_Surface partir du texte que vous lui envoyez.

RQS

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

Installer SDL_ttf
sl fut svoir queD omme SDL_imageD SDL_ttf est une iliothque qui nessite que l hv soit instlle F out omme SDL_imageD SDL_ttf est une des iliothques lies l hv les plus popuE lires @9estEEdire qu9elle est trs tlhrgeAF gomme vous llez pouvoir le onstterD ette iliothque est e'etivement ien fiteF ne fois que vous urez ppris l9utiliserD vous ne pourrez plus vous en psser 3
1

Comment fonctionne SDL_ttf ?


SDL_ttf n9utilise ps des imges itmp pour gnrer du texte dns des surfesF g9est

une mthode en e'et ssez lourde mettre en ple et on n9urit pu utiliser qu9une seule polieF in fitD SDL_ttf fit ppel une utre iliothque X FreeTypeF g9est une iliothque ple de lire les (hiers de polie @.ttfA et d9en sortir l9imgeF SDL_ttf rupre don ette imge et l onvertit pour l hv en rnt une SDL_SurfaceF SDL_ttf don esoin de l iliothque preeype pour fontionnerD sinon elle ne ser ps ple de lire les (hiers .ttfF i vous tes sous Windows et que vous prenezD omme je le fisD l version ompile de l iliothqueD vous n9urez ps esoin de tlhrger quoi que e soit de plus r preeype ser inluse dns l hvv SDL_ttf.dllF ous n9vez don rien fireF i vous tes sous Linux ou Mac OS et que vous devez reompiler l iliothqueD il vous fudr en revnhe preeype pour ompilerF endezEvous sur l pge de tlhrE gement de preeype pour ruprer les (hiers pour dveloppeursF  lhrger preeype gode we X PHSVVI 

Installer SDL_ttf
endezEvous sur l pge de tlhrgement de SDL_ttfF  lhrger SDL_ttf gode we X IVUUPU  vD hoisissez le (hier qu9il vous fut dns l setion Binary F
2

1. Bon : si ce stade du cours vous n'avez toujours pas install la SDL, c'est grave, donc je vais supposer que c'est dj fait ! 2. Sous Windows, vous remarquerez qu'il n'y a que deux chiers .zip ayant le suxe win32 et VC6. Le premier (win32) contient la DLL que vous aurez besoin de livrer avec votre excutable. Vous aurez aussi besoin de mettre cette DLL dans le dossier de votre projet pour pouvoir tester votre programme, videmment. Le second (VC6) contient les .h et .lib dont vous allez avoir besoin pour programmer. On pourrait penser d'aprs le nom que a n'est fait que pour Visual C++, mais en fait, exceptionnellement, le chier .lib livr ici marche aussi avec mingw32, il fonctionnera donc sous Code: :Blocks.

RQT

INSTALLER SDL_TTF

ve (hier s ontient omme d9hitude un dossier include et un dossier libF lez le ontenu du dossier include dns mingw32/include/SDL et le ontenu du dossier lib dns mingw32/libF
Vous
mingw32/include/SDL

devez

copier

Attention aux erreurs !

le chier SDL_ttf.h dans le dossier et non pas dans mingw32/include tout court.

Congurer un projet pour SDL_ttf


sl nous reste une dernire petite hose fire X on(gurer notre projet pour qu9il utilise ien SDL_ttfF sl v flloir modi(er les options du linker pour qu9il ompile ien votre progrmme en utilisnt l iliothque SDL_ttfF ous vez dj ppris fire ette oprtion pour l hv et pour SDL_imageD je vis don ller plus viteF gomme je trville sous gode: :floksD je vis vous donner l produre ve et shiF ge n9est ps ien di'rent ve les utres shi X ! rendezEvous dns le menu Project G Build Options Y ! dns l9onglet LinkerD liquez sur le petit outon Add Y ! indiquez o se trouve le (hier SDL_ttf.lib Y ! on vous demnde Keep this as a relative path ? eu importe e que vous rpondezD mrher dns les deux sF te vous onseille qund mme de rpondre pr l ngtiveD r sinon votre projet ne fontionner plus si vous le dplez dns un utre dossier Y ! vlidez en liqunt sur yuF
3

On n'a pas besoin de linker avec la bibliothque FreeType aussi ?

xonD r omme je vous l9i dit preeype est inluse dns l hvv de SDL_ttfF ous n9vez ps vous prouper de preeypeD 9est SDL_ttf qui gre D mintenntF

La documentation
wintennt que vous ommenez devenir des progrmmeurs guerrisD vous devriez vous demnder immditement X  wis o est l do9 c F sl y ertes des ours qui dtillent le fontionnement des iliothquesD omme e livreF outefoisF F F ! te ne vis ps fire un hpitre pour toutes les iliothques qui existent @mme en y pssnt m vieD je n9uris ps le tempsAF sl v don flloir tt ou trd lire une
4

3. Chez moi, c'est dans C:\Program Files\CodeBlocks\mingw32\lib. 4. Si vous ne vous tes pas encore pos cette question, c'est que vous n'tes pas encore des programmeurs aguerris. ;-)

RQU

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

do9D et mieux vut ommener pprendre le fire mintennt 3 ! h9utre prtD une iliothque est en gnrl ssez omplexe et ontient euoup de fontionsF te ne peux ps prsenter toutes es fontions dns un hpitreD e serit ien trop long 3 in lir X les doumenttions ont l9vntge d9tre ompltes et on ne peut prfois ps y ouperF te vous onseille don de mettre ds prsent dns vos fvoris l9dresse de l do9 de hvttfF  houmenttion de SDL_ttf gode we X PURHSH  v do9 est disponile en plusieurs formts X rwv en ligneD rwv zippD hpD etF renez l version qui vous rrnge le plusF ous verrez que SDL_ttf est une iliothque trs simple X il y peu de fontions @environ RHESHA F gel devrit tre signe @pour les progrmmeurs guerris que vous tes YEA A que ette iliothque est simple et que vous surez l mnier ssez viteF ellezD il est temps d9pprendre utiliser SDL_ttfD mintennt 3
5

Chargement de SDL_ttf
L'include
evnt toute hoseD il fut jouter l9include suivnt en hut de votre (hier .c X
1

5 inlude ` hv G hvttf Fh b

i vous vez des erreurs de ompiltion e stdeD vri(ez si vous vez ien pl le (hier SDL_ttf.h dns le dossier mingw32/include/SDL et non dns mingw32/include tout ourtF

Dmarrage de SDL_ttf
out omme l hvD SDL_ttf esoin d9tre dmrre et rrteF sl y don des fontions trs similires elles de l hv X ! TTF_Init X dmrre SDL_ttf Y ! TTF_Quit X rrte SDL_ttfF
Il n'est pas ncessaire que la SDL soit dmarre avant SDL_ttf.

our dmrrer SDL_ttf @on dit ussi  initiliser AD on doit don ppeler l fontion TTF_Init()F euun prmtre n9est nessireF v fontion renvoie EI s9il y eu une
5. Oui, c'est peu !

RQV

CHARGEMENT DE SDL_TTF

erreurF ous pouvez don dmrrer SDL_ttf trs simplement omme ei X


1

psnit @A Y

i vous voulez vri(er s9il y une erreur et tre insi plus rigoureuxD utilisez plutt e ode X
1 2 3

4 5

if @ psnit @A aa EI A { fprintf @ stderr D 4 irreur d ' initilistion de psnit X 7 s n 4 D pqetirror @A A Y exit @ ispesvi A Y }

9il y eu une erreur u dmrrge de SDL_ttfD un (hier stderr.txt ser r @sous indowsD du moinsA ontennt un messge explitif de l9erreurF our eux qui se poserient l question X l fontion TTF_GetError() renvoie le dernier messge d9erreur de SDL_ttfF g9est pour el qu9on l9utilise dns le fprintfF

Arrt de SDL_ttf
our rrter SDL_ttfD on ppelle TTF_Quit()F v enoreD ps de prmtreD ps de prise de tteF ous pouvez ppeler TTF_Quit vnt ou prs SDL_QuitD peu importeF
1

puit @A Y

Chargement d'une police


fon tout 9est ien eu mis e n9est ps ssez ompliquD on ne s9muse psF ssons ux hoses srieusesD si vous le voulez ien X mintennt que SDL_ttf est hrgeD nous devons hrger une polieF ne fois que el ser fitD nous pourrons en(n voir omment rire du texte 3 v enore il y deux fontions X ! TTF_OpenFont X ouvre un (hier de polie @.ttfA Y ! TTF_CloseFont X ferme une polie ouverteF TTF_OpenFont doit stoker son rsultt dns une vrile de type TTF_FontF ous devez rer un pointeur de TTF_FontD omme ei X
1

ppont B polie a xvv Y

ve pointeur police ontiendr don les informtions sur l polie une fois qu9on l9ur ouverteF v fontion TTF_OpenFont prend deux prmtres X ! le nom du (hier de polie @u formt .ttfA ouvrirF v9idl 9est de mettre le (hier de polie dns le rpertoire de votre projetF ixemple de (hier X arial.ttf @pour l polie erilA Y RQW

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

! l tille de l polie utiliserF ous pouvez pr exemple utiliser une tille de PPF ge sont les mmes tilles que elles que vous utilisez dns un logiiel de tritement de texte tel que ordF sl nous reste trouver es fmeuses polies .ttfF ous en vez dj un ertin nomre sur votre ordinteurD mis vous pouvez en tlhrger sur snternet omme on v le voirF
Sur votre ordinateur

ous en vez dj sur votre ordinteur 3 i vous tes sous indowsD vous en trouverez euoup dns le dossier C:\Windows\FontsF ous n9vez qu9 opier le (hier de polie qui vous plt dns le dossier de votre projetF i le nom ontient des rtres  izrres omme des espesD des ents ou mme des mjusulesD je vous onseille de le renommerF our tre sr de n9voir uun proE lmeD n9utilisez que des minusules et vitez les espesF ! ixemple de nom inorret X TIMES NEW ROMAN.TTF Y ! ixemple de nom orret X times.ttfF
Sur Internet

eutre possiilit X ruprer une polie sur snternetF ous trouverez plusieurs sites proposnt des polies grtuites et originles tlhrgerF te vous reommnde personnellement dafont.comD qui est ien lssD trs ien fourni et  vriF
dafont.com gode we X UUIITP 

ves (gF PTFID PTFP et PTFQ vous donnent un peru de polies que vous pourrez y trouver trs filementF

Figure PTFI ! olie elph ood

Figure PTFP ! olie ven

RRH

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFQ ! olie engelin


Charger la police

te vous propose d9utiliser l polie engelin pour l suite des exemplesF ous pouvez l tlhrger en ligneF   lhrger le polie engeE lin gode we X QIPSPR   yn ouvrir l polie omme ei X
1

polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y

v polie utilise ser angelina.ttfF t9i ien pris soin de mettre le (hier dns le dossier de mon projet et de le renommer pour qu9il soit tout en minusulesF v polie ser de tille TSF prt gros mis visilementD 9est une polie qu9il fut rire en gros pour qu9on puisse l voirF ge qui est trs importntD 9est que TTF_OpenFont stoke le rsultt dns l vrile policeF ous llez rutiliser ette vrile tout l9heure en rivnt du texteF ille permettr d9indiquer l polie que vous voulez utiliser pour rire votre texteF
Vous n'avez pas besoin d'ouvrir la police chaque fois que vous crivez du texte : ouvrez-la une fois au dbut du programme et fermez-la la n.
Fermer la police

sl fut penser fermer hque polie ouverte vnt l9ppel TTF_Quit()F hns mon sD donner don le ode suivnt X
1 2

pglosepont @ polie A Y GB hoit tre vnt puit @A BG puit @A Y

it voil le trvil 3

Les direntes mthodes d'criture


wintennt que SDL_ttf est hrge et qu9on une vrile police hrge elle ussiD plus rien ni personne ne nous empher d9rire du texte dns notre fentre hv 3 RRI

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

fien X rire du texte 9est ienD mis ve quelle fontion c h9prs l do9D ps moins de IP fontions sont disponiles 3 in fitD il y trois fons di'rentes pour SDL_ttf de dessiner du texteF ! Solid @(gF PTFRA X 9est l tehnique l plus rpideF ve texte ser rpidement rit dns une SDL_SurfaceF v surfe ser trnsprente mis n9utiliser qu9un niveu de trnsprene @on ppris il y quelques hpitresAF g9est prtiqueD mis le texte ne ser ps trs joliD ps trs  rrondi D surtout s9il est rit grosF tilisez ette tehnique lorsque vous devez souvent hnger le texteD pr exemple pour 0her le temps qui s9oule ou le nomre de p d9un jeuF ! Shaded @(gF PTFSA X ette foisD le texte ser joliF ves lettres seront ntilises D le texte pprtr plus lisseF sl y un dfutD en revnhe X le fond doit tre d9une ouleur unieF sl est impossile de rendre le fond de l SDL_Surface trnsprente en ShadedF ! Blended @(gF PTFTA X 9est l tehnique l plus puissnteD mis elle est lenteF in fitD elle met utnt de temps que Shaded rer l SDL_SurfaceF v seule di'rene ve ShadedD 9est que vous pouvez litter le texte sur une imge et l trnsprene ser respete @ontrirement Shaded qui imposit un fond uniAF ettention X le lul du lit ser plus lent que pour ShadedF
6

Figure PTFR ! olid X mode d9riture trs rpide mis peu esthtique @texte non lissA

in rsum X ! si vous vez un texte qui hnge souventD omme un ompte reoursD utilisez Solid Y ! si votre texte ne hnge ps trs souvent et que vous voulez litter votre texte sur un fond uniD utilisez Shaded Y ! si votre texte ne hnge ps trs souvent mis que vous voulez litter sur un fond non uni @omme une imgeAD utilisez BlendedF oilD vous devriez dj tre un peu plus fmiliers ve es trois types d9riture de SDL_ttfF te vous vis dit qu9il y vit IP fontions en toutF in e'etD pour hun de es trois types d9ritureD il y qutre fontionsF ghque fontion rit le texte l9ide d9un charset di'rentD 9estEEdire d9une plette de rtres di'renteF ges qutre fontions
6. Cela signie que leurs contours seront adoucis, ce qui est plus agrable l'il.

RRP

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFS ! hded X mode d9riture lent mis plus joli r ntilis " fond oliE

gtoirement uni

Figure PTFT ! flended X mode d9riture lent @et lit lentA mis ien plus eu r ntilis et fontionne sur un fond non uni

RRQ

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

sont X ! vtinI Y ! pV Y ! niode Y ! niode qlyphF v9idl est d9utiliser l9niode r 9est un hrset grnt l qusiEtotlit des rtres existnt sur erreF outefoisD utiliser l9niode n9est ps toujours forment simple @un rtre prend plus que l tille d9un char en mmoireAD nous ne verrons don ps omment l9utiliser iiF e prioriD si votre progrmme est rit en frnis le mode vtinI su0t mplementD vous pouvez vous ontenter de eluiElF ves trois fontions utilisnt le hrset vtinI sont X ! TTF_RenderText_Solid Y ! TTF_RenderText_Shaded Y ! TTF_RenderText_BlendedF

Exemple d'criture de texte en Blended


our spi(er une ouleur SDL_ttfD on ne v ps utiliser le mme type qu9ve l hv @un Uint32 r l9ide de l fontion SDL_MapRGBAF eu ontrireD nous llons utiliser une struture toute prte de l hv X SDL_ColorF gette struture omporte trois sousEvriles X l quntit de rougeD de vert et de leuF i vous voulez rer une vrile couleurNoireD vous devrez don rire X
1

hvgolor ouleurxoire a {H D H D H }Y

Attention ne pas confondre avec les couleurs qu'utilise habituellement la SDL ! La SDL utilise des Uint32 crs l'aide de SDL_MapRGB. SDL_ttf utilise des SDL_Color.

yn v rire un texte en noir dns une hvurfe texte X


1

texte a penderextflended @ polie D 4 lut les rHs 3 4 D ouleurxoire A Y

ous voyez dns l9ordre les prmtres envoyer X l polie @de type TTF_FontAD le texte rireD et en(n l ouleur @de type SDL_ColorAF ve rsultt est stok dns une SDL_SurfaceF SDL_ttf lule utomtiquement l tille nessire donner l surfe en fontion de l tille du texte et du nomre de rtres que vous vez voulu rireF gomme toute SDL_SurfaceD notre pointeur texte ontient les sousEvriles w et h indiE qunt respetivement s lrgeur et s huteurF g9est don un on moyen de onntre les dimensions du texte une fois que eluiEi t rit dns l SDL_SurfaceF ous n9urez qu9 rire X RRR

LES DIFFRENTES MTHODES D'CRITURE


1 2

texte E b w GB honne l lrgeur BG texte E b h GB honne l huteur BG

Code complet d'criture de texte


ous svez dsormis tout e qu9il fut onntre sur SDL_ttfF oyons pour rsumer un ode omplet d9riture de texte en mode flended X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

5 inlude 5 inlude 5 inlude 5 inlude 5 inlude

` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` hv G hvimge Fh b ` hv G hvttf Fh b

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B texte a xvv D B fond a xvv Y hvet position Y hvivent event Y ppont B polie a xvv Y hvgolor ouleurxoire a {H D H D H }Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y psnit @A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du texte ve hvttf 4 D xvv A Y fond a swqvod @ 4 morir F jpg 4 A Y GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB riture du texte dns l hvurfe texte en mode flended @ optiml A BG texte a penderextflended @ polie D 4 lut les rHs 3 4 D ouleurxoire A Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y }

20 21 22 23 24 25 26

27

28 29 30 31 32 33 34 35 36 37 38

RRS

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF


39

hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y position F x a H Y position F y a H Y hvfliturfe @ fond D xvv D ern D 8 position A Y GB flit du fond BG position F x a TH Y position F y a QUH Y hvfliturfe @ texte D xvv D ern D 8 position A Y GB flit du texte BG hvplip @ ern A Y

40 41 42 43

44 45 46 47

48 49 50 51 52 53 54 55 56 57 58

pglosepont @ polie A Y puit @A Y hvpreeurfe @ texte A Y hvuit @A Y } return isggi Y

gopier e ode gode we X PVSRWR  ve rsultt vous est prsent sur l (gF PTFUF i vous voulez hnger de mode d9riture pour testerD il n9y qu9une ligne modi(er X elle rnt l surfe @ve l9ppel l fontion TTF_RenderText_BlendedAF
La fonction TTF_RenderText_Shaded prend un quatrime paramtre, contrairement aux deux autres. Ce dernier paramtre est la couleur de fond utiliser. Vous devrez donc crer une autre variable de type SDL_Color pour indiquer une couleur de fond (par exemple le blanc).

Attributs d'criture du texte


sl est ussi possile de spi(er des ttriuts d9ritureD omme grsD itlique et soulignF sl fut d9ord que l polie soit hrgeF ous devriez don voir une vrile police vlideF ous pouvez lors fire ppel l fontion TTF_SetFontStyle qui v modi(er l polie pour qu9elle soit en grsD itlique ou soulign selon vos dsirsF v fontion prend deux prmtres X ! l polie modi(er Y ! une ominison de )gs pour indiquer le style donner X grsD itlique ou soulignF RRT

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFU ! n texte rit l9ide de SDL_ttf

our les )gsD vous devez utiliser es onstntes X ! TTF_STYLE_NORMAL X norml Y ! TTF_STYLE_BOLD X grs Y ! TTF_STYLE_ITALIC X itlique Y ! TTF_STYLE_UNDERLINE X soulignF gomme 9est une liste de )gsD vous pouvez les ominer l9ide du symole | omme on ppris le fireF estons X
1 2 3 4

5 6

GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB ve texte ser rit en itlique et soulign BG petponttyle @ polie D pvisevsg | pvixhivsxi AY GB riture du texte en itlique et soulign BG texte a penderextflended @ polie D 4 lut les rHs 3 4 D ouleurxoire A Y

sulttD le texte est rit en itlique et soulign @(gF PTFVAF our resturer une polie son tt normlD il su0t de refire ppel l fontion TTF_SetFontStyle en utilisnt ette fois le )g TTF_STYLE_NORMALF RRU

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

Figure PTFV ! riture en itlique et soulign

Exercice : le compteur
get exerie v umuler e que vous vez ppris dns e hpitre et dns le hpitre sur l gestion du tempsF otre missionD si vous l9eptezD onsister rer un ompteur qui s9inrmenter tous les diximes de seondeF ge ompteur v don progressivement 0her X HD IHHD PHHD QHHD RHHD etF eu out d9une seonde le nomre IHHH devrit don s90herF
Astuce pour crire dans une chane

our rliser et exerieD vous urez esoin de svoir omment rire dns une hne de rtres en mmoireF in e'etD vous devez donner un char* TTF_RenderText mis vousD e que vous urezD 9est un nomre @un int pr exempleAF gomment onvertir un nomre en hne de rtres c yn peut utiliser pour el l fontion sprintfF ille mrhe de l mme mnire que fprintfD suf qu9u lieu d9rire dns un (hier elle rit dns une hne F ve premier prmtre que vous lui donnerez ser don un pointeur sur un tleu de charF
7

Veillez rserver susamment d'espace pour le tableau de char si vous ne voulez pas dborder en mmoire !
7. Le  s  de sprintf signie  string , c'est--dire  chane  en anglais.

RRV

LES DIFFRENTES MTHODES D'CRITURE

ixemple X
1

sprintf @ temps D 4 emps X 7 d 4 D ompteur AY

siD temps est un tleu de char @PH rtresAD et compteur est un int qui ontient le tempsF eprs ette instrutionD l hne temps ontiendr pr exemple "Temps : 500"F vous de jouer 3
Correction

oii une orretion possile de l9exerie X


1 2 3 4 5 6 7

8 9 10

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B texte a xvv Y hvet position Y hvivent event Y ppont B polie a xvv Y hvgolor ouleurxoire a {H D H D H } D ouleurflnhe a { PSS D PSS D PSS }Y int ontinuer a I Y int tempsetuel a H D tempsreedent a H D ompteur a H Y hr temps PH a 4 4 Y GB leu de hr suffismment grnd BG hvsnit @ hvsxsshiy A Y psnit @A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du texte ve hvttf 4 D xvv A Y GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB snitilistion du temps et du texte BG tempsetuel a hvqetiks @A Y sprintf @ temps D 4 emps X 7 d 4 D ompteur AY texte a penderexthded @ polie D temps D ouleurxoire D ouleurflnhe A Y while @ ontinuer A { hvollivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y

11 12 13 14 15

16 17 18 19 20 21 22 23 24

25 26 27 28 29 30 31 32 33

RRW

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF


34 35 36

} hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent ba IHH A GB i IHH ms u moins se sont oul es BG { ompteur Ca IHH Y GB yn rjoute IHH ms u ompteur BG sprintf @ temps D 4 emps X 7 d 4 D ompteur A Y GB yn rit dns l h ne 4 temps 4 le nouveu temps BG hvpreeurfe @ texte A Y GB yn supprime l surfe pr dente BG texte a penderexthded @ polie D temps D ouleurxoire D ouleurflnhe A Y GB yn rit l h ne temps dns l hvurfe BG tempsreedent a tempsetuel Y GB yn met jour le tempsreedent BG } position F x a IVH Y position F y a PIH Y hvfliturfe @ texte D xvv D ern D 8 position A Y GB flit du texte BG hvplip @ ern A Y } pglosepont @ polie A Y puit @A Y hvpreeurfe @ texte A Y hvuit @A Y } return isggi Y

37 38 39

40 41

42

43

44

45

46 47 48 49 50

51 52 53 54 55 56 57 58 59 60 61 62

gopier e ode gode we X WIQIHU  v (gF PTFW vous prsente le rsultt u out de IQDW seondes trs extementF x9hsitez ps tlhrger e projet si vous souhitez l9tudier en dtil et l9mliorerF sl n9est ps enore prfit X on pourrit pr exemple utiliser SDL_Delay pour viter d9utiliser IHH 7 du gF  lhrger le projet gode we X UTSTPW  RSH

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFW ! ve ompteur u out de IQDW seondes


Pour aller plus loin

i vous voulez mliorer e petit out de progrmmeD vous pouvez essyer d9en fire un jeu o il fut liquer le plus de fois possile dns l fentre ve l souris dns un temps imprtiF n ompteur s9inrmenter hque li de l sourisF n ompte reours doit s90herF vorsqu9il tteint HD on rpitule le nomre de lis e'etus et on demnde si on veut fire une nouvelle prtieF ous pouvez ussi grer les meilleurs sores en les enregistrnt dns un (hierF gel vous fer trviller nouveu l gestion des (hiers en gF fon ourge 3

En rsum
! yn ne peut ps rire de texte en hvD moins d9utiliser une extension omme l iliothque SDL_ttfF ! gette iliothque permet de hrger un (hier de polie u formt .ttf l9ide de l fontion TTF_OpenFontF ! sl y trois modes d9riture du texteD du plus simple u plus sophistiqu X SolidD Shaded et BlendedF ! yn rit dns une SDL_Surface vi des fontions omme TTF_RenderText_BlendedF RSI

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

RSP

Chapitre

27
Dicult :

Jouer du son avec FMOD

epuis que nous avons dcouvert la SDL, nous avons appris placer des images dans la fentre, faire interagir l'utilisateur avec le clavier et la souris, crire du texte, mais il manque clairement un lment : le son ! Ce chapitre va combler ce manque. Parce que les possibilits oertes par la SDL en matire d'audio sont trs limites, nous allons dcouvrir ici une bibliothque spcialise dans le son : FMOD.

RSQ

CHAPITRE 27. JOUER DU SON AVEC FMOD

Installer FMOD
Pourquoi FMOD ?
ous le svez mintennt X l hv n9est ps seulement une iliothque grphiqueF ille permet ussi de grer le son vi un module ppel SDL_audioF elors que vient fire dns e hpitre une iliothque externe qui n9 rien voir omme pwyh c g9est en fit un hoix que j9i fit prs de nomreux testsF t9uris pu vous expliquer omment grer le son en hv mis j9i prfr ne ps le fireF te m9expliqueF
Pourquoi j'ai vit SDL_audio

v gestion du son en hv est  s niveu F rop mon gotF sl fut e'etuer plusieurs mnipultions trs prises pour jouer du sonF g9est don omplexe et je ne trouve ps musntF sl y ien d9utres iliothques qui proposent de jouer du son simplementF
Petit rappel : une bibliothque  bas niveau  est une bibliothque proche de l'ordinateur. On doit donc connatre un peu le fonctionnement interne de l'ordinateur pour s'en servir et il faut gnralement plus de temps pour arriver faire la mme chose qu'avec une bibliothque  haut niveau . N'oubliez pas que tout est relatif : il n'y a pas les bibliothques bas niveau d'un ct et les bibliothques haut niveau de l'autre. Certaines sont juste plus ou moins haut niveau que d'autres. Par exemple FMOD est plus haut niveau que le module SDL_audio de la SDL.

eutre dtil importntD l hv ne permet de jouer que des sons u formt eF ve formt e est un formt de son non ompressF ne musique de Q minutes dns e formt prend plusieurs dizines de woD ontrirement un formt ompress omme wQ ou ygg qui oupe euoup moins d9espe @P Q woAF in fitD si on y r)hit ienD 9tit un peu preil ve les imgesF v hv ne gre que les fw @imges non ompressesA l seF yn d instller une iliothque supplmentire @SDL_imageA pour pouvoir lire d9utres imges omme les tiqD xqD qspD etF ih ien (gurezEvous qu9il y une iliothque quivlente pour le son X SDL_mixerF ille est ple de lire un grnd nomre de formts udioD prmi lesquels les wQD les yggD les widiF F F it pourtntD l enore j9i vit de vous prler de ette iliothqueF ourquoi c
Pourquoi j'ai vit SDL_mixer
SDL_mixer est une SDL_imageF ille est

iliothque qu9on joute en plus de l hvD l mnire de simple utiliser et lit euoup de formts udio di'rentsF ouE tefoisD prs mes testsD il s9est vr que l iliothque omportit des ugs gnnts en plus d9tre reltivement limite en fontionnlitsF RSR

INSTALLER FMOD

g9est don pour el que je me suis ensuite penh sur pwyhD une iliothque qui n9 ertes rien voir ve l hvD mis qui l9vntge d9tre puissnte et rputeF

Tlcharger FMOD
i je vous ronte tout D 9est pour vous expliquer que le hoix de pwyh n9est ps nodinF g9est tout simplement pre que 9est l meilleure iliothque grtuite que j9i pu trouverF ille est ussi simple utiliser que SDL_mixerD ve un vntge non ngligele X elle n9est ps uggeF pwyh permet en outre de rliser plusieurs e'ets intressnts que SDL_mixer ne proE pose psD omme des e'ets sonores QhF
FMOD est une bibliothque gratuite mais pas sous license LGPL, contrairement la SDL. Cela signie que vous pouvez l'utiliser gratuitement tant que vous ne ralisez pas de programme payant avec. Si vous voulez faire payer votre programme, il faudra payer une redevance l'auteur (je vous laisse consulter les prix sur le site de FMOD). De nombreux jeux commerciaux utilisent FMOD ; parmi les plus connus : Starcraft II, World of Warcraft : Cataclysm, Crysis 2, etc.

sl existe plusieurs versions de pwyhD en prtiulier elle destine une utilistion sous des y dits hituels @vinuxD indowsD wF F FAD elle s9ppelle pwyh ix rogrmmers esF lhrgez don l version de pwyh ix orrespondnt votre yF renez l version dite  stle F ri(ez en prtiulier si vous vez un y QP its ou TR its @sous indowsD fites un li droit sur  yrdinteur D puis  roprits pour le svoirAF  lhrger pwyh gode we X QHIWQR 

Installer FMOD
v9instlltion fontionne sur le mme prinipe que les utres iliothquesD omme l hvF ve (hier que vous vez tlhrg est normlement un exutle @sous indowsAD ou une rhive @Fdmg sous wD FtrFgz sous vinuxAF te vis dtiller ii l produre sous indowsD mis el fontionne sur le mme prinipe sous w y et vinuxF IF snstllez pwyh ix sur votre disqueF ves (hiers dont nous vons esoin seE ront pls dns un rpertoire similire eluiEi X C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\apiF PF hns e dossierD vous trouverez l hvv de pwyh ix @fmodex.dllA pler dns le rpertoire de votre projetF v9utre hvvD fmodexL.dllD sert e'etuer du RSS

CHAPITRE 27. JOUER DU SON AVEC FMOD

doggeF xous n9en ferons ps iiF etenez surtout que 9est le (hier fmodex.dll que vous devrez livrer ve votre progrmmeF QF hns le dossier api/incD vous trouverez les .hF lezEles t des utres .h dns le dossier de votre shiF r exemple Code Blocks/mingw32/include/fmodex @j9i r un dossier spil pour pwyh omme pour hvAF RF hns le dossier api/libD ruprez le (hier qui orrespond votre ompilteurF n (hier texte doit vous indiquer quel (hier vous devez prendre X ! i vous utilisez gode floksD don le ompilteur mingwD opiez libfmodex.a dns le dossier lib de votre shiF hns le s de gode floksD 9est le dossier CodeBlocks/mingw32/lib Y ! i vous utilisez isul gCCD ruprez le (hier fmodex_vc.libF SF in(nD et 9est peutEtre le plus importntD il y un dossier documentation dns le rpertoire de pwyh ixF xormlementD des rouris ont t rs dns le menu Dmarrer vers ette doumenttionF qrdez un il dessusD r nous ne pourrons ps douvrir toutes les fontionnlits de pwyh ix dns e oursF ous en urez trs ertinement esoin dns peu de tempsF sl reste on(gurer notre projetF v enoreD 9est omme les utres fois X vous ouvrez votre projet ve votre shi fvori et vous joutez le (hier .a @ou .libA l liste des (hiers que le linker doit ruprerF ous gode floks @j9i l9impression de me rpterAD menu Project > Build OptionsD onglet LinkerD liquez sur Add et indiquez o se trouve le (hier .aF i on vous demnde  ueep s reltive pth c D je vous onseille de rpondre nonD mis de toute mnire el devrit fontionner dns les deux sF pwyh ix est instllD voyons rpidement de quoi il est onstituF

Initialiser et librer un objet systme


v liririe pwyh ix est disponile pour les deux lngges g et gCCF prtiulrit 9est que les dveloppeurs de ette liririe ont grd une ertine ohrene de syntxe dns les deux lnggesF ve premier vntge est que si vous pprenez mnipuler pwyh ix en gD vous svez le fire en gCC WS7F

Inclure le header
evnt toute hoseD vous vez d le fire instintivement mintennt mis ne ote rien de le priserD il fut inlure le (hier .h de pwyhF
1

5 inlude ` fmodex G fmod Fh b

t9i pl e (hier dns un sousEdossier fmodexF edptez ette ligne en fontion de l position du (hier si 9est di'rent hez vousF i vous tes sous vinuxD l9instlltion se fit utomtiquement dns le dossier fmodexF RST

INITIALISER ET LIBRER UN OBJET SYSTME

Crer et initialiser un objet systme


n ojet systme est une vrile qui nous servir tout u long du progrmme d(nir des prmtres de l liririeF ppelezEvous qu9ve hv pr exempleD il fllit initiliser l li expliitement ve une fontionF siD le mode d9emploi est un petit peu di'rent X u lieu d9initiliser toute l liririeD on trville ve un ojet dont le rle est de d(nir le omportement de elleEiF our rer un ojet systmeD il su0t de dlrer un pointeur sur le type FMOD_SYSTEMF r exemple X
1

pwyhiw B system Y

our llouer dns l mmoire et ojet systmeD on utilise l fontion FMOD_System_Create dont voii le prototype X
1 2 3

pwyhiv pwyhystemgrete @ pwyhiw BB system AY

emrquons que ette fontion prend en prmtre un pointeur sur un pointeur de FMOD_SYSTEMF ves plus giles d9entre vous uront remrqu que lors de l dlrtion du pointeur sur FMOD_SYSTEMD il n9 ps t llou ve malloc() ou une utre fontionF g9est justement l rison pour lquelle l fontion FMOD_System_Create prend un tel prmtre pourD entre utresD llouer le pointeur systemF gonrtementD prs voir dlr notre ojet systmeD il su0t de fire X
1 2

pwyhiw B system Y pwyhystemgrete @8 system A Y

oilD mintennt on dispose d9un ojet systme llouD il ne reste plus qu9 l9initiliserF our e fireD on utilise l fontion FMOD_System_Init dont le prototype est X
1 2 3 4 5 6

pwyhiv pwyhystemsnit @ pwyhiw B system D int mxhnnels D pwyhsxspveq flgs D void B extrdriverdt AY

! ve prmtre system est le prmtre qui nous intresse le plusD r 9est le pointeur qu9on veut initiliserF ! ve prmtre maxchannels est le nomre mximum de nux que devr grer pwyhF in d9utres termesD 9est le nomre mximl de sons qui pourront tre jous en mme tempsF out dpend de l puissne de votre rte son Y on onseille gnrlement une vleur de QP @e ser su0snt pour l pluprt des petits jeuxAF our infoD pwyh peut thoriquement grer jusqu9 IHPR nux di'rentsD mis e niveu risque de euoup fire trviller votre ordinteur 3 ! ve prmtre flag ne nous intresser ps normment dns e ours Y on se ontenE ter de lui donner l vleur FMOD_INIT_NORMALF RSU

CHAPITRE 27. JOUER DU SON AVEC FMOD

! ve prmtre extradriverdata ne nous intresser ps non plusD et on lui donner omme vleur NULLF r exempleD pour dlrerD llouer et initiliser un ojet systmeD on fer omme suit X
1 2 3

pwyhiw B system Y pwyhystemgrete @8 system A Y pwyhystemsnit @ system D P D pwyhsxsxywev D xvv A Y

wintenntD nous disposons d9un ojet systme prt l9emploiF

Fermer et librer un objet systme


yn ferme puis on lire un ojet systme ve deux fontions X
1 2

pwyhystemglose @ system A Y pwyhystemelese @ system A Y

eiEje vriment esoin de ommenter e ode c

Les sons courts


xous ommenerons pr tudier les sons ourtsF n  son ourt D omme je l9ppelleD est un son qui dure gnrlement quelques seondes @prfois moins d9une seondeA et qui est gnrlement destin tre jou rgulirementF uelques exemples de sons ourts X ! un ruit de lle Y ! un ruit de ps Y ! un tiEt @pour fire stresser le joueur vnt l (n d9un ompte reoursA Y ! des ppludissements Y ! etF frefD orrespond tous les sons qui ne sont ps des musiquesF qnrlementD es sons sont tellement ourts qu9on ne prend ps l peine de les ompresserF yn les trouve don le plus souvent sous le formt e non ompressF

Trouver des sons courts


evnt de ommenerD il serit ien de onntre quelques sites qui proposent des nques de sonsF in e'etD tout le monde ne veut ps forment enregistrer les sons hez soiF tome ienD le net regorge de sons ourtsD gnrlement u formt eF y les trouver c peut prtre teD on n9y pense ps forment @et pourtnt on devritAD mis qoogle est notre miF eu hsrdD je tpe  pree ounds D e qui signi(e  sons grtuits en nglisD et oumF F F des entines de millions de rsultts 3 RSV

LES SONS COURTS

ien qu9ve les sites de l premire pgeD vous devriez trouver votre onheurF ersonE nellementD j9i retenu FindSounds.comD un moteur de reherhe pour sonsF te ne sis ps si 9est le meilleurD mis en tout s il est ien ompletF  pindoundsFom gode we X VUTVUH 
Si vous ne savez pas quels mots-cls taper pour votre recherche, rendez-vous sur la page des exemples de recherche. Certes, il faut connatre quelques mots d'anglais (mais de toute faon, si vous voulez programmer, comment voulez-vous faire sans tre au moins capables de lire l'anglais ?).

in reherhnt  gun D on trouve des tonnes de sons de tir de fusil Y en tpnt  door on trouve des ruits de porte @(gure PUFIAD etF

Les tapes suivre pour jouer un son


v premire tpe onsiste hrger en mmoire le son que vous voulez jouerF sl est onseill de hrger tous les sons qui seront frquemment utiliss dns le jeu ds le dut du progrmmeF ous les lirerez l (nF in e'etD une fois que le son est hrg en mmoireD s leture est trs rpideF
Le pointeur

remire tpe X rer un pointeur de type FMOD_SOUND qui reprsenter notre sonF
1

pwyhyxh B tir a xvv Y

Charger le son

heuxime tpe X hrger le son ve l fontion FMOD_System_CreateSoundF ille prendF F F S prmtres X ! n objet systme dont on prl prdemmentF fien sr et ojet doit tre prt l9emploi @dlrD llou et initilisAF ! ve nom du chier son hrgerF sl peut tre de formt eD wQD yqqD etF outefoisD il vut mieux hrger des sons ourts @quelques seondes mximumA plutt que des sons longsF in e'etD l fontion hrger et doder tout le son en mmoireD e qui peut prendre de l ple si le son est une musique 3 ! ve troisime prmtre est un prmtre flagF sl nous intresse prtiulirement iiD r 9est gre lui qu9on pourr dire pwyh que le son qu9on veut jouer est un son ourtF our eiD on utiliser l vleur FMOD_CREATESAMPLEF ! ve qutrime prmtre ne nous intresse psD et on mettr NULL omme vleurF ! ve dernier prmtre est du type FMOD_SOUND ** soundD et 9est e pointeurEl qu9on utiliser pr l suite pour jouer notre sonF in quelque sorteD on peut onsidrer que e pointeur pointer l9venir vers notre sonF RSW

CHAPITRE 27. JOUER DU SON AVEC FMOD

Figure PUFI ! pindoundsFom propose des sons de porte

RTH

LES SONS COURTS

oii un exemple de hrgement X


1

pwyhystemgreteound @ system D 4 pn F wv 4 D pwyhgieiewvi D H D 8 tir A Y

siD je hrge le son pan.wavF ve pointeur tir fer rfrene e son pr l suiteF
Si vous voulez faire les tests en mme temps que moi, je vous propose de tlcharger le son pan.wav, que j'utiliserai galement par la suite.

lhrger le son gode we X UUPTIS  i tout se psse ienD l fontion renvoie l vleur FMOD_OKF inonD 9est qu9il y eu un prolme lors de l9ouverture du (hier udio @(hier orrompu ou inexistnt pr exempleAF
Jouer le son

ous voulez jouer le son c s de prolme ve l fontion FMOD_System_PlaySound 3 sl su0t de lui donner un ojet systme prt l9emploiD un numro de nl sur lequel jouer insi que le pointeur sur le sonD et d9utres prmtres qui ne nous intressent ps et qu9on mettr NULL ou 0F our le numro de nlD ne vous prenez ps l tte et envoyez FMOD_CHANNEL_FREE pour lisser pwyh grer F
1

pwyhystemlyound @ system D pwyhgrexxivpii D tir D H D xvv A Y

Librer le son de la mmoire

vorsque vous n9vez plus esoin du sonD vous devez le lirer de l mmoireF sl n9y rien de plus simpleD il su0t d9indiquer le pointeur lirer ve l fontion FMOD_Sound_Release
1

pwyhoundelese @ tir A Y

Exemple : un jeu de tir


ve mieux mintennt est de rsumer tout e qu9on vu dns un s onret de proE grmme rit en hvF sl n9y vit rien de ompliqu etD normlementD vous ne devriez voir uune di0ult rliser et exerieF
Le sujet

otre mission est simple X rer un jeu de tirF fonD on ne v ps rliser un jeu omplet iiD mis juste l gestion du viseurF te vous i justement fit un petit viseur sous int @(gure PUFPAF RTI

CHAPITRE 27. JOUER DU SON AVEC FMOD

Figure PUFP ! ve viseur

frefD voil les ojetifs X ! pond de fentre X noirF ! ointeur de l souris X invisileF ! v9imge du viseur est litte l position de l souris lorsqu9on l dpleF ettention X il fut que le gixi de l9imge soit pl u niveu du pointeur de l sourisF ! und on liqueD le son pan.wav doit tre jouF peut tre le dut d9un jeu de tirF rop file c ykD lors vous de jouer 3
La correction

oii le ode omplet X


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

5 inlude 5 inlude 5 inlude 5 inlude 5 inlude

` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` hv G hvimge Fh b ` fmodex G fmod Fh b

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B viseur a xvv Y hvivent event Y hvet position Y int ontinuer a I Y pwyhiw B system Y pwyhyxh B tir Y pwyhiv resultt Y GB gr tion et initilistion d ' un ojet syst me BG pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB ghrgement du son et v rifition du hrgement BG resultt a pwyhystemgreteound @ system D 4 pn F wv 4 D pwyhgieiewvi D H D 8 tir A Y if @ resultt 3a pwyhyu A { fprintf @ stderr D 4 smpossile de lire pn F wv n 4 A Y exit @ ispesvi A Y }

26 27 28 29 30

RTP

LES SONS COURTS


31 32 33 34 35 36

GB snitilistion de l hv BG hvsnit @ hvsxsshiy A Y hvhowgursor @ hvhsefvi A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du son ve pwyh 4 D xvv A Y viseur a swqvod @4 viseur F png 4 A Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyxhyx X GB vorqu ' on lique D on joue le son BG pwyhystemlyound @ system D pwyhgrexxivpii D tir D H D xvv A Y rek Y se hvwyiwysyx X GB vorsqu ' on d ple l souris D on ple le entre du viseur l position de l souris FFF h ' o notmment le 4 viseur E b w G P 4 pour r ussir fire el BG position F x a event F motion F x E @ viseur E b w G P A Y position F y a event F motion F y E @ viseur E b h G P A Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ viseur D xvv D ern D 8 position A Y hvplip @ ern AY

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

53 54 55

56

57 58 59 60 61 62

63 64 65 66 67 68 69 70 71

GB yn ferme l hv BG hvpreeurfe @ viseur A Y hvuit @A Y GB yn li re le son et on ferme et li re l ' ojet syst me BG pwyhoundelese @ tir A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y

72 73 74

RTQ

CHAPITRE 27. JOUER DU SON AVEC FMOD


75 76 77

return isggi Y

gopier e ode gode we X SRRWRQ  v (gure PUFQ vous donne un peru du miniEjeuD mis le mieux est enore de voir le rsultt en vido ve le son sur le we 3

oir l vido gode we X QIUVUP  siD j9i hrg pwyh vnt l hv et je l9i lir prs l hvF sl n9y ps de rgles u niveu de l9ordre @j9uris tout ussi ien pu fire l9inverseAF t9i hoisi de hrger l hv et d9ouvrir l fentre prs le hrgement de pwyh pour que le jeu soit prt tre utilis ds que l fentre s9ouvre @sinon il urit peutEtre fllu ttendre quelques milliseondes le temps que pwyh se hrgeAF gei tntD lire vous de hoisir l9ordre que vous voulez Y 9est un dtilF ve ode estD je penseD su0smment ommentF sl n9y ps de pige prtiulierD ps de nouveut frssnteF yn noter l  petite di0ult qui onsistit litter le entre du viseur u niveu du pointeur de l sourisF ve lul de l position de l9imge est fit en fontionF RTR

Figure PUFQ ! eperu du miniEjeu du viseur

LES MUSIQUES (MP3, OGG, WMA. . .)

our eux qui n9urient ps enore ompris l di'reneD voii de quoi il retourneF our l9osionD j9i rtiv l90hge du pointeur de l souris pour qu9on voie omment est pl le viseur pr rpport u pointeurF !
1 2

Code incorrect (viseur mal plac)


position F x a event F motion F x Y position F y a event F motion F y Y

!
1 2

Code correct (viseur bien plac)


position F x a event F motion F x E @ viseur E b w G P A Y position F y a event F motion F y E @ viseur E b h G P A Y

Ides d'amlioration

ge ode est l se d9un jeu de shootF ous vez le viseurD le ruit de tirD il ne vous reste plus qu9 fire pprtre ou d(ler des ennemis et mrquer le sore du joueurF gomme d9hitudeD 9est vous de jouerF ous vouliez fire un jeu c u9 el ne tienneD vous vez le niveu mintenntD et mme un ode de se pour dmrrer un jeu de tir 3 u9estEe que vous ttendezD frnhement c
Bien sr, les forums du Site du Zro sont toujours l pour vous aider si vous tes bloqus un moment de la cration de votre jeu. Il est normal de rencontrer des dicults, quel que soit le niveau que l'on ait.

porum du ite du ro gode we X RUQSUQ 

Les musiques (MP3, OGG, WMA. . .)


in thorieD le )g FMOD_CREATESAMPLE permet de hrger n9importe quel type de sonD y ompris les formts ompresss wQD yqqD weF ve prolme onerne les sons  longs D 9estEEdire les musiquesF in e'etD une musique dure en moyenne Q R minutesF yrD ve e )gD l fontion FMOD_System_CreateSound hrge tout le chier en mmoire @et 9est l version dompresse qui est mise en mmoireD don prend euoup de ple 3AF i vous vez un son long @on v prler de  musique dornvntAD il est prfrle de le hrger en streaming D 9estEEdire d9en hrger de petits outs u fur et mesure de l leture Y 9est d9illeurs e que font tous les leteurs udioF RTS

CHAPITRE 27. JOUER DU SON AVEC FMOD

Trouver des musiques


vD on rentre en terrin minD pineuxD explosif @omme vous prfrezAF in e'etD l pluprt des musiques et hnsons que l9on onnt sont soumises u droit d9uteurF wme si vous ne fites qu9un petit progrmmeD il fut verser une redevne l egiw @en prne du moinsAF honD mis prt les wQ soumis droit d9uteurD que nous resteEtEil c reureusementD il y des hnsons lires de droit 3 ves uteurs vous utorisent di'user lirement leurs hnsonsD il n9y don uun prolme pour que vous les utilisiez dns vos progrmmesF
Si votre programme est payant, il faudra en parler l'artiste, moins que celui-ci n'autorise explicitement une utilisation commerciale de son uvre. Une chanson libre de droit peut tre tlcharge, copie et coute librement, mais a ne veut pas dire qu'on vous autorise vous faire de l'argent sur le dos des artistes !

fonD l question mintennt est X  o trouver des musiques lires de droit c F yn pourrit fire une reherhe de  pree wusi sur qoogleD mis l pour le oup il n9est ps notre miF in e'etD llez svoir pourquoiD on eu tper le mot  pree D on tome qund mme sur des sites qui nous proposent d9heter des musiques 3 sl existe heureusement des sites qui sont ddis l musique lire de droitF vD je vous reommnde tmendo qui est un trs on siteD mis e n9est ps le seul qui existe dns le domineF  tmendoFom gode we X PTPUWV  ves hnsons sont lsses pr styleF ous vez euoup de hoixF yn y trouve du onD du moins onD du trs trs onD du trs trs nulF F F in fitD tout dpend de vos gots et de votre reptivit ux di'rents styles de musiqueF he prfreneD prenez une hnson qui peut servir de musique de fond et qui orrespond ien l9univers de votre jeuF our informtionD ette hnson provient de l9lum  vies nd peehes du groupe frnis  rype F our en svoir plus sur  rype D vous pouvez visiter leur pge wypeF  wype de  rype gode we X VQWPSH 
Je suis parfaitement conscient que les gots et les couleurs ne se discutent pas. N'ayez donc pas peur de prendre une autre musique si celle-ci ne vous plaisait pas.

t9i don tlhrg l9lum et je vis utiliser l hnson  rome u formt wQF ous pouvez l tlhrger diretement depuis le ite du ro si vous voulez fire des tests en mme temps que moiF g9est un des vntges de l musique lire X on peut l RTT

LES MUSIQUES (MP3, OGG, WMA. . .)

opier G distriuer lirementD don ne nous gnons psF  lhrger  rome gode we X WPTPHV 

Les tapes suivre pour jouer une musique


v seule di'rene est le )g donn l fontion FMOD_System_CreateSoundF eu lieu de lui donner le )g FMOD_CREATESAMPLED on lui donner les )gs suivnts X FMOD_SOFTWARED FMOD_2D et FMOD_CREATESTREAMF xe vous ttrdez ps trop sur l signi(tion de es )gs Y elui qui nous intresse le plus est FMOD_CREATESTREAMD r 9est lui qui dir pwyh de hrger l musique out pr outF our utiliser tous es )gs en mme tempsD on utiliser l9oprteur logique | de ette fon X
1

pwyhystemgreteound @ system D 4 mmusique F mpQ 4 D pwyhypei | pwyhPh | pwyhgieiiew D H D 8 sound A Y

it voil le trvil 3 wis e n9est ps toutF hns le s d9une musiqueD il peut tre ien de svoir modi(er le volumeD grer les rptitions de l hnsonD l mettre en puse ou mme l9rrterF g9est e genre de hoses que nous llons voir mintenntF wis vnt D nous urons esoin de trviller sur les nux diretementF
Rcuprer un canal ou un groupe de canaux

hns des versions prdentes de l liririe pwyhD le simple numro d9identi(tion d9un nl su0sit pour pouvoir modi(er le volume ou ien mettre en puse une hnsonF hepuis pwyh ixD il y eu un petit hngement X prtir du numro de nlD on utilise une fontion qui fournit un pointeur vers e nlF v9ide est reste l mmeD seule l9implmenttion hngF n nl est d(ni omme tnt du type FMOD_CHANNELD et l fontion qui permet de ruprer un nl prtir d9un numro id est FMOD_System_GetChannelF r exempleD si j9i un ojet systme system et que je veux ruprer le nl nWD il fut fire X
1 2

pwyhgrexxiv B hnnel Y pwyhystemqetghnnel @ system D W D 8 hnnel A Y

ien de plus simple 3 ! ve premier prmtre est l9ojet systmeF ! ve deuxime est le numro id du nlF ! ve troisime est l9dresse du pointeur o l9on veut stoker l9informtion voulueF ne fois qu9on ur notre pointeur de nlD on pourr filement mnipuler l musique @modi(er le volumeD mettre en puseF F FAF xotez qu9on peut ussi ruprer tout un groupe de nux en un seul pointeur Y vite de refire l mme mnipultion pour hque nl distintF ve type d9un groupe RTU

CHAPITRE 27. JOUER DU SON AVEC FMOD

de nux est FMOD_CHANNELGROUPD et une des fontions qui nous intresse le plus est FMOD_System_GetMasterChannelGroupD r elle permet d9otenir un pointeur vers l totlit des nux utiliss pr un ojet systmeF ve mode de fontionnement de ette fontion est identique l prdenteF
Modier le volume

our modi(er le volumeD on peut le fire soit pour un nl prisD soit pour tous les E nuxF r exempleD pour le fire pour tous les nuxD il fut d9ord ruprer un poinE teur vers le groupe de nuxD puis utiliser l fontion FMOD_ChannelGroup_SetVolume dont le prototype est X
1 2 3 4

pwyhiv pwyhghnnelqroupetolume @ pwyhgrexxivqy B hnnelgroup D flot volume AY

ve prmtre channelgroup est elui qu9on vient de ruprerF ve prmtre volume est du type floatD tel que HFH orrespond u sileneD et IFH orrespond une leture pleine puissne @9est ette vleur qui est pr dfutAF
Rptition de la chanson

yn souvent esoin de rpter l musique de fondF g9est justement e que propose l fontion FMOD_Sound_SetLoopCountF ille prend P prmtres X ! ve pointeur vers l hnsonF ! ve nomre de fois qu9elle doit tre rpteF i vous mettez ID l hnson ser don lue deux foisF i vous mettez un nomre ngtif @omme EIAD l hnson ser rpte l9in(niF eve e ode soureD notre musique ser don rpte l9in(ni X
1

pwyhoundetvoopgount @ musique D EI A Y

Pour que la rptition fonctionne, il faut envoyer FMOD_LOOP_NORMAL en troisime paramtre de la fonction FMOD_System_CreateSound.
Mettre en pause la chanson

sl y ii P fontions onntre X ! FMOD_Channel_GetPaused(canal, &etat) X indique si l hnson joue sur le nl indiqu est en puse ou psF ille met vri dns etat si l hnson est en puseD fux si elle est en trin d9tre joueF RTV

LES MUSIQUES (MP3, OGG, WMA. . .)

hnson sur le nl indiquF invoyez I @vriA pour mettre en puseD H @fuxA pour rtiver l letureF ge out de ode de fentre hv met en puse l hnson si on ppuie sur l touhe P du lvierD et l rtive si on ppuie nouveu sur PF
1 2 3 4 5 6 7 8

FMOD_Channel_SetPaused(canal, etat) X met en puse ou rtive l leture de l

se hvuihyx X if @ event F key F keysym F sym aa hvup A GG i on ppuie sur { pwyhfyyv ett Y pwyhghnnelqetused @ nl D 8 ett A Y if @ ett aa I A GG i l hnson est en puse pwyhghnneletused @ nl D H AY GG yn enl ve l puse else GG inon D elle est en ours de leture pwyhghnneletused @ nl D I A Y GG yn met en puse

9 10

11 12

} rek Y

i on veut ppliquer le mme tritement tous les nux runisD on utiliser les fonE tions FMOD_ChannelGroup_GetPaused et FMOD_ChannelGroup_SetPausedD l seule di'rene qu9il fut fire psser omme prmtre un FMOD_CHANNELGROUP u lieu d9un FMOD_CHANNELF
Stopper la lecture

sl su0t d9ppeler FMOD_Channel_Stop pour stopper une musique sur un nlD ou ien FMOD_ChannelGroup_Stop pour un ensemle de nuxF yn leur envoie respetivement le pointeur vers le nl ou ien le pointeur vers le groupe de nuxF
Et bien d'autres choses

yn peut fire euoup d9utres hosesD mis je ne vis ps vous les numrer toutes iiD utnt lire l do 3 te vous invite don y jeter un il si vous herhez des fontions supplmentiresF
Librer la mmoire

our dhrger l musique de l mmoireD ppelez FMOD_Sound_Release et donnezElui le pointeurF


1

pwyhoundelese @ musique A Y

RTW

CHAPITRE 27. JOUER DU SON AVEC FMOD

Code complet de lecture du MP3


ve ode iEdessous vous montre un progrmme jount l musique  rome qu9on rupre sur tmendoF v musique est joue ds le dut du progrmmeF yn peut l mettre en puse en ppuynt sur PF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

5 inlude 5 inlude 5 inlude 5 inlude 5 inlude

` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` hv G hvimge Fh b ` fmodex G fmod Fh b

int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B pohette a xvv Y hvivent event Y hvet position Y int ontinuer a I Y pwyhiw B system Y pwyhyxh B musique Y pwyhiv resultt Y pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB yn ouvre l musique BG resultt a pwyhystemgreteound @ system D 4 hypehome F mpQ 4 D pwyhypei | pwyhPh | pwyhgieiiew D H D 8 musique A Y GB yn v rifie si elle ien t ouverte @ swyex A BG if @ resultt 3a pwyhyu A { fprintf @ stderr D 4 smpossile de lire le fihier mpQ n 4 A Y exit @ ispesvi A Y } GB yn tive l r p tition de l musique l ' infini BG pwyhoundetvoopgount @ musique D EI A Y GB yn joue l musique BG pwyhystemlyound @ system D pwyhgrexxivpii D musique D H D xvv A Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y

24 25 26 27 28 29 30 31 32 33 34 35 36

37 38 39 40

RUH

LES MUSIQUES (MP3, OGG, WMA. . .)


41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

hvwetgption @ 4 qestion du son ve pwyh 4 D xvv A Y pohette a swqvod @ 4 hypeliesndspeehes F jpg 4 A Y position F x a H Y position F y a H Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X if @ event F key F keysym F sym aa hvup A GG i on ppuie sur { pwyhgrexxivqy B nl Y pwyhfyyv ett Y pwyhystemqetwsterghnnelqroup @ system D 8 nl A Y pwyhghnnelqroupqetused @ nl D 8 ett A Y if @ ett A GG i l hnson est en puse pwyhghnnelqroupetused @ nl D HA Y GG yn enl ve l puse else GG inon D elle est en ours de leture pwyhghnnelqroupetused @ nl D IA Y GG yn tive l puse

56 57 58 59

60 61 62 63

64 65

66 67 68 69 70

} rek Y

71 72 73 74 75 76 77 78 79 80 81 82 83

hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ pohette D xvv D ern D 8 position A Y hvplip @ ern AY

pwyhoundelese @ musique A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y hvpreeurfe @ pohette A Y hvuit @A Y } return isggi Y

RUI

CHAPITRE 27. JOUER DU SON AVEC FMOD

gopier e ode gode we X TWUSST  ristoire d9voir utre hose qu9une fentre noireD j9i mis l pohette de l9lum en imge de fondF our pprier pleinement le rsulttD je vous invite regrder l vido du progrmme en  ours d9exutionF oir l vido gode we X SIUSPT 

En rsum
! v hv possde des fontionnlits udio limites et il est plutt onseill de se penher sur une iliothque ddie u sonD omme pwyhF ! yn distingue P types de sons ve pwyh X des sons ourts @un ruit de ps pr exempleA et des sons longs @une musique pr exempleAF ! ghun de es types se lit ve l mme fontion mis ve des )gs di'rents en optionF ! pwyh permet de jouer simultnment plusieurs sons di'rents l9ide de plusieurs nuxF

RUP

Chapitre

28
Dicult :

TP : visualisation spectrale du son

e chapitre de travaux pratiques va vous proposer de manipuler la SDL et FMOD simultanment. Cette fois, nous n'allons pas travailler sur un jeu. Certes, la SDL est tout particulirement adapte cela, mais on peut l'utiliser dans d'autres domaines. Ce chapitre va justement vous prouver qu'elle peut servir autre chose. Nous allons raliser ici une visualisation du spectre sonore en SDL. Cela consiste acher la composition du son que l'on joue, par exemple une musique. On retrouve cela dans de nombreux lecteurs audio. C'est amusant et ce n'est pas si compliqu que a en a l'air !

RUQ

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

ge hpitre v nous permettre de trviller utour de notions que nous vons douE vertes remment X ! l gestion du temps Y ! l iliothque pwyhF xous douvrirons en outre omment modi(er une surfe pixel pr pixelF v (gure PVFI vous donne un peru du progrmme que nous llons rer dns e hpitreF

Figure PVFI ! isulistion du spetre sonore

g9est le genre de visulistion qu9on peut retrouver dns des leteurs udio tels que inmpD indows wedi lyer ou enore emrouF it pour ne rien gherD omme je vous l9i dit e n9est ps ien di0ile fireF h9illeursD ontrirement u wrio okonD ette fois 9est vous qui llez trvillerF vous fer un trs on exerieF

Les consignes
ves onsignes sont simplesF uivezEles ps ps dns l9ordreD et vous n9urez ps d9enE nuisF

1/ Lire un MP3
our ommenerD vous devez rer un progrmme qui lit un (hier wQF ous n9vez qu9 reprendre l hnson  rome du groupe rype que nous vons utilise dns le hpitre sur pwyh pour illustrer le fontionnement de l leture d9une musiqueF RUR

LES CONSIGNES

lhrger l hnson gode we X WPTPHV  i vous vez ien suivi le hpitre sur pwyhD il ne vous fudr ps plus de quelques minutes pour rriver le fireF te vous onseille u pssge de pler le wQ dns le dossier de votre projetF

2/ Rcuprer les donnes spectrales du son


our omprendre omment l visulistion spetrle fontionneD il est indispensle que je vous explique un peu omment el fontionne l9intrieur @ps dns le dtil non plusD sinon v se trnsformer en ours de mthsAF n son peut tre doup en frquenesF gertines frquenes sont ssesD d9utres moyennesD et d9utres hutesF ge que nous llons fire dns notre visulistionD 9est 0her l quntit de hune de es frquenes sous forme de rresF lus l rre est grndeD plus l frquene est utilise @(gure PVFPAF

Figure PVFP ! v visulistion des frquenes d9un son

ur l guhe de l fentreD nous fisons don pprtre les sses frquenesD et sur l droite les hutes frquenesF
Mais comment rcuprer les quantits de chaque frquence ?

pwyh nous mhe le trvilF yn peut fire ppel l fontion FMOD_Channel_GetSpectrumF RUS

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

on prototype est le suivnt X


1 2 3 4 5 6 7

pwyhiv pwyhghnnelqetpetrum @ pwyhgrexxiv B hnnel D flot B spetrumrry D int numvlues D int hnneloffset D pwyhhppsxhy windowtype AY

it voii ses prmtres X ! ve nl sur lequel l musique est joueF hon a priori il fut ruprer un pointeur vers e nlF ! n tleu de floatF sl fut que e tleu soit dj llouD sttiquement ou dynE miquementD pour permettre pwyh de le remplir orretementF ! v tille du tleuF gette tille doit oligtoirement tre une puissne de PD pr exemple SIPF ! ge prmtre sert d(nir quelle sortie on s9intresseF r exemple si vous tes en stroD H veut dire guheD et I veut dire droiteF ! ge prmtre est un peu plus omplexeD et ne nous intresse ps vriment dns e oursF yn se ontenter de lui donner l vleur FMOD_DSP_FFT_WINDOW_RECTF
Rappel : le type float est un type dcimal, au mme titre que double. La dirence entre les deux vient du fait que double est plus prcis que float, mais dans notre cas, le type float est susant. C'est celui utilis par FMOD ici, donc c'est celui que nous devrons utiliser nous aussi.

in lirD on dlre notre tleu de float X


1

flot spetre SIP Y

insuiteD lorsque l musique est en trin d9tre joueD on demnde pwyh de remplir le tleu du spetre en fisnt pr exemple X
1

pwyhghnnelqetpetrum @ nl D spetre D SIP D H D pwyhhppsxhyig A Y

yn peut ensuite prourir e tleu pour otenir les vleurs de hune des frquenes X
1 2 3 4 5 6 7

spetre H GG pr quene l plus sse @ guhe A spetre I spetre P FFF spetre SHW spetre SIH spetre SII GG pr quene l plus hute @ droite A

ghque frquene est un nomre diml ompris entre H @rienA et I @mximumAF otre trvil v onsister 0her une rre plus ou moins grnde en fontion de l vleur que ontient hque se du tleuF RUT

LES CONSIGNES

r exempleD si l vleur est HFSD vous devrez trer une rre dont l huteur orresE pondr l moiti de l fentreF i l vleur est ID elle devr fire toute l huteur de l fentreF qnrlementD les vleurs sont ssez files @plutt prohes de H que de IAF te reomE mnde de multiplier pr PH toutes les vleurs pour mieux voir le spetreF ettention X si vous fites D vri(ez que vous ne dpssez ps I @rrondissez I s9il le futAF i vous vous retrouvez ve des vleurs suprieures ID vous risquez d9voir des prolmes pour trer les rres vertiles pr l suite 3
Mais les barres doivent bouger au fur et mesure du temps non ? Comme le son change tout le temps, il faut mettre jour le graphique. Comment faire ?

fonne questionF in e'etD le tleu de SIP float que vous renvoie pwyh change toutes les 25 ms @pour tre jour pr rpport u son tuelAF sl v don flE loir dns votre ode que vous relisiez le tleu de SIP )ots @en refisnt ppel FMOD_Channel_GetSpectrum toutes les PS msAD puis que vous mettiez jour votre grphique en rresF elisez le hpitre sur l gestion du temps en hv pour vous rppeler omment fireF ous vez le hoix entre une solution se de qetiks ou se de llksF pites e qui vous prt le plus fileF

4/ Raliser le dgrad
hns un premier tempsD vous pouvez rliser des rres de ouleur unieF ous pourrez don rer des surfesF sl devr y voir SIP surfes X une pour hque rreF ghque surfe fer don I pixel de lrge et l huteur des surfes vrier en fontion de l9intensit de hque frqueneF outefoisD je vous propose ensuite d9e'etuer une mliortion X l rre doit tendre vers le rouge lorsque le son devient de plus en plus intenseF in lirD l rre doit tre verte en s et rouge en hutF
Mais. . . une surface ne peut avoir qu'une seule couleur si on utilise SDL_FillRect(). On ne peut pas faire de dgrad !

in e'etF yn pourrit ertes rer des surfes de I pixel de lrge et I pixel de hut pour hque ouleur du dgrdD mis ferit vriment euoup de surfes grer et e ne serit ps trs optimis 3 gomment fitEon pour dessiner pixel pr pixel c te ne vous l9i ps ppris uprvntD r ette tehnique ne mritit ps un hpitre entierF ous llez voir en e'et que e n9est ps ien ompliquF in fitD l hv ne propose uune fontion pour dessiner pixel pr pixelF wis on le RUU

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

droit de l9rire nousEmmesF our e fireD il fut suivre es tpes mthodiquement dns l9ordre X IF pites ppel l fontion SDL_LockSurface pour nnoner l hv que vous llez modi(er l surfe mnuellementF gel  loque l surfe pour l hv et vous tes le seul y voir s tnt que l surfe est loqueF siD je vous onseille de ne trviller qu9ve une seule surfe X l9rnF i vous voulez dessiner un pixel un endroit pris de l9rnD vous devrez don loquer l surfe ecran X
hvvokurfe@ernAY

PF ous pouvez ensuite modi(er le ontenu de hque pixel de l surfeF gomme l hv ne propose uune fontion pour fire D il v flloir l9rire nousEmme dns notre progrmmeF gette fontionD je vous l donneF te l tire de l doumenttion de l hvF ille est un peu omplique r elle trville sur l surfe diretement et gre toutes les profondeurs de ouleurs @its pr pixelA possilesF s esoin de l retenir ou de l omprendreD opiezEl simplement dns votre progrmme pour pouvoir l9utiliser X
1 2 3 4 5

void setixel @ hvurfe B surfe D int x D int y D intQP pixel A { int pp a surfe E b formt E b fyteserixel Y intV B p a @ intV BA surfe E b pixels C y B surfe E b pith C x B pp Y swith @ pp A { se I X B p a pixel Y rek Y se P X B@ intIT BA p a pixel Y rek Y se Q X if @ hvfiyhi aa hvfsqixhsex A { p H a @ pixel bb IT A 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a pixel 8 Hxff Y } else { p H a pixel 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a @ pixel bb IT A 8 Hxff Y } rek Y se R X B@ intQP BA p a pixel Y

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

RUV

LA SOLUTION
30 31 32

rek Y

gopier e ode gode we X QIHUQR  ille est simple utiliserF invoyez les prmtres suivnts X ! le pointeur vers l surfe modi(er @ette surfe doit prllement voir t loque ve SDL_LockSurfaceA Y ! l position en sisse du pixel modi(er dns l surfe @xA Y ! l position en ordonne du pixel modi(er dns l surfe @yA Y ! l nouvelle ouleur donner e pixelF gette ouleur doit tre u formt Uint32 Y vous pouvez don l gnrer l9ide de l fontion SDL_MapRGB() que vous onnissez ien mintenntF QF in(nD lorsque vous vez (ni de trviller sur l surfeD il ne fut ps oulier de l dloquer en ppelnt SDL_UnlockSurfaceF
1

hvnlokurfe @ ern A Y

Code rsum d'exemple

i on rsumeD vous llez voir que 9est tout simpleF ge ode dessine un pixel rouge u milieu de l surfe ecran @don u milieu de l fentreAF
1 2

hvvokurfe @ ern A Y GB yn loque l surfe BG setixel @ ern D ern E b w G P D ern E b h G P D hvwpqf @ ern E b formt D PSS D H D H A A Y GB yn dessine un pixel rouge u milieu de l ' rn BG hvnlokurfe @ ern A Y GB yn d loque l surfe BG
1

eve ette se vous devriez pouvoir rliser des dgrds du vert u rouge F

La solution
elorsD omment vezEvous trouv le sujet c sl n9est ps ien di0ile pprhenderD il fut juste fire quelques lulsD surtout pour l rlistion du dgrdF g9est du niveu de tout le mondeD il fut juste r)hir un petit peuF gertins mettent plus de temps que d9utres pour trouver l solutionF i vous vez du mlD e n9est ps ien grveF ge qui ompteD 9est de (nir pr y rriverF uel que soit le projet dns lequel vous vous lnerezD vous urez forment des moments o il ne su0t ps de svoir progrmmer Y il fut ussi tre logique et ien r)hirF te vous donne le ode omplet iEdessousF sl est su0smment ommentF
1. Un indice : il faut utiliser des boucles. :-p

RUW

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON


1 2 3 4 5 6

5 inlude 5 inlude 5 inlude 5 inlude

` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` fmodex G fmod Fh b

8 9

10 11 12

5 define veqipixii SIP GB hys rester SIP imp rtivement r il y SIP rres @ orrespondnt ux SIP flots A BG 5 define reipixii RHH GB ous pouvez l fire vrier elle E l pr ontre BG 5 define esy @ reipixii G PSS F H A 5 define hivesepesgrsiwix PS GB emps en ms entre hque mise jour du grphe F PS ms est l vleur minimle F BG 5 define esvviigi SIP void setixel @ hvurfe B surfe D int x D int y D intQP pixel A Y int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y int ontinuer a I D huteurfrre a H D tempsetuel a H D tempsreedent a H D i a H D j a H Y flot spetre esvviigi Y GB snitilistion de pwyh EEEEEEEEEEEEEEEEEEEEEE yn hrge pwyh D l musique on lne l leture de l musique F BG pwyhiw B system Y pwyhyxh B musique Y pwyhgrexxiv B nl Y pwyhiv resultt Y pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB yn ouvre l musique BG resultt a pwyhystemgreteound @ system D 4 hypehome F mpQ 4 D pwyhypei | pwyhPh | pwyhgieiiew D H D 8 musique A Y GB yn v rifie si elle ien t ouverte @ swyex A BG if @ resultt 3a pwyhyu A

13 14 15 16 17 18

19 20 21 22 23 24

25 26 27 28 29 30 31 32 33 34 35 36 37 38

39 40 41

RVH

LA SOLUTION
42 43 44 45 46 47 48

{ }

fprintf @ stderr D 4 smpossile de lire le fihier mpQ n 4 A Y exit @ ispesvi A Y

GB yn joue l musique BG pwyhystemlyound @ system D pwyhgrexxivpii D musique D H D xvv A Y GB yn r up re le pointeur du nl BG pwyhystemqetghnnel @ system D H D 8 nl A Y GB snitilistion de l hv EEEEEEEEEEEEEEEEEEEEEEEE yn hrge l hv D on ouvre l fen tre et on rit dns s rre de titre yn r up re u pssge un pointeur vers l surfe ern ui ser l seule surfe utilis e dns e progrmme BG hvsnit @ hvsxsshiy A Y ern a hvetideowode @ veqipixii D reipixii D QP D hvpegi | hvhyfvifp A Y hvwetgption @ 4 isulistion spetrle du son 4 D xvv A Y GB foule priniple BG while @ ontinuer A { hvollivent @8 event A Y GG yn doit utiliser ollivent r il ne fut ps ttendre d ' v nement de l ' utilisteur pour mettre jour l fen tre swith @ event F type A { se hvs X ontinuer a H Y rek Y } GB yn effe l ' rn hque fois vnt de dessiner le grphe @ fond noir A BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY GB qestion du temps EEEEEEEEEEEEEEEEE yn ompre le temps tuel pr rpport u temps pr dent @ dernier pssge dns l oule A i fit moins de PS ms @ hivesepesgrsiwix A elors on ttend le temps qu ' il fut pour qu ' u moins

49 50 51 52 53 54 55 56

57 58 59 60 61

62 63 64 65 66 67 68

69 70 71 72 73 74 75 76

77

78 79 80 81

82 83

RVI

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON


PS ms se soient oul es F yn met ensuite jour tempsreedent ve le nouveu temps BG tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent ` hivesepesgrsiwix A { hvhely @ hivesepesgrsiwix E @ tempsetuel E tempsreedent A A Y } tempsreedent a hvqetiks @A Y GB hessin du spetre sonore EEEEEEEEEEEEEEEEEEEEEEEE g ' est l prtie l plus int ressnte F sl fut r fl hir un peu l f on de dessiner pour y rriver D mis ' est tout fit fisle @ l preuve AF yn remplit le tleu de SIP flots vi pwyhghnnelqetpetrum @A yn trville ensuite pixel pr pixel sur l surfe ern pour dessiner les rres F yn fit une premi re oule pour prourir l fen tre en lrgeur F v seonde oule prourt l fen tre en huteur pour dessiner hque rre F

84

85 86 87

88 89

90 91 92 93 94 95 96

97 98

99

100

101

102 103 104

BG

105

GB yn remplit le tleu de SIP flots F t ' i hoisi de m ' int resser l sortie guhe BG pwyhghnnelqetpetrum @ nl D spetre D esvviigi D H D pwyhhppsxhyig A Y hvvokurfe @ ern A Y GB yn loque l surfe ern r on v diretement modifier ses pixels BG GB fygvi I X on prourt l fen tre en lrgeur @ pour hque rre vertile A BG for @ i a H Y i ` veqipixii Y i CCA { GB yn lule l huteur de l rre vertile qu ' on v dessiner F spetre i nous renvoie un nomre entre H et I qu ' on multiplie pr PH pour zoomer fin de voir un peu mieux @ omme je vous vis dit A F yn multiplie ensuite pr reipixii pour que l rre soit grndie pr rpport l tille de l fen tre F BG

106 107

108 109

110 111 112

113

114

RVP

LA SOLUTION
115 116 117

huteurfrre a spetre i B PH B reipixii Y GB yn v rifie que l rre ne d psse ps l huteur de l fen tre i tel est le s on oupe l rre u niveu de l huteur de l fen tre F BG if @ huteurfrre b reipixii A huteurfrre a reipixii Y GB fygvi P X on prourt en huteur l rre vertile pour l dessiner BG for @ j a reipixii E huteurfrre Y j ` reipixii Y j CCA { GB yn dessine hque pixel de l rre l onne ouleur F yn fit simplement vrier le rouge et le vert D hun dns un sens diff rent F j ne vrie ps entre H et PSS mis entre H et reipixii F i on veut l ' dpter proportionnellement l huteur de l fen tre D il suffit de fire le lul j G esy D o esy vut @ reipixii G PSS F H A F t ' i d r fl hir P E Q minutes pour trouver le on lul fire D mis ' est du niveu de tout le monde F sl suffit de r fl hir un tout petit peu BG setixel @ ern D i D j D hvwpqf @ ern E b formt D PSS E @ j G esy A D j G esy D H AA Y

118

119 120 121 122

123

124 125

126

127 128

129

130

131

132 133 134 135

hvnlokurfe @ ern A Y GB yn fini de trviller sur l ' rn D on d loque l surfe BG } hvplip @ ern AY

136 137 138 139 140 141 142 143 144 145 146 147 148 149

GB ve progrmme se termine F yn li re l musique de l m moire et on ferme pwyh et hv BG pwyhoundelese @ musique A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y hvuit @A Y

RVQ

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON


150 151 152 153

return isggi Y

154 155 156 157 158

GB v fontion setixel permet de dessiner pixel pr pixel dns une surfe BG void setixel @ hvurfe B surfe D int x D int y D intQP pixel A { int pp a surfe E b formt E b fyteserixel Y intV B p a @ intV BA surfe E b pixels C y B surfe E b pith C x B pp Y swith @ pp A { se I X B p a pixel Y rek Y se P X B@ intIT BA p a pixel Y rek Y se Q X if @ hvfiyhi aa hvfsqixhsex A { p H a @ pixel bb IT A 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a pixel 8 Hxff Y } else { p H a pixel 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a @ pixel bb IT A 8 Hxff Y } rek Y se R X B@ intQP BA p a pixel Y rek Y }

159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

gopier e ode gode we X VWPPIT  ous devriez otenir un rsultt orrespondnt l (gure PVFQF fien entenduD il vut mieux une nimtion pour pprier e rsulttF g9est don e que je vous propose de visuliserF  oir l9nimtion du rsultt gode we X PHSRHR  xotez que l ompression rduit l qulit du son et le nomre d9imges pr seondeF RVR

IDES D'AMLIORATION

Figure PVFQ ! isulistion spetrle d9un son

ve mieux est enore de tlhrger le progrmme omplet @ve son ode soureA pour tester hez soiF ous pourrez insi pprier le progrmme dns les meilleures onditions  lhrger le progrmme gode we X VIUHSW 
Il faut imprativement que le chier Hype_Home.mp3 soit plac dans le dossier du programme pour qu'il fonctionne (sinon il s'arrtera tout de suite).

Ides d'amlioration
sl est toujours possile d9mliorer un progrmmeF siD j9i pr exemple des tonnes d9ides d9extensions qui pourrient outir l rtion d9un vritle petit leteur wQF ! sl serit ien qu9on puisse hoisir le wQ qu9on veut lireF sl fudrit pr exemple lister tous les .mp3 prsents dns le dossier du progrmmeF xous n9vons ps vu omment fire D mis vous pouvez le douvrir pr vousEmmes F ! i votre progrmme tit ple de lire et grer les plylistsD serit enore mieuxF sl existe plusieurs formts de plylistD le plus onnu est le formt wQF
2

2. Indice : utilisez la librairie dirent (il faudra inclure dirent.h). vous de chercher des informations sur le web pour savoir comment l'utiliser.

RVS

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

! ous pourriez 0her le nom du wQ en ours de leture dns l fentre @il fudr utiliser SDL_ttfAF ! ous pourriez 0her un inditeur pour qu9on she o en est l leture du moreuD omme el se fit sur l pluprt des leteurs wQF ! ous pourriez ussi proposer de modi(er le volume de letureF ! etF frefD il y euoup fireF ous vez l possiilit de rer de eux leteursD il ne tient plus qu9 vous de les oder 3

RVT

Quatrime partie
Les structures de donnes

RVU

Chapitre

29
Dicult :

Les listes chanes

our stocker des donnes en mmoire, nous avons utilis des variables simples (type int, double. . .), des tableaux et des structures personnalises. Si vous souhaitez stocker une srie de donnes, le plus simple est en gnral d'utiliser des tableaux. Toutefois, les tableaux se rvlent parfois assez limits. Par exemple, si vous crez un tableau de 10 cases et que vous vous rendez compte plus tard dans votre programme que vous avez besoin de plus d'espace, il sera impossible d'agrandir ce tableau. De mme, il n'est pas possible d'insrer une case au milieu du tableau. Les listes chanes reprsentent une faon d'organiser les donnes en mmoire de manire beaucoup plus exible. Comme la base le langage C ne propose pas ce systme de stockage, nous allons devoir le crer nous-mmes de toutes pices. C'est un excellent exercice qui vous aidera tre plus l'aise avec le langage.

RVW

CHAPITRE 29. LES LISTES CHANES

Reprsentation d'une liste chane


u9estEe qu9une liste hne c te vous propose de prtir sur le modle des tleuxF n tleu peut tre reprsent en mmoire omme sur l (gF PWFIF sl s9git ii d9un tleu ontennt des intF
1

Figure PWFI ! n tleu de R ses en mmoire @reprsenttion horizontleA

gomme je vous le disis en introdutionD le prolme des tleux est qu9ils sont (gsF sl n9est ps possile de les grndirD moins d9en rer de nouveuxD plus grnds @(gF PWFPAF he mmeD il n9est ps possile d9y insrer une se u milieuD moins de dler tous les utres lmentsF

Figure PWFP ! yn ne peut ps grndir un tleu prs s rtion

ve lngge g ne propose ps d9utre systme de stokge de donnesD mis il est possile de le rer soiEmme de toutes piesF inore futEil svoir omment s9y prendre X 9est justement e que e hpitre et les suivnts vous proposent de douvrirF ne liste hne est un moyen d9orgniser une srie de donnes en mmoireF gel onsiste ssemler des strutures en les lint entre elles l9ide de pointeursF yn pourrit les reprsenter omme ei X
Figure PWFQ ! ne liste hne est un ssemlge de strutures lies pr des pointeurs

ghque lment peut ontenir e que l9on veut X un ou plusieurs intD doubleF F F in plus de elD hque lment possde un pointeur vers l9lment suivnt @(gF PWFRAF te reonnis que tout el est enore trs thorique et doit vous prtre un peu )ou pour le momentF etenez simplement omment les lments sont gens entre eux X ils forment une chane de pointeursD d9o le nom de  liste hne F
Contrairement aux tableaux, les lments d'une liste chane ne sont pas placs cte cte dans la mmoire. Chaque case pointe vers une autre case en mmoire qui n'est pas ncessairement stocke juste ct.
1. J'ai choisi ici de reprsenter le tableau horizontalement, mais il serait aussi possible de le prsenter verticalement, peu importe.

RWH

CONSTRUCTION D'UNE LISTE CHANE

Figure PWFR ! ghque lment ontient une donne @exF X un intA et un pointeur vers l9lment suivnt

Construction d'une liste chane


ssons mintennt u onretF xous llons essyer de rer une struture qui fonE tionne sur le prinipe que nous venons de douvrir F
2

Un lment de la liste
our nos exemplesD nous llons rer une liste hne de nomres entiers F ghque lment de l liste ur l forme de l struture suivnte X
3 1 2 3 4 5 6

typedef strut ilement ilement Y strut ilement { int nomre Y ilement B suivnt Y }Y

xous vons r ii un lment d9une liste hneD orrespondnt l (gF PWFR que nous vons vue plus ttF ue ontient ette struture c ! ne donneD ii un nomre de type int X on pourrit rempler el pr n9importe quelle utre donne @un doubleD un tleuF F FAF gel orrespond e que vous voulez stokerD 9est vous de l9dpter en fontion des esoins de votre progrmme F ! n pointeur vers un lment du mme type ppel suivantF g9est e qui permet de lier les lments les uns ux utres X hque lment  sit o se trouve l9lment
4

2. Je rappelle que tout ce que nous allons faire ici fait appel des techniques du langage C que vous connaissez dj. Il n'y a aucun lment nouveau, nous allons nous contenter de crer nos propres structures et fonctions et les transformer en un systme logique, capable de se rguler tout seul. 3. On pourrait aussi bien crer une liste chane contenant des nombres dcimaux ou mme des tableaux et des structures. Le principe des listes chanes s'adapte n'importe quel type de donnes, mais ici, je propose de faire simple pour que vous compreniez bien le principe. ;-) 4. Si on veut travailler de manire gnrique, l'idal est de faire un pointeur sur void : void*. Cela permet de faire pointer vers n'importe quel type de donnes.

RWI

CHAPITRE 29. LES LISTES CHANES

suivnt en mmoire F gomme je vous le disis plus ttD les ses ne sont ps te te en mmoireF g9est l grosse di'rene pr rpport ux tleuxF gel o're dvntge de souplesse r on peut plus filement jouter de nouvelles ses pr l suite u esoinF
5

La structure de contrle
in plus de l struture qu9on vient de rer @que l9on dupliquer utnt de fois qu9il y d9lmentsAD nous llons voir esoin d9une utre struture pour ontrler l9ensemle de l liste hneF ille ur l forme suivnte X
1 2 3 4 5

typedef strut viste viste Y strut viste { ilement B premier Y }Y

gette struture Liste ontient un pointeur vers le premier lment de l listeF in e'etD il fut onserver l9dresse du premier lment pour svoir o ommene l listeF i on onnt le premier lmentD on peut retrouver tous les utres en  sutnt d9lment en lment l9ide des pointeurs suivantF
Une structure compose d'une seule sous-variable n'est en gnral pas trs utile. Nanmoins, je pense que l'on aura besoin d'y ajouter des sous-variables plus tard, je prfre donc prendre les devants en crant ici une structure. On pourrait par exemple y stocker en plus la taille de la liste, c'est--dire le nombre d'lments qu'elle contient.

xous n9urons esoin de rer qu9un seul exemplire de l struture ListeF ille permet de ontrler toute l liste @(gF PWFSAF

Le dernier lment de la liste


xotre shm est presque ompletF sl mnque une dernire hose X on imerit retenir le dernier lment de l listeF in e'etD il fudr ien rrter de prourir l liste un moment donnF eve quoi pourritEon signi(er notre progrmme  topD ei est le dernier lment c sl serit possile d9jouter dns l struture Liste un pointeur vers le dernier ElementF outefoisD il y enore plus simple X il su0t de fire pointer le dernier lment de l liste vers NULLD 9estEEdire de mettre son pointeur suivant NULLF gel nous permet de rliser un shm en(n omplet de notre struture de liste hne @(gF PWFTAF
5. En revanche, il ne sait pas quel est l'lment prcdent, il est donc impossible de revenir en arrire partir d'un lment avec ce type de liste. On parle de liste  simplement chane , alors que les listes  doublement chanes  ont des pointeurs dans les deux sens et n'ont pas ce dfaut. Elles sont nanmoins plus complexes.

RWP

CONSTRUCTION D'UNE LISTE CHANE

Figure PWFS ! v struture Liste nous donne des informtions sur l9ensemle de l

liste hne

Figure PWFT ! ve dernier lment de l liste pointe vers NULL pour indiquer l (n de

liste

RWQ

CHAPITRE 29. LES LISTES CHANES

Les fonctions de gestion de la liste


xous vons r deux strutures qui permettent de grer une liste hne X ! ElementD qui orrespond un lment de l liste et que l9on peut dupliquer utnt de fois que nessire Y ! ListeD qui ontrle l9ensemle de l listeF xous n9en urons esoin qu9en un seul exemplireF g9est ienD mis il mnque enore l9essentiel X les fontions qui vont mnipuler l liste hneF in e'etD on ne v ps modi(er  l min le ontenu des strutures hque fois qu9on en esoin 3 sl est plus sge et plus propre de psser pr des fontions qui utomtisent le trvilF inore futEil les rerF premire vueD je diris qu9on ur esoin de fontions pour X ! initiliser l liste Y ! jouter un lment Y ! supprimer un lment Y ! 0her le ontenu de l liste Y ! supprimer l liste entireF yn pourrit rer d9utres fontions @pr exemple pour luler l tille de l listeA mis elles sont moins indispenslesF xous llons ii nous onentrer sur elles que je viens de vous numrerD e qui nous fer dj une onne seF te vous inviteri ensuite rliser d9utres fontions pour vous entrner une fois que vous urez ien ompris le prinipeF

Initialiser la liste
v fontion d9initilistion est l toute premire que l9on doit ppelerF ille re l struture de ontrle et le premier lment de l listeF te vous propose l fontion iEdessousD que nous ommenterons juste prsD ien enE tendu X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

viste B initilistion @A { viste B liste a mllo @ sizeof @B liste A A Y ilement B element a mllo @ sizeof @B element AA Y if @ liste aa xvv || element aa xvv A { exit @ ispesvi A Y } element Eb nomre a H Y element Eb suivnt a xvv Y liste E b premier a element Y return liste Y

RWR

LES FONCTIONS DE GESTION DE LA LISTE


16

}
6

yn ommene pr rer l struture de ontrle liste F yn l9lloue dynmiquement ve un mallocF v tille llouer est lule utomtiquement ve sizeof(*liste)F v9ordinteur sur qu9il doit llouer l9espe nessire u stokge de l struture Liste F yn lloue ensuite de l mme mnire l mmoire nessire u stokge du premier lmentF yn vri(e si les llotions dynmiques ont fontionnF in s d9erreurD on rrte immditement le progrmme en fisnt ppel exit()F i tout s9est ien pssD on d(nit les vleurs de notre premier lment X ! l donne nombre est mise H pr dfut Y ! le pointeur suivant pointe vers NULL r le premier lment de notre liste est ussi le dernier pour le momentF gomme on l9 vu plus ttD le dernier lment doit pointer vers NULL pour signler qu9il est en (n de listeF xous vons don mintennt russi rer en mmoire une liste ompose d9un seul lment et ynt une forme semlle l (gF PWFUF
7

Figure PWFU ! v9tt de l liste qui vient d9tre initilise

Ajouter un lment
siD les hoses se ompliquent un peuF y vEtEon jouter un nouvel lment c eu dut de l listeD l (nD u milieu c v rponse est qu9on le hoixF vire nous de dider e que nous fisonsF our e hpitreD je propose que l9on voie ensemle l9jout d9un lment en dut de listeF h9une prtD 9est simple omprendreD et d9utre prt el me donner une osion l (n de e hpitre de vous proposer de r)hir l rtion d9une fontion qui joute un lment un endroit pris de l listeF xous devons rer une fontion ple d9insrer un nouvel lment en dut de listeF our nous mettre en situtionD imginons un s semlle l (gF PWFV X l liste est ompose de trois lments et on souhite en jouter un nouveu u dutF
6. Notez que le type de donnes est Liste et que la variable s'appelle liste. La majuscule permet de les direncier. 7. On aurait aussi pu crire sizeof(Liste), mais si plus tard on dcide de modier le type du pointeur liste, on devra aussi adapter le sizeof.

RWS

CHAPITRE 29. LES LISTES CHANES

Figure PWFV ! yn souhite insrer notre nouvel lment en dut de liste

sl v flloir dpter le pointeur premier de l liste insi que le pointeur suivant de notre nouvel lment pour  insrer orretement eluiEi dns l listeF te vous propose pour el e ode soure que nous nlyserons juste prs X
1 2 3 4 5 6 7 8 9 10 11 12 13 14

void insertion @ viste B liste D int nvxomre A { GB gr tion du nouvel l ment BG ilement B nouveu a mllo @ sizeof @B nouveu AA Y if @ liste aa xvv || nouveu aa xvv A { exit @ is pesvi A Y } nouveu Eb nomre a nvxomre Y GB snsertion de l ' l ment u d ut de l liste BG nouveu Eb suivnt a liste Eb premier Y liste E b premier a nouveu Y

v fontion insertion() prend en prmtre l9lment de ontrle liste @qui ontient l9dresse du premier lmentA et le nomre stoker dns le nouvel lment que l9on v rerF hns un premier tempsD on lloue l9espe nessire u stokge du nouvel lment et on y ple le nouveu nomre nvNombreF sl reste lors une tpe dlite X l9insertion du nouvel lment dns l liste hneF xous vons ii hoisi pour simpli(er d9insrer l9lment en dut de listeF our mettre jour orretement les pointeursD nous devons proder dns et ordre pris X IF fire pointer notre nouvel lment vers son futur suesseurD qui est l9tuel preE mier lment de l liste Y PF fire pointer le pointeur premier vers notre nouvel lmentF RWT

LES FONCTIONS DE GESTION DE LA LISTE

On ne peut pas suivre ces tapes dans l'ordre inverse ! En eet, si vous faites d'abord pointer premier vers notre nouvel lment, vous perdez l'adresse du premier lment de la liste ! Faites le test, vous comprendrez de suite pourquoi l'inverse est impossible.

gel ur pour e'et d9insrer orretement notre nouvel lment dns l liste hne @(gF PWFWA 3

Figure PWFW ! snsertion d9un lment dns l liste hne

Supprimer un lment
he mme que pour l9insertionD nous llons ii nous onentrer sur l suppression du premier lment de l listeF sl est tehniquement possile de supprimer un lment pris u milieu de l listeD e ser d9illeurs un des exeries que je vous proposeri l (nF v suppression ne pose ps de di0ult supplmentireF sl fut ependnt ien dpter les pointeurs de l liste dns le on ordre pour ne  perdre uune informtionF
1 2 3 4 5 6 7 8 9 10 11 12 13 14

void suppression @ viste B liste A { if @ liste aa xvv A { exit @ ispesvi A Y } if @ liste E b premier 3a xvv A { ilement B upprimer a liste E b premier Y liste E b premier a liste E b premier E b suivnt Y free @ upprimer A Y }

yn ommene pr vri(er que le pointeur qu9on nous envoie n9est ps NULLD sinon on ne peut ps trvillerF yn vri(e ensuite qu9il y u moins un lment dns l listeD sinon il n9y rien fireF RWU

CHAPITRE 29. LES LISTES CHANES

ges vri(tions e'etuesD on peut suvegrder l9dresse de l9lment supprimer dns un pointeur aSupprimerF yn dpte ensuite le pointeur premier vers le nouveu premier lmentD qui est tuellement en seonde position de l liste hneF sl ne reste plus qu9 supprimer l9lment orrespondnt notre pointeur aSupprimer ve un free @(gF PWFIHAF

Figure PWFIH ! uppression d9un lment de l liste hne

gette fontion est ourte mis suriezEvous l rrire c sl fut ien omprendre qu9on doit fire les hoses dns un ordre pris X IF fire pointer premier vers le seond lment Y PF supprimer le premier lment ve un freeF i on fisit l9inverseD on perdrit l9dresse du seond lment 3

Acher la liste chane


our ien visuliser e que ontient notre liste hneD une fontion d90hge serit idle 3 sl su0t de prtir du premier lment et d90her hque lment un un en  sutnt de lo en loF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

void ffiherviste @ viste B liste A { if @ liste aa xvv A { exit @ ispesvi A Y } ilement B tuel a liste E b premier Y while @ tuel 3a xvv A { printf @ 4 7 d Eb 4 D tuel E b nomre A Y tuel a tuel E b suivnt Y } printf @ 4 xvv n 4 A Y

RWV

ALLER PLUS LOIN

gette fontion est simple X on prt du premier lment et on 0he le ontenu de hque lment de l liste @un nomreAF yn se sert du pointeur suivant pour psser l9lment qui suit hque foisF yn peut s9muser tester l rtion de notre liste hne et son 0hge ve un main X
1 2 3 4 5 6 7 8 9 10 11 12 13

int min @A { viste B mviste a initilistion @A Y insertion @ mviste D R A Y insertion @ mviste D V A Y insertion @ mviste D IS A Y suppression @ mviste A Y ffiherviste @ mviste A Y } return H Y

in plus du premier lment @que l9on liss ii HAD on en joute trois nouveux ette listeF uis on en supprime unF eu (nlD le ontenu de l liste hne ser don X
V Eb R Eb H Eb xvv

Aller plus loin


xous venons de fire le tour des priniples fontions nessires l gestion d9une liste hne X initilistionD jout d9lmentD suppression d9lmentD etF oii quelques utres fontions qui mnquent et que je vous invite rireD e ser un trs on exerie 3 ! Insertion d'un lment en milieu de liste X tuellementD nous ne pouvons jouter des lments qu9u dut de l listeD e qui est gnrlement su0sntF i toutefois on veut pouvoir jouter un lment u milieuD il fut rer une fontion spi(que qui prend un prmtre supplmentire X l9dresse de elui qui prder notre nouvel lment dns l listeF otre fontion v prourir l liste hne jusqu9 tomer sur l9lment indiquF ille y insrer le petit nouveu juste prsF ! Suppression d'un lment en milieu de liste X le prinipe est le mme que pour l9insertion en milieu de listeF gette foisD vous devez jouter en prmtre l9dresse de l9lment supprimerF ! Destruction de la liste X il su0t de supprimer tous les lments un un 3 ! Taille de la liste X ette fontion indique omien il y d9lments dns votre liste hneF v9idlD plutt que d9voir luler ette vleur hque foisD serit de mintenir jour un entier nbElements dns l struture ListeF sl su0t d9inrmenter e nomre hque fois qu9on joute un lment et de le drmenter qund on en supprime unF RWW

CHAPITRE 29. LES LISTES CHANES

te vous onseille de regrouper toutes les fontions de gestion de l liste hne dns des (hiers liste_chainee.c et liste_chainee.h pr exempleF ge ser votre premire iliothque 3 ous pourrez l rutiliser dns tous les progrmmes dns lesquels vous vez esoin de listes hnesF ous pouvez tlhrger le projet des listes hnes omprennt les fontions que nous vons douvertes ensemleF gel vous fer une onne se de dprtF  lhrger le projet gode we X THQUIT 

En rsum
! ves listes hnes onstituent un nouveu moyen de stoker des donnes en mmoireF illes sont plus )exiles que les tleux r on peut jouter et supprimer des  ses n9importe quel momentF ! sl n9existe ps en lngge g de systme de gestion de listes hnesD il fut l9rire nousEmmes 3 g9est un exellent moyen de progresser en lgorithmique et en proE grmmtion en gnrlF ! hns une liste hneD hque lment est une struture qui ontient l9dresse de l9lment suivntF ! sl est onseill de rer une struture de ontrle @du type Liste dns notre sA qui retient l9dresse du premier lmentF ! sl existe une version mliore " mis plus omplexe " des listes hnes ppeE le  listes doulement hnes D dns lesquelles hque lment possde en plus l9dresse de elui qui le prdeF

SHH

Chapitre

30
Dicult :

Les piles et les les

ous avons dcouvert avec les listes chanes un nouveau moyen plus souple que les tableaux pour stocker des donnes. Ces listes sont particulirement exibles car on peut insrer et supprimer des donnes n'importe quel endroit, n'importe quel moment. Les piles et les les que nous allons dcouvrir ici sont deux variantes un peu particulires des listes chanes. Elles permettent de contrler la manire dont sont ajouts les nouveaux lments. Cette fois, on ne va plus insrer de nouveaux lments au milieu de la liste mais seulement au dbut ou la n. Les piles et les les sont trs utiles pour des programmes qui doivent traiter des donnes qui arrivent au fur et mesure. Nous allons voir en dtails leur fonctionnement dans ce chapitre.

SHI

CHAPITRE 30. LES PILES ET LES FILES

ves piles et les (les sont trs similiresD mis rvlent nnmoins une sutile di'rene que vous llez rpidement reonntreF xous llons dns un premier temps douvrir les piles qui vont d9illeurs euoup vous rppeler les listes hnesD quelques mots de voulire prsF qlolementD e hpitre ser simple pour vous si vous vez ompris le fontionnement des listes hnesF i e n9est ps le sD retournez d9ord u hpitre prdent r nous llons en voir esoinF

Les piles
smginez une pile de pies @(gF QHFIAF ous pouvez jouter des pies une une en hut de l pileD mis ussi en enlever depuis le hut de l pileF sl est en revnhe impossile d9enlever une pie depuis le s de l pile 3
1

Figure QHFI ! ne pile de pies

Fonctionnement des piles


ve prinipe des piles en progrmmtion est de stoker des donnes u fur et mesure les unes uEdessus des utres pour pouvoir les ruprer plus trdF r exempleD imginons une pile de nomres entiers de type int @(gF QHFPAF i j9joute un lment @on prle d9empilageAD il ser pl uEdessus @(gF QHFQAF ve plus intressnt est sns onteste l9oprtion qui onsiste extrire les nomres de l pileF yn prle de dpilageF yn rupre les donnes une uneD en ommennt pr l dernire qui vient d9tre pose tout en hut de l pile @(gF QHFRAF yn enlve les donnes u fur et mesureD jusqu9 l dernire tout en s de l pileF yn dit que 9est un lgorithme LIFOD e qui signi(e  vst sn pirst yut F rdution X  ve dernier lment qui t jout est le premier sortir F ves lments de l pile sont relis entre eux l mnire d9une liste hneF sls possdent un pointeur vers l9lment suivnt et ne sont don ps forment pls te te en mmoireF ve dernier lment @tout en s de l pileA doit pointer vers NULL pour indiquer qu9on F F F touh le fond @(gF QHFSAF
2

1. Si vous voulez essayer, bon courage ! 2. Oui, comme dans Tetris. ;-)

SHP

LES PILES

Figure QHFP ! ne pile de int

Figure QHFQ ! impilge

SHQ

CHAPITRE 30. LES PILES ET LES FILES

Figure QHFR ! hpilge

Figure QHFS ! ves lments sont relis entre eux et le dernier pointe vers NULL

SHR

LES PILES

quoi est-ce que tout cela peut bien servir, concrtement ?

sl y des progrmmes o vous vez esoin de stoker des donnes temporirement pour les ressortir dns un ordre pris X le dernier lment que vous vez stok doit tre le premier ressortirF our vous donner un exemple onretD votre systme d9exploittion utilise e type d9lgorithme pour retenir l9ordre dns lequel les fontions ont t ppelesF smginez un exemple X IF PF QF RF SF TF votre progrmme ommene pr l fontion main @omme toujoursA Y vous y ppelez l fontion jouer Y ette fontion jouer fit ppel son tour l fontion charger Y une fois que l fontion charger est termineD on retourne l fontion jouer Y une fois que l fontion jouer est termineD on retourne u main Y en(nD une fois le main terminD il n9y plus de fontion ppelerD le progrmme s9hveF

our  retenir l9ordre dns lequel les fontions ont t ppelesD votre ordinteur re une pile de es fontions u fur et mesure @(gF QHFTAF

Figure QHFT ! v pile d9ppel des fontions u fur et mesure du progrmme

oil un exemple onret d9utilistion des pilesF qre ette tehniqueD votre ordinE teur sit quelle fontion il doit retournerF sl peut empiler IHH fontions d90le s9il le futD il retrouver toujours le main en s 3 SHS

CHAPITRE 30. LES PILES ET LES FILES

Cration d'un systme de pile


wintennt que nous onnissons le prinipe de fontionnement des pilesD essyons d9en onstruire uneF gomme pour les listes hnesD il n9existe ps de systme de pile intgr u lngge gF sl fut don le rer nousEmmesF ghque lment de l pile ur une struture identique elle d9une liste hne X
1 2 3 4 5 6

typedef strut ilement ilement Y strut ilement { int nomre Y ilement B suivnt Y }Y

v struture de ontrle ontiendr l9dresse du premier lment de l pileD elui qui se trouve tout en hut X
1 2 3 4 5

typedef strut ile ile Y strut ile { ilement B premier Y }Y

xous urons esoin en tout et pour tout des fontions suivntes X ! empilge d9un lment Y ! dpilge d9un lmentF ous noterez queD ontrirement ux listes hnesD on ne prle ps d9jout ni de suppressionF yn prle d9empilge et de dpilge r es oprtions sont limites un lment prisD omme on l9 vuF einsiD on ne peut jouter et retirer un lment qu9en hut de l pileF yn pourr ussi rire une fontion d90hge de l pileD prtique pour vri(er si notre progrmme se omporte orretementF ellonsEy 3
Empilage

xotre fontion empiler doit prendre en prmtre l struture de ontrle de l pile @de type PileA insi que le nouveu nomre stoker F
3 1 2 3 4 5

void empiler @ ile B pile D int nvxomre A { ilement B nouveu a mllo @ sizeof @B nouveu AA Y if @ pile aa xvv || nouveu aa xvv A {

3. Je vous rappelle que nous stockons ici des int, mais rien ne vous empche d'adapter ces exemples avec un autre type de donnes. On peut stocker n'importe quoi : des double, des char, des chanes, des tableaux ou mme d'autres structures !

SHT

LES PILES
6 7 8 9 10 11 12

exit @ ispesvi A Y

nouveu E b nomre a nvxomre Y nouveu E b suivnt a pile E b premier Y pile E b premier a nouveu Y

v9jout se fit en dut de pile rD omme on l9 vuD il est impossile de le fire u milieu d9une pileF g9est le prinipe mme de son fontionnementD on joute toujours pr le hut F
4

Dpilage

ve rle de l fontion de dpilge est de supprimer l9lment tout en hut de l pileD D vous vous en doutiezF wis elle doit ussi retourner l9lment qu9elle dpileD 9estEEdire dns notre s le nomre qui tit stok en hut de l pileF g9est omme el que l9on de ux lments d9une pile X en les enlevnt un unF yn ne prourt ps l pile pour ller y herher le seond ou le troisime lmentF yn demnde toujours ruprer le premierF xotre fontion depiler v don retourner un int orrespondnt u nomre qui se trouvit en tte de pile X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

int depiler @ ile B pile A { if @ pile aa xvv A { exit @ ispesvi A Y } int nomrehepile a H Y ilement B elementhepile a pile E b premier Y if @ pile 3a xvv 88 pile E b premier 3a xvv A { nomrehepile a elementhepile E b nomre Y pile E b premier a elementhepile E b suivnt Y free @ elementhepile A Y } } return nomrehepile Y

yn rupre le nomre en tte de pile pour le renvoyer l (n de l fontionF yn modi(e l9dresse du premier lment de l pileD puisque eluiEi hngeF in(nD ien entenduD on supprime l9nienne tte de pile gre freeF
4. De ce fait, contrairement aux listes chanes, on ne doit pas crer de fonction pour insrer un lment au milieu de la pile. Seule la fonction empiler permet d'ajouter un lment.

SHU

CHAPITRE 30. LES PILES ET LES FILES

Achage de la pile

fien que ette fontion ne soit ps indispensle D elle v nous tre utile pour tester le fontionnement de notre pile et surtout pour  visuliser le rsulttF
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

void ffiherile @ ile B pile A { if @ pile aa xvv A { exit @ ispesvi A Y } ilement B tuel a pile E b premier Y while @ tuel 3a xvv A { printf @ 4 7 d n 4 D tuel E b nomre A Y tuel a tuel E b suivnt Y } } printf @ 4 n 4 A Y
6

gette fontion tnt ridiulement simpleD elle ne nessite uune explition F in revnheD 9est le moment de fire un main pour tester le omportement de notre pile X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

int min @A { ile B mile a initiliser @A Y empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D RAY VAY IS A Y IT A Y PQ A Y RP A Y

printf @ 4 nitt de l pile X n 4 A Y ffiherile @ mile A Y printf @ 4 te depile 7 d n 4 D depiler @ mile A A Y printf @ 4 te depile 7 d n 4 D depiler @ mile A A Y printf @ 4 nitt de l pile X n 4 A Y ffiherile @ mile A Y } return H Y

5. Les fonctions empiler et depiler susent grer une pile ! 6. Et toc !

SHV

LES FILES

yn 0he l9tt de l pile prs plusieurs empilges et une utre fois prs quelques dpilgesF yn 0he ussi le nomre qui est dpil hque fois que l9on dpileF ve rsultt dns l onsole est le suivnt X
itt de l pile X RP PQ IT IS V R te depile RP te depile PQ itt de l pile X IT IS V R

ri(ez que vous voyez ien e qui se psse dns e progrmmeF i vous omprenez elD vous vez ompris le fontionnement des piles 3 ous pouvez tlhrger le projet omplet des piles si vous le dsirezF  lhrger le projet gode we X WQSHTS 

Les les
ves (les ressemlent ssez ux pilesD si e n9est qu9elles fontionnent dns le sens inverse 3

Fonctionnement des les


hns e systmeD les lments s9entssent les uns l suite des utresF ve premier qu9on fit sortir de l (le est le premier tre rrivF yn prle ii d9lgorithme FIFO @pirst sn pirst yutAD 9estEEdire  ve premier qui rrive est le premier sortir F sl est file de fire le prllle ve l vie ournteF und vous llez prendre un illet de inmD vous fites l queue u guihet @(gF QHFUAF moins d9tre le frre du guihetierD vous llez devoir fire l queue omme tout le monde et ttendre derrireF g9est le premier rriv qui ser le premier serviF in progrmmtionD les (les sont utiles pour mettre en ttente des informtions dns l9ordre dns lequel elles sont rrivesF r exempleD dns un logiiel de chat @type messgerie instntneAD si vous reevez trois messges peu de temps d9intervlleD vous les en(lez les uns l suite des utres en mmoireF ous vous oupez lors du SHW

CHAPITRE 30. LES PILES ET LES FILES

Figure QHFU ! ne (le d9ttenteF ve premier rriv est le premier servi 3

premier messge rriv pour l90her l9rnD puis vous pssez u seondD et insi de suiteF ves vnements que vous envoie l iliothque hv que nous vons tudie sont eux ussi stoks dns une (leF i vous ougez l sourisD un vnement ser gnr pour hque pixel dont s9est dpl le urseur de l sourisF v hv les stoke dns une (le puis vous les envoie un un hque fois que vous fites ppel SDL_PollEvent F in gD une (le est une liste hne o hque lment pointe vers le suivntD tout omme les pilesF ve dernier lment de l (le pointe vers NULL @(gF QHFVAF
7

Figure QHFV ! eprsenttion d9une (le

Cration d'un systme de le


ve systme de (le v ressemler peu de hoses prs ux pilesF sl y seulement quelques petites sutilits tnt donn que les lments sortent de l (le dns un utre sensD mis rien d9insurmontle si vous vez ompris les pilesF xous llons rer une struture Element et une struture de ontrle File X
1 2 3 4

typedef strut ilement ilement Y strut ilement { int nomre Y


7. Ou SDL_WaitEvent : oui, c'est bien ! Je vois que a suit au fond de la classe. ;-)

SIH

LES FILES
5 6 7 8 9 10 11 12

}Y

ilement B suivnt Y

typedef strut pile pile Y strut pile { ilement B premier Y }Y

gomme pour les pilesD hque lment de l (le ser de type ElementF l9ide du pointeur premierD nous disposerons toujours du premier lment et nous pourrons remonter jusqu9u dernierF
Enlage

v fontion qui joute un lment l (le est ppele fontion  d9en(lge F sl y deux s grer X ! soit l (le est videD dns e s on doit juste rer l (le en fisnt pointer premier vers le nouvel lment r Y ! soit l (le n9est ps videD dns e s il fut prourir toute l (le en prtnt du premier lment jusqu9 rriver u dernierF yn rjouter notre nouvel lment prs le dernierF oii omment on peut fire dns l prtique X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

void enfiler @ pile B file D int nvxomre A { ilement B nouveu a mllo @ sizeof @B nouveu A A Y if @ file aa xvv || nouveu aa xvv A { exit @ ispesvi A Y } nouveu E b nomre a nvxomre Y nouveu E b suivnt a xvv Y if @ file E b premier 3a xvv A GB v file n ' est ps vide BG { GB yn se positionne l fin de l file BG ilement B elementetuel a file E b premier Y while @ elementetuel E b suivnt 3a xvv A { elementetuel a elementetuel E b suivnt Y } elementetuel E b suivnt a nouveu Y } else GB v file est vide D notre l ment est le premier BG { file E b premier a nouveu Y

SII

CHAPITRE 30. LES PILES ET LES FILES


25 26

ous voyez dns e ode le tritement des deux s possilesD hun devnt tre gr prtF v di'rene pr rpport ux pilesD qui rjoute une petite touhe de di0ultD est qu9il fut se pler l (n de l (le pour jouter le nouvel lmentF wis onD un petit while et le tour est jouD omme vous pouvez le onstterF XEA
Dlage

ve d(lge ressemle trngement u dpilgeF tnt donn qu9on possde un pointeur vers le premier lment de l (leD il nous su0t de l9enlever et de renvoyer s vleurF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

int defiler @ pile B file A { if @ file aa xvv A { exit @ ispesvi A Y } int nomrehefile a H Y GB yn v rifie s ' il y quelque hose d filer BG if @ file E b premier 3a xvv A { ilement B elementhefile a file E b premier Y nomrehefile a elementhefile E b nomre Y file E b premier a elementhefile E b suivnt Y free @ elementhefile A Y

} }

return nomrehefile Y

vous de jouer !
sl resterit rire une fontion afficherFileD omme on l9vit fit pour les pilesF gel vous permettrit de vri(er si votre (le se omporte orretementF lisez ensuite un main pour fire tourner votre progrmmeF ous devriez pouvoir otenir un rendu similire ei X
itt de l file X R V IS IT PQ RP te defile R te defile V

SIP

LES FILES

itt de l file X IS IT PQ RP

termeD vous devriez pouvoir rer votre propre iliothque de (lesD ve des (hiers file.h et file.c pr exempleF te vous propose de tlhrger le projet omplet de gestion des (lesD si vous le dsirezF sl inlut l fontion afficherFile F  lhrger le projet omplet gode we X RTUVUW 

En rsum
! ves piles et les (les permettent d9orgniser en mmoire des donnes qui rrivent u fur et mesureF ! illes utilisent un systme de liste hne pour ssemler les lmentsF ! hns le s des pilesD les donnes s9joutent les unes uEdessus des utresF vorsqu9on extrit une donneD on rupre l dernire qui vient d9tre joute @l plus renteAF yn prle d9lgorithme vspy @Last In First Out AF ! hns les s des (lesD les donnes s9joutent les unes l suite des utresF yn extrit l premire donne voir t joute dns l (le @l plus nienneAF yn prle d9lgorithme pspy @First In First Out AF

SIQ

CHAPITRE 30. LES PILES ET LES FILES

SIR

Chapitre

31
Dicult :

Les tables de hachage

es listes chanes ont un gros dfaut lorsqu'on souhaite lire ce qu'elles contiennent : il n'est pas possible d'accder directement un lment prcis. Il faut parcourir la liste en avanant d'lment en lment jusqu' trouver celui qu'on recherche. Cela pose des problmes de performance ds que la liste chane devient volumineuse. Imaginez une liste chane de 1 000 lments o celui que l'on recherche est tout la n ! Les tables de hachage reprsentent une autre faon de stocker des donnes. Elles sont bases sur les tableaux du langage C que vous connaissez bien, dornavant. Leur gros avantage ? Elle permettent de retrouver instantanment un lment prcis, que la table contienne 100, 1 000, 10 000 cases ou plus encore !

SIS

CHAPITRE 31. LES TABLES DE HACHAGE

Pourquoi utiliser une table de hachage ?


rtons du prolme que peuvent nous poser les listes hnesF gellesEi sont prtiuE lirement souplesD nous vons pu le onstter X il est possile d9jouter ou de supprimer des ses tout momentD lors qu9un tleu est  (g une fois qu9il t rF outefoisD omme je vous le disis en introdutionD les listes hnes ont qund mme un gros dfut X si on herhe ruprer un lment pris de l listeD il fut prourir elleEi en entier jusqu9 e qu9on le retrouve 3 smginons une liste hne qui ontienne des informtions sur des lves X leur nomD leur ge et leur moyenneF ghque lve ser reprsent pr une struture Eleve F i je veux retrouver les informtions sur vu honieux dns l (gF QIFID il v flloir prourir toute l liste pour se rendre ompte qu9il tit l (n 3
1

Figure QIFI ! our retrouver vu honieux dns l listeD il fut l prourir en entier en nlysnt hque lment prtir du premier 3
Bien entendu, si on avait cherch Julien Lefebvre, cela aurait t beaucoup plus rapide puisqu'il est au dbut de la liste. Nanmoins, pour valuer l'ecacit d'un algorithme , on doit toujours envisager le pire des cas. Et le pire, c'est Luc.
2

hns et exempleD notre liste hne ne ontient que qutre lmentsF v9ordinteur retrouver vu honieux trs rpidement vnt que vous n9yez eu le temps de dire  ouf F wis imginez mintennt que eluiEi se trouve l (n d9une liste hne ontennt IH HHH lments 3 ge n9est ps eptle de devoir prourir jusqu9 IH HHH lments pour retrouver une informtionF g9est l que les tles de hhge entrent en jeuF

Qu'est-ce qu'une table de hachage ?


i vous vous souvenez ienD les tleux ne onnissient ps e prolmeF einsiD pour der l9lment d9indie P dns mon tleuD il me su0sit d9rire ei X
1. Nous avons travaill auparavant sur des listes chanes qui contenaient des int. Comme je vous l'ai dit, il est possible de stocker ce qu'on veut dans une liste, mme un pointeur vers une structure comme je le propose ici. 2. Ici, on dit que l'algorithme de recherche d'un lment a une complexit en O(n), car il faut parcourir toute la liste chane pour retrouver un lment donn, dans le pire des cas o celui-ci est la n. Si la liste contient 9 lments, il faudra 9 itrations au maximum pour retrouver un lment.

SIT

QU'EST-CE QU'UNE TABLE DE HACHAGE ?


1 2

int tleu R a { IP D U D IR D QQ }Y printf @ 4 7 d 4 D tleu P A Y

i on lui donne tableau[2]D l9ordinteur v diretement l se mmoire o se trouve stok le nomre IRF sl ne prourt ps les ses du tleu une uneF
Tu es en train de dire que les tableaux ne sont  pas si mauvais , en fait ? Mais dans ce cas, on perd l'avantage des listes chanes qui nous permettaient d'ajouter et de retirer des cases tout moment !

in e'etD les listes hnes sont plus )exilesF ves tleuxD euxD permettent un s plus rpideF ves tables de hachage onstituent quelque prt un ompromis entre les deuxF sl y un dfut importnt ve les tleux dont on n9 ps euoup prl jusqu9ii X les ses sont identi(es pr des numros qu9on ppelle des indicesF sl n9est ps possile de demnder l9ordinteur X  hisEmoi quelles sont les donnes qui se trouvent l se 4vu honieux4 F our retrouver l9ge et l moyenne de vu honieuxD on ne peut don ps rire X
1

tleu 4 vu honieux 4 Y

ge serit pourtnt prtique de pouvoir der une se du tleu rien qu9ve le nom 3 ih ien ve les tles de hhge D 9est possileF
3

Puisque notre tableau doit forcment tre numrot par des indices, comment fait-on pour retrouver le bon numro de case si on connat seulement le nom  Luc Doncieux  ?

fonne remrqueF in e'etD un tleu reste un tleu et eluiEi ne fontionne qu9ve des indies numrotsF smginez un tleu orrespondnt l (gF QIFP X hque se un indie et possde un pointeur vers une struture de type EleveF gelD vous svez dj le fireF i on veut retrouver l se orrespondnt vu honieuxD il fut pouvoir trnsformer son nom en indie du tleuF einsiD il fut pouvoir fire l9ssoition entre hque nom et un numro de se de tleu X ! tulien vefevre a H Y ! eurlie fssoli a I Y ! nn wrtinez a P Y ! vu honieux a QF yn ne peut rire tableau["Luc Doncieux"] omme je l9i fit prdemmentF ge n9est ps vlide en gF
3. Comme tout ce que nous venons de voir rcemment, les tables de hachage ne font pas  partie  du langage C. Il s'agit simplement d'un concept. On va rutiliser les briques de base du C que l'on connat dj pour crer un nouveau systme intelligent. Comme quoi, en C, avec peu d'outils la base, on peut crer beaucoup de choses !

SIU

CHAPITRE 31. LES TABLES DE HACHAGE

Figure QIFP ! n simple tleu ontennt des pointeurs vers des strutures Eleve

v question est X omment trnsformer une hne de rtres en numro c g9est toute l mgie du hhgeF sl fut rire une fontion qui prend en entre une hne de rtresD fit des luls veD puis retourne en sortie un numro orrespondnt ette hneF ge numro ser l9indie de l se dns notre tleu @(gF QIFQAF

Figure QIFQ ! v fontion de hhge gnre un indie orrespondnt u nom envoy

en prmtre

crire une fonction de hachage


oute l di0ult onsiste rire une fontion de hhge orreteF gomment trnE former une hne de rtres en un nomre unique c out d9ordD mettons les hoses u lir X une tle de hhge ne ontient ps R ses omme sur mes exemplesD mis plutt IHHD I HHH ou mme plusF eu importe l tille SIV

CRIRE UNE FONCTION DE HACHAGE

du tleuD l reherhe de l9lment ser ussi rpide F smginons don un tleu de IHH ses dns lequel on v stoker des pointeurs vers des strutures EleveF
4 1

ileve B tleu IHH Y

xous devons rire une fontion quiD prtir d9un nomD gnre un nomre ompris entre H et WW @les indies du tleuAF g9est l qu9il fut tre inventifF sl existe des mthodes mthmtiques trs omplexes pour  hher des donnesD 9estEEdire les trnsformer en nomresF ous pouvez inventer votre propre fontion de hhgeF siD pour fire simpleD je vous propose tout simplement d9dditionner les vleurs egss de hque lettre du nomD 9estEEdire pour vu honieux fire l somme suivnte X
5 1

'v ' C 'u ' C ' ' C ' ' C 'h ' C 'o ' C 'n ' C ' ' C 'i ' C 'e ' C 'u ' C 'x '
6

yn v toutefois voir un prolme X ette somme dpsse IHH 3 gomme notre tleu ne fit que IHH sesD si on s9en tient D on risque de sortir des limites du tleuF our rgler le prolmeD on peut utiliser l9oprteur modulo %F ous vous souvenez de lui c sl donne le reste de l division 3 i on fit le lul X
1

sommevettres 7 IHH

F F F on otiendr forment un nomre ompris entre H et WWF r exempleD si l somme fit RQISD le reste de l division pr IHH est ISF v fontion de hhge retourner don ISF oii quoi pourrit ressemler ette fmeuse fontion X
1 2 3 4 5 6 7 8 9 10 11 12

int hhge @ hr B hine A { int i a H D nomrerhe a H Y for @ i a H Y hine i 3a ' H ' Y i CCA { nomrerhe Ca hine i Y } nomrerhe 7a IHH Y } return nomrerhe Y

4. On dit que c'est une complexit en O(1) car on trouve directement l'lment que l'on recherche. En eet, la fonction de hachage nous retourne un indice : il sut de  sauter  directement la case correspondante du tableau. Plus besoin de parcourir toutes les cases ! 5. Les algorithmes MD5 et SHA1 sont des fonctions de hachage clbres, mais elles sont trop pousses pour nous ici. 6. Je vous rappelle que chaque lettre dans la table ASCII peut tre numrote jusqu' 255. On a donc vite fait de dpasser 100.

SIW

CHAPITRE 31. LES TABLES DE HACHAGE

gopier e ode gode we X SUVRUW  i on lui envoie hachage("Luc Doncieux")D elle renvoie SSF eve hachage("Yann Martinez")D on otient VHF qre ette fontion de hhgeD vous svez don dns quelle se de votre tleu vous devez pler vos donnes 3 vorsque vous voudrez y der plus trd pour en ruprer les donnesD il su0r de hher nouveu le nom de l personne pour retrouver l9indie de l se du tleu o sont stokes les informtions 3
7

Grer les collisions


und l fontion de hhge renvoie le mme nomre pour deux ls di'rentesD on dit qu9il y collisionF r exemple dns notre sD si nous vions un ngrmme de vu honieux qui s9ppelle vu DoncueixD l somme des lettres est l mmeD don le rsultt de l fontion de hhge ser le mme 3 heux risons peuvent expliquer une ollisionF ! v fontion de hhge n9est ps trs performnte F g9est notre sF xous vons rit une fontion trs simple @mis nnmoins su0snteA pour nos exemplesF ! ve tleu dns lequel on stoke nos donnes est trop petitF i on re un tleu de R ses et qu9on souhite stoker S personnesD on ur oup sr une ollisionD 9estEEdire que notre fontion de hhge donner le mme indie pour deux noms di'rentsF i une ollision survientD ps de pnique 3 heux solutions s9o'rent vous u hoix X l9dressge ouvert et le hngeF
8

L'adressage ouvert
9il reste de l ple dns votre tleuD vous pouvez utiliser l tehnique dite du hachage linaireF ve prinipe est simpleF v se est oupe c s de prolmeD llez l se suivnteF ehD elle est oupe ussi c ellez l suivnte 3 einsi de suiteD ontinuez jusqu9 trouver l prohine se lire dns le tleuF i vous rrivez l (n du tleuD retournez l premire se et ontinuezF gette mthode est trs simple mettre en pleD mis si vous vez euoup de olliE sionsD vous llez psser euoup de temps herher l prohine se lireF sl existe des vrintes @hhge douleD hhge qudrtiqueF F FA qui onsistent hher
7. Je vous recommande de crer une fonction de recherche qui se chargera de hacher la cl (le nom) et de vous renvoyer un pointeur vers les donnes que vous recherchiez. Cela donnerait par exemple :
infosSurLuc = rechercheTableHachage(tableau, "Luc Doncieux");

8. Les fonctions MD5 et SHA1 mentionnes plus tt sont de bonne qualit car elles produisent trs peu de collisions. Notez que SHA1 est aujourd'hui prfre MD5 car c'est celle des deux qui en produit le moins.

SPH

GRER LES COLLISIONS

nouveu selon une utre fontion en s de ollisionF illes sont plus e0es mis plus omplexes mettre en pleF

Le chanage
ne utre solution onsiste rer une liste chane l9emplement de l ollisionF ous vez deux donnes @ou plusA stoker dns l mme se c tilisez une liste hne et rez un pointeur vers ette liste depuis le tleu @(gF QIFRAF

Figure QIFR ! i deux lments doivent tre stoks u mme endroitD rez une liste

hne 3 fien entenduD on en revient u dfut des listes hnes X s9il y QHH lments et emplement du tleuD il v flloir prourir l liste hne jusqu9 trouver le onF siD omme vous le voyezD tout est 'ire de ompromisF ves listes hnes ne sont ps toujours idlesD mis les tles de hhge ont ussi leurs limitesF yn peut ominer les deux pour tenter de tirer le meilleur de hune de es strutures de donnesF uoi qu9il en soitD le point ritique dns une tle de hhge est l fontion de hhgeF woins elle produit de ollisionsD mieux 9estF vous de trouver l fontion de hhge qui onvient le mieux votre s 3

En rsum
! ves listes hnes sont )exilesD mis il peut tre long de retrouver un lment pris l9intrieur r il fut les prourir se pr seF ! ves tles de hhge sont des tleuxF yn y stoke des donnes un emplement dtermin pr une fontion de hhgeF ! v fontion de hhge prend en entre une l @exF X une hne de rtresA et retourne en sortie un nomreF ! ge nomre est utilis pour dterminer quel indie du tleu sont stokes les donnesF SPI

CHAPITRE 31. LES TABLES DE HACHAGE

! ne onne fontion de hhge doit produire peu de ollisionsD 9estEEdire qu9elle doit viter de renvoyer le mme nomre pour deux ls di'rentesF ! in s de ollisionD on peut utiliser l9dressge ouvert @reherhe d9une utre se lire dns le tleuA ou ien le hnge @ominison ve une liste hneAF

SPP

Index

dressge ouvert F F F F F F F F F F F F F F F F F F F F F SPP dresseF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSI ltoire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ llotion dynmique F F F F F F F F F F F F F F F F PQW de tleuF F F F F F F F F F F F F F F F F F F F F F FPRW ntilising F F F F F F F F F F F F F F F F F F F F F F F F F F RRR egss F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUP ssemleur F F F F F F F F F F F F F F F F F F F F F F F F F F F F RW iliothqueF F F F F F F F F F F F F F F F F F F F F F F F F F FQT hne de rtres F F F F F F F F F F F F F IUV mthmtique F F F F F F F F F F F F F F F F F F F F UP hvF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPWU stndrdF F F F F F F F F F F F F F FIQSD PPHD PWT tiereF F F F F F F F F F F F F F F F F F F F F F F F F F F FPWT inire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F S itmpF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQRR lit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQR fw F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRR oolen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VR oule F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WR in(nie F F F F F F F F F F F F F F F F F F F F F F F F F F F F WU rek F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VW u'er F F F F F F F F F F F F F F F F F F F F F F PSUD PVID QUH vidgeF F F F F F F F F F F F F F F F F F F F F F F F F F FPVT u'er over)ow F F F F F F F F F F F F F F F F F F F F F F F PVP g FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF V gCC F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VD UI gVWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITR gWWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITR
C B

llkF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRQQ rr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR eil F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UQ hnge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SPQ hne de rtresF F F F F F F F F F F F F F F F F FIUR initilistionF F F F F F F F F F F F F F F F F F F F FIUS hrF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSRD IUP tleu deF Fvoir hne de rtres ode soure F F F F F F F F F F F F F F F F F F F F F F F F F F F F T gode: :floksF F F F F F F F F F F F F F F F F F F F F F F F F FIQ ollision F F F F F F F F F F F F F F F F F F F F RHQD RHUD SPP ommentire F F F F F F F F F F F F F F F F F F F F F F F F F F RQ ompilteurF F F F F F F F F F F F F F F F F F F F F F F F FUD IP ompiltionF F F F F F F F F F F F F F F F F F F F F F F FUD IQT omplexit F F F F F F F F F F F F F F F F F F F F F F SIVD SPI ontntion F F F F F F F F F F F F F F F F F F F F F F F F IVP onditionF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUV onsoleF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQ onstnte F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SV osF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUR g F F F F F F F F F F F F F F F F F F F F F voir proesseur dogueur F F F F F F F F F F F F F F F F F F F F F F F F F F F F IP drmenttionF F F F F F F F F F F F F F F F F F F F F F F FUI d(lge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SIR de(ne F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IWQ dpssement de mmoire F F F F F F F F F F F F F PVI dpilgeF F F F F F F F F F F F F F F F F F F F F F F F FSHRD SHW diretive de prproesseur F F F F F F F F QTD IWP disque dur F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV division F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TU resteF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FTV do while F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WU
D

SPQ

INDEX

doule F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR fputF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPU doule u'eringF F F F F F F F F F F F F F F F F F F F F FQUH fputsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPV free F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRT preeype F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV E diteur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IP fsnf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQR diteur de liens F F F F F F F F F F F F F F F F F F F F F F IQU fseek F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQT else F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VH ftellF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPQS else if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VI fuite mmoire F F F F F F F F F F F F F F F F F F F F F F F F PPT empilge F F F F F F F F F F F F F F F F F F F F F F F F SHRD SHV G en(lge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SIQ gnrtion ltoire F F F F F F F F F F F F F F F F F F IHQ numrtion F F F F F F F F F F F F F F F F F F F F F F F F F PIS getsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVQ environnement de dveloppementF F F F F FIP qv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWU iyp F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQID PVW vnement F F F F F F F F F F F F F F F F F F F F F F F F F F F QTP H exit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRT hhgeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSPH ispesvi F F F F F F F F F F F F F F F F F F F F QPH hhge @tle deA F F F F F F F F F F F F F F F F F F F SIV isggi F F F F F F F F F F F F F F F F F F F F QPH hhge linireF F F F FSPP exp F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US heder F F F F F F F F F F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FIQHD IWP fsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUQ flose F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPS fget F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQH fgets F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQPD PVQ (hierF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPIW renommer F F F F F F F F F F F F F F F F F F F F F F F PQU supprimer F F F F F F F F F F F F F F F F F F F F F F F PQV pspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SII (leF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSII )gF F F F F F F F F F F F F F F F F F F F F F F F FQIUD QPID QVR testerF F F F F F F F F F F F F F F F F F F F F F F F F F F FQVR )ot F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR )oor F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR pwyhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRST fousF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQVQ fontionF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIIH loqunte F F F F F F F F F F F F F F F F F F F F F F F RPV lole F F F F F F F F F F F F F F F F F F F F F F F F F F F IRI pointeur deF F F F F F F F F F F F F F F F F F F F F FRQQ porte F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV sttique F F F F F F F F F F F F F F F F F F F F F F F F F IRI fonte F F F F F F F F F F F F F F F F F F F F F F F F F F voir polie fopen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPI for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WV fprintf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPW p F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQI SPR
F

shiF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIP if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UV ifdef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHH ifndef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHH imges pr seondeF F F F F F F F F F F F F F F F F F FRQI inlude F F F F F F F F F F F F F F F F F F F F F F F F F F F QTD IWP inlusion in(nie F F F F F F F F F F F F F F F F F F F F F F PHI inrmenttion F F F F F F F F F F F F F F F F F F F F UHD WW indie F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITQ instrution F F F F F F F F F F F F F F F F F F F F F F F F F F F F QU int F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR keysym F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QTV lngge inire F F F F F F F F F F F F F F F F F F F F F F F F F S lngge g F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F V lngge gCCF F F F F F F F F F F F F F F F F F F F F F F F F F FV lngge de progrmmtion F F F F F F F F F F F F F T vqvF F F F F F F F F F F F F F F F F F F F F F F F F F FPWUD RSU liririeF F F F F F F F F F F F F F F F Fvoir iliothque vspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR linkerF F F F F F F F F F F F F F F Fvoir diteur de liens liste hneF F F F F F F F F F F F F F F F F F F F F F F F F FRWP log F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US
L K

INDEX

longF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSR mroF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIWU min @fontionA F F F F F F F F F F F F F F F F F F F F F F F QU mllo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRR mthFhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUQ whSF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSPI mmoire dresse F F F F F F F F F F F F F F F F F F F F F F SID IRT he F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV dpssementF F F F F F F F F F F F F F F F F F F F FPVI vleur F F F F F F F F F F F F F F F F F F F F F F F F F F F F SI vive F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV modulo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TV multithe F F F F F F F F F F F F F F F F F F F F F F F F F F F RPS xvv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRW prmtreF F F F F F F F F F F F F F F F F F F F F F FIIPD IIQ pile F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR pointeur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRW de fontion F F F F F F F F F F F F F F F F F F F F F F RQQ de struture F F F F F F F F F F F F F F F F F F F F F PIP polie F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RRP porte F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV powF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUR prproesseur F F F F F F F F F F F F F F F F F F F IQTD IWI ondition F F F F F F F F F F F F F F F F F F F F F F F F PHH onstnte deF F F F F F F F F F F F F F F F F F F F FIWR printfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQWD SW proesseur onsommtion F F F F F F F F F F F F F F RPRD RQH progrmmtionF F F F F F F F F F F F F F F F F F F F F F F F FR projetF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIQH prototype F F F F F F F F F F F F F F F F F F F F F F F F F F F F IPV puissne F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR
R P N M

rine rre F F F F F F F F F F F F F F F F F F F F F F F F F F UR ew F F F F F F F F F F F F F F F F F F voir mmoire vive rnd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ T registre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV returnF F F F F F F F F F F F F F F F F F F F F F F F F F F FQUD IIQ tle de hhge F F F F F F F F F F F F F F F F F F F F F SIV qfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQH tleu F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITP SPS

sisieF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FTI snf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TID PVH hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWU ouleur F F F F F F F F F F F F F F F F F F F F F F F F F F QPW instlltion F F F F F F F F F F F F F F F F F F F F F F QHI surfe F F F F F F F F F F F F F F F F F F F F F F F F F F QPU tlhrgement F F F F F F F F F F F F F F F F F F QHH hvfliturfe F F F F F F F F F F F F F F F F F F F F QQR hvhelyF F F F F F F F F F F F F F F F F F F F F F F F F FRPR hvplip F F F F F F F F F F F F F F F F F F F F F F F F F F F QUS hvqetiks F F F F F F F F F F F F F F F F F F F F F F RPT hvsmgeF F F F F F F F F F F F F F F F F F F F FQSPD QSR hvttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV setixel F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RVH reI F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SPI sin F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR sizeof F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRH sokonF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQVV sprintf F F F F F F F F F F F F F F F F F F F F F F F F F F IVVD RSH sprite F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QWH sqrt F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR srnd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ stderrF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQIW stdinF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVT strt F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVP strhr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVS strmpF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIVQ strpyF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIVI streming F F F F F F F F F F F F F F F F F F F F F F F F F F F F RTU string F F F F F F F F F F F voir hne de rtres stringFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUV strlen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUV strprk F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVT strstr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVU strtodF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPWI strtol F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWH strutureF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPHT initilistionF F F F F F F F F F F F F F F F F F F F FPII pointeur deF F F F F F F F F F F F F F F F F F F F F FPIP surfeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQPU swithF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FVU

INDEX

tille dynmiqueF F F F F F F F F F F F F F FITR idimensionnel F F F F F F F F F F F F F F F F F F QWV indie F F F F F F F F F F F F F F F F F F F F F F F F F F F ITQ initilistionF F F F F F F F F F F F F F F F F F F F FITT tn F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR ternire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WI tik F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPT timer F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQP type personnlis F F F F F F F F F F F F F F F F F F F F PHT typedef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHV unsigned F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SS vleurF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSI vrile F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SP 'ettion F F F F F F F F F F F F F F F F F F F F F F F F SU dlrtion F F F F F F F F F F F F F F F F F F F F F F F SS glole F F F F F F F F F F F F F F F F F F F F F F F F F F IQW porte F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV sttique F F F F F F F F F F F F F F F F F F F F F F F F F IRH type F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SQ isul gCC ixpress F F F F F F F F F F F F F F F F F F IW void F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIP voidB F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRS whileF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FWR odeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPS
X W V U

SPT

Dpt lgal : mars 2012 ISBN : 979-10-90085-00-8 Code diteur : 979-10-90085 Imprim en France Achev d'imprimer le 05 mars 2012 (2 Numro imprimeur : 144043

dition)

sur les presses de Corlet Imprimeur (Cond-sur-Noireau)

Mentions lgales : Crdit photo Mathieu Nebra 4

de couverture : Yoann Grange - 2011

Conception couverture : Fan Jiyong Illustrations chapitres : Fan Jiyong Mario est une marque dpose de Nintendo Corporation Visual Studio est une marque dpose de Microsoft Corporation Google est une marque dpose de Google Corporation Vue et Vue d'Esprit sont des marques dposes de e-on Software

S-ar putea să vă placă și