You are on page 1of 545

http://www.free-livres.

com/

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 2010 - ISBN : 978-2-9535278-0-3

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 tehnologies prmi tnt d9utresF 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 les 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 g9tit il y dix ns presque jour pour jour l sortie de e livreF i

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 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:GGwwwFsiteduzeroFomGodeweFhtml

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 wwwFsiteduzeroFom 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 ! xos infogrphistesD pn tiyong @ouverture de e livreA et nnik iult @illustrE tions des hpitresA qui ont trvill d9rrheEpied pendnt plusieurs semines pour livrer le meilleur trvil possileF
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 ifFFF else F F F F F F F F F ves oolensD le oeur des onditions F F F v ondition swith 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 doFFF 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 c F F F F F F F F

143

IRR IRT IRW ISR ISU

12 Les tableaux

159

ITH ITH ITQ ITS

13 Les chanes de caractres

ve type hr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUH ves hnes sont des tleux de hr F F F F F F F F F F F F F F F F F F F F F F IUP 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 IUT F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
187

169

14 Le prprocesseur

ves inlude F F ves define F F ves mros F F ves onditions F

IVV IWH IWQ IWT

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 PHP 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 PHR 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 PHV

201

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 PII


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

215

PIT PPQ PQI PQQ

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 PQT 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 PRH 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 PRS 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
249

235

18 TP : ralisation d'un Pendu

PSH PST PTI PUI

19 La saisie de texte scurise

ves limites de l fontion 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 PUR 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 PUT 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 PVQ

273

III Cration de jeux 2D en SDL


20 Installation de la SDL

287
289

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 PWH 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 PWR 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 PWS 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
305

21 Cration d'une fentre et de surfaces

QHT QIH QIU QPU

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 QQR 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 QQV ghrger plus de formts d9imge ve hvsmge F F F F F F F F F F F F F F F F QRP 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
351

333

23 La gestion des vnements

QSP QSU QTH QTV QUP

24 TP : Mario Sokoban

ghier des hrges du okon F F F F F F ve min 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

377

QUV QVI QVT RHH RHP RHV

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 RIP 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 RPH


425

411

26 crire du texte avec hvttf

snstller 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 F F F F F RPT ghrgement de 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 F RPV 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 RQI snstller pwyh F F F F F F F F F F F F F snitiliser et lirer pwyh F F F F F F ves sons ourts F F F F F F F F F F F F F ves musiques @wQD yqqD weF F FA ves musiques @wshsA F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
443

27 Jouer du son avec FMOD

RRR RRT RRU RSP RSU xi

SOMMAIRE

28 TP : visualisation spectrale du son

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 RTR 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 RUH 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 RUR

463

IV Les structures de donnes


29 Les listes chanes

475
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
477

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

RUV RUW RVP RVU

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 RWH 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 RWU 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
503

489

31 Les tables de hachage

SHR SHR SHT SHV

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

HHIHIIHIIHHIHHIIHIHHIIIIH

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  HHIHIIHIIHHIHHIIHIHHIIIIH 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 Fexe 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 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 odeloksEVFHPmingwEsetupFexeAF 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 odeloksEVFHPEpPEmFzipF 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 gompilerD ixuterD gompiler 8 ixuter et out reompilerF 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 ! 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
3 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 !

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 ompilerD 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 pW pour faire gompiler 8 ixuter.

Crer un nouveau projet


our rer un nouveu projetD 9est trs simple X llez dns le menu pile G xew rojetF hns l fentre qui s9ouvre @(gF PFQAD hoisissez gonsole pplitionF
G

Figure PFQ ! xouveu projet

IT

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

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 qo pour rer le projetF n ssistnt s9ouvreF pites xextD 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

Figure PFR ! ghoix du lngge

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 sur e que nous llons fire dns l9immdit @veillez e que l se heug ou elese u moins soit oheAF gliquez sur pinishD 9est on 3 gode: :floks vous rer un premier projet ve dj un tout petit peu de ode soure dednsF 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 minF IU

CHAPITRE 2. AYEZ LES BONS OUTILS !

Figure PFS ! xom et emplement du projet

Figure PFT ! wode de ompiltion

IV

VISUAL C++ (WINDOWS SEULEMENT)

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


Quelles sont les dirences avec le  vrai  Visual ?
5. Attention, il n'est compatible avec Windows 7 qu' partir de la version 2010.

IW

CHAPITRE 2. AYEZ LES BONS OUTILS !

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 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 l (nD on vous dit qu9il fut vous enregistrer dns les QH joursF s de pniqueD 9est grtuit et rpide 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 c G snsrire le produitF

Crer un nouveau projet


our rer un nouveu projet sous isulD llez dns le menu pihier G xouveu G rojetF letionnez inQP dns l olonne de guheD puis epplition onsole inQP 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 rmtres de l9pplition dns l olonne de guheF eillez e que rojet vide soit oh omme sur l (gF PFIHF gliquez en(n sur erminerF

Ajouter un nouveau chier source


ne fentre s9ouvreF letionnez pihier PH otre projet est pour l9instnt ien videF pites un li droit sur le dossier pihiers soure situ sur votre guheD puis llez dns ejouter G xouvel lment @(gF PFIIAF
gCC @FppA 6 F
6. Je sais, on ne fait pas de C++ mais a n'a pas d'importance ici.

intrez un nom pour votre

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

Figure PFII ! ejout d9un (hier soure

PP

VISUAL C++ (WINDOWS SEULEMENT)

(hier X minFD omme sur l (gF PFIPF

Figure PFIP ! ghoix du type et du nom du (hier soure

gliquez sur ejouterF 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 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 hoguer et qnrer dns l listeF outes es ines de ompiltion ont leur quivlent dns les menus qnrer et hoguerF i vous fites qnrerD el rer l9exutle @ signi(e  ompiler pour isulAF i vous fites hoguer G ixuterD 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 ixplorteur de solutions en sD si e n9est dj fitF ous devriez voir que isul re dj des dossiers pour sprer les PQ

CHAPITRE 2. AYEZ LES BONS OUTILS !

Figure PFIQ ! pentre priniple de isul gCC ixpress

PR

XCODE (MAC OS SEULEMENT)

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 prinipleF g9est l qu9on modi(e les (hiers soureF RF g9est l enore l  zone de l mort D elle o on voit pprtre toutes les erreurs de ompiltionF g9est dns le s de l9rn ussi que isul 0he les informtions de dogge qund vous essyez de orriger un progrmme oguF oilD on fit le tour de isul gCCF ous pouvez ller jeter un il dns les options @yutils G yptionsA 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 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 est prsent sur le gh d9instlltion de w y @logo (gF PFIRAF

Figure PFIR ! vogo de ode

snsrez don le gh dns le leteur et instllezEleF sl se trouve dns les  heveloper ools F 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 gode we X PTRUHV PS

CHAPITRE 2. AYEZ LES BONS OUTILS !

Lancement de Xcode
vorsque vous lnez ode pour l premire foisD vous serez prolement surprisF it il y de quoiF gontrirement l pluprt des logiiels wD il n9y ps de fentre de ienvenueF in fitD l premire foisD on trouve un peu videF F F et pourtntD 9est un logiiel trs puissnt 3
Xcode est l'IDE le plus utilis sous Mac, cr par Apple lui-mme. Les plus grands logiciels, comme iPhoto et Keynote, ont t cods l'aide de Xcode. C'est rellement l'outil de dveloppement de choix quand on a un Mac !

v premire hose fire est de rer un nouveu projetD lors ommenons pr F ellez dns le menu pile G xew rojetF ne fentre de sletion de projet s9ouvre @(gF PFISAF

Figure PFIS ! eueil de ode

ellez dns l setion epplition et sletionnez gommnd vine ool F gliquez ensuite sur xextF 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
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)

ne fois rD votre projet se prsenter sous l forme d9un dossier ontennt de mulE tiples (hiers dns le pinderF ve (hier l9extension Fxodeproj orrespond u (hier du projetF g9est lui que vous devrez sletionner l prohine fois si vous souhitez rouvrir votre projetF

La fentre de dveloppement
hns odeD si vous sletionnez minFD vous devriez voir une fentre similire l (gF PFITF

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 ous pouvez l on(gurer omme on vous semleD hnger les outonsD etF ves plus importnts d9entre eux sont reprsents sur les (gF PFIU et PFIVF ves trois premiers outons vous permettent de nviguer entreD dns l9ordre X ! rojet X l o vous voyez vos (hiers et o vous les modi(ez Y ! fuild X vous y voyez le rsultt de l ompiltion de votre progrmmeD et les erreurs s9il y en eu Y ! heug X l fentre de doggeD o vous pouvez exuter votre progrmme ligne pr ligne pour trouver et omprendre ses erreursF PU

CHAPITRE 2. AYEZ LES BONS OUTILS !

ves deux outons de l (gF PFIV signi(ent X ! fuild X ompile votre projetD don re un exutle prtir de vos soures Y ! fuild nd qo @le outon que vous utiliserez le plus souventA X ompile votre projet et le lne pour le testerF 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 l liste des (hiers de notre projet X ! minF X 9est le (hier soure de votre progrmme @il peut y en voir plusieurs dns les gros progrmmesA Y ! Mon_Premier_Programme X 9est votre progrmme une fois ompilD don l9exutle que vous pouvez distriuerF i le (hier est en rougeD 9est qu9il n9existe ps enore @vous n9vez don ps enore ompil votre progrmmeD mis ode le rfrene qund mmeA Y ! Mon_Premier_Programme.l X 9est votre progrmme prsent en lngge sE semleurD un lngge trs prohe du proesseurF gel ne nous intresser psD mis si vous voulez prendre peur n9hsitez ps y jeter un ilF RF in(nD l qutrime prtieD l plus intressnte X 9est elle dns lquelle vous pourrez rire votre ode soure en lngge gF r dfutD ode met juste un petit ode d9exemple qui 0he  relloD world 3 l9rnF

Figure PFIU ! v rre d9outils @nvigtionA

Figure PFIV ! v rre d9outils @ompiltionA

Lancement du programme
our tester e premier progrmmeD liquez sur le outon fuild nd qo de l rre d9outilsF otre rn devrit hnger et ressemler l (gF PFIWF IF ge sont les outons qui permettent de hnger de pgeD omme on l9 vu plus ttF letionnez rojet si vous souhitez revenir l fentre prdenteF PF g9est l ileD le (hier qui runit les soures ompiles de votre progrmmeF QF v9exutle de votre pplitionF RF ve mode de ompiltionF sl peut tre X PV

XCODE (MAC OS SEULEMENT)

Figure PFIW ! vnement du progrmme sous ode


heug X l9exutle reste dns ode et ontient des informtions de dogge pour vous ider rsoudre vos erreurs ventuellesF g9est e que vous utiliserez lorsque vous dvelopperez votre pplition Y ! elese X n9utiliser qu9 l (nF ode gnre lors l9pplition d(nitiveD fite pour tre prtge et utilise pr d9utres ordinteursF ges deux outons vous permettent de dmrrer l9pplition diretement @unA ou de l dmrrer en mode  heug pour exuter le progrmme instrution pr instrutionD (n de rsoudre les erreursF x9utilisez heug que lorsque vous vez des erreurs dns votre progrmmeF v liste des (hiers de votre projetF v9diteur du ode soureD omme tout l9heureF v onsole de odeF g9est l que vous verrez votre progrmme s9exuterF ves outons fuild et un vous permettent de psser du mode  gompiltion u mode  ixution F in lirD ve le premier vous pouvez voir e qui s9est pss pendnt l ompiltionD tndis que dns le seond vous pouvez voir e que votre pplition 0h une fois qu9elle t dmrreF

SF TF UF VF WF

Ajouter un nouveau chier


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

CHAPITRE 2. AYEZ LES BONS OUTILS !

our rer un nouveu (hier soure sous odeD rendezEvous dns le menu pile G xew pileF n ssistnt vous demnde quel type de (hier vous voulez rerF endezE vous dns l setion fh et sletionnez g pile @pihier gAF ous devriez voir sous les yeux l (gF PFPHF

Figure PFPH ! ejouter un (hier sous ode

ous devrez donner un nom votre nouveu (hier @e que vous voulezAF v9extensionD elleD doit rester FF rfois E nous le verrons plus loin ED il fudr ussi rer des (hiers Fh @mis on en reprlerAF v se oher elso rete fihierFh est l pour F our le momentD elle ne nous intresse psF gliquez ensuite sur pinishF g9est fit 3 otre (hier est r et jout votre projetD en plus de minFF 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 QH

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.

QI

CHAPITRE 3. VOTRE PREMIER PROGRAMME

Console ou fentre ?
xous vons rpidement prl de l notion de  progrmme onsole et de  proE grmme fentre dns le hpitre prdentF xotre shi nous demndit quel type de progrmme nous voulions rer et je vous vis dit de rpondre onsoleF 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 ?

QP

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.

QQ

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 hmrrer G eessoires G snvite de ommndesD ou ien enore en fisnt hmrrer G ixuterFFFD et en tpnt ensuite mdF 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 QR

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 pile G xew G rojetD puis hoisir gonsole epplition et sletionner le lngge gF gode: :floks don gnr le minimum de ode en lngge g dont on esoinF ve voii X
5inlude `stdioFhb 5inlude `stdliFhb int min@A { printf@4rello world3n4AY return HY }

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


int min@A

F F F peut ussi s9rire X


int min@int rgD hr BrgvA

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 minF 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 minF @le resteD e sont des (hiers de projet gnrs pr votre shiAF QS

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
5inlude `stdioFhb 5inlude `stdliFhb

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 5F 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 inlude 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 stdioFh et stdliFhF 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
int min@A { printf@4rello world3n4AY return HY }

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 QT

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 ouvrirfihier 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 ouvrirfihierD 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 minF g9est un nom de fontion prtiulier qui signi(e  prinipl F min est l fontion priniple de votre progrmmeD c'est toujours par la fonction min que le programme commenceF ne fontion un dut et une (nD dlimits pr des oldes { et }F oute l fontion min se trouve don entre es oldesF i vous vez ien suiviD notre fontion min ontient deux lignes X
printf@4rello world3n4AY return HY

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 ouvrirfihier omme je vous l9i expliqu tout l9heureD ou enore une fontion vnerpersonnge 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  Y . 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@4rello world3n4AY 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 HY ih ien D en grosD veut dire que 9est (ni @eh ouiD djAF gette ligne indique qu9on rrive l (n de notre fontion min et demnde de renvoyer l vleur HF
2. Du moins si vous l'avez bien dress.

QU

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 fuild 8 un sous gode: :floksAF i vous ne l9vez ps enore fitD on vous demnder d9enregistrer les (hiersF pitesEleF eprs un temps d9ttente insupportle @l ompiltionAD votre premier progrmme v pprtre sous vos yeux totlement envhis de onheur @(gF QFSAF 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
3. En pratique, 0 signie  tout s'est bien pass  et n'importe quelle autre valeur signie  erreur .

QV

CRIRE UN MESSAGE L'CRAN

Figure QFS ! otre premier progrmme 3

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 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 min !
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 ?

QW

CHAPITRE 3. VOTRE PREMIER PROGRAMME

ous vous souvenez de es deux lignes c


5inlude `stdioFhb 5inlude `stdliFhb

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 @stdioFh et stdliFhA ontiennent l pluprt des fontions de se dont on esoin dns un progrmmeF stdioFh 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 minD on fit don ppel l fontion printfF g9est une fontion qui en ppelle une utre @iiD min 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
printf@AY

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
printf@4fonjour4AY

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
5inlude `stdioFhb 5inlude `stdliFhb int min@A { printf@4fonjour4AY return HY }

RH

CRIRE UN MESSAGE L'CRAN

yn don deux instrutions qui ommndent dns l9ordre l9ordinteur X IF 0he  fonjour l9rn Y PF l fontion min 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 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
printf@4fonjourn4AY

RI

CHAPITRE 3. VOTRE PREMIER PROGRAMME

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@4fonjourneu evoirn4AY 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 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 RP

LES COMMENTAIRES, C'EST TRS UTILE !

! 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
printf@4fonjour qerrdn4AY

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


5

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 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 @GGA suivi de votre ommentireF r exemple X
GG gei est un ommentire
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 !

RQ

CHAPITRE 3. VOTRE PREMIER PROGRAMME

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
printf@4fonjour4AY GG gette instrution ffihe fonjour l9rn

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 @GBA Y ! pour indiquer l n du commentaire X tpez une toile suivie d9un slsh @BGAF ous rirez don pr exemple X
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
GB giEdessousD e sont des diretives de prproesseurF ges lignes permettent d9jouter des fihiers u projetD fihiers que l9on ppelle iliothquesF qre es iliothquesD on disposer de fontions toutes prtes pour ffiher pr exemple un messge l9rnF BG 5inlude `stdioFhb 5inlude `stdliFhb GB giEdessousD vous vez l fontion priniple du progrmmeD ppele minF g9est pr ette fontion que tous les progrmmes ommenentF siD m fontion se ontente d9ffiher fonjour l9rnF BG int min@A { printf@4fonjour4AY GG gette instrution ffihe fonjour l9rn return HY GG ve progrmme renvoie le nomre H puis s9rrte }

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 RR

LES COMMENTAIRES, C'EST TRS UTILE !

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 min @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 ! printf 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
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. ;-)

RS

CHAPITRE 3. VOTRE PREMIER PROGRAMME

RT

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.

RU

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 RV

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

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

CHAPITRE 4. UN MONDE DE VARIABLES

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 l9oeil 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 SH

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 SI

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 SP

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 @efgHIPA 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 lrgeurD veqi ou enore vergiu 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 nomreheiesD prenomD nomD numerodetelephoneD numeroheelephoneF 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 nomreheies, 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 SQ

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
hr int long flot doule

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 @hrD intD longA permettent de stoker des nomres entiers X ID PD QD RF F F ves deux derniers @flotD douleA permettent de stoker des nomres dimux X IQFVD ITFWIIF F F
Les types flot et doule permettent de stocker des nombres dcimaux extrmement grands. Si vous ne connaissez pas les puissances de 10, dites-vous par exemple que le type doule 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 hr, int et doule.

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

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 @hrD 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 hr 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 @hr s9rrte IPVD tndis que unsigned hr 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 hrD 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 douleF

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 SS

CHAPITRE 4. UN MONDE DE VARIABLES

r exempleD si je veux rer m vrile nomreheies de type intD je dois tper l ligne suivnte X
int nomreheiesY

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


int notehewthsY doule sommeergenteueY unsigned int nomreheveteursinrinhevirenxomherileneuvongY

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 minAD vous llez dlrer l vrile omme ei X
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA GG quivlent de int min@A { int nomreheiesY } return HY

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

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 !

ST

DCLARER UNE VARIABLE

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 nomreheiesD niveuD gehutoueurY

Cela crera trois variables gehutoueur.

int

appeles

nomreheies, niveu

et

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 nomreheiesD il su0t de proder omme ei X
nomreheies a SY

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 nomreheiesF xotre progrmme omplet ressemle don ei X
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { int nomreheiesY nomreheies a SY } return HY

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
int nomreheiesY nomreheies a SY nomreheies a RY nomreheies a QY

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 SU

CHAPITRE 4. UN MONDE DE VARIABLES

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 ?

in e'etD qund l9ordinteur lit ette ligne X


int nomreheiesY

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
int nomreheies a SY

siD l vrile nomreheies 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 onst 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 SV

AFFICHER LE CONTENU D'UNE VARIABLE


onst int xywfihisisxssevi a SY

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 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 0herit un mot doux du genre X rning ssignment of redEonly vrile 9xywfihisisxssevi9 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
printf@4sl vous reste 7d vies4AY

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
7d 7f

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 7dD et pour un doule vous utiliserez 7fF 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
2. Traduction :  Triple idiot, pourquoi tu essaies de modier la valeur d'une constante ? 

SW

CHAPITRE 4. UN MONDE DE VARIABLES


printf@4sl vous reste 7d vies4D nomreheiesAY

ve 7d ser rempl pr l vrile indique prs l virguleD svoir nomreheiesF yn se teste dns un progrmme c
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { int nomreheies a SY GG eu dprtD le joueur S vies printf@4ous vez 7d viesn4D nomreheiesAY printf@4BBBB f e w BBBBn4AY GG v il se prend un grnd oup sur l tte nomreheies a RY GG sl vient de perdre une vie 3 printf@4eh desoleD il ne vous reste plus que 7d vies mintennt 3nn4D nomreheiesAY } return HY

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 desoleD 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 7d ou des 7f l o vous voulezD puis d9indiquer les vriles orrespondntes dns le mme ordreD spres pr des virgulesF r exemple X
printf@4ous vez 7d vies et vous etes u niveu n 7d4D nomreheiesD niveuAY

TH

RCUPRER UNE SAISIE

Veillez bien indiquer vos variables dans le bon ordre. Le premier 7d sera remplac par la premire variable (nomreheies), et le second 7d par la seconde variable (niveu). 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
int min@int rgD hr BrgvA { int nomreheies a SD niveu a IY printf@4ous vez 7d vies et vous etes u niveu n 7dn4D nomreheiesD niveu AY } return HY

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 snfF gette fontion ressemle euoup printfF ous devez mettre un 7d 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
int ge a HY snf@47d4D 8geAY

yn doit mettre le 7d 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 ?

TI

CHAPITRE 4. UN MONDE DE VARIABLES

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 doule), cette fois il ne faut pas utiliser 7f comme on pourrait s'y attendre mais. . . 7lf. C'est une petite dirence avec le printf qui lui prenait 7f.
doule poids a HY snf@47lf4D 8poidsAY

evenons notre progrmmeF vorsque eluiEi rrive un snfD il se met en puse et ttend que l9utilisteur entre un nomreF ge nomre ser stok dns l vrile geF oii un petit progrmme simple qui demnde l9ge de l9utilisteur et qui le lui 0he ensuite X
int min@int rgD hr BrgvA { int ge a HY GG yn initilise l vrile H printf@4uel ge vezEvous c 4AY snf@47d4D 8geAY GG yn demnde d9entrer l9ge ve snf printf@4eh 3 ous vez don 7d ns 3nn4D geAY } return HY

gode we X WWPIVT uel ge vezEvous 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 ge l9rn @ Ah ! Vous avez donc 20 ans ! AF oilD vous vez ompris le prinipeF qre l fontion snfD 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 TP

RCUPRER UNE SAISIE

! 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 ! 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 doule stokent des nomres dimuxF ! v fontion snf 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.

TQ

CHAPITRE 4. UN MONDE DE VARIABLES

TR

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.

TS

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 resultt de type int et fire un lul X
1

int resultt a HY resultt a S C QY

s esoin d9tre un pro du lul mentl pour deviner que l vrile resultt 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
printf@4S C Q a 7d4D resulttAY

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.

TT

LES CALCULS DE BASE

eddition C oustrtion E wultiplition B hivision G wodulo 7 Table SFI ! ignes des oprteurs

Opration

Signe

La division
ves divisions fontionnent normlement sur un ordinteur qund il n9y ps de resteF r exempleD T G Q font PD votre ordinteur vous donner l rponse justeF tusqueEl ps de souiF wis prenons mintennt une division ve reste omme S G PF F F ve rsultt devrit tre PFSF it pourtnt 3 egrdez e que fit e ode X
int resultt a HY resultt a S G PY printf @4S G P a 7d4D resulttAY

S G P a P

sl y un gros prolmeF yn demnd S G PD 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 resultt 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 resultt en douleD 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
doule resultt a HY
2. Aussi appele  division euclidienne .

TU

CHAPITRE 5. UNE BTE DE CALCUL


resultt a SFH G PFHY printf @4S G P a 7f4D resulttAY

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 S G PD 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 7F oii quelques exemples de modulos X ! S 7 P a IY ! IR 7 Q a P Y ! R 7 P a HF ve modulo S 7 P est le reste de l division S G PD 9estEEdire IF v9ordinteur lule que S a P B P C I @9est e ID le resteD que le modulo renvoieAF he mmeD IR 7 QD le lul est IR a Q B R C P @modulo renvoie le PAF in(nD pour R 7 PD 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 TV

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
resultt a nomreI C nomrePY

gette ligne fit l somme des vriles nomreI et nomrePD et stoke le rsultt dns l vrile resulttF 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 resulttF 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
int min@int rgD hr BrgvA { int resultt a HD nomreI a HD nomreP a HY GG yn demnde les nomres I et P l9utilisteur X printf@4intrez le nomre I X 4AY snf@47d4D 8nomreIAY printf@4intrez le nomre P X 4AY snf@47d4D 8nomrePAY GG yn fit le lul X resultt a nomreI C nomrePY GG it on ffihe l9ddition l9rn X printf @47d C 7d a 7dn4D nomreID nomrePD resulttAY } return HY

TW

CHAPITRE 5. UNE BTE DE CALCUL


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

resultt a nomreI C nomreP C nomreQY

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 nomre @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
nomre a nomre C IY
3. Encore heureux, parce que des oprations comme a, il doit en faire des milliards en une seule seconde !

UH

LES RACCOURCIS

ue se psseEtEil ii c yn fit le lul nomre C ID et on rnge e rsultt dns l vrileF F F nomre 3 hu oupD si notre vrile nomre 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
nomreCCY

gette ligneD ien plus ourte que elle de tout l9heureD signi(e  ejoute I l vrile nomre 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'oeil 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
nomre a nomre E IY

it mintennt en forme  rourie X


nomreEEY

yn l9urit presque devin tout seul 3 eu lieu de mettre un CCD vous mettez un EE 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 C E B G 7F UI

CHAPITRE 5. UNE BTE DE CALCUL

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
nomre a nomre B PY

ous pouvez l9rire d9une fon rourie omme ei X


nomre Ba PY

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
int nomre a PY nomre nomre nomre nomre nomre Ca Ea Ba Ga 7a RY QY SY QY QY GG GG GG GG GG nomre vut TFFF FFF nomre vut mintennt Q FFF nomre vut IS FFF nomre vut S FFF nomre vut P @r S a I B Q C PA

(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 snf de l iliothque stdioFhF sl fut svoir qu9il existe une utre iliothqueD ppele mthFhD 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
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.

UP

LA BIBLIOTHQUE MATHMATIQUE

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 S2 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 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
5inlude `mthFhb

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
doule solu a HD nomre a EPUY solu a fs@nomreAY GG solu vudr PU

gette fontion renvoie un douleD don votre vrile solu doit tre de type douleF
Il existe aussi une fonction similaire appele s, situe cette fois dans La fonction s marche de la mme manire, sauf qu'elle utilise des entiers (int). Elle renvoie donc un nombre entier de type int et non un doule comme fs.
stdliFh.

UQ

CHAPITRE 5. UNE BTE DE CALCUL

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 doule X
doule dessus a HD nomre a SPFUIY dessus a eil@nomreAY 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
pow@nomreD puissneAY

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
doule resultt a HD nomre a PY resultt a pow@nomreD QAY GG resultt vudr PQ 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 douleF
doule resultt a HD nomre a IHHY resultt a sqrt@nomreAY GG resultt vudr IH

UR

LA BIBLIOTHQUE MATHMATIQUE

sin, cos, tan


ge sont les trois fmeuses fontions utilises en trigonomtrieF ve fontionnement est le mmeD es fontions renvoient un douleF 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 douleF

exp
gette fontion lule l9exponentielle d9un nomreF ille renvoie un doule @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 vrileCCF ! v dcrmentation est l9oprtion inverse X on retire I une vrileF yn rit don vrileEEF ! 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>

US

CHAPITRE 5. UNE BTE DE CALCUL

UT

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 !

UU

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 ifFFF 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 ifFFF 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 aa pour tester l'galit. Une erreur courante que font les dbutants et de ne mettre qu'un symbole a, 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 UV

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
if @GB otre ondition BGA { GG snstrutions exuter 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 ge qui ontient votre geF enez pour s9entrnerD on v tester si vous tes mjeurD 9estEEdire si votre ge est suprieur ou gal 18 X
if @ge ba IVA { printf @4ous etes mjeur 34AY }

ve symole ba 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 min et ne ps oulier de dlrer une vrile ge 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
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { int ge a PHY

UW

CHAPITRE 6. LES CONDITIONS

if @ge ba IVA { printf @4ous etes mjeur 3n4AY } } return HY

we X SQQURT siD l vrile ge 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

gode

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
if @ge ba IVA { printf @4ous etes mjeur 34AY }

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 VH

LA CONDITION IF... ELSE

s l vrile vut D evy fis eiD sxyx fis elF sl su0t de rjouter le mot else prs l9olde fermnte du ifF etit exemple X
if @ge ba IVA GG i l9ge est suprieur ou gl IV { printf @4ous etes mjeur 34AY } else GG inonFFF { printf @4eh 9est eteD vous etes mineur 34AY }

ves hoses sont ssez simples X si l vrile ge 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
if @ge ba IVA GG i l9ge est suprieur ou gl IV { printf @4ous etes mjeur 34AY } else if @ ge b R A GG inonD si l9ge est u moins suprieur R { printf @4fon t9es ps trop jeune qund memeFFF4AY } else GG inonFFF { printf @4eg g g g4AY 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 VI

CHAPITRE 6. LES CONDITIONS

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 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
88 || 3

i y xyx

Test ET

i on veut fire le test que j9i mentionn plus hutD il fudr rire X
if @ge b IV 88 ge ` PSA

ves deux symoles 88 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 elt qr C TF ur un lvier elgeD il fudr fire elt qr C 8F VP

LA CONDITION IF... ELSE

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 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
if @ge b QH || rgent b IHHHHHA { printf@4fienvenue hez isoufnque 34AY } else { printf@4rors de m vueD miserle 34AY }

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
if @3@ge ` IVAA

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

Quelques erreurs courantes de dbutant


N'oubliez pas les deux signes aa

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


if @ge aa IVA { printf @4ous venez de devenir mjeur 34AY }

N'oubliez pas de mettre deux signes  gl dns un ifD omme ei X aa i vous ne mettez qu9un seul signe aD 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 VQ

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
if @ge aa IVAY GG xotez le pointEvirgule ii qui ne devrit e tre l { printf @4u es tout juste mjeur4AY }

Les boolens, le coeur des conditions


xous llons mintennt entrer plus en dtils dns le fontionnement d9une ondition de type ifFFF 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
if @IA { printf@4g9est vri4AY } else { printf@4g9est fux4AY }

sultt X

g9est 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


if @HA { printf@4g9est vri4AY

VR

LES BOOLENS, LE COEUR DES CONDITIONS


} else { printf@4g9est fux4AY }

sultt X

g9est 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
if @ge ba IVA

siD le test que vous fites est ge ba IVF upposons que ge ville PQF elors le test est vriD et l9ordinteur  remple en quelque sorte ge ba IV pr IF insuiteD l9ordinteur otient @dns s tteA un if @IAF 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 ge ba IV 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
int ge a PHY int mjeur a HY mjeur a ge ba IVY printf@4wjeur vut X 7dn4D mjeurAY

gomme vous le voyezD l ondition ge ba IV renvoy le nomre I r elle est vrieF hu oupD notre vrile mjeur vut ID on vri(e d9illeurs el gre un printf qui montre ien qu9elle hng de vleurF VS

CHAPITRE 6. LES CONDITIONS

pites le mme test en mettnt ge

aa IH

pr exempleF gette foisD mjeur vudr HF

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 ool 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
int mjeur a IY if @mjeurA { printf@4u es mjeur 34AY } else { printf@4u es mineur4AY }

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 @mjeurAD 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
if @mjeur 88 gronA

ge test signi(e  si tu es mjeur i que tu es un gron F gron 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
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 .

VT

LA CONDITION SWITCH

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
Petite question : si on fait le test if
@mjeur aa IA,

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 @mjeurA 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 @vrile aa IAF 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 @vrileAF

La condition switch
v ondition ifFFF 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 ifFFF else permet de grer tous les sF outefoisD le ifFFF else peut s9vrer quelque peuF F F rptitifF renons et exemple X
if @ge aa PA { printf@4lut ee 34AY } else if @ge aa TA { printf@4lut gmin 34AY } else if @ge aa IPA { printf@4lut jeune 34AY } else if @ge aa ITA { printf@4lut do 34AY } else if @ge aa IVA { printf@4lut dulte 34AY } else if @ge aa TVA { printf@4lut ppy 34AY

VU

CHAPITRE 6. LES CONDITIONS


} else { printf@4te n9i uune phrse de prete pour ton ge4AY }

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 ifFFF elseF gette struture prtiulire s9ppelle swithF oii un swith s sur l9exemple qu9on vient de voir X
swith @geA { se PX printf@4lut ee 34AY rekY se TX printf@4lut gmin 34AY rekY se IPX printf@4lut jeune 34AY rekY se ITX printf@4lut do 34AY rekY se IVX printf@4lut dulte 34AY rekY se TVX printf@4lut ppy 34AY rekY defultX printf@4te n9i uune phrse de prete pour ton ge rekY }

4AY

we X WWTWVV smprgnezEvous de mon exemple pour rer vos propres swithF yn les utilise plus rrementD mis 9est vri que 9est prtique r fit @un peuA moins de ode tperF v9ide 9est don d9rire swith @mrileA pour dire  je vis tester l vleur de VV

gode

LA CONDITION SWITCH

l vrile mrile F ous ouvrez ensuite des oldes que vous refermez tout en sF insuiteD l9intrieur de es oldesD vous grez tous les s X se PD se RD se SD se RSF F F
Vous devez mettre une instruction rekY 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 rekY commande en fait l'ordinateur de  sortir  des accolades.

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

Grer un menu avec un switch


ve swith 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 snf pour enregistrer le hoix de l9utilisteur dns une vrile hoixwenuD et en(n fites un swith 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


5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA

VW

CHAPITRE 6. LES CONDITIONS


{

int hoixwenuY printf@4aaa wenu aaann4AY printf@4IF oyl gheesen4AY printf@4PF w heluxen4AY printf@4QF w fonn4AY printf@4RF fig wn4AY printf@4notre hoix c 4AY snf@47d4D 8hoixwenuAY printf@4n4AY

swith @hoixwenuA { se IX printf@4ous vez hoisi le oyl gheeseF fon hoix 34AY rekY se PX printf@4ous vez hoisi le w heluxeF ferkD trop de sueFFF4AY rekY se QX printf@4ous vez hoisi le w fonF fonD psse enore YoA4AY rekY se RX printf@4ous vez hoisi le fig wF ous devez voir tres fim 34AY rekY defultX printf@4ous n9vez ps rentre un nomre orretF ous ne mngerez rien du tout 34AY rekY } printf@4nn4AY } return HY

we X SQRIIV it voil le trvil 3 t9espre que vous n9vez ps ouli le defult l (n du swith 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 IH ou enore lut 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 defult ou un else si vous fites ve des ifF WH

gode

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 ifFFF 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 ifFFF elseD et l seondeD identiqueD mis sous forme d9une expression ternireF

Une condition if... else bien connue


upposons qu9on it une vrile oolenne mjeur qui vut vri @IA si on est mjeurD et fux @HA si on est mineurF yn veut hnger l vleur de l vrile ge 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 ifFFF else X
if @mjeurA ge a IVY else ge a IUY

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
ge a @mjeurA c IV X IUY

ves ternires permettentD sur une seule ligneD de hnger l vleur d9une vrile en fontion d9une onditionF si l ondition est tout simplement mjeurD mis pourrit WI

CHAPITRE 6. LES CONDITIONS

tre n9importe quelle ondition plus longue ien entendu F ve point d9interrogtion permet de dire  estEe que tu es mjeur c F i ouiD lors on met l vleur IV dns geF inon @le deuxEpoints X 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
2

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 swith 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

2. Un autre exemple ? autorisation = (age >= 18) ? 1 : 0; 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.

WP

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 !

WQ

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 ! doFFF 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
while @GB gondition BGA {

WR

LA BOUCLE WHILE
GG snstrutions rpter

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
int nomreintre a HY while @nomreintre 3a RUA { printf@4pez le nomre RU 3 4AY snf@47d4D 8nomreintreAY }

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 ompteur 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 vrileCCYF egrdez ttentivement e out de ode etD surtoutD essyez de le omprendre X
int ompteur a HY while @ompteur ` IHA { printf@4lut les eros 3n4AY ompteurCCY }

sultt X WS

CHAPITRE 7. LES BOUCLES


lut lut lut lut lut lut lut lut lut lut les les les les les les les les les les eros eros eros eros eros eros eros eros eros eros 3 3 3 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 ompteur initilise HF ille vut don H u dut du progrmmeF PF v oule while ordonne l rptition ex i ompteur est infrieur IHF gomme ompteur 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 ompteurD gre ompteurCCYF ompteur 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 ompteur vut I 3 hon on reommene les instrutions de l ouleF it insi de suiteF F F ompteur v vloir progressivement HD ID PD QD F F FD VD WD et IHF vorsque ompteur vut IHD l ondition ompteur ` IH est fusseF gomme l9instrution est fusseD on sort de l ouleF yn pourrit d9illeurs voir que l vrile ompteur ugmente u fur et mesure dns l ouleD en l90hnt dns le printf X
int ompteur a HY while @ompteur ` IHA { printf@4v vrile ompteur vut 7dn4D ompteurAY ompteurCCY }

WT

LA BOUCLE DO... WHILE


v v v v v v v v v v vrile vrile vrile vrile vrile vrile vrile vrile vrile vrile ompteur ompteur ompteur ompteur ompteur ompteur ompteur ompteur ompteur ompteur vut vut vut vut vut vut vut vut vut vut H I P Q R S 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 @` IHH u lieu de ` IHAF 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
while @IA { printf@4foule infinien4AY }

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 gtrl C g.

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
int ompteur a HY

WU

CHAPITRE 7. LES BOUCLES


do {

printf@4lut les eros 3n4AY ompteurCCY } while @ompteur ` IHAY

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 initilis le ompteur SHD l ondition urit t fusse ds le dut et on ne serit jmis rentr dns l ouleF our l oule doFFF 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 ompteur 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 doFFF 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 swith 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
int ompteur a HY while @ompteur ` IHA { printf@4lut les eros 3n4AY ompteurCCY }

oii mintennt l9quivlent en oule for X


int ompteurY for @ompteur a H Y ompteur ` IH Y ompteurCCA {

WV

LA BOUCLE FOR
printf@4lut les eros 3n4AY

uelles di'renes c ! ous noterez que l9on n9 ps initilis l vrile ompteur 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 ompteurCCY dns l ouleF 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 ompteurF 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 ompteurF v qusiEtotlit du temps on fer une inrmenttionD mis on peut ussi fire une drmenttion @vrileEEYA ou enore n9importe quelle utre oprtion @vrile Ca PY 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 doFFF 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

WW

CHAPITRE 7. LES BOUCLES

IHH

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.

IHI

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 g9est plus 3 uel est le nomre c US g9est plus 3 uel est le nomre c VS g9est moins 3 uel est le nomre c VH g9est moins 3 uel est le nomre c UV g9est plus 3 uel est le nomre c UW frvoD 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 IHP

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 snf 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 rnd@AF 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

srnd@time@xvvAAY nomrewystere a @rnd@A 7 @we E wsx C IAA C wsxY

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

et wsx 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
onst int we a IHHD wsx a IY

Les bibliothques inclure


our que votre progrmme fontionne orretementD vous urez esoin d9inlure trois iliothques X stdliD stdio et time @l dernire sert pour les nomres ltoiresAF otre progrmme devr don ommener pr X
1. Je ne pouvais pas trop vous demander de la deviner !

IHQ

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


5inlude `stdioFhb 5inlude `stdliFhb 5inlude `timeFhb

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
5inlude `stdioFhb 5inlude `stdliFhb 5inlude `timeFhb int min @ int rgD hrBB rgv A { int nomrewystere a HD nomreintre a HY onst int we a IHHD wsx a IY GG qnrtion du nomre ltoire

IHR

CORRECTION !

srnd@time@xvvAAY nomrewystere a @rnd@A 7 @we E wsx C IAA C wsxY

GB v oule du progrmmeF ille se rpte tnt que l9utilisteur n9 ps trouv le nomre mystre BG do {

GG yn demnde le nomre printf@4uel est le nomre c 4AY snf@47d4D 8nomreintreAY GG yn ompre le nomre entr ve le nomre mystre

if @nomrewystere b nomreintreA printf@4g9est plus 3nn4AY else if @nomrewystere ` nomreintreA printf@4g9est moins 3nn4AY else printf @4frvoD vous vez trouve le nomre mystere 333nn4AY } while @nomreintre 3a nomrewystereAY }

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 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 minFF x9ouvrez ps le (hier minF 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 minFF ous pourrez lors ompiler le progrmme pour tester et le modi(er si vous le dsirezF IHS

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 5 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 @nomreintreA et une utre qui retient le nomre ltoire gnr pr l9ordinteur @nomrewystereAF 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 we pr exempleA il su0t juste d9diter ette ligne et de reompilerF
La boucle

t9i hoisi de fire une oule doFFF whileF in thorieD une oule while simple urit pu fontionner ussiD mis j9i trouv qu9utiliser doFFF while tit plus logiqueF ourquoi c re queD souvenezEvousD doFFF 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 nomreintreF uisD on ompre e nomreintre u nomrewystereF 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 IHT

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 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 ontinuerrtie 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 rnd@A omme on vuD dns l9utre s serF F F un snfF ! 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 nomrewximum @vous prendrez soin d9enlever le motEl onst 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 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 IHU

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

IHV

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 !

IHW

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 minF 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 5 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 min @ps trop remplie il fut le reonntreAF te vous vis dit qu9un progrmme en lngge g ommenit pr l fontion minF te vous rssureD 9est toujours vri 3 eulementD jusqu9ii nous sommes rests l9intrieur de l fontion minF xous n9en sommes jmis sortisF evoyez vos odes soures et vous verrez X nous sommes toujours rests l9intrieur des oldes de l fontion minF
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 minF 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 minD 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 IIH

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 ffiherpenetre 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 ffiherpenetreD ouvreEmoi une fentre 3 F yn pourr ussi rire une fontion deplerersonnge 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 minF 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
type nompontion@prmetresA { GG snsrez vos instrutions ii }

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

III

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 douleD 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 @hrD intD douleD etFA Y ! les fontions qui ne renvoient ps de vleur X on leur met un type spil void @qui signi(e  vide AF ! nompontion 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 ! prmetres @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
int triple@int nomreA { int resultt a HY resultt a Q B nomreY GG yn multiplie le nomre fourni pr Q return resulttY 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 intre les prenthsesD vous vez les vriles que l fontion reoitF siD notre fontion triple reoit une vrile de type int ppele nomreF
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.

IIP

CRER ET APPELER UNE FONCTION

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
return resulttY

ge ode signi(e pour l fontion X  errteEtoi l et renvoie le nomre resultt F gette vrile resultt hys tre de type intD r l fontion renvoie un int omme on l9 dit plus hutF v vrile resultt 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 min 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
int triple@int nomreA { return Q B nomreY }

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 ddition qui dditionne deux nomres et X
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.

IIQ

CHAPITRE 9. LES FONCTIONS

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

void onjour@A { printf@4fonjour4AY }

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 minF i vous l plez prsD ne mrher psF te vous expliqueri pourquoi pr l suiteF oii un ode tester et omprendre X
5inlude `stdioFhb 5inlude `stdliFhb int triple@int nomreA { return Q B nomreY } int min@int rgD hr BrgvA { int nomreintre a HD nomreriple a HY printf@4intrez un nomreFFF 4AY snf@47d4D 8nomreintreAY nomreriple a triple@nomreintreAY printf@4ve triple de e nomre est 7dn4D nomreripleAY } return HY

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

IIR

CRER ET APPELER UNE FONCTION

we X VISRWT xotre progrmme ommene pr l fontion min 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 nomreripleF egrdez en prtiulier ette ligneD 9est l plus intressnte r 9est l9ppel de l fontion X
nomreriple a triple@nomreintreAY

gode

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 nomreripleF yn ordonne don l9ordinteur dns ette ligne X  hemnde l fontion triple de me luler le triple de nomreintreD et stoke le rsultt dns l vrile nomreriple 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
5inlude `stdioFhb 5inlude `stdliFhb int triple@int nomreA GG T { return Q B nomreY GG U } int min@int rgD hr BrgvA GG I { int nomreintre a HD nomreriple a HY GG P printf@4intrez un nomreFFF 4AY GG Q snf@47d4D 8nomreintreAY GG R nomreriple a triple@nomreintreAY GG S printf@4ve triple de e nomre est 7dn4D nomreripleAY GG V } return HY GG W

oii e qui se psseD ligne pr ligneF IF ve progrmme ommene pr l fontion minF IIS

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 @snfAF 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 @nomreAF 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 min 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 nomreFFF IH ve triple de e nomre est QH

IIT

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@nomreintreA 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 nomreriple r on ne s9en sert plus X
5inlude `stdioFhb 5inlude `stdliFhb int triple@int nomreA { return Q B nomreY } int min@int rgD hr BrgvA { int nomreintre a HY printf@4intrez un nomreFFF 4AY snf@47d4D 8nomreintreAY

GG ve rsultt de l fontion est diretement envoy u printf et n9est ps stok dns une vrile printf@4ve triple de e nomre est 7dn4D triple@nomreintreAAY return HY

gomme vous le voyezD triple@nomreintreA 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 IIU

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 onversionF gette fontion prend une vrile en entre de type doule et retourne une sortie de type doule r on v forment mnipuler des nomres dimuxF visezEl ttentivement X
doule onversion@doule eurosA { doule frns a HY frns a TFSSWSU B eurosY return frnsY

int min@int rgD hr BrgvA { printf@4IH euros a 7fpn4D onversion@IHAAY printf@4SH euros a 7fpn4D onversion@SHAAY printf@4IHH euros a 7fpn4D onversion@IHHAAY printf@4PHH euros a 7fpn4D onversion@PHHAAY } return HY

gode we X UVTSRW IH euros a TSFSWSUHHp SH euros a QPUFWUVSHHp IHH euros a TSSFWSUHHHp PHH euros a IQIIFWIRHHHp

IIV

DES EXEMPLES POUR BIEN COMPRENDRE

sl n9y ps grndEhose de di'rent pr rpport l fontion tripleD je vous vis prvenusF h9illeursD m fontion onversion 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 minD 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 onversion@SHAF 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 minA 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

void punition@int nomrehevignesA { int iY for @i a H Y i ` nomrehevignes Y iCCA { printf@4te ne dois ps reopier mon voisinn4AY }

int min@int rgD hr BrgvA { punition@IHAY } return HY

gode

we X VHSQRQ IIW

CHAPITRE 9. LES FONCTIONS


te te te te te te te te te te ne ne ne ne ne ne ne ne ne ne dois dois dois dois dois dois dois dois dois dois ps ps ps ps ps ps ps ps ps ps reopier reopier reopier reopier reopier reopier reopier reopier reopier reopier mon mon mon mon mon mon mon mon mon mon voisin voisin voisin voisin voisin voisin 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 lrgeur B huteurF xotre fontion nomme v prendre deux prmtres X l lrgeur et l huteurF ille renverr l9ireF
ireetngle
doule ireetngle@doule lrgeurD doule huteurA { return lrgeur B huteurY } int min@int rgD hr BrgvA { printf@4etngle de lrgeur S et huteur IHF eire a 7fn4D ireetngle@SD IHAAY printf@4etngle de lrgeur PFS et huteur QFSF eire a 7fn4D ireetngle @PFSD QFSAAY printf@4etngle de lrgeur RFP et huteur WFUF eire a 7fn4D ireetngle @RFPD WFUAAY } return HY

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 !

IPH

DES EXEMPLES POUR BIEN COMPRENDRE


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

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
void ireetngle@doule lrgeurD doule huteurA { doule ire a HY ire a lrgeur B huteurY printf@4etngle de lrgeur 7f et huteur 7fF eire a 7fn4D lrgeurD huteurD ireAY } int min@int rgD hr BrgvA { ireetngle@SD IHAY ireetngle@PFSD QFSAY ireetngle@RFPD WFUAY } return HY

gomme vous le voyezD le printf est l'intrieur de l fontion ireetngle 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@A 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
int menu@A { int hoix a HY while @hoix ` I || hoix b RA { printf@4wenu Xn4AY

IPI

CHAPITRE 9. LES FONCTIONS


printf@4I X oulet de dinde ux esrgots rotis l sue ernisen4A Y printf@4P X gonomres sures l sue de myrtilles enroee de hool tn4AY printf@4Q X islope de kngourou signnte et s gelee ux frises poiv reen4AY printf@4R X v surprise du ghef @j9en slive d9vneFFFAn4AY printf@4otre hoix c 4AY snf@47d4D 8hoixAY

} }

return hoixY

int min@int rgD hr BrgvA { swith @menu@AA { se IX printf@4ous vez pris le pouletn4AY rekY se PX printf@4ous vez pris les onomresn4AY rekY se QX printf@4ous vez pris l9eslopen4AY rekY se RX printf@4ous vez pris l surprise du ghefF ous etes un sre venturier dites don 3n4AY rekY } } return HY

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 minD vous vez vu qu9on fit un swith@menu@AAF ne fois que l fontion menu@A est termineD elle renvoie le hoix de l9utilisteur diretement dns le swithF 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 IPP

gode

DES EXEMPLES POUR BIEN COMPRENDRE

En rsum
! ves fontions s9ppellent entre ellesF einsiD le min peut ppeler des fontions toutes prtes telles que printf ou snfD mis ussi des fontions que nous vons resF ! ne fontion rupre en entre des vriles qu9on ppelle paramtresF ! ille e'etue ertines oprtions ve es prmtres puis retourne en gnrl une vleur l9ide de l9instrution returnF

IPQ

CHAPITRE 9. LES FONCTIONS

IPR

Deuxime partie
Techniques  avances  du langage C

IPS

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 minF. 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 (minF), nous le  sparons  en plusieurs petits chiers.

IPU

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

Les prototypes
tusqu9iiD je vous i demnd de pler votre fontion vnt l fontion minF ourquoi c re que l9ordre une relle importne ii X si vous mettez votre fontion vnt le min dns votre ode soureD votre ordinteur l9ur lue et l onntrF vorsque vous ferez un ppel l fontion dns le minD l9ordinteur onntr l fontion et sur o ller l herherF in revnheD si vous mettez votre fontion prs le minD 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 ireetngle X
doule ireetngle@doule lrgeurD doule huteurA { return lrgeur B huteurY }

gopiez l premire ligne @doule ireetngleF F FA tout en hut de votre (hier soure @juste prs les 5inludeAF Rajoutez un point-virgule l (n de ette nouE velle ligneF it voil 3 wintenntD vous pouvez pler votre fontion ireetngle prs l fontion min si vous le voulez 3 ous devriez voir le ode suivnt sous les yeux X
5inlude `stdioFhb 5inlude `stdliFhb GG v ligne suivnte est le prototype de l fontion ireetngle X doule ireetngle@doule lrgeurD doule huteurAY int min@int rgD hr BrgvA {

IPV

LES PROTOTYPES
printf@4etngle de lrgeur S et huteur IHF eire a 7fn4D ireetngle@SD IHAAY printf@4etngle de lrgeur PFS et huteur QFSF eire a 7fn4D ireetngle @PFSD QFSAAY printf@4etngle de lrgeur RFP et huteur WFUF eire a 7fn4D ireetngle @RFPD WFUAAY

return HY

GG xotre fontion ireetngle peut mintennt tre mise n9importe o dns le ode soure X doule ireetngle@doule lrgeurD doule huteurA { return lrgeur B huteurY }

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 ireetngle 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 min 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
doule ireetngle@douleD douleAY

gode

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.

IPW

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 minFF

Plusieurs chiers par projet


hns l prtiqueD vos progrmmes ne seront ps tous rits dns e mme (hier minFF 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 minFF 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 minF X 9est elui qui ontient l fontion minF in gnrl dns mes progrmmesD je ne mets que le min dns minF 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.

IQH

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 editeurF j9i regroup toutes les fontions onernnt l9diteur de niveu Y dns le (hier jeuFD 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 FhD ppels (hiers headersF ges (hiers ontiennent les prototypes des fontionsF ! Les F X les (hiers soureF ges (hiers ontiennent les fontions ellesEmmesF in gnrlD on met don rrement les prototypes dns les (hiers F omme on l9 fit tout l9heure dns le minF @suf si votre progrmme est tout petitAF our hque (hier FD il y son quivlent Fh qui ontient les prototypes des fontionsF tetez un il plus ttentif l (gF IHFP X ! il y editeurF @le ode des fontionsA et editeurFh @les prototypes des fontionsA Y ! il y jeuF et jeuFh Y ! etF
Mais comment faire pour que l'ordinateur sache que les prototypes sont dans un autre chier que le F ?

sl fut inlure le (hier Fh 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 jeuF X IQI

CHAPITRE 10. LA PROGRAMMATION MODULAIRE


5inlude `stdliFhb 5inlude `stdioFhb 5inlude 4jeuFh4 void jouer@hvurfeB ernA { GG FFF

v9inlusion se fit gre l diretive de prproesseur 5inlude que vous onnissez ien mintenntF egrdez les premires lignes du ode soure iEdessus X
5inlude `stdliFhb 5inlude `stdioFhb 5inlude 4jeuFh4 GG yn inlut jeuFh

yn inlut trois (hiers Fh X stdioD stdli 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 @4jeuFh4A tndis que les (hiers orrespondnt ux iliothques @qui sont gnrlement instllsD euxD dns le rpertoire de votre shiA sont inlus entre hevrons @`stdioFhbAF ous utiliserez don X ! les chevrons ` b pour inlure un (hier se trouvnt dns le rpertoire  inlude de votre shi Y ! les guillemets 4 4 pour inlure un (hier se trouvnt dns le rpertoire de votre projet @ t des FD gnrlementAF v ommnde 5inlude demnde d9insrer le ontenu du (hier dns le FF g9est don une ommnde qui dit  snsre ii le (hier jeuFh pr exempleF it dns le (hier jeuFhD que trouveEtEon c yn trouve simplement les prototypes des fontions du (hier jeuF 3
GB jeuFh EEEEE r mteoPID pour ve ite du ro @wwwFsiteduzeroFomA le X prototypes des fontions du jeuF BG void jouer@hvurfeB ernAY void deplertoueur@int rtexffvygreiD hvet BposD int diretionAY void deplergisse@int BpremieregseD int BseondegseAY

oil omment fontionne un vri projet 3 IQP

LES HEADERS

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

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 Fh @hedersA inlus en hut des (hiers FD 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 FF 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 FhD l ompiltion houer sns uun douteF
Lorsque vous appellerez une fonction situe dans fontionsF depuis le chier minF, vous aurez besoin d'inclure les prototypes de fontionsF dans minF. Il faudra donc mettre un 5inlude 4fontionsFh4 en haut de minF. 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 F et Fh mon projet ?

dpend de l9shi que vous utilisezD mis glolement l produre est l mme X pihier G xouveu G pihier soureF gel re un nouveu (hier videF ge (hier n9est ps enore de type F ou FhD 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 F ou un Fh X ! si vous l9ppelez fihierFD e ser un F Y ! si vous l9ppelez fihierFhD e ser un FhF 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 minFAF qnrlementD vous enregistrerez tous vos (hiers dns le mme rpertoireD les F omme les FhF ve dossier du projet ressemle u (nl l (gF IHFQF ous y voyez des F et des Fh ensemleF IQQ

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

Figure IHFQ ! n dossier de projet

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 edd files @(gF IHFRAF

Figure IHFR ! ejout de (hiers u projet

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 et pprt dns l liste guhe 3 IQR

LA COMPILATION SPARE

Les include des bibliothques standard


ne question devrit vous trotter dns l tteF F F i on inlut les (hiers stdioFh et stdliFhD 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
g:rogrm pilesgodeflokswinqinlude

sl fut gnrlement herher un dossier inludeF vEdednsD vous llez trouver de trs nomreux (hiersF ge sont des heders @FhA des iliothques stndrdD 9estEEdire des iliothques disponiles prtout @que e soit sous indowsD wD vinuxF F FAF ous y retrouverez don stdioFh et stdliFhD 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 F ?

ous ne les vez ps 3 in fitD les (hiers F 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 li F ghez moiD on peut les trouver dns le rpertoire X
2

g:rogrm pilesgodeflokswinqli

ves (hiers ompils des iliothques ont l9extension F sous gode: :floks @qui utilise le ompilteur ppel mingwA et ont l9extension Fli sous isul gCC @qui utilise le ompilteur isulAF x9essyez ps de les lire X e n9est solument ps omestile pour un huminF in rsumD dns vos (hiers FD vous inluez les Fh 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 vions vu un shm trs simpli(F v (gF IHFS est un shm ien plus pris de l ompiltionF g9est le genre de shms
2. C'est l'abrviation de library qui signie  bibliothque  en franais.

IQS

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

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 5F our l9instntD l seule diretive de prproesseur que l9on onnt est 5inludeD qui permet d9inlure un (hier dns un utreF ve prproesseur sit fire d9utres hosesD mis D nous le verrons plus trdF ve 5inlude est qund mme e qu9il y de plus importnt onntreF ve prproesseur  remple don les lignes 5inlude pr le (hier indiquF sl met l9intrieur de hque (hier F le ontenu des (hiers Fh qu9on demnd d9inlureF e momentEl de l ompiE ltionD votre (hier F est omplet et ontient tous les prototypes des fontions que vous utilisez @votre (hier F 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 F 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 Fo @ou FojD dpend du ompilteurA pr (hier F 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 QF dition de liens X le linker @ou  diteur de liens en frnisA est un progrmme dont le rle est d9ssemler les (hiers inires FoF sl les ssemle en un seul gros
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.

IQT

LA COMPILATION SPARE

(hier X l9exutle (nl 3 get exutle l9extension Fexe 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 Fo @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 Fo @temporiresA ve les iliothques ompiles dont vous vez esoin @F ou Fli selon le ompilteurAF v (gF IHFT est don une version mliore de l (gF IHFSF

Figure IHFT ! hm d9une ompiltion ve iliothques

xous y sommesD le shm est ette fois ompletF os (hiers de iliothques F @ou sont rssemls dns l9exutle ve vos FoF g9est omme el qu9on peut otenir u (nl un progrmme IHH 7 ompletD qui ontient
FliA

IQU

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

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 FD 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 F 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
int triple@int nomreA { int resultt a HY GG v vrile resultt est re en mmoire resultt a Q B nomreY return resulttY } GG v fontion est termineD l vrile resultt est supprime de l mmoire

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
int triple@int nomreAY int min@int rgD hr BrgvA { printf@4ve triple de IS est 7dn4D triple@ISAAY printf@4ve triple de IS est 7d4D resulttAY GG irreur } return HY

int triple@int nomreA {

IQV

LA PORTE DES FONCTIONS ET DES VARIABLES


int resultt a HY resultt a Q B nomreY return resulttY

hns le minD j9essie ii d9der l vrile resulttF yrD omme ette vrile resultt t re dns l fontion tripleD elle n9est ps essile dns l fontion min 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 5inludeF
5inlude `stdioFhb 5inlude `stdliFhb int resultt a HY GG hlrtion de vrile glole void triple@int nomreAY GG rototype de fontion int min@int rgD hr BrgvA { triple@ISAY GG yn ppelle l fontion tripleD qui modifie l vrile glole resultt printf@4ve triple de IS est 7dn4D resulttAY GG yn s resultt } return HY

void triple@int nomreA { resultt a Q B nomreY }

ur et exempleD m fontion triple ne renvoie plus rien @voidAF ille se ontente de IQW

CHAPITRE 10. LA PROGRAMMATION MODULAIRE

modi(er l vrile glole resultt que l fontion min peut ruprerF w vrile resultt 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 stti devnt X
stti int resultt a HY

Variable statique une fonction


ettention X 9est un peu plus dlitD iiF i vous rjoutez le motEl stti devnt l dlrtion d9une vrile l9intrieur d9une fontionD n9 ps le mme sens que pour les vriles glolesF in fitD l vrile stti n9est plus supprime l (n de l fontionF v prohine fois qu9on ppeller l fontionD l vrile ur onserv s vleurF r exemple X
int triple@int nomreA { stti int resultt a HY GG v vrile resultt est re l premire fois que l fontion est ppele resultt a Q B nomreY return resulttY } GG v vrile resultt n9est e supprime lorsque l fontion est termineF

u9estEe que signi(eD onrtement c u9on pourr rppeler l fontion plus trd et l vrile resultt ontiendr toujours l vleur de l dernire foisF oii un petit exemple pour ien omprendre X
int inremente@AY

IRH

LA PORTE DES FONCTIONS ET DES VARIABLES


int min@int rgD { printf@47dn4D printf@47dn4D printf@47dn4D printf@47dn4D } return HY hr BrgvA inremente@AAY inremente@AAY inremente@AAY inremente@AAY

int inremente@A { stti int nomre a HY nomreCCY return nomreY

gode

we X WPSUUT

I P Q R

siD l premire fois qu9on ppelle l fontion inrementeD l vrile nomre 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 FF 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 stti @enore luiA devnt l fontion X
stti int triple@int nomreA { GG snstrutions }

ensez mettre jour le prototype ussi X IRI

CHAPITRE 10. LA PROGRAMMATION MODULAIRE


stti int triple@int nomreAY

wintenntD votre fontion stti 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 stti 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 stti 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 stti devntF

En rsum
! n progrmme ontient de nomreux (hiers FF in rgle gnrleD hque (hier F un petit frre du mme nom ynt l9extension Fh @qui signi(e headerAF ve F ontient les fontions tndis que le Fh ontient les prototypesD 9estEEdire l signture de es fontionsF ! ve ontenu des (hiers Fh est inlus en hut des F pr un progrmme ppel prprocesseurF ! ves F sont trnsforms en (hiers Fo inires pr le compilateurF ! ves Fo sont ssemls en un exutle @FexeA 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

IRP

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.

IRQ

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
int fontion@A { return vleurY }

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
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
5inlude `stdioFhb 5inlude `stdliFhb GB te mets le prototype en hutF gomme 9est un tout petit progrmme je ne le mets ps dns un FhD mis en temps norml @dns un vri progrmmeAD j9uris pl le prototype dns un fihier Fh ien entendu BG void deoupewinutes@int heuresD int minutesAY

IRR

UN PROBLME BIEN ENNUYEUX

int min@int rgD hr BrgvA { int heures a HD minutes a WHY GB yn une vrile minutes qui vut WHF eprs ppel de l fontionD je veux que m vrile 4heures4 ville I et que m vrile 4minutes4 ville QH BG deoupewinutes@heuresD minutesAY printf@47d heures et 7d minutes4D heuresD minutesAY } return HY

void deoupewinutes@int heuresD int minutesA { heures a minutes G THY GG WH G TH a I minutes a minutes 7 THY GG WH 7 TH a QH }

we X QRISVT sultt X

gode

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 deoupewinutes n9est ps l mme que elle de l fontion min 3 g9est simplement une opie 3 otre fontion deoupewinutes fit son joF l9intrieur de deoupewinutesD 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 minD 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 min. Ainsi, vous pourriez trs bien crire :
void deoupewinutes@int hD int mA

h pour heures et m pour minutes. Si vos variables ne s'appellent pas de la mme faon dans la fonction et dans le min, a ne pose donc aucun problme !

IRS

CHAPITRE 11. L'ASSAUT DES POINTEURS

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 int 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

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 IRT

LA MMOIRE, UNE QUESTION D'ADRESSE

sl fut lire e shm ligne pr ligneF v premire ligne reprsente l  ellule du 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 ge de type int pr exempleD en tpnt X
int ge a IHY

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 geF 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 ge dns votre progrmme est rempl pr l9dresse RTSS l9exutionF gel fit queD hque fois que vous vez tp le mot ge 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 ge vut IH 3 F
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.

IRU

CHAPITRE 11. L'ASSAUT DES POINTEURS

yn sit don omment ruprer l vleur de l vrile X il su0t tout tement de tper ge dns son ode soureF i on veut 0her l9geD on peut utiliser l fontion printf X
printf@4v vrile ge vut X 7d4D geAY

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 7p @le p du mot  poinE teur A dns le printfF in outreD on doit envoyer l fontion printf non ps l vrile geD mis son dresseF F F it pour fire elD vous devez mettre le symole 8 devnt l vrile geD omme je vous vis demnd de le fire pour les snfD il y quelque tempsD sns vous expliquer pourquoiF pez don X
printf@4v9dresse de l vrile ge est X 7p4D 8geAY

sultt X

v9dresse de l vrile ge est X HHPQppUR

ge que vous voyez l est l9dresse de l vrile ge 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 7p pr 7dD 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 ! ge X dsigne la valeur de l vrile Y ! 8ge X dsigne l'adresse de l vrileF IRV

UTILISER DES POINTEURS

eve geD l9ordinteur v lire l vleur de l vrile en mmoire et vous renvoie ette vleurF eve 8geD votre ordinteur vous dit en revnhe quelle dresse se trouve l vrileF

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 B devnt le nom de l vrileF
int BmonointeurY

Notez qu'on peut aussi crire. . .


intB monointeurY

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 BpointeurID BpointeurPD BpointeurQY

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 xvv X
3

int Bmonointeur a xvvY

vD vous vez un pointeur initilis xvvF gomme D vous surez dns l suite de votre progrmme que votre pointeur ne ontient uune dresseF
3. Veillez l'crire en majuscules.

IRW

CHAPITRE 11. L'ASSAUT DES POINTEURS

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 ge c ous svez mintennt omment indiquer l9dresse d9une vrile u lieu de s vleur @en utilisnt le symole 8AD lors llonsEy 3 nous donne X
int ge a IHY int Bpointeururege a 8geY

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 ge 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
int ge a IHY int BpointeururegeY GG IA signifie 4te re un pointeur4 pointeururege a 8geY GG PA signifie 4pointeururege ontient l9dresse de l vrile ge4

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

eu lieu de D on utilise le symole BD 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 pointeururege v ontenir l9dresse de l vrile ge @qui est de type intAD lors mon pointeur doit tre de type intB 3 i m vrile ge vit t de type douleD lors j9uris d rire doule BmonointeurF Vocabulaire X on dit que le pointeur pointeururege pointe sur l vrile geF v (gF IIFP rsume e qu9il s9est pss dns l mmoireF hns e shmD l vrile ge t ple l9dresse IUURSH @vous voyez d9illeurs que s vleur est IHAD et le pointeur pointeururege 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 geF v di'rene iiD 9est que l vleur de pointeururege est un peu prtiulireF egrdez ien le shm X 9est l9dresse de l vrile ge 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 ?

ISH

UTILISER DES POINTEURS

Figure IIFP ! wmoireD dresses et pointeurs

ISI

CHAPITRE 11. L'ASSAUT DES POINTEURS

ne trnsforme ps enore votre ordinteur en mhine fD ertesF eulement mintenntD on un pointeururege qui ontient l9dresse de l vrile geF issyons de voir e que ontient le pointeur l9ide d9un printf X
int ge a IHY int Bpointeururege a 8geY printf@47d4D pointeururegeAY

IUURSH

rumF in fitD el n9est ps trs tonnntF yn demnde l vleur de pointeururegeD et s vleur 9est l9dresse de l vrile ge @IUURSHAF gomment fire pour demnder voir l vleur de l vrile se trouvnt l9dresse indique dns pointeururege c sl fut pler le symole B devnt le nom du pointeur X
int ge a IHY int Bpointeururege a 8geY printf@47d4D BpointeururegeAY

IH

rourr 3 xous y sommes rrivs 3 in plnt le symole B devnt le nom du pointeurD on de l vleur de l vrile geF i u ontrire on vit utilis le symole 8 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 ge !

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 ge X ISP

UTILISER DES POINTEURS

! ge signi(e X  te veux l vleur de l vrile ge D ! 8ge signi(e X  te veux l9dresse lquelle se trouve l vrile ge Y ! sur un pointeurD omme pointeururege X ! pointeururege signi(e X  te veux l vleur de pointeururege @ette vleur tnt une dresseAD ! Bpointeururege signi(e X  te veux l vleur de l vrile qui se trouve l9dresse ontenue dns pointeururege 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

Figure IIFQ ! hsigntion des vriles et pointeurs

ISQ

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 BpointeururegeY

En revanche, lorsqu'ensuite vous utilisez votre pointeur en crivant :


printf@47d4D BpointeururegeAY

. . . cela ne signie pas  Je veux crer un pointeur  mais :  Je veux la valeur de la variable sur laquelle pointe mon pointeururege .

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
void tripleointeur@int BpointeururxomreAY int min@int rgD hr BrgvA { int nomre a SY tripleointeur@8nomreAY GG yn envoie l9dresse de nomre l fontion printf@47d4D nomreAY GG yn ffihe l vrile nomreF v fontion diretement modifi l vleur de l vrile r elle onnissit son dresse } return HY

void tripleointeur@int BpointeururxomreA { Bpointeururxomre Ba QY GG yn multiplie pr Q l vleur de nomre

ISR

ENVOYER UN POINTEUR UNE FONCTION


}

gode IS

we X PTSPSR

v fontion tripleointeur prend un prmtre de type intB @9estEEdire un pointeur sur intAF oii e qu9il se psse dns l9ordreD en prtnt du dut du min X IF une vrile nomre est re dns le minF yn lui 'ete l vleur SF D vous onnissez Y PF on ppelle l fontion tripleointeurF yn lui envoie en prmtre l9dresse de notre vrile nomre Y QF l fontion tripleointeur reoit ette dresse dns pointeururxomreF l9inE trieur de l fontion tripleointeurD on don un pointeur pointeururxomre qui ontient l9dresse de l vrile nomre Y RF mintennt qu9on un pointeur sur nomreD on peut modi(er diretement l vrile nomre en mmoire 3 sl su0t d9utiliser Bpointeururxomre pour dsiE gner l vrile nomre 3 our l9exempleD on fit un simple test X on multiplie l vrile nomre pr Q Y SF de retour dns l fontion minD notre nomre vut mintennt IS r l fontion tripleointeur modi( diretement l vleur de nomreF 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 minF tuste une vrile nomreF ve seul pointeur qu9il y vit vriment tit dns l fontion triplexomre @de type intBAF sl fut solument que vous shiez qu9il y une utre fon d9rire le ode prdentD en joutnt un pointeur dns l fontion min X ISS

CHAPITRE 11. L'ASSAUT DES POINTEURS


void tripleointeur@int BpointeururxomreAY int min@int rgD hr BrgvA { int nomre a SY int Bpointeur a 8nomreY GG pointeur prend l9dresse de nomre

tripleointeur@pointeurAY GG yn envoie pointeur @l9dresse de nomreA l fontion printf@47d4D BpointeurAY GG yn ffihe l vleur de nomre ve Bpointeur return HY

void tripleointeur@int BpointeururxomreA { Bpointeururxomre Ba QY GG yn multiplie pr Q l vleur de nomre }

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

gode

ge qui ompteD 9est d9envoyer l9dresse de l vrile nomre l fontionF yrD pointeur vut l9dresse de l vrile nomreD don 9est on de e t 3 yn le fit seulement d9une mnire di'rente en rnt un pointeur dns l fontion minF hns le printf @et 9est juste pour l9exerieAD j90he le ontenu de l vrile nomre en tpnt BpointeurF xotez qu9 l pleD j9uris pu rire nomre X le rsultt urit t identique r Bpointeur et nomre 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 snfF 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
int nomre a HY snf@47d4D 8nomreAY

v fontion trville ve un pointeur sur l vrile nomre et peut insi modi(er diretement le ontenu de nomreF gomme on vient de le voirD on pourrit rer un pointeur qu9on enverrit l fontion snf X
int nomre a HY int Bpointeur a 8nomreY snf@47d4D pointeurAY

IST

QUI A DIT :  UN PROBLME BIEN ENNUYEUX  ?

ettention ne ps mettre le symole 8 devnt pointeur dns l fontion snf 3 siD pointeur ontient luiEmme l9dresse de l vrile nomreD ps esoin de mettre un 8 3 i vous fisiez D vous enverriez l9dresse o se trouve le pointeur X or 9est de l9dresse de nomre 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
void deoupewinutes@intB pointeurreuresD intB pointeurwinutesAY int min@int rgD hr BrgvA { int heures a HD minutes a WHY GG yn envoie l9dresse de heures et minutes deoupewinutes@8heuresD 8minutesAY GG gette foisD les vleurs ont t modifies 3 printf@47d heures et 7d minutes4D heuresD minutesAY } return HY

void deoupewinutes@intB pointeurreuresD intB pointeurwinutesA { GB ettention ne ps oulier de mettre une toile devnt le nom des pointeurs 3 gomme D vous pouvez modifier l vleur des vrilesD et non leur dresse 3 ous ne voudriez ps diviser des dressesD n9estEe ps c YoA BG Bpointeurreures a Bpointeurwinutes G THY Bpointeurwinutes a Bpointeurwinutes 7 THY }

we X RPQHVQ sultt X

gode

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

4. C'est un chapitre important, vous devez faire beaucoup d'eorts pour comprendre : je peux donc bien en faire moi aussi pour vous.

ISU

CHAPITRE 11. L'ASSAUT DES POINTEURS

IF ves vriles heures et minutes sont res dns le minF PF yn envoie l fontion deoupewinutes l9dresse de heures et minutesF QF v fontion deoupewinutes rupre es dresses dns des pointeurs ppels pointeurreures et pointeurwinutesF 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 deoupewinutes 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 deoupewinutes (alors que c'est dans le min 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 8 devnt un nom de vrileD on otient son dresse u lieu de s vleur @exF X 8geAF ! i on ple un symole B devnt un nom de pointeurD on otient l vleur de l vrile stoke l9dresse indique pr le pointeurF ! 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

minutes du main, qui ne sont pas les mmes.

5. Je ne l'ai pas fait car je ne veux pas que vous risquiez de confondre avec les variables heures et

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 hrD douleF 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 doule 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
int tleuRY

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 tleunumerohevgseF
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
int tleuRY tleuH tleuI tleuP tleuQ a a a a IHY PQY SHSY VY

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

in fitD si vous rivez juste tleuD vous otenez un pointeurF g9est un pointeur sur l premire se du tleuF pites le test X
int tleuRY printf@47d4D tleuAY

sulttD on voit l9dresse o se trouve tleu X


ITHH

in revnheD si vous indiquez l9indie de l se du tleu entre rohetsD vous otenez l vleur X
int tleuRY printf@47d4D tleuHAY

IH

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

ITI

CHAPITRE 12. LES TABLEAUX


int tleuRY printf@47d4D BtleuAY

IH

sl est ussi possile d9otenir l vleur de l seonde se ve B@tleu de tleu C IAF ves deux lignes suivntes sont don identiques X

C IA @dresse

tleuI GG envoie l vleur de l seonde se @l premire se tnt HA B@tleu C IA GG sdentique X renvoie l vleur ontenue dns l seonde se

in lirD qund vous rivez tleuHD vous demndez l vleur qui se trouve l9dresse tleu C H se @9estEEdire ITHHAF i vous rivez tleuID 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
int tille a SY int tleutilleY

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
int tleuSY

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

int min@int rgD hr BrgvA { int tleuRD i a HY tleuH tleuI tleuP tleuQ a a a a IHY PQY SHSY VY

for @i a H Y i ` R Y iCCA { printf@47dn4D tleuiAY } } return HY

gode IH PQ SHS V

we X WIPPWP

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 tleuHD tleuID tleuP et tleuQ 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 tleuR ! Un tableau de 4 cases possde les indices 0, 1, 2 et 3, point barre. Si vous tentez d'acher tleuR, 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
int min@int rgD hr BrgvA { int tleuRD i a HY GG snitilistion du tleu for @i a H Y i ` R Y iCCA { tleui a HY } GG effihge de ses vleurs pour vrifier for @i a H Y i ` R Y iCCA { printf@47dn4D tleuiAY } } return HY

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 tleuR a {vleurID vleurPD vleurQD vleurR}F in lirD vous plez les vleurs une une entre oldesD spres pr des virgules X
int min@int rgD hr BrgvA {

ITR

PASSAGE DE TABLEAUX UNE FONCTION


int tleuR a {HD HD HD H}D i a HY for @i a H Y i ` R Y iCCA { printf@47dn4D tleuiAY } } return HY

H H H H

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
int tleuR a {IHD PQ}Y GG leurs insres X IHD PQD HD 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
int tleuR a {H}Y GG outes les ses du tleu seront initilises 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 tleuR a {I}Y GG leurs insres X ID HD HD H

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 ITS

CHAPITRE 12. LES TABLEAUX

omment on envoie un tleu une fontion @e qui m9rrngeAF 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 tilleleuF gomme je vous l9i ditD tleu peut tre onsidr omme un pointeurF yn peut don l9envoyer l fontion omme on l9urit fit ve un vulgire pointeur X
GG rototype de l fontion d9ffihge void ffihe@int BtleuD int tilleleuAY int min@int rgD hr BrgvA { int tleuR a {IHD ISD Q}Y GG yn ffihe le ontenu du tleu ffihe@tleuD RAY } return HY

void ffihe@int BtleuD int tilleleuA { int iY for @i a H Y i ` tilleleu Y iCCA { printf@47dn4D tleuiAY }

gode IH IS Q H

we X SUIVSV

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 BtleuD mettez ei X
void ffihe@int tleuD int tilleleuA

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 gode we X RUQSUQ
Exercice 1

grez une fontion sommeleu 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
int sommeleu@int tleuD int tilleleuAY

Exercice 2

grez une fontion rototype X

moyenneleu

qui lule et renvoie l moyenne des vleursF

doule moyenneleu@int tleuD int tilleleuAY

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


Exercice 3

grez une fontion opierleu qui prend en prmtre deux tleuxF ve ontenu du premier tleu devr tre opi dns le seond tleuF rototype X
void opie@int tleuyriginlD int tleugopieD int tilleleuAY

ITU

CHAPITRE 12. LES TABLEAUX

Exercice 4

grez une fontion mximumleu 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 @vleurwxAF outes les ses qui ontiennent un nomre suprieur vleurwx doivent tre mises HF rototype X
void mximumleu@int tleuD int tilleleuD int vleurwxAY

Exercice 5

get exerie est plus di0ileF grez une fontion ordonnerleu qui lsse les vleurs d9un tleu dns l9ordre roissntF einsiD un tleu qui vut {ISD VID PPD IQ} doit l (n de l fontion vloir {IQD ISD PPD VI}F rototype X
void ordonnerleu@int tleuD int tilleleuAY

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 tleuxF (avec son homologue tleuxFh 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 tleuHD tleuID tleuPD 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 hrF i vous vous souvenez ienD le type hr permet de stoker des nomres ompris entre EIPV et IPUF
Si ce type hr 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 hr 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 9e9F l ompiltionD 9e9 ser rempl pr l vleur orrespondnteF estons X
int min@int rgD hr BrgvA { hr lettre a 9e9Y printf@47dn4D lettreAY } return HY

TS

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 99 n9est ps identique l lettre 9e9D 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 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 7 @ omme rtreA X
int min@int rgD hr BrgvA { hr lettre a 9e9Y printf@47n4D lettreAY } return HY

rourr 3 xous svons 0her une lettreF yn peut ussi demnder l9utilisteur d9entrer une lettre en utilisnt le 7 dns un snf X
int min@int rgD hr BrgvA { hr lettre a HY snf@474D 8lettreAY printf@47n4D lettreAY } return HY

i je tpe l lettre fD je verri X


2

f f

oii peu prs tout e qu9il fut svoir sur le type hrF etenez ien X ! le type hr permet de stoker des nomres llnt de EIPV IPUD unsigned hr 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 hr pour stoker xi lettre Y ! 9e9 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 hrF n te tleu de rien du toutF i on re un tleu X
hr hineSY

et qu9on met dns hineH l lettre 99D dns hineI l lettre 99F 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 9H9F
Pourquoi faut-il que la chane de caractres se termine par un H ?

IUP

LES CHANES SONT DES TABLEAUX DE CHAR

out simplement pour que votre ordinteur she qund s9rrte l hne 3 ve rtre H 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 hrD 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 HD 9est imprtif 3 yulier le rtre de (n H 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

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 9H9D le rtre de (n de hne qui permet d9indiquer l9ordinteur que l hne se termine lF oyez le rtre H 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 hr 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 hrBD qu9on peut ussi rire hrAF 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 hine ve le texte  lut D on peut utiliser l mthode mnuelle mis peu e0e X IUQ

CHAPITRE 13. LES CHANES DE CARACTRES


hr hineTY GG leu de T hr pour stoker EElEuEt C le H hineH hineI hineP hineQ hineR hineS a a a a a a 99Y 99Y 9l9Y 9u9Y 9t9Y 9H9Y

gette mthode mrheF yn peut le vri(er ve un printfF our fire un printf il fut utiliser le symole 7s @s omme string D qui signi(e  hne en nglisAF oii le ode omplet qui re une hne  lut en mE moire et qui l90he X
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { hr hineTY GG leu de T hr pour stoker EElEuEt C le H GG snitilistion de l hne @on rit les rtres un un en mmoireA hineH a 99Y hineI a 99Y hineP a 9l9Y hineQ a 9u9Y hineR a 9t9Y hineS a 9H9Y GG effihge de l hne gre u 7s du printf printf@47s4D hineAY } return HY

we X VTSUPI sultt X
lut

gode

ous remrquerez que 9est un peu ftignt et rptitif de devoir rire les rtres un un omme on l9 fit dns le tleu hineF our initiliser une hneD il existe heureusement une mthode plus simple X
int min@int rgD hr BrgvA { hr hine a 4lut4Y GG v tille du tleu hine est utomtiquement lule

IUR

LES CHANES SONT DES TABLEAUX DE CHAR

printf@47s4D hineAY } return HY

gode lut

we X SHVHSU

gomme vous le voyez l premire ligneD je re une vrile de type hrF t9uris pu rire ussi hrBD 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 HF sl rit ensuite une une les lettres du mot  lut en mmoire et joute le H 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
hine a 4lut4Y

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 snfD en utilisnt l enore le symole 7sF 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 hr trs grndD su0smment grnd pour pouvoir stoker le prnomF yn v don rer un hrIHHF 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

int min@int rgD hr BrgvA { hr prenomIHHY printf@4gomment t9ppellesEtu petit ero c 4AY snf@47s4D prenomAY printf@4lut 7sD je suis heureux de te renontrer 34D prenomAY
3. Et il y a des programmes qui gchent la mmoire de faon bien pire que cela !

IUS

CHAPITRE 13. LES CHANES DE CARACTRES

return HY

gode we X UQSUVH gomment t9ppellesEtu petit ero c wteoPI

lut wteoPID 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 hr 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 stringFh 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 stringFhD vous devez l9inlure en hut des (hiers F o vous en vez esoin X
5inlude `stringFhb

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

gette fontion vous retourne l longueur de l hneF 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 IUT

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

FONCTIONS DE MANIPULATION DES CHANES


sizet strlen@onst hrB hineAY

sizet 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 hr, 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 sizet en int automatiquement). En toute rigueur, il faudrait plutt stocker le rsultat dans une variable de type sizet, mais en pratique un int est susant pour cela.

v fontion prend un prmtre de type onst hrBF ve onst @qui signi(e onstnteD rppelezEvousA fit que l fontion strlen  s9interdit en quelque sorte de modi(er votre hneF und vous voyez un onstD vous svez que l vrile n9est ps modi(e pr l fontionD elle est juste lueF estons l fontion strlen X
int min@int rgD hr BrgvA { hr hine a 4lut4Y int longueurghine a HY GG yn rupre l longueur de l hne dns longueurghine longueurghine a strlen@hineAY GG yn ffihe l longueur de l hne printf@4v hine 7s fit 7d rteres de long4D hineD longueurghineAY } return HY

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 hr qui s9rrte qund on tome sur le rtre HF 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
int longueurghine@onst hrB hineAY int min@int rgD hr BrgvA { hr hine a 4lut4Y

IUU

CHAPITRE 13. LES CHANES DE CARACTRES


int longueur a HY longueur a longueurghine@hineAY printf@4v hine 7s fit 7d rteres de long4D hineD longueurAY return HY

int longueurghine@onst hrB hineA { int nomrehegrteres a HY hr rtereetuel a HY do {

} while@rtereetuel 3a 9H9AY GG yn oule tnt qu9on n9est ps rriv l9H

rtereetuel a hinenomrehegrteresY nomrehegrteresCCY

nomrehegrteresEEY GG yn retire I rtre de long pour ne ps ompter le rtre H return nomrehegrteresY

we X ISHUVS v fontion longueurghine fit une oule sur le tleu hineF ille stoke les rtres un pr un dns rtereetuelF hs que rtreetuel vut 9H9D 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 H dns le lotF in(nD on retourne nomrehegrteres et le tour est jou 3
strcpy

gode

: copier une chane dans une autre

v fontion strpy @omme  string opy A permet de opier une hne l9intrieur d9une utreF on prototype est X
hrB strpy@hrB opiehevghineD onst hrB hineegopierAY

gette fontion prend deux prmtres X IUV

FONCTIONS DE MANIPULATION DES CHANES

X 9est un pointeur vers un hrB @tleu de hrAF g9est dns e tleu que l hne ser opie Y ! hineegopier X 9est un pointeur vers un utre tleu de hrF gette hne ser opie dns opiehevghineF v fontion renvoie un pointeur sur opiehevghineD e qui n9est ps trs utileF in gnrlD on ne rupre ps e que ette fontion renvoieF estons el X
opiehevghine
int min@int rgD hr BrgvA { GB yn re une hne 4hine4 qui ontient un peu de texte et une opie @videA de tille IHH pour tre sr d9voir l ple pour l opie BG hr hine a 4exte4D opieIHH a {H}Y strpy@opieD hineAY GG yn opie 4hine4 dns 4opie4 GG i tout s9est ien pssD l opie devrit tre identique hine printf@4hine vut X 7sn4D hineAY printf@4opie vut X 7sn4D opieAY } return HY

gode we X IWQWHQ hine vut X exte opie vut X exte

yn voit que hine vut  exte F tusqueElD 9est normlF r ontreD on voit ussi que l vrile opieD qui tit vide u dprtD t remplie pr le ontenu de hineF v hne don ien t opie dns opieF
Vriez que la chane opie est assez grande pour accueillir le contenu de Si, dans mon exemple, j'avais dni opieS (ce qui n'est pas susant car il n'y aurait pas eu de place pour le H), la fonction strpy aurait  dbord en mmoire  et probablement fait planter votre programme. viter tout prix, sauf si vous aimez faire planter votre ordinateur, bien sr.
hine.

hmtiquementD l opie fontionn omme sur l (gF IQFQF ghque rtre de hine t pl dns opieF v hne opie 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 opie ser ple de reevoir d9utres hnes peutEtre plus grndes dns l suite du progrmmeF IUW

CHAPITRE 13. LES CHANES DE CARACTRES

Figure IQFQ ! gopie d9une hne de rtres


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 ! hineI a 4lut 4 ! hineP a 4wteoPI4 i je ontne hineP dns hineID lors hineI vudr 4lut wteoPI4F unt hinePD elle n9ur ps hng et vudr don toujours 4wteoPI4F eule hineI est modi(eF g9est extement e que fit strtD dont voii le prototype X
hrB strt@hrB hineID onst hrB hinePAY

gomme vous pouvez le voirD hineP 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 hineID e quiD omme pour strpyD ne sert ps grndEhose dns le s prsent X on peut don ignorer e que l fontion nous renvoieF v fontion joute hineI le ontenu de hinePF egrdonsEy de plus prs X
int min@int rgD hr BrgvA { GB yn re P hnesF hineI doit tre ssez grnde pour ueillir le ontenu de hineP en plusD sinon risque de plntge BG hr hineIIHH a 4lut 4D hineP a 4wteoPI4Y strt@hineID hinePAY GG yn ontne hineP dns hineI GG i tout s9est ien pssD hineI vut 4lut wteoPI4 printf@4hineI vut X 7sn4D hineIAY GG hineP n9 ps hng X printf@4hineP vut toujours X 7sn4D hinePAY } return HY

gode

we X PPHISQ

IVH

FONCTIONS DE MANIPULATION DES CHANES


hineI vut X lut wteoPI hineP vut toujours X wteoPI

ri(ez solument que hineI est ssez grnde pour qu9on puisse lui jouter le ontenu de hinePD sinon vous ferez un dordement en mmoire qui peut onduire un plntgeF g9est pour el que j9i d(ni hineI de tille IHHF unt hinePD 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 hineP t jout l suite de hineI @qui omprenit une entine de sesAF ve H de hineI t supprim @en fitD il t rempl pr le w de wteoPIAF in e'etD il ne fut ps lisser un H u milieu de l hneD sinon elleEi urit t  oupe u milieu 3 yn ne met qu9un H l (n de l hneD une fois qu9elle est (nieF
strcmp
strmp

: comparer 2 chanes

ompre P hnes entre ellesF oii son prototype X

int strmp@onst hrB hineID onst hrB hinePAY

ves vriles hineI et hineP sont ompresF gomme vous le voyezD uune d9elles n9est modi(e r elles sont indiques omme onstntesF sl est importnt de ruprer e que l fontion renvoieF in e'etD strmp 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 hineI sont suprieurs ceux de la hineP, 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 strmp pour vrier si 2 chanes sont identiques ou non.

oii un ode de test X IVI

CHAPITRE 13. LES CHANES DE CARACTRES


int min@int rgD hr BrgvA { hr hineI a 4exte de test4D hineP a 4exte de test4Y if @strmp@hineID hinePA aa HA GG i hnes identiques { printf@4ves hines sont identiquesn4AY } else { printf@4ves hines sont differentesn4AY } } return HY

gode we X RUIWRV ves hines sont identiques

ves hnes tnt identiquesD l fontion strmp renvoy le nomre HF xotez que j9uris pu stoker e que renvoie strmp 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
strchr

: rechercher un caractre

v fontion strhr reherhe un rtre dns une hneF rototype X


hrB strhr@onst hrB hineD int rtereeeherherAY

v fontion prend P prmtres X ! hine X l hne dns lquelle l reherhe doit tre fite Y ! rtereeeherher X le rtre que l9on doit reherher dns l hneF
Vous remarquerez que rtereeeherher est de type int et non de type hr. 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 hr 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 xvv si elle n9 rien trouvF hns l9exemple suivntD je rupre e pointeur dns suiteghine X IVP

FONCTIONS DE MANIPULATION DES CHANES


int min@int rgD hr BrgvA { hr hine a 4exte de test4D Bsuiteghine a xvvY suiteghine a strhr@hineD 9d9AY if @suiteghine 3a xvvA GG i on trouv quelque hose { printf@4oii l fin de l hine prtir du premier d X 7s4D suiteghineAY } } return HY

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 suiteghine est un pointeur omme hineD suf que hine pointe sur le premier rtre @le 99 mjusuleAD tndis que suiteghine pointe sur le premier rtre 9d9 qui t trouv dns hineF ve shm de l (gF IQFS vous montre o pointe hque pointeur X

Figure IQFS ! ointeurs et hnes


hine ommene u dut de l hine @99 mjusuleAD tndis que suiteghine pointe sur le 9d9 minusuleF vorsque je fis un printf de suiteghineD il est don norml que l9on m90he juste  de test F v fontion printf 0he tous les rtres qu9elle renontre @9d9D 9e9D 9 9D 9t9D 9e9D 9s9D 9t9A jusqu9 e qu9elle tome sur le H qui lui dit que l hne s9rrte lF

Variante

sl existe une fontion strrhr stritement identique strhrD suf que elleEl renvoie un pointeur vers le dernier caractre qu9elle trouv dns l hne plutt que vers le premierF IVQ

CHAPITRE 13. LES CHANES DE CARACTRES

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 strhr qui ne peut reherher qu9un seul rtre l foisF r exempleD si on forme l hne 4xds4 et qu9on en fit une reherhe dns 4exte de test4D l fontion renvoie un pointeur vers le premier de es rtres qu9elle y trouvF in l9ourreneD le premier rtre de 4xds4 qu9elle trouve dns 4exte de test4 est le xD don strprk renverr un pointeur sur 9x9F rototype X
hrB strprk@onst hrB hineD onst hrB lettreseeherherAY

estons l fontion X
int min@int rgD hr BrgvA { hr BsuiteghineY GG yn herhe l premire ourrene de xD d ou s dns 4exte de test4 suiteghine a strprk@4exte de test4D 4xds4AY if @suiteghine 3a xvvA { printf@4oii l fin de l hine prtir du premier des rteres trouves X 7s4D suiteghineAY } } return HY

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 44D 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 IVR

FONCTIONS DE MANIPULATION DES CHANES


hrB strstr@onst hrB hineD onst hrB hineeeherherAY

ve prototype est similire strprkD mis ttention ne ps onfondre X strprk reherhe x des rtresD tndis que strstr reherhe toute l hneF ixemple X
int min@int rgD hr BrgvA { hr BsuiteghineY GG yn herhe l premire ourrene de 4test4 dns 4exte de test4 X suiteghine a strstr@4exte de test4D 4test4AY if @suiteghine 3a xvvA { printf@4remiere ourrene de test dns exte de test X 7sn4D suiteghineAY } } return HY

gode we X PWQRUS remiere ourrene de test dns exte de test X test

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 xvv 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 @resultt 3a xvvA 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 stdioFh contrairement aux autres fonctions que nous avons tudies jusqu'ici, qui taient dans stringFh.

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 IVS

CHAPITRE 13. LES CHANES DE CARACTRES


5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { hr hineIHHY int ge a ISY GG yn rit 4u s IS ns4 dns hine sprintf@hineD 4u s 7d ns 34D geAY GG yn ffihe hine pour vrifier qu9elle ontient ien el X printf@47s4D hineAY } return HY

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 hns mon exempleD j9ris dns hine  u s 7d ns D o 7d est rempl pr le ontenu de l vrile geF outes les rgles du printf s9ppliquentD vous pouvez don si vous le voulez mettre des 7s 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 hr 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 hrF ! oute hne de rtre se termine pr un rtre spil ppel H 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 stringFh pour pouvoir les utiliserF
4

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

IVT

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.

IVU

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 5F illes sont don files reonntreF v premire @et seuleA diretive que nous yons vue pour l9instnt est 5inludeF 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 Fh omme les (hiers Fh des iliothques @stdliFhD stdioFhD stringFhD mthFhF F FA et vos propres (hiers FhF our inlure un (hier Fh se trouvnt dns le dossier o est instll votre shiD vous devez utiliser les hevrons ` b X
5inlude `stdliFhb

our inlure un (hier Fh se trouvnt dns le dossier de votre projetD vous devez en revnhe utiliser les guillemets X
5inlude 4monfihierFh4

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 5F vorsqu9il renontre l diretive 5inludeD il insre littrlement le ontenu du (hier indiqu l9endroit du 5inludeF upposons que j9ie un fihierF ontennt le ode de mes fontions et un fihierFh ontennt les prototypes des fontions de fihierFF yn pourrit rsumer l sitution dns le shm de l (gF IRFIF

Figure IRFI ! snlusion de (hier

out le ontenu de fihierFh est mis l9intrieur de fihierFD l9endroit o il y l diretive 5inlude fihierFhF smginons qu9on it dns le fihierF X
5inlude 4fihierFh4

IVV

LES INCLUDE
int mpontion@int truD doule iduleA { GB gode de l fontion BG } void utrepontion@int vleurA { GB gode de l fontion BG }

it dns le fihierFh X
int mpontion@int truD doule iduleAY void utrepontion@int vleurAY

vorsque le prproesseur psse pr lD juste vnt l ompiltion de fihierFD il insre fihierFh dns fihierFF eu (nlD le ode soure de fihierF juste avant l ompiltion ressemle X
int mpontion@int truD doule iduleAY void utrepontion@int vleurAY int mpontion@int truD doule iduleA { GB gode de l fontion BG } void utrepontion@int vleurA { GB gode de l fontion BG }

ve ontenu du Fh est venu se mettre l9emplement de l ligne 5inludeF 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 5inlude 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 Fh, au lieu de tout mettre dans les F, c'est essentiellement par principe. On pourrait a priori mettre les prototypes en haut des F (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 Fh. Lorsque votre programme grossira et que plusieurs chiers F feront appel un mme Fh, vous serez heureux de ne pas avoir copier-coller les prototypes des mmes fonctions plusieurs fois !

IVW

CHAPITRE 14. LE PRPROCESSEUR

Les define
xous llons douvrir mintennt une nouvelle diretive de prproesseur X le 5defineF gette diretive permet de d(nir une constante de prprocesseurF gel permet d9ssoier une vleur un motF oii un exemple X
5define xywfisisxssevi Q

ous devez rire dns l9ordre X ! le 5define 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
onst int xywfisisxssevi a QY

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 5define 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
5define xywfisisxssevi Q

F F F remple dns le (hier hque xywfisisxssevi pr QF oii un exemple de (hier F vnt pssge du prproesseur X
5define xywfisisxssevi Q int min@int rgD hr BrgvA { int vies a xywfisisxsseviY GB gode FFFBG

eprs pssge du prproesseur X


int min@int rgD hr BrgvA { int vies a QY GB gode FFFBG

IWH

LES DEFINE

evnt l ompiltionD tous les 5define 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 ?

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 5defineF 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 5define en revnhe s9ppliquer toutes les fontions du (hierD e qui peut s9vrer prfois prtique selon les esoinsF n exemple onret d9utilistion des 5define 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
5define veqipixii 5define 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 5define puis de reompilerF noter X les 5define sont gnrlement pls dns des FhD t des prototypes @vous pouvez d9illeurs ller voir les Fh des iliothques omme stdliFhD vous verrez qu9il y des 5define 3AF ves 5define sont don  files d9s D vous pouvez hnger les dimensions de l fentre en modi(nt les 5define 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
5define esvviwe IHHH int min@int rgD hr BrgvA { hr hineIesvviweD hinePesvviweY GG FFF

IWI

CHAPITRE 14. LE PRPROCESSEUR

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 esvviwe n9est e une vrile ni une onstnteF in e'et je vous l9i ditD le prproesseur trnsforme le (hier vnt ompiltion en X
int min@int rgD hr BrgvA { hr hineIIHHHD hinePIHHHY GG FFF

F F F et el est vlide 3 in d(nissnt esvviwe 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 5defineD reompilerD et vos tleux de hr 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 veqipixiiD une utre reipixiiD puis une troisime xywfisiv qui ontiendr le nomre de pixels 0hs l9intrieur de l fentre @le lul est simple X lrgeur B huteurA X
5define veqipixii 5define reipixii 5define xywfisiv VHH THH @veqipixii B reipixiiA

v vleur de xywfisiv est remple vnt l ompiltion pr le ode suiE vnt X @veqipixii B reipixiiAD 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
1

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.

IWP

LES MACROS

! vsxi X donne le numro de l ligne tuelleF ! psvi X donne le nom du (hier tuelF ! hei X donne l dte de l ompiltionF ! swi X donne l9heure de l ompiltionF ges onstntes peuvent tre utiles pour grer des erreursD en fisnt pr exemple ei X
printf@4irreur l ligne 7d du fihier 7sn4D vsxiD psviAY printf@4ge fihier ete ompile le 7s 7sn4D heiD swiAY

irreur l ligne W du fihier minF ge fihier ete ompile le tn IQ PHHT IWXPIXIH

Les dnitions simples


sl est ussi possile de fire tout simplement X
5define gyxexi

F F F sns priser de vleurF gel veut dire pour le prproesseur que le mot gyxexi 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 5define on pouvit demnder u prproesseur de rempler un mot pr une vleurF r exemple X
5define xywfi W

F F F signi(e que tous les xywfi 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 5define est enore plus puissnt que F sl permet de rempler ussi prF F F un ode soure tout entier 3 und on utilise 5define pour reherherErempler un mot pr un ode soureD on dit qu9on re une macroF IWQ

CHAPITRE 14. LE PRPROCESSEUR

Macro sans paramtres


oii un exemple de mro trs simple X
5define gygy@A printf@4gouou4AY

ge qui hnge iiD e sont les prenthses qu9on joutes prs le motEl @ii gygy@AAF xous verrons quoi elles peuvent servir tout l9heureF estons l mro dns un ode soure X
5define gygy@A printf@4gouou4AY int min@int rgD hr BrgvA { gygy@A } return HY

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
int min@int rgD hr BrgvA { printf@4gouou4AY } return HY

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
5define egyxiesi@A printf@4gououD je m9ppelle frien4AY printf@4t9hite xien4AY printf@4t9ime l glissen4AY

IWR

LES MACROS
int min@int rgD hr BrgvA { egyxiesi@A } return HY

gououD je m9ppelle frie t9hite xie t9ime l glisse

emrquez dns le min 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  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
5define weti@geA if @ge ba IVA printf@4ous etes mjeurn4AY int min@int rgD hr BrgvA { weti@PPA } return HY

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


5define weti@geA if @ge ba IVA printf@4ous etes mjeurn4AY

IWS

CHAPITRE 14. LE PRPROCESSEUR

yn met entre prenthses le nom d9une  vrile qu9on nomme geF hns tout notre ode de mroD ge 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
int min@int rgD hr BrgvA { if @PP ba IVA printf@4ous etes mjeurn4AY } return HY

ve ode soure t mis l ple de l9ppel de l mroD et l vleur de l  vrile ge t mise diretement dns le ode soure de remplementF sl est possile ussi de rer une mro qui prend plusieurs prmtres X
5define weti@geD nomA if @ge ba IVA printf@4ous etes mjeur 7sn4D nomAY int min@int rgD hr BrgvA { weti@PPD 4wxime4A } return HY

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
5if ondition GB gode soure ompiler si l ondition est vrie BG

IWT

LES CONDITIONS
5elif onditionP GB inon si l ondition P est vrie ompiler e ode soure BG 5endif

ve motEl 5if permet d9insrer une ondition de prproesseurF 5elif signi(e else if @sinon siAF v ondition s9rrte lorsque vous insrez un 5endifF 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 5define d9une onstnte sns priser de vleurD omme je vous l9i montr pge IWQ X
5define gyxexi

in e'etD il est possile d9utiliser 5ifdef pour dire  i l onstnte est d(nie F 5ifndefD luiD sert dire  i l onstnte n9est ps d(nie F yn peut lors imginer ei X
5define sxhy 5ifdef sxhy GB gode soure pour indows BG 5endif 5ifdef vsx GB gode soure pour vinux BG 5endif 5ifdef weg GB gode soure pour w BG 5endif

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 5define sxhy 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 5define vsxF eompilezD et ette fois 9est l portion de ode soure pour vinux qui ser ompileD les utres prties tnt ignoresF IWU

CHAPITRE 14. LE PRPROCESSEUR

#ifndef
5ifndef

pour viter les inclusions innies

est trs utilis dns les Fh pour viter les  inlusions in(nies F
Une inclusion innie ? C'est--dire ?

smginezD 9est trs simpleF t9i un (hier eFh et un (hier fFhF ve (hier eFh ontient un inlude du (hier fFhF ve (hier f est don inlus dns le (hier eF wisD et 9est l que ommene oinerD supposez que le (hier fFh ontienne son tour un inlude du (hier eFh 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 eFh et voit qu9il fut inlure fFh Y PF il lit fFh pour l9inlureD et l il voit qu9il fut inlure eFh Y QF il inlut don eFh dns fFhD mis dns eFh on lui indique qu9il doit inlure fFh 3 RF reeloteD il v voir fFh et voit nouveu qu9il fut inlure eFh 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 gomment dile fire pour viter et 'reux uhemr c oii l9stueF hsormisD je vous demnde de fire omme dans TOUS vos chiers Fh sns exeption X
5ifndef hipxywhpsgrsi GG i l onstnte n9 ps t dfinie le fihier n9 jmis t inlus 5define hipxywhpsgrsi GG yn dfinit l onstnte pour que l prohine fois le fihier ne soit plus inlus GB gontenu de votre fihier Fh @utres inludeD prototypesD defineFFFA BG 5endif

we X TWVIIV ous mettrez en fit tout le ontenu de votre (hier Fh @ svoir vos utres inludeD vos prototypesD vos defineF F FA entre le 5ifndef et le 5endifF 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 Fh est inlus pour l premire foisF ve prproesseur lit l ondition  i l onstnte hipxywhpsgrsi 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 IWV

gode

LES CONDITIONS

v premire instrution qu9il renontre est justement X


5define 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 hipxywhpsgrsi pr hitudeF ge qui ompte en revnheD et j9espre que vous l9viez ien omprisD 9est de hnger de nom de onstnte hque (hier Fh di'rentF sl ne fut ps que soit l mme onstnte pour tous les (hiers FhD sinon seul le premier (hier Fh serit lu et ps les utres 3 ous remplerez don xywhpsgrsi pr le nom de votre (hier FhF
Je vous invite aller consulter les Fh des bibliothques standard sur votre disque dur. Vous verrez qu'ils sont TOUS construits sur le mme principe (un 5ifndef au dbut et un 5endif la n). Ils s'assurent ainsi qu'il ne pourra pas y avoir d'inclusions innies.

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 5inlude insre le ontenu d9un utre (hierF ! v9instrution 5define 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 5defineF 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 5ifD 5elif et 5endifF ! our viter qu9un (hier Fh 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 Fh devront tre protgs de ette mnireF

IWW

CHAPITRE 14. LE PRPROCESSEUR

PHH

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 pihier ou encore, un peu plus tard, d'autres de types penetre, eudio, glvier, etc.

PHI

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 hrD int et doule l foisF ves strutures sont gnrlement d(nies dns les (hiers FhD u mme titre don que les prototypes et les defineF oii un exemple de struture X
strut xomheotretruture { int vrileIY int vrilePY int utrerileY doule nomreheimlY }Y

ne d(nition de struture ommene pr le motEl strutD suivi du nom de votre struture @pr exemple pihierD ou enore irnAF
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 gehugpitine dans mon code, je sais que c'est une variable car cela commence par une lettre minuscule. Quand je vois woreueudio 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 douleD etF sl n9y ps de mirleD un type pihier n9est don ompos que de nomres de se 3 PHP

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 goordonnees 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
strut goordonnees { int xY GG esisses int yY GG yrdonnes }Y

xotre struture s9ppelle goordonnees 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 goordonnees 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 hr @hnes de rtresA sns prolme 3 ellezD imginons une struture ersonne qui stokerit diverses informtions sur une personne X PHQ

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES


strut ersonne { hr nomIHHY hr prenomIHHY hr dresseIHHHY int geY int gronY GG foolen X I a gronD 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 FhD on v pouvoir l9utiliser dns une fontion de notre (hier FF oii omment rer une vrile de type goordonnees @l struture qu9on d(nie plus hutA X
5inlude 4minFh4 GG snlusion du Fh qui ontient les prototypes et strutures int min@int rgD hr BrgvA { strut goordonnees pointY GG grtion d9une vrile 4point4 de type goordonnees } return HY

xous vons insi r une vrile point de type goordonneesF 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 ?
strut

lors de la dnition de la

yui X el permet l9ordinteur de di'renier un type de se @omme intA d9un type personnlisD omme goordonneesF outefoisD les progrmmeurs trouvent souvent un peu lourd de mettre le mot strut hque d(nition de vrile personnliseF our rgler e prolmeD ils ont invent une instrution spile X le typedefF PHR

UTILISATION D'UNE STRUCTURE

Le typedef
etournons dns le (hier Fh qui ontient l d(nition de notre struture de type goordonneesF 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
typedef strut goordonnees goordonneesY strut goordonnees { int xY int yY }Y

gette ligne doit tre doupe en trois moreux @nonD je n9i ps gy le mot goordonnees 3A X ! typedef X indique que nous llons rer un lis de struture Y ! strut goordonnees X 9est le nom de l struture dont vous llez rer un lis @9estEEdire un  quivlent A Y ! goordonnees X 9est le nom de l9quivlentF in lirD ette ligne dit  rire le mot goordonnees est dsormis quivlent rire strut goordonnees F in fisnt elD vous n9urez plus esoin de mettre le mot strut hque d(nition de vrile de type goordonneesF yn peut don retourner dns notre min et rire tout simplement X
int min@int rgD hr BrgvA { goordonnees pointY GG v9ordinteur omprend qu9il s9git de 4strut goordonnees4 gre u typedef return HY }

te vous reommnde de fire un typedef omme je l9i fit ii pour goordonneesF v pluprt des progrmmeurs font omme elF leur vite d9voir rire le mot strut 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. Un bon programmeur est un programmeur fainant ! Il en crit le moins possible.

PHS

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES


int min@int rgD hr BrgvA { goordonnees pointY pointFx a IHY pointFy a PHY } return HY

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

vrileFnomhevgomposnte

ve point fit l sprtion entre l vrile et l omposnteF i on prend l struture ersonne que nous vons vue tout l9heure et qu9on demnde le nom et le prnomD on devr fire omme X
int min@int rgD hr BrgvA { ersonne utilisteurY printf@4uel est votre nom c 4AY snf@47s4D utilisteurFnomAY printf@4otre prenom c 4AY snf@47s4D utilisteurFprenomAY printf@4ous vous ppelez 7s 7s4D utilisteurFprenomD utilisteurFnomAY } return HY

uel est votre nom c hupont otre prenom c ten ous vous ppelez ten hupont

yn envoie l vrile utilisteurFnom snf qui rir diretement dns notre vrile utilisteurF 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 ersonne qui ur ussi son propre nomD son propre prnomD etF yn peut don fire X
3

2. C'est la notation mathmatique d'une coordonne. 3. Je dois tre programmeur, c'est pour a. ;-)

PHT

UTILISATION D'UNE STRUCTURE


ersonne joueurID joueurPY

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 ersonne 3 g9est file fire X
ersonne joueursPY

it ensuiteD vous dez pr exemple u nom du joueur no H en tpnt X


joueursHFnom

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 ersonne 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 xvvF xvv est en fit un 5define situ dns stdliFh qui vut gnrlement HD mis on ontinue utiliser xvvD 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
goordonnees point a {HD H}Y

gel d(nirD dns l9ordreD pointFx

a H

et pointFy

a HF

PHU

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

evenons l struture ersonne @qui ontient des hnesAF ous vez ussi le droit d9initiliser une hne en rivnt juste 44 @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 dresseD ge et gron omme ei X
ersonne utilisteur a {44D 44D 44D HD H}Y

outefoisD j9utilise ssez peu ette tehniqueD personnellementF te prfre envoyer pr exemple m vrile point une fontion initilisergoordonnees 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 doule ou de n9importe quelle utre type de se X
goordonneesB point a xvvY

yn insi un pointeur de goordonnees 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
goordonnees Bpoint a xvvY

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
goordonnees BpointI a xvvD BpointP a xvvY

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 goordonnees dns le min et envoyer son dresse initilisergoordonneesF gette fontion ur pour rle de mettre tous les lments de l struture HF PHV

POINTEUR DE STRUCTURE

xotre fontion initilisergoordonnees v prendre un prmtre X un pointeur sur une struture de type goordonnees @un goordonneesBD donAF
int min@int rgD hr BrgvA { goordonnees monointY initilisergoordonnees@8monointAY } return HY

void initilisergoordonnees@goordonneesB pointA { GG snitilistion de hun des memres de l struture ii }

w vrile monoint est don re dns le minF yn envoie son dresse l fontion initilisergoordonnees 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 initilisergoordonneesD 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
void initilisergoordonnees@goordonneesB pointA { BpointFx a HY BpointFy a HY }

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 Bpoint en entierF yrD nous e qu9on veutD 9est der Bpoint pour en modi(er l vleurF our rgler le prolmeD il fut pler des prenthses utour de BpointF gomme elD le point de sprtion s9ppliquer Bpoint et non juste point X
void initilisergoordonnees@goordonneesB pointA { @BpointAFx a HY @BpointAFy a HY }

ge ode fontionneD vous pouvez testerF v vrile de type goordonnees t trnsE mise l fontion qui initilis x et y HF PHW

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

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

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

@BpointAFx a HY

yui mis voilD enore une fois les progrmmeurs trouvent trop longF ves prenthses utour de BpointD 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
pointEbx a HY

ge rouri onsiste former une )he ve un tiret suivi d9un hevron bF rire pointEbx est don sgiwix quivlent rire @BpointAFxF
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 initilisergoordonneesF xous pouvons don l9rire omme ei X


void initilisergoordonnees@goordonneesB pointA { pointEbx a HY pointEby a HY }

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
4. Chaque chose en son temps. 5. Quand je vous disais que les pointeurs vous poursuivraient jusque dans votre tombe, je ne le disais presque pas en rigolant !

PIH

LES NUMRATIONS
int min@int rgD hr BrgvA { goordonnees monointY goordonnees Bpointeur a 8monointY monointFx a IHY GG yn trville sur une vrileD on utilise le 4point4 pointeurEbx a IHY GG yn trville sur un pointeurD on utilise l flhe } return HY

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
typedef enum olume olumeY enum olume { pesfviD wyixD 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 olumeF g9est un type de vrile personnlis qui peut prendre une des trois vleurs qu9on indiques X soit pesfviD soit wyixD soit pyF yn v pouvoir rer une vrile de type olumeD pr exemple musiqueD qui stoker le volume tuel de l musiqueF yn peut pr exemple initiliser l musique u volume wyix X
olume musique a wyixY

oil qui est fitF lus trd dns le progrmmeD on pourr modi(er l vleur du volume et l mettre soit pesfviD soit pyF PII

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

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 olumeD pesfvi vut HD wyix vut I et py vut PF v9ssoition est utomtique et ommene HF gontrirement u 5defineD 9est le ompilteur qui ssoie wyix I pr exempleD et non le prproesseurF eu out du ompteD revient un peu u mmeF in fitD qund on initilis l vrile musique wyixD on don mis l se en mmoire l vleur IF
En pratique, est-ce utile de savoir que wyix vaut 1, py 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
if @musique aa wyixA { GG touer l musique u volume moyen }

eu importe l vleur de wyixD 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
typedef enum olume olumeY enum olume {

PIP

LES NUMRATIONS
pesfvi a IHD wyix a SHD py a IHH

}Y

siD le volume pesfvi orrespondr IH 7 de volumeD le volume wyix SH 7D etF yn pourrit filement jouter de nouvelles vleurs possiles omme wiF yn ssoierit dns e s wi 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 doule que l9on retrouve dns tous les progrmmesF ! ne struture est ompose de  sousEvriles qui sont en gnrl des vriles de type de se omme int et douleD 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 joueurFprenomF ! i on mnipule un pointeur de struture et qu9on veut der une des omposntesD on utilise une )he l ple du point X pointeurtoueurEbprenomF ! ne numrtion est un type de vrile personnlis qui peut seulement prendre une des vleurs que vous prd(nissez X pesfviD wyix ou py pr exempleF

PIQ

CHAPITRE 15. CREZ VOS PROPRES TYPES DE VARIABLES

PIR

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.

PIS

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 snf 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 (stdliFh, stdioFh, mthFh, stringFh. . .) 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 stdioFh et stdliFh en hut de votre (hier F X
5inlude `stdliFhb 5inlude `stdioFhb

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 xvvD 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 xvv 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 floseF xous llons dns un premier temps pprendre nous servir de fopen et floseF ne fois que vous surez fire elD nous pprendrons lire le ontenu du (hier et y rire du texteF PIT

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
psviB fopen@onst hrB nomhupihierD onst hrB modeyuvertureAY

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 psvi 3 g9est un pointeur sur une struture de type psviF gette struture est d(nie dns stdioFhF ous pouvez ouvrir e (hier pour voir de quoi est onstitu le type psviD mis n9 uun intrt en e qui nous onerneF
Pourquoi le nom de la structure est-il tout en majuscules (psvi) ? 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 psviBF sl est extrmement importnt de ruprer e pointeur pour pouvoir ensuite lire et rire dns le (hierF xous llons don rer un pointeur de psvi u dut de notre fontion @pr exemple l fontion minA X
int min@int rgD hr BrgvA { psviB fihier a xvvY } return HY

ve pointeur est initilis xvv ds le dutF te vous rppelle que 9est une rgle fondmentle que d9initiliser ses pointeurs xvv ds le dut si on n9 ps d9utre
1. Je reconnais nanmoins que l'on a toujours besoin de quelques petites explications ct quand mme !

PIU

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

vleur leur donnerF i vous ne le fites psD vous ugmentez onsidrlement le risque d9erreur pr l suiteF
Vous noterez qu'il n'est pas ncessaire d'crire strut psviB fihier a 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 psvi directement (on ne fera pas fihierFelement par exemple). On passera par des fonctions qui manipulent le psvi notre place.
xvv.

wintenntD nous llons ppeler l fontion fopen et ruprer l vleur qu9elle renvoie dns le pointeur fihierF wis vnt D il fut que je vous explique omment se servir du seond prmtreD le prmtre modeyuvertureF 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 ! 4r4 : lecture seuleF ous pourrez lire le ontenu du (hierD mis ps y rireF Le ! !
chier doit avoir t cr au pralable.
4w4 44

: 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. ! 4rC4 : 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

! !

4wC4 : 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 44 prs le premier rtre @4r4D 4w4D 44D 4rC4D 4wC4D 4C4AD 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 4r4 @letureAD 4w4 @ritureA et 4rC4 @leture et riE tureAF ve mode 4wC4 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 @44A peut tre utile dns ertins sD si vous voulez seulement jouter des informtions l (n du (hierF
4C4

Si le chier n'existe pas, il sera cr.

PIV

OUVRIR ET FERMER UN FICHIER

Si vous avez juste l'intention de lire un chier, il est conseill de mettre 4r4. Certes, le mode 4rC4 aurait fonctionn lui aussi, mais en mettant 4r4 vous vous assurez que le chier ne pourra pas tre modi, ce qui est en quelque sorte une scurit.

i vous rivez une fontion hrgerxiveu @pour hrger le niveu d9un jeuD pr exempleAD le mode 4r4 su0tF i vous rivez une fontion enregistrerxiveuD le mode 4w4 ser lors dptF ve ode suivnt ouvre le (hier testFtxt en mode 4rC4 @leture G ritureA X
int min@int rgD hr BrgvA { psviB fihier a xvvY fihier a fopen@4testFtxt4D 4rC4AY } return HY

ve pointeur fihier devient lors un pointeur sur testFtxtF


O doit tre situ testFtxt ?

sl doit tre situ dns le mme dossier que votre exutle @FexeAF our les esoins de e hpitreD rez un (hier testFtxt omme moi dns le mme dossier que le Fexe @(gF ITFIAF gomme vous le voyezD je trville tuellement ve l9shi gode: :floksD e qui explique l prsene d9un (hier de projet Fp @u lieu de FslnD si vous vez isul gCC pr exempleAF frefD e qui ompte 9est de ien voir que mon progrmme @testsFexeA est situ dns le mme dossier que le (hier dns lequel on v lire et rire @testFtxtAF
Le chier doit-il tre de type Ftxt ?

xonF g9est vous qui hoisissez l9extension lorsque vous ouvrez le (hierF ous pouvez trs ien inventer votre propre formt de (hier Fniveu 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 PIW

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

Figure ITFI ! ve (hier doit tre pl dns le mme dossier que l9exutle
fihier a fopen@4dossierGtestFtxt4D 4rC4AY

siD le (hier testFtxt 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
fihier a fopen@4gXrogrm pilesxotepdCCredmeFtxt4D 4rC4AY

ge ode ouvre le (hier redmeFtxt situ dns g:rogrm

pilesxotepdCCF

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
fihier a fopen@4GhomeGmteoGdossierGredmeFtxt4D 4rC4AY

PPH

OUVRIR ET FERMER UN FICHIER

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

Tester l'ouverture du chier


ve pointeur fihier devrit ontenir l9dresse de l struture de type psvi qui sert de desripteur de (hierF geluiEi t hrg en mmoire pour vous pr l fontion fopen@AF 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 xvvD l9ouverture houF 9il vut utre hose que xvvD l9ouverture russiF yn v don suivre systmtiquement le shm suivnt X
int min@int rgD hr BrgvA { psviB fihier a xvvY fihier a fopen@4testFtxt4D 4rC4AY if @fihier 3a xvvA { GG yn peut lire et rire dns le fihier } else { GG yn ffihe un messge d9erreur si on veut printf@4smpossile d9ouvrir le fihier testFtxt4AY } } return HY

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 flose qui pour rle de lirer l mmoireD 9estEEdire supprimer votre (hier hrg dns l mmoire viveF PPI

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

on prototype est X
int flose@psviB pointeururpihierAY

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 ! H X si l fermeture mrh Y ! iyp X si l fermeture houF iyp est un define situ dns stdioFh 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 flose mrhF ous pouvez nnmoins le fire si vous le voulezF our fermer le (hierD on v don rire X
flose@fihierAY

eu (nlD le shm que nous llons suivre pour ouvrir et fermer un (hier ser le suivnt X
int min@int rgD hr BrgvA { psviB fihier a xvvY fihier a fopen@4testFtxt4D 4rC4AY if @fihier 3a xvvA { GG yn lit et on rit dns le fihier GG FFF } } flose@fihierAY GG yn ferme le fihier qui t ouvert

return HY

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 PPP

DIFFRENTES MTHODES DE LECTURE / CRITURE

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 flose oulisF

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 ! fput 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 qusiE identique printfF
fput

gette fontion rit un rtre l fois dns le (hierF on prototype est X


int fput@int rtereD psviB pointeururpihierAY

ille prend deux prmtresF ! ve rtre rire @de type intD e qui omme je vous l9i dit revient plus ou moins utiliser un hrD suf que le nomre de rtres utilisles est ii plus grndAF ous pouvez don rire diretement 9e9 pr exempleF ! ve pointeur sur le (hier dns lequel rireF hns notre exempleD notre pointeur s9ppelle fihierF 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 iyp 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 fput russiD mis vous pouvez le fire enore une fois si vous le voulezF ve ode suivnt rit l lettre 9e9 dns testFtxt @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 PPQ

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


int min@int rgD hr BrgvA { psviB fihier a xvvY fihier a fopen@4testFtxt4D 4w4AY if @fihier 3a xvvA { fput@9e9D fihierAY GG riture du rtre e flose@fihierAY } } return HY

we X SIUWRR yuvrez votre (hier testFtxtF ue voyezEvous c g9est mgiqueD le (hier ontient minE tennt l lettre 9e9 omme le montre l (gF ITFPF

gode

Figure ITFP ! ve (hier ontient dsormis l lettre 9e9


fputs

gette fontion est trs similire fputD l di'rene prs qu9elle rit tout une hneD e qui est en gnrl plus prtique que d9rire rtre pr rtreF gel ditD fput reste utile lorsque vous devez rire rtre pr rtreD e qui rrive frquemmentF rototype de l fontion X
hrB fputs@onst hrB hineD psviB pointeururpihierAY

ves deux prmtres sont files omprendreF ! hine X l hne rireF xotez que le type ii est onst hrB X en joutnt le mot onst 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 PPR

DIFFRENTES MTHODES DE LECTURE / CRITURE

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 ! pointeururpihier X omme pour fputD il s9git de votre pointeur de type psviB sur le (hier que vous vez ouvertF v fontion renvoie iyp s9il y eu une erreurD sinon 9est que el fontionnF v non plusD je ne teste en gnrl ps l vleur de retourF estons l9riture d9une hne dns le (hier X
int min@int rgD hr BrgvA { psviB fihier a xvvY fihier a fopen@4testFtxt4D 4w4AY if @fihier 3a xvvA { fputs@4lut les rHsngomment llezEvous c4D fihierAY flose@fihierAY } } return HY

we X VRHTVU v (gF ITFQ prsente le (hier une fois modi( pr le progrmmeF

gode

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 psvi en premier prmtreF ge ode demnde l9ge de l9utilisteur et l9rit dns le (hier @rsultt (gF ITFRA X
int min@int rgD hr BrgvA {

PPS

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


psviB fihier a xvvY int ge a HY fihier a fopen@4testFtxt4D 4w4AY if @fihier 3a xvvA { GG yn demnde l9ge printf@4uel ge vezEvous c 4AY snf@47d4D 8geAY GG yn l9rit dns le fihier fprintf@fihierD 4ve wonsieur qui utilise le progrmmeD il 7d ns4D geAY flose@fihierAY

} }

return HY

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 ! fget X lit un rtre Y ! fgets X lit une hne Y ! fsnf 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 PPT

DIFFRENTES MTHODES DE LECTURE / CRITURE


fget

out d9ord le prototype X


int fget@psviB pointeurhepihierAY

gette fontion retourne un int X 9est le rtre qui t luF i l fontion n9 ps pu lire de rtreD elle retourne iypF
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 fget vne le urseur d9un rtre hque fois que vous en lisez unF i vous pE pelez fget 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 fget renvoie iyp @qui signi(e  ind yf pile D 9estEEdire  (n du (hier AF
int min@int rgD hr BrgvA { psviB fihier a xvvY int rtereetuel a HY fihier a fopen@4testFtxt4D 4r4AY if @fihier 3a xvvA { GG foule de leture des rtres un un do { rtereetuel a fget@fihierAY GG yn lit le rtre printf@474D rtereetuelAY GG yn l9ffihe } while @rtereetuel 3a iypAY GG yn ontinue tnt que fget n9 ps retourn iyp @fin de fihierA flose@fihierAY

PPU

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS


} } return HY

we X UQPTQP v onsole 0her tout le ontenu du (hierD pr exemple X


gououD je suis le ontenu du fihier testFtxt 3

gode

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
hrB fgets@hrB hineD int nrehegrteresevireD psviB pointeururpihierAY

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 hineD 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

5define esvviwe IHHH GG leu de tille IHHH int min@int rgD hr BrgvA { psviB fihier a xvvY hr hineesvviwe a 44Y GG ghne vide de tille esvviwe fihier a fopen@4testFtxt4D 4r4AY if @fihier 3a xvvA { fgets@hineD esvviweD fihierAY GG yn lit mximum esvviwe
2. Du moins on l'espre, car on ne peut pas en tre sr 100 %.

PPV

DIFFRENTES MTHODES DE LECTURE / CRITURE

rtres du fihierD on stoke le tout dns 4hine4 printf@47s4D hineAY GG yn ffihe l hne } flose@fihierAY

return HY

we X VQHWWP ve rsultt est le mme que pour le ode de tout l9heureD svoir que le ontenu s9rit dns l onsole X
gououD je suis le ontenu du fihier testFtxt 3

gode

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 5define dns son ode pour d(nir l tille mximle d9un tleu pr exempleF in e'etD esvviwe 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 esvviwe 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 xvv si elle n9est ps prvenue lire e que vous vez demndF v oule doit don s9rrter ds que fgets se met renvoyer xvvF yn n9 plus qu9 fire un while pour ouler tnt que fgets ne renvoie ps xvv X
5define esvviwe IHHH int min@int rgD hr BrgvA { psviB fihier a xvvY hr hineesvviwe a 44Y fihier a fopen@4testFtxt4D 4r4AY if @fihier 3a xvvA { while @fgets@hineD esvviweD fihierA 3a xvvA GG yn lit le fihier

PPW

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

tnt qu9on ne reoit ps d9erreur @xvvA { printf@47s4D hineAY GG yn ffihe l hne qu9on vient de lire } } flose@fihierAY

return HY

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
while @fgets@hineD esvviweD fihierA 3a xvvA

gode

v ligne du while fit deux hoses X elle lit une ligne dns le (hier et vri(e si fgets ne renvoie ps xvvF 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
fsnf

g9est le mme prinipe que l fontion snfD 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 IS PH QHF ous voudriez ruprer hun de es nomres dns une vrile de type intF v fontion fsnf v vous permettre de fire rpidementF
int min@int rgD hr BrgvA { psviB fihier a xvvY int soreQ a {H}Y GG leu des Q meilleurs sores fihier a fopen@4testFtxt4D 4r4AY if @fihier 3a xvvA { fsnf@fihierD 47d 7d 7d4D 8soreHD 8soreID 8sorePAY printf@4ves meilleurs sores sont X 7dD 7d et 7d4D soreHD soreID sorePAY } flose@fihierAY

PQH

SE DPLACER DANS UN FICHIER


return HY

gode we X SQHSTI ves meilleurs sores sont X ISD PH et QH

gomme vous le voyezD l fontion fsnf ttend trois nomres sprs pr un espe @47d 7d 7d4AF 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 7d entre guillemets pour la fonction snf. 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
long ftell@psviB pointeururpihierAY

ve nomre renvoy indique don l position du urseur dns le (hierF PQI

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

fseek

: se positionner dans le chier

ve prototype de fseek est le suivnt X


int fseek@psviB pointeururpihierD long deplementD int origineAY

v fontion fseek permet de dpler le urseur d9un ertin nomre de rtres @indiqu pr deplementA prtir de l position indique pr origineF ! ve nomre deplement 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 ! iiui X indique le dut du (hier Y ! iiug X indique l position tuelle du urseur Y ! iiuixh X indique l (n du (hierF oii quelques exemples pour ien omprendre omment on jongle ve deplement et origineF ! ve ode suivnt ple le urseur deux rtres aprs le dut X
fseek@fihierD PD iiuiAY

! ve ode suivnt ple le urseur qutre rtres avant l position ournte X


fseek@fihierD ERD iiugAY

emrquez que deplement est ngtif r on se dple en rrireF ! ve ode suivnt ple le urseur l (n du (hier X
fseek@fihierD HD iiuixhAY

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 !

PQP

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
void rewind@psviB pointeururpihierAY

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 ! renme 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


int renme@onst hrB nienxomD onst hrB nouveuxomAY

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
int min@int rgD hr BrgvA { renme@4testFtxt4D 4testrenommeFtxt4AY } return HY

PQQ

CHAPITRE 16. LIRE ET CRIRE DANS DES FICHIERS

remove

: supprimer un chier

gette fontion supprime un (hier sns demnder son reste X


int remove@onst hrB fihiereupprimerAY

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 testFtxtD je peux don me permettre de le supprimer X
int min@int rgD hr BrgvA { remove@4testFtxt4AY } return HY

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.

PQR

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.

PQS

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

und on dlre une vrileD on dit qu9on demande allouer de la mmoire X


int monxomre a HY

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 @hrD intD douleD flotF F FAD vous vez esoin de plus ou moins de mmoireF in e'etD pour stoker un nomre ompris entre EIPV et IPU @un hrAD on n9 esoin que d9un otet en mmoireF g9est tout petitF in revnheD un int oupe gnrlement R otets en mmoireF unt u douleD 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@AF 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 !

PQT

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
sizeof@intA

l ompiltionD el ser rempl pr un nomre X le nomre d9otets que prend int en mmoireF ghez moiD sizeof@intA 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
printf@4hr X 7d otetsn4D sizeof@hrAAY printf@4int X 7d otetsn4D sizeof@intAAY printf@4long X 7d otetsn4D sizeof@longAAY printf@4doule X 7d otetsn4D sizeof@douleAAY

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


typedef strut goordonnees goordonneesY strut goordonnees
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.

PQU

CHAPITRE 17. L'ALLOCATION DYNAMIQUE


{ }Y

int xY int yY

int min@int rgD hr BrgvA { printf@4goordonnees X 7d otetsn4D sizeof@goordonneesAAY } return HY

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
int nomre a IVY

F F F et que sizeof@intA indique R otets sur notre ordinteurD lors l vrile ouper R otets en mmoire 3 upposons que l vrile nomre soit lloue l9dresse ITHH en mmoireF yn urit lors le shm de l (gF IUFIF siD on voit ien que notre vrile nomre 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 hrD 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
int tleuIHHY

on ouper lors en rlit R B IHH a RHH otets en mmoireF


Mme si le tableau est vide, il prend 400 octets ?

PQV

LA TAILLE DES VARIABLES

Figure IUFI ! n int oupnt R otets en mmoire

Figure IUFP ! n hr oupnt I otet en mmoire

PQW

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

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 de l ple en mmoireF xotez que si on re un tleu de type goordonnees X
goordonnees tleuIHHY

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 `stdliFhb F gette iliothque ontient deux fontions dont nous llons voir esoin X ! mllo @ 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 mllo pour demnder de l mmoire Y PF vri(er l vleur retourne pr mllo 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 mllo est ssez omiqueD vous llez voir X


3. Si vous avez suivi mes conseils, vous devriez avoir inclus cette bibliothque dans tous vos programmes, de toute faon.

PRH

ALLOCATION DE MMOIRE DYNAMIQUE


voidB mllo@sizet nomreytetsxeessiresAY

v fontion prend un prmtre X le nomre d9otets rserverF einsiD il su0r d9rire sizeof@intA 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 voidB 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 mllo 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 mllo ne sit ps quel type elle doit retournerD elle renvoie le type voidBF 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 mllo que j9i esoin de sizeof@intA otets en mmoireF te rupre le rsultt du mllo dns un pointeur sur intF
intB memoireellouee a xvvY GG yn re un pointeur sur int memoireellouee a mllo@sizeof@intAAY GG v fontion mllo insrit dns notre pointeur l9dresse qui t reserveF

l (n de e odeD memoireellouee 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 mllo don renvoy dns notre pointeur memoireellouee 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 xvvF 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 PRI

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

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 queD de toute mnireD il ne pourr ps ontinuer onvenlementF yn v utiliser une fontion stndrd qu9on n9vit ps enore vue jusqu9ii X exit@AF ille rrte immditement le progrmmeF ille prend un prmtre X l vleur que le progrmme doit retourner F
4

int min@int rgD hr BrgvA { intB memoireellouee a xvvY memoireellouee a mllo@sizeof@intAAY if @memoireellouee aa xvvA GG i l9llotion hou { exit@HAY GG yn rrte immditement le progrmme } GG yn peut ontinuer le progrmme normlement sinon } return HY

i le pointeur est di'rent de xvvD 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 flose 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
void free@voidB pointeurAY

v fontion free juste esoin de l9dresse mmoire lirerF yn v don lui envoyer notre pointeurD 9estEEdire memoireellouee dns notre exempleF oii le shm omE plet et (nlD ressemlnt s9y mprendre e qu9on vu dns le hpitre sur les (hiers X
int min@int rgD hr BrgvA { intB memoireellouee a xvvY memoireellouee a mllo@sizeof@intAAY if @memoireellouee aa xvvA GG yn vrifie si l mmoire t lloue
4. Cela correspond en fait au return du main().

PRP

ALLOCATION DE MMOIRE DYNAMIQUE


{ }

exit@HAY GG irreur X on rrte tout 3

GG yn peut utiliser ii l mmoire free@memoireelloueeAY GG yn n9 plus esoin de l mmoireD on l lire } return HY

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
int min@int rgD hr BrgvA { intB memoireellouee a xvvY memoireellouee a mllo@sizeof@intAAY GG ellotion de l mmoire if @memoireellouee aa xvvA { exit@HAY } GG tilistion de l mmoire printf@4uel ge vezEvous c 4AY snf@47d4D memoireelloueeAY printf@4ous vez 7d nsn4D BmemoireelloueeAY free@memoireelloueeAY GG virtion de mmoire } return HY

gode we X PWRUUR uel ge vezEvous c QI ous vez QI ns

PRQ

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

Attention : comme memoireellouee 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 : Bmemoireellouee (regardez le printf). Tandis que pour indiquer l'adresse, on a juste besoin d'crire le nom du pointeur memoireellouee (regardez le snf). 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

int min@int rgD hr BrgvA { int mrile a HY GG ellotion de l mmoire @utomtiqueA GG tilistion de l mmoire printf@4uel ge vezEvous c 4AY snf@47d4D 8mrileAY printf@4ous vez 7d nsn4D mrileAY return HY } GG virtion de l mmoire @utomtique l fin de l fontionA

uel ge vezEvous 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 PRR

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
int geemisISY

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
int misnomrehemisY

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 nomrehemisD et el gre un ode qui fontionner prtout 3 yn v demnder u mllo de nous rserver nomrehemis B sizeof@intA otets en mmoire X
mis a mllo@nomrehemis B sizeof@intAAY

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 PRS

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

IF PF QF RF SF

demnder l9utilisteur omien il d9mis Y rer un tleu de int ynt une tille gle son nomre d9mis @vi mlloA Y demnder l9ge de hun de ses mis un unD qu9on stoke dns le tleu Y 0her l9ge des mis pour montrer qu9on ien mmoris tout el Y l (nD puisqu9on n9 plus esoin du tleu ontennt l9ge des misD le lirer ve l fontion freeF

int min@int rgD hr BrgvA { int nomrehemis a HD i a HY intB geemis a xvvY GG ge pointeur v servir de tleu prs l9ppel du mllo GG yn demnde le nomre d9mis l9utilisteur printf@4gomien d9mis vezEvous c 4AY snf@47d4D 8nomrehemisAY if @nomrehemis b HA GG sl fut qu9il it u moins un mi @je le plins un peu sinon XpA { geemis a mllo@nomrehemis B sizeof@intAAY GG yn lloue de l mmoire pour le tleu if @geemis aa xvvA GG yn vrifie si l9llotion mrh ou non { exit@HAY GG yn rrte tout }

GG yn demnde l9ge des mis un un for @i a H Y i ` nomrehemis Y iCCA { printf@4uel ge l9mi numero 7d c 4D i C IAY snf@47d4D 8geemisiAY } GG yn ffihe les ges stoks un un printf@4nnos mis ont les ges suivnts Xn4AY for @i a H Y i ` nomrehemis Y iCCA { printf@47d nsn4D geemisiAY } GG yn lire l mmoire lloue ve mlloD on n9en plus esoin free@geemisAY

} }

return HY

gode

we X RPQQSH

PRT

ALLOCATION DYNAMIQUE D'UN TABLEAU


gomien d9mis vezEvous c S uel ge l9mi numero I c IT uel ge l9mi numero P c IV uel ge l9mi numero Q c PH uel ge l9mi numero R c PT uel ge l9mi 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 mlloAF te vous rssure X dns l suite du oursD nous urons l9osion d9utiliser le mllo 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@AF ! v9llotion dynmique onsiste rserver mnuellement de l9espe en mmoire pour une vrile ou un tleuF ! v9llotion est e'etue ve mllo@A et il ne fut surtout ps oulier de lirer l mmoire ve free@A 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

PRU

CHAPITRE 17. L'ALLOCATION DYNAMIQUE

PRV

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 !

PRW

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 stringFh 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 BBBqB

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 BBqB
1. Mais vous pouvez changer ce nombre maximal pour corser la dicult, bien sr !

PSH

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 iBiBiBB

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 BeBBBB roposez une lettre X y sl vous reste W oups jouer uel est le mot seret c BeBByB 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 weBByx roposez une lettre X qgne 3 ve mot seret etit ien X weyx

PSI

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
snf@474D 8mvettreAY

it e'etivementD 9est ienF 7 indique que l9on ttend un rtreD qu9on stoker dns mvettre @une vrile de type hrAF out se psse trs ienF F F tnt qu9on ne refit ps un snfF in e'etD vous pouvez tester le ode suivnt X
int min@int rgD hrB rgvA { hr mvettre a HY snf@474D 8mvettreAY printf@474D mvettreAY snf@474D 8mvettreAY printf@474D mvettreAY } return HY

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 snfF
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 snfF wis l seonde foisD snf 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 liregrtere@A X
hr liregrtere@A { hr rtere a HY rtere a gethr@AY GG yn lit le premier rtre

PSP

LES CONSIGNES
rtere a toupper@rtereAY GG yn met l lettre en mjusule si elle ne l9est ps dj GG yn lit les utres rtres mmoriss un un jusqu9u n @pour les efferA while @gethr@A 3a 9n9A Y return rtereY GG yn retourne le premier rtre qu9on lu

we X UTRITV gette fontion utilise gethr@A qui est une fontion de stdio qui revient extement rire snf@474D 8lettreAYF v fontion gethr renvoie le rtre que le joueur tpF eprsD j9utilise une fontion stndrd qu9on n9 ps eu l9osion d9tudier dns le ours X toupper@AF gette fontion trnsforme l lettre indique en mjusuleF gomme D le jeu fontionner mme si le joueur tpe des lettres minusulesF sl fudr inlure typeFh 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 gethr 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 gethr 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 ?

gode

in fitD je fis une oule qui ne ontient ps d9instrutions @l seule instrutionD 9est le gethr entre les prenthsesAF ves oldes ne sont ps nessires vu que je n9i rien d9utre fire qu9un gethrF 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
while @gethr@A 3a 9n9A { }

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 PSQ

CHAPITRE 18. TP : RALISATION D'UN PENDU

in(nD l fontion liregrtere retourne le premier rtre qu9elle lu X l vrile rtereF En rsumD pour ruprer une lettre dns votre odeD vous n9utiliserez ps X
snf@474D 8mvettreAY

F F F vous utiliserez l ple notre superEfontion X


mvettre a liregrtere@AY

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
hr moteret a 4weyx4Y

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 PSR

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.

PSS

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 minF yn n9oulie ps d9inlure les iliothques stdioD stdli et type @pour l fontion toupper@AA dont on ur esoin X
5inlude `stdioFhb 5inlude `stdliFhb
4.  ESPCE DE PROGRAMME DE ***** TU VAS TE METTRE MARCHER, OUI OU NON ! ? .

PST

LA SOLUTION (1 : LE CODE DU JEU)


5inlude `typeFhb int min@int rgD hrB rgvA { } return HY

ykD jusqueEl tout le monde devrit suivreF xotre min 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

5inlude `stdioFhb 5inlude `stdliFhb 5inlude `typeFhb int min@int rgD hrB rgvA { hr lettre a HY GG toke l lettre propose pr l9utilisteur @retour du snfA hr moteret a 4weyx4Y GG g9est le mot trouver int lettrerouveeT a {H}Y GG leu de oolensF ghque se orrespond une lettre du mot seretF H a lettre non trouveD I a lettre trouve int oupsestnts a IHY GG gompteur de oups restnts @H a mortA int i a HY GG ne petite vrile pour prourir les tleux } return HY

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 moteret le mot trouverD oupsestnts 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 lettrerouveeF 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 !

PSU

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 lettrerouvee 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 oupsestnts tome HF ssons l suite X
printf@4fienvenue dns le endu 3nn4AY

g9est un messge de ienvenueD il n9y rien de ien plpitntF in revnheD l oule priniple du jeu est plus intressnte X
while @oupsestnts b H 88 3ggne@lettrerouveeAA {

ve jeu ontinue tnt qu9il reste des oups @oupsestnts b HA 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 ggne est une fontion qui nlyse le tleu lettrerouveeF ille renvoie  vri @IA si le joueur ggn @le tleu lettrerouvee 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
printf@4nnsl vous reste 7d oups jouer4D oupsestntsAY printf@4nuel est le mot seret c 4AY GB yn ffihe le mot seret en msqunt les lettres non trouves ixemple X BeBByx BG for @i a H Y i ` T Y iCCA { if @lettrerouveeiA GG i on trouv l lettre n i printf@474D moteretiAY GG yn l9ffihe else printf@4B4AY GG inonD on ffihe une toile pour les lettres non trouves }

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 lettrerouveeiAF i 9est le sD on 0he l lettreF inonD on 0he une B de remplement pour msquer l lettreF PSV

LA SOLUTION (1 : LE CODE DU JEU)

wintennt qu9on 0h e qu9il fllitD on v demnder u joueur de sisir une lettre X


printf@4nroposez une lettre X 4AY lettre a liregrtere@AY

te fis ppel notre fontion liregrtere@AF 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
GG i e n9tit e l onne lettre if @3reherhevettre@lettreD moteretD lettrerouveeAA { oupsestntsEEY GG yn enlve un oup u joueur } }

yn vri(e si l lettre entre se trouve dns moteretF yn fit ppel pour el une fontion mison ppele reherhevettreF 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 3 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 reherhevettre met aussi jour le tableau de boolens lettrerouvee. 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
if @ggne@lettrerouveeAA printf@4nnqgne 3 ve mot seret etit ien X 7s4D moteretAY else printf@4nnerdu 3 ve mot seret etit X 7s4D moteretAY return HY }

yn fit ppel l fontion ggne 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 PSW

CHAPITRE 18. TP : RALISATION D'UN PENDU

Analyse de la fonction gagne


oyons mintennt le ode de l fontion ggne X
int ggne@int lettrerouveeA { int i a HY int joueurqgne a IY for @i a H Y i ` T Y iCCA { if @lettrerouveei aa HA joueurqgne a HY } } return joueurqgneY

gette fontion prend le tleu de oolens lettrerouvee 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 lettrerouvee 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 joueurqgne  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 reherhevettre 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 lettrerouvee orrespondnt ux positions de l lettre qui t trouveF
int reherhevettre@hr lettreD hr moteretD int lettrerouveeA { int i a HY int onnevettre a HY GG yn prourt moteret pour vrifier si l lettre propose y est for @i a H Y motereti 3a 9H9 Y iCCA { if @lettre aa moteretiA GG i l lettre y est { onnevettre a IY GG yn mmorise que 9tit une onne lettre lettrerouveei a IY GG yn met I l se du tleu de oolens orrespondnt l lettre tuelle }

PTH

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


} } return onnevettreY

yn prourt don l hne moteret 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 onnevettre ID pour que l fontion retourne I r l lettre se trouvit e'etivement dns moteret Y ! on met jour le tleu lettrerouvee 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 lettrerouveeD 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 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 dioFtxt dans le mme rpertoire que mon projetF our le momentD j9y mets les mots suivnts X
6

wesyx fvi esyx vyryxi efisvvi swwifvi qyhsx xisqi iy


6. Donc sans la gestion du dictionnaire.

PTI

CHAPITRE 18. TP : RALISATION D'UN PENDU

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 dioF @qui ser hrg de l leture du dioAF hns l fouleD je re le dioFh qui ontiendr les prototypes des fontions ontenues dns dioFF hns dioFD je ommene pr inlure les iliothques dont j9uri esoin insi que mon dioFhF e prioriD omme souventD j9uri esoin de stdio et stdli iiF in plus de elD je vis tre men pioher un nomre u hsrd dns le dioD je vis don inlure timeFh omme on l9vit fit pour notre premier projet  lus ou woins F te vis ussi voir esoin de stringFh pour fire un strlen vers l (n de l fontion X
7

5inlude 5inlude 5inlude 5inlude

`stdioFhb `stdliFhb `timeFhb `stringFhb

5inlude 4dioFh4

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 min@AF 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
int pioherwot@hr BmotioheA { psviB dio a xvvY GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a HD numwotghoisi a HD i a HY int rterevu a HY

te d(nis quelques vriles qui me seront indispenslesF gomme pour le min@AD 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 dio dont on v se servir pour lire le (hier dioFtxtD des vriles temporires qui vont stoker les rtresD etF xotez que j9utilise ii un int pour stoker un rtre
7. Du moins, j'en ai le pressentiment.

PTP

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)

@rterevuA r l fontion fget que je vis utiliser renvoie un intF sl est don prfrle de stoker le rsultt dns un intF ssons l suite X
dio a fopen@4dioFtxt4D 4r4AY GG yn ouvre le ditionnire en leture seule GG yn vrifie si on russi ouvrir le ditionnire if @dio aa xvvA GG i on n9 e russi ouvrir le fihier { printf@4nsmpossile de hrger le ditionnire de mots4AY return HY GG yn retourne H pour indiquer que l fontion hou GG l leture du returnD l fontion s9rrte immditementF }

te n9i ps grndEhose jouter iiF t9ouvre le (hier dioFtxt en leture seule @4r4A et je vri(e si j9i russi en testnt si dio vut xvv ou nonF i dio vut xvvD 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 HF 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 min que l fontion houF hns l suite de l fontionD on suppose don que le (hier ien t ouvertF
GG yn ompte le nomre de mots dns le fihier @il suffit de ompter les entres n do { rterevu a fget@dioAY if @rterevu aa 9n9A nomrewotsCCY } while@rterevu 3a iypAY

vD on prourt tout le (hier oups de fget @rtre pr rtreAF yn ompte le nomre de n @entresA qu9on dteteF hque fois qu9on tome sur un nD on inrE mente l vrile nomrewotsF qre e out de odeD on otient dns nomrewots le nomre de mots dns le (hier F
8

numwotghoisi a nomreeletoire@nomrewotsAY 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 nomrewots @le prmtre qu9on envoie l fontionAF g9est une fontion toute simple que j9i ple ussi dns dioF @je vous l dtilleri tout l9heureAF frefD elle renvoie un nomre @orrespondnt un numro de ligne du (hierA u hsrd qu9on stoke dns numwotghoisiF
8. Rappelez-vous que le chier contient un mot par ligne.

PTQ

CHAPITRE 18. TP : RALISATION D'UN PENDU


GG yn reommene lire le fihier depuis le dutF yn s9rrte lorsqu9on est rriv u on mot rewind@dioAY while @numwotghoisi b HA { rterevu a fget@dioAY if @rterevu aa 9n9A numwotghoisiEEY }

wintennt qu9on le numro du mot qu9on veut pioherD on reprt u dut gre un ppel rewind@AF yn prourt l enore le (hier rtre pr rtre en omptnt les nF gette foisD on drmente l vrile numwotghoisiF 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 numwotghoisi b H 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 motiohe @le prmtre que l fontion reoitA gre un simple fgets qui v lire le mot X
GB ve urseur du fihier est positionn u on endroitF yn n9 plus qu9 fire un fgets qui lir l ligne BG fgets@motioheD IHHD dioAY GG yn vire le n l fin motiohestrlen@motioheA E I a 9H9Y

yn demnde u fgets de ne ps lire plus de IHH rtres @9est l tille du tleu motioheD qu9on d(ni dns le minAF 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 HF 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 motioheF yn n9 plus qu9 fermer le (hierD retourner I pour que l fontion s9rrte et pour dire que tout s9est ien pss X
flose@dioAY } return IY GG out s9est ien pssD on retourne I

s esoin de plus pour l fontion pioherwot 3 PTR

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
int nomreeletoire@int nomrewxA { srnd@time@xvvAAY return @rnd@A 7 nomrewxAY }

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 nomrewx et le renvoie F
9

Le chier dico.h
sl s9git juste des prototypes des fontionsF ous remrquerez qu9il y l  protetion 5ifndef que je vous vis demnd d9inlure dns tous vos (hiers Fh @revoyez le hpitre sur le prproesseur u esoinAF
5ifndef hiphsgy 5define hiphsgy int pioherwot@hr BmotioheAY int nomreeletoire@int nomrewxAY 5endif

gode

we X SRRHIW

Le chier dico.c
oii le (hier dioF en entier X
GB teu du endu dioF EEEEEE ges fontions piohent u hsrd un mot dns un fihier ditionnire pour le jeu du endu BG
9. Notez que j'ai fait tout a en une ligne, c'est tout fait possible, bien que peut-tre parfois moins lisible.

PTS

CHAPITRE 18. TP : RALISATION D'UN PENDU

5inlude 5inlude 5inlude 5inlude

`stdioFhb `stdliFhb `timeFhb `stringFhb

5inlude 4dioFh4 int pioherwot@hr BmotioheA { psviB dio a xvvY GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a HD numwotghoisi a HD i a HY int rterevu a HY dio a fopen@4dioFtxt4D 4r4AY GG yn ouvre le ditionnire en leture seule GG yn vrifie si on russi ouvrir le ditionnire if @dio aa xvvA GG i on n9 e russi ouvrir le fihier { printf@4nsmpossile de hrger le ditionnire de mots4AY return HY GG yn retourne H pour indiquer que l fontion hou GG l leture du returnD l fontion s9rrte immditementF } GG yn ompte le nomre de mots dns le fihier @il suffit de ompter les GG entres n do { rterevu a fget@dioAY if @rterevu aa 9n9A nomrewotsCCY } while@rterevu 3a iypAY numwotghoisi a nomreeletoire@nomrewotsAY GG yn piohe un mot u hsrd

GG yn reommene lire le fihier depuis le dutF yn s9rrte lorsqu9on est rriv u on mot rewind@dioAY while @numwotghoisi b HA { rterevu a fget@dioAY if @rterevu aa 9n9A numwotghoisiEEY } GB ve urseur du fihier est positionn u on endroitF yn n9 plus qu9 fire un fgets qui lir l ligne BG fgets@motioheD IHHD dioAY GG yn vire le n l fin motiohestrlen@motioheA E I a 9H9Y

PTT

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


flose@dioAY } return IY GG out s9est ien pssD on retourne I

int nomreeletoire@int nomrewxA { srnd@time@xvvAAY return @rnd@A 7 nomrewxAY }

gode

we X QTTQQR

Il va falloir modier le main !


wintennt que le (hier dioF est prtD on retourne dns le min@A pour l9dpter un petit peu ux quelques hngements qu9on vient de fireF hjD on ommene pr inlure dioFh si on veut pouvoir fire ppel ux fontions de dioFF he plusD on v ussi inlure stringFh r on v devoir fire un strlen X
5inlude `stringFhb 5inlude 4dioFh4

our ommenerD les d(nitions de vriles vont un peu hngerF hjD on n9initilise plus l hne moteretD on re juste un grnd tleu de hr @IHH sesAF unt u tleu lettrerouveeF 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 mllo 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 mlloF te ne dois ps oulier de lirer l mmoire ensuite qund je n9en i plus esoinD d9o l prsene d9un free@A l (n du minF yn v ussi voir esoin d9une vrile tillewot qui v stokerF F F l tille du motF in e'etD si vous regrdez le min@A 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 tous les mots 3 oii don les d(nitions de vriles du min en version (nle X
int min@int rgD hrB rgvA { hr lettre a HY GG toke l lettre propose pr l9utilisteur @retour du snfA

PTU

CHAPITRE 18. TP : RALISATION D'UN PENDU


hr moteretIHH a {H}Y GG ge ser le mot trouver int Blettrerouvee a xvvY GG n tleu de oolensF ghque se orrespond une lettre du mot seretF H a lettre non trouveD I a lettre trouve int oupsestnts a IHY GG gompteur de oups restnts @H a mortA int i a HY GG ne petite vrile pour prourir les tleux int tillewot a HY

g9est priniplement le dut du min qui v hngerD don nlysonsEle de plus prs X
if @3pioherwot@moteretAA exit@HAY

yn fit d9ord ppel pioherwot diretement dns le ifF pioherwot v pler dns moteret le mot qu9elle ur piohF he plusD pioherwot 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 3 permet d9exprimer l ngtionAD lors on rrte tout @exit@HAAF
tillewot a strlen@moteretAY

yn stoke l tille du moteret dns tillewot omme je vous l9i dit tout l9heureF
lettrerouvee a mllo@tillewot B sizeof@intAAY GG yn lloue dynmiquement le tleu lettrerouvee @dont on ne onnissit ps l tille u dprtA if @lettrerouvee aa xvvA exit@HAY

wintennt on doit llouer l mmoire pour le tleu lettrerouveeF yn lui donne l tille du mot @tillewotAF yn vri(e ensuite si le pointeur n9est ps xvvF i 9est le sD 9est que l9llotion houF hns e sD on rrte immditement le progrmme @on fit ppel exit@AAF 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 minF pour rempler tous les nomres T @l9nienne longueur de weyx qu9on vit (xeA pr l vrile tillewotF r exemple X
for @i a H Y i ` tillewot Y iCCA lettrerouveei a HY

ge ode met toutes les ses du tleu lettrerouvee HD en s9rrtnt lorsqu9on prouru tillewot sesF t9i d ussi remnier le prototype de l fontion ggne pour jouter l vrile tillewotF ns elD l fontion n9urit ps su qund rrter s ouleF oii le (hier minF (nl en entier X PTV

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE)


GB teu du endu minF EEEEEE pontions priniples de gestion du jeu BG 5inlude 5inlude 5inlude 5inlude `stdioFhb `stdliFhb `typeFhb `stringFhb

5inlude 4dioFh4 int ggne@int lettrerouveeD long tillewotAY int reherhevettre@hr lettreD hr moteretD int lettrerouveeAY hr liregrtere@AY int min@int rgD hrB rgvA { hr lettre a HY GG toke l lettre propose pr l9utilisteur @retour du snfA hr moteretIHH a {H}Y GG ge ser le mot trouver int Blettrerouvee a xvvY GG n tleu de oolensF ghque se orrespond une lettre du mot seretF H a lettre non trouveD I a lettre trouve long oupsestnts a IHY GG gompteur de oups restnts @H a mortA long i a HY GG ne petite vrile pour prourir les tleux long tillewot a HY printf@4fienvenue dns le endu 3nn4AY if @3pioherwot@moteretAA exit@HAY tillewot a strlen@moteretAY

lettrerouvee a mllo@tillewot B sizeof@intAAY GG yn lloue dynmiquement le tleu lettrerouvee @dont on ne onnissit ps l tille u dprtA if @lettrerouvee aa xvvA exit@HAY for @i a H Y i ` tillewot Y iCCA lettrerouveei a HY GB yn ontinue jouer tnt qu9il reste u moins un oup jouer ou qu9on n9 ps ggn BG while @oupsestnts b H 88 3ggne@lettrerouveeD tillewotAA {

PTW

CHAPITRE 18. TP : RALISATION D'UN PENDU


printf@4nnsl vous reste 7ld oups jouer4D oupsestntsAY printf@4nuel est le mot seret c 4AY GB yn ffihe le mot seret en msqunt les lettres non trouves ixemple X BeBByx BG for @i a H Y i ` tillewot Y iCCA { if @lettrerouveeiA GG i on trouv l lettre n i printf@474D moteretiAY GG yn l9ffihe else printf@4B4AY GG inonD on ffihe une toile pour les lettres non trouves } printf@4nroposez une lettre X 4AY lettre a liregrtere@AY GG i e n9tit e l onne lettre if @3reherhevettre@lettreD moteretD lettrerouveeAA { oupsestntsEEY GG yn enlve un oup u joueur }

if @ggne@lettrerouveeD tillewotAA printf@4nnqgne 3 ve mot seret etit ien X 7s4D moteretAY else printf@4nnerdu 3 ve mot seret etit X 7s4D moteretAY

free@lettrerouveeAY GG yn lire l mmoire lloue mnuellement @pr mlloA return HY

hr liregrtere@A { hr rtere a HY rtere a gethr@AY GG yn lit le premier rtre rtere a toupper@rtereAY GG yn met l lettre en mjusule si elle ne l9est ps dj GG yn lit les utres rtres mmoriss un un jusqu9u n while @gethr@A 3a 9n9A Y } return rtereY GG yn retourne le premier rtre qu9on lu

int ggne@int lettrerouveeD long tillewotA

PUH

IDES D'AMLIORATION
{

long i a HY int joueurqgne a IY for @i a H Y i ` tillewot Y iCCA { if @lettrerouveei aa HA joueurqgne a HY }

return joueurqgneY

int reherhevettre@hr lettreD hr moteretD int lettrerouveeA { long i a HY int onnevettre a HY GG yn prourt moteret pour vrifier si l lettre propose y est for @i a H Y motereti 3a 9H9 Y iCCA { if @lettre aa moteretiA GG i l lettre y est { onnevettre a IY GG yn mmorise que 9tit une onne lettre lettrerouveei a IY GG yn met I l se du tleu de oolens orrespondnt l lettre tuelle } } } return onnevettreY

gode

we X IHSSSH

Ides d'amlioration
Tlcharger le projet
our ommenerD je vous invite tlhrger le projet omplet du enduF gode we X SVUSRS i vous tes sous vinux ou sous wD supprimez le (hier dioFtxt 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 PUI

CHAPITRE 18. TP : RALISATION D'UN PENDU

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 F et Fh insi que le (hier Fp 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 F et Fh que vous trouverez dns le FzipF ous trouverez ussi l9exutle @Fexe indowsA insi qu9un ditionnire @dioFtxtAF

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 min pour lancer une nouvelle partie si le joueur le dsireF ! 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 !

PUP

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 snf, 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 snf et de vous montrer une alternative plus sre avec la fonction fgets.

PUQ

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

Les limites de la fonction scanf


v fontion snf@AD 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 snf 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
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { hr nomPH a {H}Y printf@4uel est votre nom c 4AY snf@47s4D nomAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY } return HY

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 snf 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
En fait, le mot 4hupont4 se trouve toujours en mmoire, dans ce qu'on appelle le buer . La prochaine fois qu'on appellera snf, la fonction lira toute seule le mot  Dupont  qui tait rest en attente dans la mmoire.

PUR

LES LIMITES DE LA FONCTION SCANF

yn peut utiliser l fontion snf de telle sorte qu9elle lise les espesD mis 9est ssez ompliquF i vous voulez pprendre ien vous servir de snfD on peut trouver des ours trs dtills sur le we F gode we X RVTRRH
1

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
hr nomS a {H}Y

ous voyez que j9i llou S ses pour mon tleu de hr ppel nomF gel signi(e qu9il y l ple d9rire R rtresD le dernier tnt toujours rserv u rtre de (n de hne HF evoyez solument le ours sur les hnes de rtres @pge ITWA 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 snf c ille ontinu rire l suite en mmoire omme si de rien n9tit 3 ille rit dns des zones mmoire qui n9tient ps prvues pour elF ves rtres en trop ont  rs d9utres informtions en mmoireF g9est e qu9on ppelle un buer overow @(gF IWFQAF
1. Attention, c'est assez dicile.

PUS

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

Figure IWFP ! hpssement dns l mmoire

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

Rcuprer une chane de caractres


sl existe plusieurs fontions stndrds en g qui permettent de ruprer une hne de texteF rormis l fontion snf @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
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.

PUT

RCUPRER UNE CHANE DE CARACTRES

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 snfF
fgets

La fonction fgets
ve prototype de l fontion fgetsD situ dns stdioFhD est le suivnt X
hr Bfgets@ hr BstrD int numD psvi Bstrem AY

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 hrD fgets lir W rtres u mximum @il rserve toujours un rtre d9espe pour pouvoir rire le H de (n de hneAF ! strem 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 xvv s9il y eu une erreurF sl su0t don de tester si l fontion renvoy xvv pour svoir s9il y eu une erreurF estons 3
5inlude `stdioFhb 5inlude `stdliFhb int min@int rgD hr BrgvA { hr nomIHY printf@4uel est votre nom c 4AY fgets@nomD IHD stdinAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY } return HY

gode

we X UTWWVU PUU

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


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 strhr que vous devriez dj onntreF i un n est trouvD elle le remple pr un H @(n de hneA pour viter de onserver une  intre F oii le odeD omment ps ps X
5inlude `stdioFhb 5inlude `stdliFhb 5inlude `stringFhb GG enser inlure stringFh pour strhr@A int lire@hr BhineD int longueurA { hr Bpositionintree a xvvY GG yn lit le texte sisi u lvier if @fgets@hineD longueurD stdinA 3a xvvA GG s d9erreur de sisie c { positionintree a strhr@hineD 9n9AY GG yn reherhe l94intre4 if @positionintree 3a xvvA GG i on trouv le retour l ligne { Bpositionintree a 9H9Y GG yn remple e rtre pr H } return IY GG yn renvoie I si l fontion s9est droule sns erreur } else {

PUV

RCUPRER UNE CHANE DE CARACTRES


return HY GG yn renvoie H s9il y eu une erreur

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 xvv 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 strhr et rempler et n pr un H @(gF IWFRAF

gode

Figure IWFR ! emplement du sut de ligne

ge shm montre que l hne rite pr fgets tit  wteonH F xous vons rempl le n pr un HD e qui donn u (nl X  wteoHH F ge n9est ps grve d9voir deux H d90leF v9ordinteur s9rrte u premier H qu9il renontre et onsidre que l hne de rtres s9rrte lF ve rsultt c ih ien mrheF
int min@int rgD hr BrgvA { hr nomIHY printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY } return HY

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 PUW

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


uel est votre nom c ten idourd elert Ier 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 hr @il ne fut ps oulier le rtre de (n de hne H 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

Figure IWFS ! veture du u'er du lvier

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 hineAF 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 PVH

RCUPRER UNE CHANE DE CARACTRES

euoup de rtresD et que l fontion fgets ne peut opier qu9une prtie d9entre eux @pre que vous vez llou un tleu de IH hr 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
int min@int rgD hr BrgvA { hr nomIHY printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY } return HY

uel est votre nom c ten idourd elert Ier 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

Figure IWFT ! veture du u'er du lvier ve dordement

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 PVI

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


int min@int rgD hr BrgvA { hr nomIHY printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY lire@nomD IHAY printf@4eh 3 ous vous ppelez don 7s 3nn4D nomAY } return HY

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 Ier 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 viderfuffer pour fire en sorte que le u'er soit vid si on rentr trop de rtres X
void viderfuffer@A { int a HY while @ 3a 9n9 88 3a iypA { a gethr@AY } } int lire@hr BhineD int longueurA { hr Bpositionintree a xvvY if @fgets@hineD longueurD stdinA 3a xvvA { positionintree a strhr@hineD 9n9AY if @positionintree 3a xvvA { Bpositionintree a 9H9Y }

PVP

CONVERTIR LA CHANE EN NOMBRE


else { viderfuffer@AY } return IY

} else { viderfuffer@AY return HY }

we X RTVWTU v fontion lire ppelle viderfuffer 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 viderfuffer est ourte mis denseF ille lit dns le u'er rtre pr rtre gre gethrF gette fontion renvoie un int F yn se ontente de ruprer e int dns l vrile temporire F yn oule tnt qu9on n9 ps rupr le rtre n ou le symole iyp @(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

gode

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


3. Et non un char, allez savoir pourquoi, peu importe.

PVQ

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE


long strtol@ onst hr BstrtD hr BBendD int se AY

v fontion lit l hne de rtres que vous lui envoyez @strtA et essie de l onvertir en long en utilisnt l se 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 xvv 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
long iY i a strtol@ 4IRV4D xvvD IH AY GG i a IRV i a strtol@ 4IRVFPIS4D xvvD IH AY GG i a IRV i a strtol@ 4 IRVFPIS4D xvvD IH AY GG i a IRV i a strtol@ 4 IRVCQR4D xvvD IH AY GG i a IRV i a strtol@ 4 IRV feuilles mortes4D xvvD IH AY GG i a IRV i a strtol@ 4 sl y IRV feuilles mortes4D xvvD IH AY GG i a H @erreur X l hne ne ommene ps pr un nomreA

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 @FD CD 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 lirevong qui v ppeler notre premire fontion lire @qui lit du texteA et ensuite onvertir le texte sisi en nomre X
long lirevong@A { hr nomreexteIHH a {H}Y GG IHH ses devrient suffire if @lire@nomreexteD IHHAA { GG i leture du texte okD onvertir le nomre en long et le retourner return strtol@nomreexteD xvvD IHAY } else { GG i prolme de letureD renvoyer H return HY }

gode

we X PPHVHW

PVR

CONVERTIR LA CHANE EN NOMBRE

ous pouvez tester dns un min trs simple X


int min@int rgD hr BrgvA { long ge a HY printf@4uel est votre ge c 4AY ge a lirevong@AY printf@4eh 3 ous vez don 7d ns 3nn4D geAY } return HY

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 doule X
doule strtod@ onst hr BstrtD hr BBend AY

ous noterez que le troisime prmtre se 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 lirehouleF ous ne devriez voir uun ml le fireD 9est extement omme lirevong prt que ette foisD on ppelle strtod et on retourne un douleF ous devriez lors pouvoir fire ei dns l onsole X
4

gomien pesezEvous c TUFR eh 3 ous pesez don TUFRHHHHH kg 3

issyez ensuite de modi(er votre fontion lirehoule 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 strhrAD puis envoyez l hne modi(e strtodF

En rsum
! v fontion snfD ien qu9en pprene simple d9utilistionD est en fit trs omplexe et nous oppose ertines limitesF yn ne peut psD pr exempleD rire plusieurs mots
4. a se voit que a a t cod par des Anglais.

PVS

CHAPITRE 19. LA SAISIE DE TEXTE SCURISE

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

PVT

Troisime partie
Cration de jeux 2D en SDL

PVU

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.

PVW

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 @stdliFhD stdioFhD stringFhD timeFhF 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 !

PWH

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.

PWI

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

PWP

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 PWQ

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 @wwwFlisdlForgA 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 gode we X RVHUPR ur le site de l hvD rendezEvous dns le menu guheD setion hownlodF 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 :indowsF ! Development libraries X e sont les (hiers F @ou Fli sous isulA et Fh 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 Fli 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 FAF v prtiulritD 9est que les  hevelopment lirries ontiennent tout e qu9il fut X les Fh et F @ou FliA ien srD mis ussi l hvFdll distriuer ve votre pplition insi que l doumenttion de l hv 3 frefD tout e que vous vez fire u (nl est
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.

PWR

CRER UN PROJET SDL

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 houmenttion G hownlodleF te vous reommnde de pler les (hiers rwv de l doumenttion dns un dossier spil @intitul pr exemple ho hvA et de fire un rouri vers le sommire indexFhtmlF ve ut est que vous puissiez der rpidement 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 uivnt E uivnt E uivnt E erminerF 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 in fitD le mot  instller n9est peutEtre ps elui qui onvient le mieuxF xous n9llons PWS

CHAPITRE 20. INSTALLATION DE LA SDL

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 Fzip pour isul et un FtrFgz pour mingwQP @il vous fudr un logiiel omme inrr ou UEip pour dompresser le FtrFgzAF ve (hier ompress ontient plusieurs sousEdossiersF geux qui nous intressent sont les suivnts X ! in X ontient l Fdll de l hv Y ! dos X ontient l doumenttion de l hv Y ! inlude X ontient les Fh Y ! li X ontient les F @ou Fli 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 hv @(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 inludeGhv F ous devriez y voir de nomreux petits (hiers FhF gopiezEles dns le dossier prentD 9estEEdire dns X
9

g:rogrm pilesgodeflokshvEIFPFIQ

v hv est instlle 3 sl fut mintennt on(gurer gode: :floksF


2/ Cration du projet SDL

g:rogrm pilesgodeflokshvEIFPFIQinlude

yuvrez mintennt gode: :floks et demndez rer un nouveu projetF eu lieu de rer un projet gonsole epplition omme vous viez l9hitude de fireD vous llez demnder rer un projet de type hv projetF v premire fentre de l9ssistnt qui pprt ne sert rienD liquez sur xextF yn vous
9. Dans mon cas, il se trouve dans C:\Program Files\CodeBlocks\SDL-1.2.13\include\SDL.

PWT

CRER UN PROJET SDL

Figure PHFQ ! ve dossier de l hv dzipp

demnde ensuite le nom de votre projet et le dossier dns lequel il doit tre plD omme vous l9vez toujours fit @(gF PHFRAF

Figure PHFR ! essistnt hv et nom de projet

PWU

CHAPITRE 20. INSTALLATION DE LA SDL

ient ensuite l prtie o vous devez indiquer o se trouve instlle l hv @(gF PHFSAF

Figure PHFS ! essistnt hv et on(gurtion

gliquez sur le outon FFF droiteF ne nouvelle fentre un peu omplexe s9ouvre @(gF PHFTAF

Figure PHFT ! volistion de l hv

ous devez simplement remplir le hmp nomm seF sndiquez le dossier o vous vez PWV

CRER UN PROJET SDL

dompress l hvF hns mon sD 9est X


g:rogrm pilesgodeflokshvEIFPFIQ

gliquez sur gloseF ne nouvelle fentre pprtF g9est une fentreEpige @dont je n9i toujours ps sisi l9intrtAF ille vous demnde un dossierF gliquez sur ennuler pour ne rien fireF gliquez ensuite sur xext dns l9ssistntD puis hoisissez de ompiler en mode elese ou heug @peu importeA et en(nD hoisissez pinishF gode: :floks v rer un petit projet hv de test omprennt un minF et un (hier FmpF 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

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 hvFdll dans le dossier de votre projet ! Il faudra penser fournir cette Fdll en plus de votre Fexe vos amis si vous voulez qu'ils puissent eux aussi excuter le programme. En revanche, vous n'avez pas besoin de leur joindre les Fh et F qui n'intressent que vous.

ous pouvez supprimer le Fmp du progrmmeD on n9en ur ps esoinF unt u (hier minFD il est un peu longD on ne v ps dmrrer ve F upprimez tout son ontenu et remplezEle pr X
5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb int min@int rgD hr BrgvA { } return HY

we X SUVWQH g9est en fit un ode de se trs similire eux que l9on onnt @un inlude de stdliD un utre de stdioD un minF F FAF v seule hose qui hngeD 9est le inlude d9un (hier hvFhF g9est le (hier Fh de se de l hv qui se hrger d9inlure tous les utres (hiers Fh de l hvF
10. Vous devriez l'avoir copie dans C:\Program Files\CodeBlocks\SDL-1.2.13\bin\SDL.dll.

gode

PWW

CHAPITRE 20. INSTALLATION DE LA SDL

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 dosAD les Fh @dossier inludeAD et les Fli @dossier liA qui sont l9quivlent des F pour le ompilteur de isulF ous trouverez ussi le (hier hvFdll dns e dossier liF ! gopiez hvFdll dns le dossier de votre projetF ! gopiez les Fli dns le dossier li de isul gCCF r exemple hez moi il s9git du dossier X g:rogrm pileswirosoft isul tudio VgliF ! gopiez les Fh dns le dossier inludes de isul gCCF grez un dossier hv dns e dossier inludes pour regrouper les Fh de l hv entre euxF ghez moiD je mets don les Fh dns X g:rogrm pileswirosoft isul tudio VginludehvF
2/ Cration d'un nouveau projet SDL

ous isul gCCD rez un nouveu projet de type epplition onsole inQPF eppelez votre projet testsdl pr exempleF gliquez sur yuF n ssistnt v s9ouvrirF ellez dns rmtres de l9pplition et vri(ez que rojet vide est oh @(gF PHFUAF

Figure PHFU ! gohez rojet

vide

ve projet est lors rF sl est videF ejoutezEy un nouveu (hier en fisnt un li droit QHH

CRER UN PROJET SDL

sur pihiers

souresD ejouter

G xouvel

lment

@(gF PHFVAF

Figure PHFV ! ejout d9un nouveu (hier

hns l fentre qui s9ouvreD demndez rer un nouveu (hier de type pihier gCC @FppA que vous ppellerez minFF in utilisnt l9extension F dns le nom du (hierD isul rer un (hier F et non un (hier FppF 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 rojet G roprits de testsdlF ! hns l setion g G gCC ab qnrtion de odeD mettez le hmp filiothque runtime hvv multithred @GwhAF ! hns l setion gGgCC ab evnD sletionnez gompiltion sous et optez pour l vleur gompiler omme ode g @GgA @sinon isul vous ompiler votre projet omme tnt du gCCAF ! hns l setion diteur de liens ab intreD modi(ez l vleur de hpendnes supplmentires pour y jouter hvFli hvminFliF ! hns l setion diteur de liens ab ystmeD modi(ez l vleur de ousEsystme et mettezEl indows @(gF PHFWAF lidez ensuite vos modi(tions en liqunt sur yu et enregistrez le toutF ous pouvez mintennt ompiler en llnt dns le menu qnrer G qnrer l solutionF endezEvous dns le dossier de votre projet pour y trouver votre exutle @il ser peutEtre dns un sousEdossier heugAF x9ouliez ps que le (hier hvFdll doit se trouver dns le mme dossier que l9exutleF houleEliquez sur votre Fexe X si tout v ienD il ne devrit rien se psserF inonD s9il y une erreur 9est prolement que le (hier hvFdll ne se trouve ps dns le mme dossierF QHI

CHAPITRE 20. INSTALLATION DE LA SDL

Figure PHFW ! gon(gurtion de isul pour l hv

Cration d'un projet SDL avec Xcode (Mac OS X)


gette setion t l9origine rdige pr guimersV du ite du roD que je remerie nouveu u pssgeF gommenez pr tlhrger l version de l hv sur le site o0ielF ve (hier doit voir l9extension FdmgF wontez @hrgezA e (hier FdmgD prenez le dossier Ffrmework @pr exemple X hvFfrmeworkA et plezEle dns le dossier X
`ine hisquebGfiliothqueGprmeworks

n dossier Ffrmework est un dossier ontennt tous les (hiers nessiresD omme les inires de l hv et les heders @(gF PHFIHAF

Figure PHFIH ! ves frmeworks dns leur dossier

ellez dns l9rhive de l hv @hvEIFPFIIFdmgAD puis dns le dossier develElite et QHP

CRER UN PROJET SDL

prenez les (hiers hvwinFm et hvwinFhF lezEles en lieu srF sl v flloir ruprer un (hier supplmentireD mintennt X hvEIFPFIPEextrsFdmg que vous trouverez sur le site de l hvF sl est ompos de deux dossiers X ! empltesporrojetfuilder ! empltesporode gopiezEles dns X
wintosh rhGheveloperGvirryGodeGrojet empltesG

v9ssistnt de rtion de nouveu projet de gode vous proposer lors de rer une hv epplition @(gF PHFIIAF

Figure PHFII ! gode propose de rer un projet hv

it voilD votre projet est r 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 gode we X TIWSPS v seule hose un peu prtiulireD 9est l9jout de l iliothque hv pour le linker @vhpveqAF 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 inludeGhv et liA insuiteD vous pourrez utiliser les ommndes suivntes dns l onsole X QHQ

CHAPITRE 20. INSTALLATION DE LA SDL


mke 5our ompiler le projet mke len 5our effer les fihiers de ompiltion @Fo inutilesA mke mrproper 5our 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

QHR

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 !

QHS

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 mllo @ils sont trs utiles ii 3AF yrD omme vous le svezD qui dit mllo 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 ! hvsnit X hrge l hv en mmoire @des mllo y sont fitsA Y ! hvuit 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 hvsnitD et l dernire un ppel hvuitF
1

SDL_Init

: chargement de la SDL

v fontion hvsnit 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
hvsnit@hvsxsshiyAY

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 hvsnit 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 hvsnit regrder le nomre qu9elle reoit et en fontion de elD elle sur quels systmes elle doit hrgerF
1. Imaginez que vous fassiez une boucle innie de malloc sans le faire exprs : en quelques secondes, vous saturerez toute votre mmoire !

QHT

CHARGER ET ARRTER LA SDL

Constante

ghrge le systme d90hge @vidoAF g9est l prtie que nous hrgerons le plus souventF hvsxsehsy ghrge le systme de sonF ous permettr don pr exemple de jouer de l musiqueF hvsxsghyw ghrge le systme de ghEywF ous permettr de mniE puler votre leteur de ghEyw hvsxstysgu ghrge le systme de gestion du joystikF hvsxsswi ghrge le systme de timerF gel vous permet de grer le temps dns votre progrmme @trs prtiqueAF hvsxsiirsxq ghrge tous les systmes lists iEdessus l foisF Table PIFI ! viste des onstntes de hrgement de l hv
hvsxsshiy

Description

wintenntD si vous fites X


hvsnit@hvsxsiirsxqAY

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 hvsxsiirsxq ?

ous n9llez ps utiliser hvsxsiirsxq juste pre que vous vez esoin de deux modulesD puvres fous 3 reureusementD on peut ominer les options l9ide du symole | @l rre vertileAF
GG ghrgement de l vido et de l9udio hvsnit@hvsxsshiy | hvsxsehsyAY

ous pouvez ussi en ominer trois sns prolme X


GG ghrgement de l vidoD de l9udio et du timer hvsnit@hvsxsshiy | hvsxsehsy | hvsxsswiAY

Ces  options  que l'on envoie hvsnit 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.

QHU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

SDL_Quit

: arrt de la SDL

v fontion hvuit est trs simple utiliser vu qu9elle ne prend ps de prmtre X


hvuit@AY

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
5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb int min@int rgD hr BrgvA { hvsnit@hvsxsshiyAY GG hmrrge de l hv @ii X hrgement du systme vidoA GB v hv est hrgeF ous pouvez mettre ii le ontenu de votre progrmme BG hvuit@AY GG errt de l hv @lirtion de l mmoireAF } return HY

we X QSUHWT fien entenduD uun progrmme  srieux ne tiendr dns le minF ge que je fis l est shmtiqueF hns l rlitD votre min 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

gode

Grer les erreurs


v fontion hvsnit renvoie une vleur X ! EI en s d9erreur Y ! H si tout s9est ien pssF QHV

CHARGER ET ARRTER LA SDL

ous n9y tes ps oligsD mis vous pouvez vri(er l vleur retourne pr hvsnitF peut tre un on moyen de triter les erreurs de votre progrmme et don de vous ider les rsoudreF
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 floseF 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 stdioFh 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 floseF ous pouvez don fire un fprintf sur stderr sns utiliser fopen ou flose X
2

5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb int min@int rgD hr BrgvA { if @hvsnit@hvsxsshiyA aa EIA GG hmrrge de l hvF i erreur X { fprintf@stderrD 4irreur d9initilistion de l hv X 7sn4D hvqetirror@AAY GG riture de l9erreur exit@ispesviAY GG yn quitte le progrmme } hvuit@AY } return isggiY

we X UIPTWH uoi de neuf dns e ode c


2. Gnralement sous Windows, ce sera un chier stderr.txt tandis que sous Linux, l'erreur apparatra le plus souvent dans la console.

gode

QHW

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

! yn rit dns stderr notre erreurF ve 7s permet de lisser l hv indiquer les dtils de l9erreur X l fontion hvqetirror@A renvoie en e'et l dernire erreur de l hvF ! yn quitte en utilisnt exit@AF tusqueElD rien de nouveuF outefoisD vous urez remrqu que j9utilise une onstnte @ispesviA pour indiquer l vleur que renvoie le progrmmeF he plusD l (n j9utilise isggi u lieu de HF u9estEe 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 stdliFh nous fournit deux onstntes @des defineA X ! ispesvi X vleur renvoyer en s d9he du progrmme Y ! isggi 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 stdliFh 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 min qui ressemle ei X
int min@int rgD hr BrgvA { if @hvsnit@hvsxsshiyA aa EIA { fprintf@stderrD 4irreur d9initilistion de l hv4AY exit@ispesviAY } hvuit@AY } return isggiY

gel devrit tre le s si vous vez ien suivi le dut du hpitreF our le moment donD on initilise juste l vido @hvsxsshiyAD 9est tout e qui nous intresseF
3. Pour peu que vous programmiez correctement en utilisant les outils fournis, comme ici.

QIH

OUVERTURE D'UNE FENTRE

Choix du mode vido


v premire hose fire prs hvsnit@AD 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 hvetideowode@A 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 hvsnit on doit utiliser des )gs pour d(nir des optionsF oii les prinipux )gs que vous pouvez utiliser @et ominer ve le symole |AF ! hvrpegi 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 @hvpegiAF ! hvpegi 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 ! hvisefvi X l fentre ser redimensionnleF r dfut elle ne l9est psF ! hvxypewi X l fentre n9ur ps de rre de titre ni de ordureF ! hvpvvgiix 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 ! hvhyfvifp 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

hvetideowode@TRHD RVHD QPD hvrpegiAY

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.

QII

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

eutre exempleD si je fis X


hvetideowode@RHHD QHHD QPD hvrpegi | hvisefvi | hvhyfvifpAY

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

5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb int min@int rgD hr BrgvA { hvsnit@hvsxsshiyAY hvetideowode@TRHD RVHD QPD hvrpegiAY hvuit@AY } return isggiY

we X IWRHRW estezF ue se psseEtEil c v fentre pprt et disprt l vitesse de l lumireF in e'etD l fontion hvetideowode est immditement suivie de hvuitD don tout s9rrte immditementF

gode

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.

QIP

OUVERTURE D'UNE FENTRE


int min@int rgD hr BrgvA { hvsnit@hvsxsshiyAY hvetideowode@TRHD RVHD QPD hvrpegiAY while@IAY hvuit@AY } return isggiY

ous reonnissez le while@IAY 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 puse@A X
void puse@A { int ontinuer a IY hvivent eventY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY } }

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
5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb

gode

QIQ

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

void puse@AY int min@int rgD hr BrgvA { hvsnit@hvsxsshiyAY GG snitilistion de l hv hvetideowode@TRHD RVHD QPD hvrpegiAY GG yuverture de l fentre puse@AY GG wise en puse du progrmme hvuit@AY GG errt de l hv } return isggiY GG permeture du progrmme

void puse@A { int ontinuer a IY hvivent eventY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY } }

we X WIVTUI ous remrquerez que j9i mis le prototype de m fontion puse@A en hut pour tout vous prsenter sur un seul (hierF te fis ppel l fontion puse@A 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 redimensionnement 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 QIR

gode

OUVERTURE D'UNE FENTRE

Figure PIFI ! ne fentre vide en TRH x RVH


Attention au mode plein cran (hvpvvgiix) et au mode sans bordure (hvxypewi). 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 gv C ev C . 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 gv C ev C .

Changer le titre de la fentre


our le momentD notre fentre un titre pr dfut X @hvpp sur l (gF PIFIAF ue diriezEvous de hnger el c g9est extrmement simpleD il su0t d9utiliser l fontion hvwetgptionF 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 xvv 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 min que tout l9heure ve l fontion hvwetgption en plus X
7

7. ma connaissance, cela donne un rsultat sous Gnome sous Linux.

QIS

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


int min@int rgD hr BrgvA { hvsnit@hvsxsshiyAY hvetideowode@TRHD RVHD QPD hvrpegiAY hvwetgption@4w super fentre hv 34D xvvAY puse@AY hvuit@AY } return isggiY

gode

we X IPISUP
Vous aurez remarqu que j'ai mis xvv 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 xvv 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

QIT

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 ern @ou sreen 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 hvurfeF 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
hvurfe Bern a xvvY

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 hvetideowode 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 ern X
ern a hvetideowode@TRHD RVHD QPD hvrpegiAY

xotre pointeur peut mintennt vloir X ! xvv X ern vut xvv si l hvetideowode 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 QIU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

! une utre vleur X si l vleur est di'rente de xvvD 9est que l hv pu llouer l surfe en mmoireD don que tout est on 3 sl serit ien ii de grer les erreursD omme on ppris le fire tout l9heure pour l9initilistion de l hvF oii don notre min ve l gestion de l9erreur pour hvetideowode X
int min@int rgD hr BrgvA { hvurfe Bern a xvvY GG ve pointeur qui v stoker l surfe de l9rn hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY GG yn tente d9ouvrir une fentre if @ern aa xvvA GG i l9ouverture houD on le note et on rrte { fprintf@stderrD 4smpossile de hrger le mode vido X 7sn4D hvqetirror@AAY exit@ispesviAY }

hvwetgption@4w super fentre hv 34D xvvAY puse@AY hvuit@AY } return isggiY

we X UVVIQR ve messge que nous lisser hvqetirror@A 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 stderrFtxt 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 !).

gode

Colorer une surface


sl n9y ps QT fons de remplir une surfeF F F in fitD il y en deux X QIV

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 hvpillet @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 ernA Y ! l prtie de l surfe qui doit tre remplieF i vous voulez remplir toute l surfe @et 9est e qu9on veut fireAD envoyez xvv Y ! l ouleur utiliser pour remplir l surfeF in rsum X
hvpillet@surfeD xvvD ouleurAY

La gestion des couleurs en SDL

in hvD une ouleur est stoke dns un nomre de type intQPF


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 ! intQP X un entier de longueur QP its @soit R otets A Y ! intIT X un entier od sur IT its @P otetsA Y ! intV 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 hvtypesFh 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 intQP est un type qui stoke un entierD omme un intF
8

8. Je rappelle que 1 octet = 8 bits.

QIW

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 hvwpqfF ille prend qutre prmtres X ! le formt des ouleursF ge formt dpend du nomre de its G pixel que vous vez demnd ve hvetideowodeF ous pouvez le ruprerD il est stok dns l sousEvrile ernEbformt 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
hvwpqf@ernEbformtD PSSD HD HA

F F F on re une ouleur rougeF sl n9y ps de vert ni de leuF eutre exempleD si on rit X


hvwpqf@ernEbformtD HD HD PSSA

F F F ette foisD 9est une ouleur leueF


hvwpqf@ernEbformtD PSSD PSSD PSSA

F F F lD il s9git d9une ouleur lnhe @toutes les ouleurs s9dditionnentAF i vous voulez du noirD il fut don rire HD HD HF
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 intF ellez dns le menu gouleurs G wodifier les ouleursF gliquez sur le outon hfinir les ouleurs personnlisesF 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
9. Bien entendu, cette dernire couleur n'existe pas.

QPH

MANIPULATION DES SURFACES

Figure PIFQ ! letion d9une ouleur et de ses omposntes


Coloration de l'cran

v fontion hvwpqf renvoie un intQP qui orrespond l ouleur demndeF yn peut don rer une vrile leuert qui ontiendr le ode de l ouleur leuEvert X
intQP leuert a hvwpqf@ernEbformtD IUD PHTD IIPAY

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 hvwpqf hvpilletF i on veut remplir notre rn de leuEvertD on peut don rire X
hvpillet@ernD xvvD hvwpqf@ernEbformtD IUD PHTD IIPAAY

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 hvpillet 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 hvplipD dont nous reprlerons plus longuement plus loin dns le oursF gette fontion prend un prmtre X l9rnF
hvplip@ernAY GB wise jour de l9rn BG

QPI

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

On rsume !

oii une fontion min@A qui re une fentre ve un fond leuEvert X


int min@int rgD hr BrgvA { hvurfe Bern a xvvY hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY hvwetgption@4w super fentre hv 34D xvvAY GG golortion de l surfe ern en leuEvert hvpillet@ernD xvvD hvwpqf@ernEbformtD IUD PHTD IIPAAY hvplip@ernAY GB wise jour de l9rn ve s nouvelle ouleur BG puse@AY hvuit@AY } return isggiY

we X PTTVRI ve rsultt est prsent sur l (gF PIFRF

gode

Figure PIFR ! v fentre est remplie d9un fond leuEvert

QPP

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 hvurfe pour ette nouvelle surfe X
hvurfe Bretngle a xvvY

xous devons ensuite demnder l hv de nous llouer de l9espe en mmoire pour ette nouvelle surfeF our l9rnD nous vons utilis hvetideowodeF 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 hvgreteqfurfeF 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 ! hvrpegi 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 ! hvpegi 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

retngle a hvgreteqfurfe@hvrpegiD PPHD IVHD QPD HD 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 hvpreeurfe@AD utiliser juste vnt hvuit@A X
10. Quoique, avec les cartes 3D qu'on sort de nos jours, il y a de quoi se poser des questions. . .

QPQ

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


hvpreeurfe@retngleAY hvuit@AY

La surface ern n'a pas besoin d'tre libre avec cela est fait automatiquement lors de hvuit@A.

hvpreeurfe@A,

yn peut mintennt olorer notre nouvelle surfe en l remplissnt pr exemple de ln X


hvpillet@retngleD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY

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 ernF 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 hvfliturfeF gette fontion ttend X ! l surfe oller @iiD e ser retngleA 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 xvv Y ! l surfe sur lquelle on doit ollerD 9estEEdire ern 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 hvetF 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
hvet positionY positionFx a HY positionFy a HY

QPR

MANIPULATION DES SURFACES

Figure PIFS ! goordonnes sur l fentre

wintennt qu9on notre vrile positionD on peut litter notre retngle sur l9rn X
hvfliturfe@retngleD xvvD ernD 8positionAY

emrquez le symole 8D 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


int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bretngle a xvvY hvet positionY hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY GG ellotion de l surfe retngle a hvgreteqfurfe@hvrpegiD PPHD IVHD QPD HD HD HD HAY hvwetgption@4w super fentre hv 34D xvvAY hvpillet@ernD xvvD hvwpqf@ernEbformtD IUD PHTD IIPAAY positionFx a HY GG ves oordonnes de l surfe seront @HD HA positionFy a HY GG emplissge de l surfe ve du ln

QPS

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


hvpillet@retngleD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY hvfliturfe@retngleD xvvD ernD 8positionAY GG gollge de l surfe sur l9rn hvplip@ernAY GG wise jour de l9rn puse@AY hvpreeurfe@retngleAY GG virtion de l surfe hvuit@AY } return isggiY

we X TVUPTS it voil le trvil @(gF PIFTA 3

gode

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 seondesD 9est mathmatique F
11

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.

QPT

EXERCICE : CRER UN DGRAD


positionFx a @TRH G PA E @PPH G PAY positionFy a @RVH G PA E @IVH G PAY

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
@HD HD HA GG xoir @ID ID IA GG qris trs trs prohe du noir

QPU

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

Figure PIFV ! hgrd du noir u ln


@PD PD PA GG qris trs prohe du noir FFF @IPVD IPVD IPVA GG qris moyen @ SH 7A FFF @PSQD PSQD PSQA GG qris trs prohe du ln @PSRD PSRD PSRA GG qris trs trs prohe du ln @PSSD PSSD PSSA 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 hvurfeB 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 hvurfeBF yn l9initilise xvv X
hvurfe BlignesPST 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
for @i a H Y i `a PSS Y iCCA lignesi a hvgreteqfurfe@hvrpegiD TRHD ID QPD HD HD HD HAY

insuiteD on remplit et on litte hune de es surfes une pr uneF QPV

EXERCICE : CRER UN DGRAD


for @i a H Y i `a PSS Y iCCA { positionFx a HY GG ves lignes sont guhe @sisse de HA positionFy a iY GG v position vertile dpend du numro de l ligne hvpillet@lignesiD xvvD hvwpqf@ernEbformtD iD iD iAAY GG hessin hvfliturfe@lignesiD xvvD ernD 8positionAY GG gollge

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 hvfliturfeF 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

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 positionFy a QPW

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES


iYF

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
for @i a H Y i `a PSS Y iCCA GG x9ouliez ps de lirer les PST surfes hvpreeurfe@lignesiAY

Rsum du min

oii don l fontion min u omplet X


int min@int rgD hr BrgvA { hvurfe Bern a xvvD BlignesPST a {xvv}Y hvet positionY int i a HY hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD PSTD QPD hvrpegiAY for @i a H Y i `a PSS Y iCCA lignesi a hvgreteqfurfe@hvrpegiD TRHD ID QPD HD HD HD HAY hvwetgption@4won dgrd en hv 34D xvvAY hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY for @i a H Y i `a PSS Y iCCA { positionFx a HY GG ves lignes sont guhe @sisse de HA positionFy a iY GG v position vertile dpend du numro de l ligne hvpillet@lignesiD xvvD hvwpqf@ernEbformtD iD iD iAAY hvfliturfe@lignesiD xvvD ernD 8positionAY } hvplip@ernAY puse@AY for @i a H Y i `a PSS Y iCCA GG x9ouliez ps de lirer les PST surfes hvpreeurfe@lignesiAY hvuit@AY } return isggiY

gode

we X PTQWTH

QQH

EXERCICE : CRER UN DGRAD

 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 hvsnit u dut du progrmme et dhrge ve hvuit 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 hvurfeF 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 ernF ! ve remplissge d9une surfe se fit ve hvpillet et le ollge sur l9rn l9ide de hvfliturfeF ! ves ouleurs sont d(nies l9ide d9un mlnge de rougeD de vert et de leuF

QQI

CHAPITRE 21. CRATION D'UNE FENTRE ET DE SURFACES

QQP

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.

QQQ

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 FmpAF xe pniquez ps pour utntD r gre une extension de l hv @l iliothque hvsmgeAD 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 gode we X VTRIUS fien entenduD vous pouvez utiliser vos propres imgesF sl fudr en revnhe dpter l tille de votre fentre ellesEiF lez toutes les imges dns le dossier de votre projetF xous llons ommener pr
1. Je pense au JPG plus particulirement, car les PNG et GIF n'altrent pas l'image.

QQR

CHARGER UNE IMAGE BMP

trviller ve le (hier lenmontgneFmp 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 hvvodfwF ous llez voir quel point 9est simple X
murfe a hvvodfw@4imgeFmp4AY

v fontion hvvodfw remple deux fontions que vous onnissez X ! hvgreteqfurfe X elle se hrgeit d9llouer de l mmoire pour stoker une surfe de l tille demnde @quivlent u mlloA Y ! hvpillet 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
int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bimgehepond a xvvY hvet positionpondY positionpondFx a HY positionpondFy a HY hvsnit@hvsxsshiyAY ern a hvetideowode@VHHD THHD QPD hvrpegiAY hvwetgption@4ghrgement d9imges en hv4D xvvAY GB ghrgement d9une imge fitmp dns une surfe BG imgehepond a hvvodfw@4lenmontgneFmp4AY GB yn litte prEdessus l9rn BG hvfliturfe@imgehepondD xvvD ernD 8positionpondAY hvplip@ernAY puse@AY hvpreeurfe@imgehepondAY GB yn lire 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.

QQS

CHAPITRE 22. AFFICHER DES IMAGES


hvuit@AY } return isggiY

we X QIPUUS t9i don r un pointeur vers une surfe @imgehepondA insi que les oordonnes orrespondntes @positionpondAF v surfe est re en mmoire et remplie pr l fontion hvvodfwF yn l litte ensuite sur l surfe ern et 9est tout 3 edmirez le rsultt sur l (gF PPFIF

gode

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
Mais, les icnes des programmes ne sont-elles pas des Fio, normalement ?

QQT

CHARGER UNE IMAGE BMP

xonD ps forment 3 h9illeurs les Fio 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 hvwetsonF gette fontion prend deux prmtres X l surfe qui ontient l9imge 0her insi que des inforE mtions sur l trnsprene @xvv 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
hvwetson@hvvodfw@4sdlioneFmp4AD xvvAY

v9imge est hrge en mmoire pr hvvodfw et l9dresse de l surfe est direE tement envoye hvwetsonF
La fonction hvwetson doit tre appele avant que la fentre ne soit ouverte, c'est--dire qu'elle doit se trouver avant hvetideowode dans votre code source.

oii le ode soure ompletF ous noterez que j9i simplement jout le hvwetson pr rpport u ode prdent X
int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bimgehepond a xvvY hvet positionpondY positionpondFx a HY positionpondFy a HY hvsnit@hvsxsshiyAY GB ghrgement de l9ine eex hvetideowode BG hvwetson@hvvodfw@4sdlioneFmp4AD xvvAY ern a hvetideowode@VHHD THHD QPD hvrpegiAY hvwetgption@4ghrgement d9imges en hv4D xvvAY imgehepond a hvvodfw@4lenmontgneFmp4AY hvfliturfe@imgehepondD xvvD ernD 8positionpondAY

QQU

CHAPITRE 22. AFFICHER DES IMAGES


hvplip@ernAY puse@AY hvpreeurfe@imgehepondAY hvuit@AY } return isggiY

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

int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bimgehepond a xvvD Bzozor a xvvY hvet positionpondD positionozorY positionpondFx a HY positionpondFy a HY positionozorFx a SHHY positionozorFy a PTHY hvsnit@hvsxsshiyAY hvwetson@hvvodfw@4sdlioneFmp4AD xvvAY ern a hvetideowode@VHHD THHD QPD hvrpegiAY hvwetgption@4ghrgement d9imges en hv4D xvvAY imgehepond a hvvodfw@4lenmontgneFmp4AY hvfliturfe@imgehepondD xvvD ernD 8positionpondAY
3. Il s'agit de la bonne vieille mascotte du Site du Zro pour ceux qui ne le connatraient pas.

QQV

GESTION DE LA TRANSPARENCE

GB ghrgement et littge de ozor sur l sne BG zozor a hvvodfw@4zozorFmp4AY hvfliturfe@zozorD xvvD ernD 8positionozorAY hvplip@ernAY puse@AY hvpreeurfe@imgehepondAY hvpreeurfe@zozorAY hvuit@AY } return isggiY

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


Je sais pourquoi, c'est parce que tu as mis un fond bleu tout moche sur l'image de Zozor !

QQW

CHAPITRE 22. AFFICHER DES IMAGES

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 zozorFmp de plus prs @(gF PPFRAF

Figure PPFR ! v9imge zozorFmp 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 hvetgolorueyF gette fontion doit tre ppele vnt de litter l9imgeF oii omment je m9en sers pour rendre le leu derrire ozor trnsprent X
hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY

sl y trois prmtres X ! l surfe qui doit tre rendue trnsprente @iiD 9est zozorA Y ! une liste de )gs X utilisez hvggyvyui pour tiver l trnspreneD H pour l dstiver Y QRH

GESTION DE LA TRANSPARENCE

! indiquez ensuite l ouleur qui doit tre rendue trnsprenteF t9i utilis hvwpqf pour rer l ouleur u formt nomre @intQPA 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 hvvodfwD on indique l ouleur trnsE prente ve hvetgolorueyD puis on peut litter ve hvfliturfe X
GB yn hrge l9imge X BG zozor a hvvodfw@4zozorFmp4AY GB yn rend le leu derrire ozor trnsprent X BG hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY GB yn litte l9imge mintennt trnsprente sur le fond X BG hvfliturfe@zozorD xvvD ernD 8positionozorAY

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

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 QRI

CHAPITRE 22. AFFICHER DES IMAGES

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 hvetelph X
hvetelph@zozorD hvgevreD IPVAY

sl y l enore trois prmtres X ! l surfe en question @zozorA Y ! une liste de )gs X mettez hvgevre 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
zozor a hvvodfw@4zozorFmp4AY hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY GB rnsprene elph moyenne @IPVA X BG hvetelph@zozorD hvgevreD IPVAY hvfliturfe@zozorD xvvD ernD 8positionozorAY

ous noterez que j9i onserv l trnsprene de hvetgolorueyF 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 le qsp et le tiqF tome ienD il existe justement une iliothque hvsmge qui gre tous les formts suivnts X ! qe Y QRP

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

Figure PPFT ! xiveux de trnsprene elph

QRQ

CHAPITRE 22. AFFICHER DES IMAGES

! 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 hvsmge 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 virriesD 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 hvsmge dns l listeF F F vous rriverez sur l pge ddie hvsmgeF gode we X RQRTUP lhrgez l version de hvsmge qui vous orrespond dns l setion finry @ne prenez e l soureD on n9en ps esoin 3AF i vous tes sous indowsD tlhrgez hvimgeEdevelEIFPFIHEgFzipD et e mme si vous n9utilisez ps isul gCC 3
Installation

hns e FzipD vous trouverez X ! hvimgeFh X le seul heder dont esoin l iliothque hvsmgeF lezEle dns g:rogrm pilesgodeflokshvEIFPFIQinludeD 9estEEdire t des utres heders de l hv Y ! hvimgeFli X opiez dns g:rogrm pilesgodeflokshvEIFPFIQliF yuiD je sisD je vous i dit que normlement les Fli tient des (hiers rservs isulD mis ii exeptionnellement le Fli fontionner mme ve le ompilteur mingw Y
4. On emploie aussi parfois le mot  greon , plus franais.

QRR

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

! plusieurs hvv X plezEles toutes dns le dossier de votre projet @ t de hvFdllD donAF insuiteD vous devez modi(er les options de votre projet pour  linker ve le (hier hvimgeFliF i vous tes sous gode: :floks pr exempleD llez dns le menu rojets G fuild optionsF hns l9onglet vinkerD liquez sur le outon edd et indiquez o se trouve le (hier hvimgeFli @(gF PPFUAF

Figure PPFU ! letion de hvimgeFli

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 hvimgeFh dns votre ode soureF elon l9endroit o vous vez pl le (hier hvimgeFhD vous devrez soit utiliser e ode X
5inlude `hvGhvimgeFhb

F F F soit eluiEi X QRS

CHAPITRE 22. AFFICHER DES IMAGES


5inlude `hvimgeFhb

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

Installer SDL_image sous Mac OS X


i vous utilisez w y D tlhrgez le (hier Fdmg sur le site de l hvD setion hvimgeF gode we X RQRTUP gopiez le (hier hvimgeFfrmework dns wintosh rhGvirryGprmeworksF goE piez ensuite le (hier hvimgeFh dns hvFfrmeworkGredersF grez un nouveu projet de type hv epplition et fites edd G ixisting prmeworks @(gF PPFVAF

Figure PPFV ! ejout de hvimge sous ode

vD sletionnez le (hier hvimgeFfrmework que vous venez de tlhrgerF g9est tout 3 sl fudr en revnhe inlure le (hier Fh dns votre ode omme ei X
5inlude 4hvimgeFh4

QRT

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

F F F u lieu d9utiliser des hevrons ` bF emplez don l ligne d9inlude de hvimge dns le ode qui v suivre pr elle que je viens de vous donnerF

Charger les images


in fitD instller hvimge est IHH fois plus ompliqu que de l9utiliserD 9est vous dire l omplexit de l iliothque 3 sl y xi seule fontion onntre X swqvodF 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 hvimge @qspD xqD tqD mis ussi fwD spF F FAF ille dteter toute seule le type du (hier en fontion de son extensionF
Comme hvimge peut aussi ouvrir les BMP, vous pouvez mme oublier maintenant la fonction hvvodfw et ne plus utiliser que swqvod 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 hvimge tiver utomtiquement l trnsprene pour ette imge 3 gel vous vite don d9voir ppeler hvetgolorueyF te vis vous prsenter le ode soure qui hrge spinFpng et l90he F xotez ien que j9inlue hvGhvimgeFh et que je ne fis ps ppel hvetgoloruey r mon xq est nturellement trnsprentF ous llez voir que j9utilise swqvod prtout dns e ode en remplement de hvvodfwF
5

5inlude `stdliFhb 5inlude `stdioFhb 5inlude `hvGhvFhb 5inlude `hvGhvimgeFhb GB snlusion du heder de hvimge @dpter le dossier u esoinA BG int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bimgehepond a xvvD Bspin a xvvY hvet positionpondD positionpinY GB FFF ghrgement de l hv et d9une imge de fond BG GB ghrgement d9un xq ve swqvod geluiEi est utomtiquement rendu trnsprent r les informtions de trnsprene sont odes l9intrieur du fihier xq BG spin a swqvod@4spinFpng4AY hvfliturfe@spinD xvvD ernD 8positionpinAY
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.

QRU

CHAPITRE 22. AFFICHER DES IMAGES

hvplip@ernAY puse@AY hvpreeurfe@imgehepondAY hvpreeurfe@spinAY hvuit@AY } return isggiY

we X SPVSRV gomme on peut le voir sur l (gF PPFWD l9imge xq t insre ve l trnsprene sur l9imge de fond 3

gode

Figure PPFW ! ne imge xq trnsprente insre l9ide de hvimge

En rsum
! v hv permet de hrger des imges dns des surfesF r dfutD elle ne gre que les fw ve hvvodfwF ! yn peut d(nir une ouleur trnsprente ve hvetgolorueyF ! yn peut rendre l9ensemle de l9imge plus ou moins trnsprent ve l fontion hvetelph F QRV

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE

! v iliothque hvimge permet d9insrer n9importe quel type d9imge @xqD tiqF F FA ve swqvodF sl fut ependnt l9instller en plus de l hvF

QRW

CHAPITRE 22. AFFICHER DES IMAGES

QSH

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 !

QSI

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 puse@A 3 in e'etD le rle de l fontion puse 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 puse. 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 hviventF eppelezEl omme vous voulez X moiD je vis l9ppeler eventD e qui signi(e  vnement en nglisF
hvivent eventY

QSP

LE PRINCIPE DES VNEMENTS

our nos tests nous llons nous ontenter d9un min trs sique qui 0he juste une fentreD omme on l9 vu quelques hpitres plus ttF oii quoi doit ressemler votre min X
int min@int rgD hr BrgvA { hvurfe Bern a xvvY hvivent eventY GG gette vrile servir plus trd grer les vnements hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY hvwetgption@4qestion des vnements en hv4D xvvAY hvuit@AY } return isggiY

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

gode

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 ontinuer X
int ontinuer a IY

ge oolen est mis I u dprt r on veut que l oule se rpte ex i l vrile ontinuer vut I @vriAF hs qu9elle vudr H @fuxAD lors on sortir de l oule et le progrmme s9rrterF oii l oule rer X
while @ontinuerA { GB ritement des vnements BG }

oil X on pour le moment une oule in(nie qui ne s9rrter que si on met l vrile ontinuer HF g9est e que nous llons rire l9intrieur de ette oule qui est le plus intressntF QSQ

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 ! hvitivent 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 ! hvollivent 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 hvitivent votre progrmme utiliser trs peu de proesseur r il ttenE dr qu9un vnement se produiseF in revnheD si vous utilisez hvolliventD votre progrmme v prourir votre oule while et rppeler hvollivent 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 ?
hvitivent

si cette fonction

xonD r il y des s o hvollivent 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 hvitiventD le progrmme serit rest  loqu dns ette fontion et vous n9uriez ps pu mettre jour l9rn pour fire desendre les los 3
Comment fait hvitivent 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 hvitiventD 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 hvitivent r notre progrmme reste trs simpleF ges deux fontions s9utilisent de toute fon de l mme mnireF QSR

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 8 devnt le nom de l vrile (n de donner l9dresse X
hvitivent@8eventAY

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

Analyse de l'vnement
wintenntD nous disposons d9une vrile event qui ontient des informtions sur l9vnement qui s9est produitF sl fut regrder l sousEvrile eventFtype et fire un test sur s vleurF qnrlement on utilise un swith 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
while @ontinuerA { hvitivent@8eventAY GB uprtion de l9vnement dns event BG swith@eventFtypeA GB est du type d9vnement BG { se hvsX GB i 9est un vnement de type 4uitter4 BG ontinuer a HY rekY } }

oii omment fontionneF IF hs qu9il y un vnementD l fontion hvitivent renvoie et vnement dns eventF PF yn nlyse le type d9vnement gre un swithF ve type de l9vnement se trouve dns eventFtype QF yn teste l9ide de se dns le swith le type de l9vnementF our le momentD on ne teste que l9vnement hvs @demnde de fermeture du progrmmeAD r 9est le seul qui nous intresseF QSS

CHAPITRE 23. LA GESTION DES VNEMENTS

! i 9est un vnement hvsD 9est que l9utilisteur demnd quitter le progrmmeF hns e s on met le oolen ontinuer 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 hvsD 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
int min@int rgD hr BrgvA { hvurfe Bern a xvvY hvivent eventY GB v vrile ontennt l9vnement BG int ontinuer a IY GB xotre oolen pour l oule BG hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY hvwetgption@4qestion des vnements en hv4D xvvAY while @ontinuerA GB ex i l vrile ne vut ps H BG { hvitivent@8eventAY GB yn ttend un vnement qu9on rupre dns event BG swith@eventFtypeA GB yn teste le type d9vnement BG { se hvsX GB i 9est un vnement si BG ontinuer a HY GB yn met le oolen HD don l oule v s9rrter BG rekY } } hvuit@AY } return isggiY

we X VSWVPQ oil le ode ompletF sl n9y rien de ien di0ile X si vous vez suivi jusqu9iiD ne devrit ps vous surprendreF h9illeursD vous remrquerez qu9on n9 fit que reproduire QST

gode

LE CLAVIER

e que fisit l fontion puse 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 se dns le swith 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 ! hvuihyx X qund une touhe du lvier est enfone Y ! hvui 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 @hvuihyxAD puis vous l relhez @hvuiAF 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 hvuihyx @ppui de l touheA X
while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX GB i ppui sur une touhe BG ontinuer a HY rekY } }

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.

QSU

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 eventFkeyFkeysymFsymF 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 ihp, ou encore smprF irn, uppr, intre, 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 ueysym 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 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 ihp @ ispe en nglisAF yn peut vri(er si l touhe enfone est ihp omme ei X
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.

QSV

LE CLAVIER
swith @eventFkeyFkeysymFsymA { se hvuigeiX GB eppui sur l touhe ihpD on rrte le progrmme BG ontinuer a HY rekY }

J'utilise un swith pour faire mon test mais j'aurais aussi bien pu utiliser un if. Toutefois, j'ai plutt tendance me servir des swith quand je traite les vnements car je teste beaucoup de valeurs direntes (en pratique, j'ai beaucoup de se dans un swith, contrairement ici).

oii une oule d9vnement omplte que vous pouvez tester X


while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX swith @eventFkeyFkeysymFsymA { se hvuigeiX GB eppui sur l touhe ihpD on rrte le progrmme BG ontinuer a HY rekY } rekY } }

gette foisD le progrmme s9rrte si on ppuie sur ihp 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.

QSW

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
zozor a hvvodfw@4zozorFmp4AY hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY

insuiteD et 9est ertinement le plus importntD vous devez rer une vrile de type hvet pour retenir les oordonnes de ozor X
hvet positionozorY

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
GB yn entre ozor l9rn BG positionozorFx a ernEbw G P E zozorEbw G PY positionozorFy a ernEbh G P E zozorEbh G PY

Vous devez initialiser positionozor aprs avoir charg les surfaces ern 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 hvpillet sur ernAD 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 QTH

EXERCICE : DIRIGER ZOZOR AU CLAVIER

Figure PQFQ ! ozor entr dns l fentre


connatre par curF ve voii X
while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvgX GB qestion des vnements de type g BG se hvfshviX GB qestion des vnements de type fshvi BG } GB yn effe l9rn @ii fond lnA X BG hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY

GB yn fit tous les hvfliturfe nessires pour oller les surfes l9rn BG GB yn met jour l9ffihge X BG hvplip@ernAY

oil dns les grndes lignes l forme de l oule priniple d9un progrmme hvF yn oule tnt qu9on n9 ps demnd rrter le progrmmeF QTI

CHAPITRE 23. LA GESTION DES VNEMENTS

IF On attend un vnement @hvitiventA ou ien on vri(e s9il y un vnement mis on n9ttend ps qu9il y en it un @hvolliventAF our le moment on se ontente de hvitiventF PF yn fit un @grndA swith pour svoir de quel type d9vnement il s9git @vE nement de type gD de type fshviD 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 swithD on prpre un nouvel 0hge X @A premire hose fire X on eace l'cran ve un hvpilletF 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 hvplip@ernAF

Traiter l'vnement SDL_KEYDOWN


oyons mintennt omment on v triter l9vnement hvuihyxF 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
swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX swith@eventFkeyFkeysymFsymA { se hvuX GG plhe hut positionozorFyEEY rekY se hvuhyxX GG plhe s positionozorFyCCY rekY se hvusqrX GG plhe droite positionozorFxCCY rekY se hvuvipX GG plhe guhe positionozorFxEEY rekY } rekY }

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 QTP

EXERCICE : DIRIGER ZOZOR AU CLAVIER

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

gode

int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bzozor a xvvY hvet positionozorY hvivent eventY int ontinuer a IY hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegiAY hvwetgption@4qestion des vnements en hv4D xvvAY GB ghrgement de ozor BG zozor a hvvodfw@4zozorFmp4AY hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY GB yn entre ozor l9rn BG positionozorFx a ernEbw G P E zozorEbw G PY positionozorFy a ernEbh G P E zozorEbh G PY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX swith@eventFkeyFkeysymFsymA { se hvuX GG plhe hut positionozorFyEEY rekY se hvuhyxX GG plhe s
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.

QTQ

CHAPITRE 23. LA GESTION DES VNEMENTS


positionozorFyCCY rekY se hvusqrX GG plhe droite positionozorFxCCY rekY se hvuvipX GG plhe guhe positionozorFxEEY rekY

} rekY

GB yn effe l9rn BG hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY GB yn ple ozor s nouvelle position BG hvfliturfe@zozorD xvvD ernD 8positionozorAY GB yn met jour l9ffihge BG hvplip@ernAY

hvpreeurfe@zozorAY hvuit@AY } return isggiY

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 ontinuer HF hns ette ouleD on rupre d9ord un vnement triterF yn fit un swith 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 swith vous devez mettre jour votre rn omme suitF IF remirementD vous e'ez l9rn vi un hvpillet @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 positionozor 3 g9est l que l di'rene se fit X si j9i mis jour positionozor uprvntD lors ozor pprtr un utre endroit et on ur l9impression qu9on l9 dpl 3 QF in(nD toute dernire hose fire X hvplipF gel ordonne l mise jour de l9rn ux yeux de l9utilisteurF QTR

gode

EXERCICE : DIRIGER ZOZOR AU CLAVIER

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 hvinleueyepet 3 gette fontion permet d9tiver l rE ptition des touhesF ille fit en sorte que l hv rgnre un vnement de type hvuihyx 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 ! 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 hvuihyx une fois que l rptition t tiveF QTS

CHAPITRE 23. LA GESTION DES VNEMENTS

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
hvinleueyepet@IHD IHAY

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 rns en ppelnt l fontion hvplip @(gF PQFTAF 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 QTT

EXERCICE : DIRIGER ZOZOR AU CLAVIER

Figure PQFT ! hvplip intervertit les rns pour 0her l nouvelle imge

our rliser elD tout e que vous vez fire est de hrger le mode vido en joutnt le )g hvhyfvifp X
ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY

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 hvplip 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 gode we X TIVVUH
6

6. a ne cote pas plus cher et c'est mieux : de quoi se plaint-on ?

QTU

CHAPITRE 23. LA GESTION DES VNEMENTS

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 ! hvwyifyxhyx X lorsqu9on lique ve l sourisF gel orrespond u moment o le outon de l souris est enfonF ! hvwyifyx 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 ! hvwyiwysyx X lorsqu9on dple l sourisF hque fois que l souris ouge dns l fentre @ne seritEe que d9un pixel 3AD un vnement hvwyiwysyx est gnr 3 xous llons d9ord trviller ve les lis de l souris et plus prtiulirement ve hvwyifyxF yn ne trviller ps ve hvwyifyxhyx 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 hvwyiwysyxF

Grer les clics de la souris


xous llons don pturer un vnement de type hvwyifyx @li de l sourisA puis voir quelles informtions on peut ruprerF gomme d9hitudeD on v devoir jouter un se dns notre swith de testD lors llonsEy giement X
swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvwyifyxX GB gli de l souris BG rekY }

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
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 eventFuttonFutton @nonD je ne gie psA et omprer s vleur QTV

LA SOURIS

ve l9une des S onstntes suivntes X ! hvfyxvip X li ve le outon guhe de l souris Y ! hvfyxwshhvi X li ve le outon du milieu de l souris Y ! hvfyxsqr X li ve le outon droit de l souris Y ! hvfyxriiv X molette de l souris vers le hut Y ! hvfyxriivhyx 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
swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvwyifyxX if @eventFuttonFutton aa hvfyxsqrA GB yn rrte le progrmme si on fit un li droit BG ontinuer a HY rekY }

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 eventFuttonFx et eventFuttonFyF 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
while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA {
7. Tout le monde n'en a pas forcment un, c'est en gnral un clic avec la molette.

QTW

CHAPITRE 23. LA GESTION DES VNEMENTS


se hvsX ontinuer a HY rekY se hvwyifyxX positionozorFx a eventFuttonFxY positionozorFy a eventFuttonFyY rekY

hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY hvfliturfe@zozorD xvvD ernD 8positionozorAY GB yn ple ozor s nouvelle position BG hvplip@ernAY }

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 positionozorFxD 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 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 QUH

LA SOURIS

Grer le dplacement de la souris


n dplement de l souris gnre un vnement de type hvwyiwysyxF 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 eventFmotionFx et eventFmotionFyF
Faites attention : on n'utilise pas les mmes variables que pour le clic de souris de tout l'heure (avant, c'tait eventFuttonFx). 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
while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvwyiwysyxX positionozorFx a eventFmotionFxY positionozorFy a eventFmotionFyY rekY } hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY hvfliturfe@zozorD xvvD ernD 8positionozorAY GB yn ple ozor s nouvelle position BG hvplip@ernAY }

fougez votre ozor l9rnF ue voyezEvous c sl suit nturellement l souris o que vous lliezF g9est euD 9est rpideD 9est )uide @vive le doule u'eringAF QUI

CHAPITRE 23. LA GESTION DES VNEMENTS

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 hvhowgursor et de lui envoyer un )g X ! hvhsefvi X msque le urseur de l souris Y ! hvixefvi X r0he le urseur de l sourisF r exemple X
hvhowgursor@hvhsefviAY

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 hvrpwouse 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
hvrpwouse@ernEbw G PD ernEbh G PAY

Lorsque vous faites un rpwouse, un vnement de type hvwyiwysyx 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 gommenons pr tudier le premier d9entre eux X l9vnement gnr lors du redimenE sionnement de l fentreF QUP

LES VNEMENTS DE LA FENTRE

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 hvisefvi dns l fontion hvetideowode X
ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifp | hvisefviAY

ne fois que vous vez jout e )gD vous pouvez redimensionner l fentreF vorsque vous fites elD un vnement de type hvshiyisi est gnrF ous pouvez ruprer X ! l nouvelle lrgeur dns eventFresizeFw Y ! l nouvelle huteur dns eventFresizeFhF yn peut utiliser es informtions pour fire en sorte que notre ozor soit toujours entr dns l fentre X
se hvshiyisiX positionozorFx a eventFresizeFw G P E zozorEbw G PY positionozorFy a eventFresizeFh G P E zozorEbh G PY rekY

Visibilit de la fentre
v9vnement hvegsiiix 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 ! eventFtiveFgin 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 ! eventFtiveFstte X 9est une ominison de )gs indiqunt le type d9vnement qui s9est produitF oii l liste des )gs possiles X QUQ

CHAPITRE 23. LA GESTION DES VNEMENTS

X le urseur de l souris vient de rentrer ou de sortir de l fentreF sl fut regrder l vleur de eventFtiveFgin pour svoir si elle est rentre @gin a IA ou sortie @gin a HA de l fentre Y ! hvesxpyg 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 eventFtiveFgin pour svoir si l fentre t mise u premier pln @gin a IA ou en rrireEpln @gin a HA Y ! hveegsi 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 gin et stte pour svoir extement e qui s9est produitF
hvewyipyg

Tester la valeur d'une combinaison de ags


eventFtiveFstte 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
if @eventFtiveFstte aa hveegsiA

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
if @@eventFtiveFstte 8 hvewyipygA aa hvewyipygA

sl n9y ps d9erreurF ettentionD 9est pris X il fut un seul 8 et deux aD et il fut ien utiliser les prenthses omme je l9i fitF gel fontionne de l mme mnire pour les utres vnementsF r exemple X
if @@eventFtiveFstte 8 hveegsiA aa hveegsiA

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 QUR

LES VNEMENTS DE LA FENTRE

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 puse IF sl remet en mrhe le jeu en dstivnt le oolen HF
if @@eventFtiveFstte 8 hveegsiA aa hveegsiA { if @eventFtiveFgin aa HA GB v fentre t rduite BG puse a IY else if @eventFtiveFgin aa IA GB v fentre t resture BG puse a HY }

Bien entendu, ce code n'est pas complet. Ce sera vous de tester l'tat de la variable puse 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 hvivent ve l fonE tion hvitivent @fontion loqunte mis file grerA ou ve l fontion hvollivent @fontion non loqunte mis plus omplexe mnipulerAF ! sl fut nlyser l sousEvrile eventFtype pour onntre le type d9vnement qui s9est produitF yn le fit en gnrl dns un swithF ! 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 @hvuihyxA il fut nlyser eventFkeyFkeysymFsym pour onntre l touhe en questionF ! ve doule u'ering est une tehnique qui onsiste hrger l9imge suivnte en the de fond et l90her seulement une fois qu9elle est prteF gel permet d9viter des sintillements dsgrles l9rnF QUS

CHAPITRE 23. LA GESTION DES VNEMENTS

QUT

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.

QUU

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 QUV

CAHIER DES CHARGES DU SOKOBAN

l9orgnistionF sl v en e'et flloir douper notre progrmme en plusieurs (hiers F 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 niveuxFlvlA 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 !

QUW

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 gode we X SRPSTT
3. Je vais pas tout vous servir sur un plateau d'argent non plus ! ;-)

QVH

LE MAIN ET LES CONSTANTES

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 hvsmgeF ensez on(gurer votre projet pour qu9il gre l hv et hvsmgeF 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 swqvodA 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 onstntesFh insi qu9un (hier minF qui ontiendr l fontion min @et uniqueE ment elleElAF ge n9est ps une rgle X 9est juste m fon de fontionnerF ghun s propre mnire de fireF QVI

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 ! onstntesFh X les d(nitions de onstntes gloles tout le progrmme Y ! minF X le (hier qui ontient l fontion min @fontion priniple du progrmmeA Y ! jeuF X fontions grnt une prtie de okon Y ! jeuFh X prototypes des fontions de jeuF Y ! editeurF X fontions grnt l9diteur de niveux Y ! editeurFh X prototypes des fontions de editeurF Y ! fihiersF X fontions grnt l leture et l9riture de (hiers de niveux @omme niveuxFlvl pr exempleA Y ! fihiersFh X prototypes des fontions de fihiersFF yn v ommener pr rer le (hier des onstntesF

Les constantes : constantes.h


oii le ontenu de mon (hier de onstntes X
GB onstntesFh EEEEEEEEEEEE r mteoPID pour ve ite du ro @wwwFsiteduzeroFomA le X dfinit des onstntes pour tout le progrmme @tille de l fentreFFFA BG 5ifndef hipgyxexi 5define hipgyxexi 5define 5define 5define 5define 5define esvvifvyg xffvygveqi xffvygrei veqipixii reipixii QR GG ille d9un lo @rrA en pixels IP IP esvvifvyg B xffvygveqi esvvifvyg B xffvygrei

enum {reD feD qegriD hysi}Y enum {shiD wD gesiD yftigspD wesyD gesiyu}Y 5endif

we X PSHTHW ous noterez plusieurs points intressnts dns e petit (hierF ! 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 Fh ou des QVP

gode

LE MAIN ET LES CONSTANTES

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 Fh 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 re a HD fe a ID qegri 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 re 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 feD qegri et hysiF ! ! ! !

FAF

Inclure les dnitions de constantes

ve prinipe ser d9inlure e (hier de onstntes dns hun de mes (hiers FF 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 F X
5inlude 4onstntesFh4

QVQ

CHAPITRE 24. TP : MARIO SOKOBAN

Le main : main.c
v fontion min priniple est extrmement simpleF ille pour rle d90her l9rn d9ueil du jeu et de rediriger vers l onne setionF
GB minF EEEEEE r mteoPID pour ve ite du ro @wwwFsiteduzeroFomA le X menu du jeuF ermet de hoisir entre l9diteur et le jeu luiEmmeF BG 5inlude 5inlude 5inlude 5inlude `stdliFhb `stdioFhb `hvGhvFhb `hvGhvimgeFhb

5inlude 4onstntesFh4 5inlude 4jeuFh4 5inlude 4editeurFh4 int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bmenu a xvvY hvet positionwenuY hvivent eventY int ontinuer a IY hvsnit@hvsxsshiyAY hvwetson@swqvod@4isseFjpg4AD xvvAY GG v9ine doit tre hrge vnt hvetideowode ern a hvetideowode@veqipixiiD reipixiiD QPD hvrpegi | hvhyfvifpAY hvwetgption@4wrio okon4D xvvAY

menu a swqvod@4menuFjpg4AY positionwenuFx a HY positionwenuFy a HY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY

QVR

LE MAIN ET LES CONSTANTES


rekY se hvuihyxX swith@eventFkeyFkeysymFsymA { se hvuigeiX GG eut rrter le jeu ontinuer a HY rekY se hvuuIX GG hemnde jouer jouer@ernAY rekY se hvuuPX GG hemnde l9diteur de niveux editeur@ernAY rekY } rekY

GG iffement de l9rn hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY hvfliturfe@menuD xvvD ernD 8positionwenuAY hvplip@ernAY

hvpreeurfe@menuAY hvuit@AY } return isggiY

we X UQQQTW v fontion min se hrge d9e'etuer les initilistions de l hvD de donner un titre l fentre insi qu9une ineF l (n de l fontionD hvuit@A est ppele pour rrter l hv proprementF v fontion 0he un menuF ve menu est hrg en utilisnt l fontion swqvod de hvsmge X
menu a swqvod@4menuFjpg4AY

gode

Vous remarquerez que, pour donner les dimensions de la fentre, j'utilise les constantes veqipixii et reipixii qu'on a dnies dans onstntesFh.
La boucle des vnements

v oule in(nie gre les vnements suivnts X QVS

CHAPITRE 24. TP : MARIO SOKOBAN

! arrt du programme @hvsA X si on demnde fermer le progrmme @li sur l roix en hut droite de l fentreAD lors on psse le oolen ontinuer HD et l oule s9rrterF frefD lssique Y ! appui sur la touche Echap X rrt du progrmme @omme hvsA 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 min dns lequel on refit un tour de ouleF ve min 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 min 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 ernF in e'etD l fentre t ouverte dns le minD et pour que l fontion jouer puisse y dessinerD il fut qu9elle rupre le pointeur sur ern 3 i vous regrdez le min nouveuD vous voyez qu9on ppelle jouer en lui envoynt ern X
jouer@ernAY

ve prototype de l fontionD que vous pouvez mettre dns jeuFhD est don le suivnt X
void jouer@hvurfeB ernAY

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.

QVT

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
hvurfe BmrioR a {xvv}Y GG R surfes pour R diretions de mrio hvurfe Bmur a xvvD Bisse a xvvD Bisseyu a xvvD Bojetif a xvvD Bmrioetuel a xvvY hvet positionD positiontoueurY hvivent eventY

t9i r un tleu de hvurfe ppel mrioF 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 isseD isseyu @une isse sur un ojetifA et ojetifF
quoi sert mrioetuel ?

g9est un pointeur vers une surfeF sl pointe sur l surfe orrespondnt u wrio orient dns l diretion tuelleF g9est don mrioetuel que l9on litter l9rnF i vous regrdez tout en s de l fontion jouerD vous verrez justement X
hvfliturfe@mrioetuelD xvvD ernD 8positionAY

yn ne litte don ps un lment du tleu mrioD mis le pointeur mrioetuelF einsiD en littnt mrioetuelD on litte soit le wrio vers le sD soit elui vers le hutD etF ve pointeur mrioetuel pointe vers une des ses du tleu mrioF uoi d9utre prt c ne vrile position de type hvet dont on se servir pour d(nir l position des lments litter @on s9en servir pour tous les spritesD inutile de rer un hvet pour hque surfe 3AF positiontoueur 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 QVU

CHAPITRE 24. TP : MARIO SOKOBAN


int ontinuer a ID ojetifsestnts a HD i a HD j a HY int rtexffvygveqixffvygrei a {H}Y

ontinuer et ojetifsestnts sont des oolensF i et j sont des petites vriles qui vont me permettre de prourir le tleu rteF 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

int rtexffvygveqixffvygrei 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 onstntesFhD xffvygveqi et xffvygrei sont des onstntes qui vlent toutes les deux IPF ge tleu ser don l ompiltion r omme ei X
int rteIPIP a {H}Y

Mais qu'est-ce que a veut dire ?

veut dire que pour hque  se de rteD il y IP sousEsesF sl y ur don les vriles suivntes X
rteHH rteHI rteHP rteHQ rteHR rteHS rteHT rteHU rteHV rteHW rteHIH rteHII rteIH rteII rteIP rteIQ
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.

QVV

LE JEU
rteIR rteIS rteIT rteIU rteIV rteIW rteIIH FFF rteIIP rteIIQ rteIIR rteIIS rteIIT rteIIU rteIIV rteIIW rteIIIH rteIIII

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

QVW

CHAPITRE 24. TP : MARIO SOKOBAN

einsiD l se en hut guhe est stoke dns rteHHF v se en hut droite est stoke dns rteHIIF v se en s droite @l toute dernireA est stoke dns rteIIIIF 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
enum {shiD wD gesiD yftigspD wesyD gesiyu}Y

i l se vut shi @HA on sit que ette prtie de l9rn devr rester lnheF i elle vut w @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
GG ghrgement des sprites @dorsD personngeFFFA mur a swqvod@4murFjpg4AY isse a swqvod@4isseFjpg4AY isseyu a swqvod@4isseokFjpg4AY ojetif a swqvod@4ojetifFpng4AY mriofe a swqvod@4mriosFgif4AY mrioqegri a swqvod@4mrioguheFgif4AY mriore a swqvod@4mriohutFgif4AY mriohysi a swqvod@4mriodroiteFgif4AY

ien de sorier lEdedns X on hrge tout gre swqvodF 9il y une petite prE tiulritD 9est le hrgement de mrioF yn hrge en e'et wrio dns hune des diretions dns le tleu mrio en utilisnt les onstntes reD feD qegriD hysiF ve fit d9utiliser les onstntes rend ii " omme vous le voyez " le ode plus lirF yn urit trs ien pu rire mrioHD mis 9est qund mme plus lisile d9voir mriore pr exemple 3
Orientation initiale du Mario (mrioetuel)

yn initilise ensuite mrioetuel pour qu9il it une diretion u dprt X


mrioetuel a mriofeY GG wrio ser dirig vers le s u dprt

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
mrioetuel a mriohysiY

ous verrez que wrio ser lors orient vers l droite u dut du jeuF QWH

LE JEU

Chargement de la carte

wintenntD il v flloir remplir notre tleu deux dimensions rteF our l9instntD e tleu ne ontient que des HF sl fut lire le niveu qui est stok dns le (hier niveuxFlvlF
GG ghrgement du niveu if @3hrgerxiveu@rteAA exit@ispesviAY GG yn rrte le jeu si on n9 ps pu hrger le niveu

t9i hoisi de fire grer le hrgement @et l9enregistrementA de niveux pr des fontions situes dns fihiersFF siD on ppelle don l fontion hrgerxiveuF 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 rteF
Si le niveau n'a pas pu tre charg (parce que niveuxFlvl 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 rte qui drit le ontenu de hque se X wD shiD gesiF F F
Recherche de la position de dpart de Mario

sl fut mintennt initiliser l vrile positiontoueurF gette vrileD de type hvetD 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 rte 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
GG eherhe de l position de wrio u dprt for @i a H Y i ` xffvygveqi Y iCCA { for @j a H Y j ` xffvygrei Y jCCA { if @rteij aa wesyA GG i wrio se trouve ette position

positiontoueurFx aa II positiontoueurFy aa II

QWI

CHAPITRE 24. TP : MARIO SOKOBAN


{

positiontoueurFx a iY positiontoueurFy a jY rteij a shiY

hque seD on teste si elle ontient wesy @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 positiontoueurF yn e'e ussi l se en l mettnt shi 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
GG etivtion de l rptition des touhes hvinleueyepet@IHHD IHHAY

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 swith qui teste l9vnement X
swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX swith@eventFkeyFkeysymFsymA { se hvuigeiX ontinuer a HY rekY se hvuX mrioetuel a mrioreY deplertoueur@rteD 8positiontoueurD reAY rekY se hvuhyxX

QWP

LE JEU
mrioetuel a mriofeY deplertoueur@rteD 8positiontoueurD feAY rekY se hvusqrX mrioetuel a mriohysiY deplertoueur@rteD 8positiontoueurD hysiAY rekY se hvuvipX mrioetuel a mrioqegriY deplertoueur@rteD 8positiontoueurD qegriAY rekY

} rekY

i on ppuie sur l touhe ihpD 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 mrioetuel 3 i on ppuie vers le hutD lors X
mrioetuel a mrioreY

i on ppuie vers le sD lors X


mrioetuel a mriofeY

mrioetuel pointe don sur l surfe reprsentnt wrio dns l position tuelleF g9est insi qu9en littnt mrioetuel tout l9heureD on ser ertin de litter wrio dns l onne diretionF wintenntD hose trs importnte X on ppelle une fontion deplertoueurF 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 QWQ

CHAPITRE 24. TP : MARIO SOKOBAN

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 evenons l fontion deplertoueur 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 reD feD qegriD hysi pour plus de lisiilitF xous tudierons l fontion deplertoueur plus loinF t9uris trs ien pu mettre tous les tests dns le swithD 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 swith 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
GG iffement de l9rn hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY

it mintenntD on prourt tout notre tleu deux dimensions rte 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
GG lement des ojets l9rn ojetifsestnts a HY for @i a H Y i ` xffvygveqi Y iCCA { for @j a H Y j ` xffvygrei Y jCCA { positionFx a i B esvvifvygY positionFy a j B esvvifvygY swith@rteijA { se wX hvfliturfe@murD xvvD ernD 8positionAY

QWR

LE JEU
rekY se gesiX hvfliturfe@isseD xvvD ernD 8positionAY rekY se gesiyuX hvfliturfe@isseyuD xvvD ernD 8positionAY rekY se yftigspX hvfliturfe@ojetifD xvvD ernD 8positionAY ojetifsestnts a IY rekY

our hune des sesD on prpre l vrile position @de type hvetA pour pler l9lment tuel l onne position sur l9rnF ve lul est trs simple X
positionFx a i B esvvifvygY positionFy a j B esvvifvygY

sl su0t de multiplier i pr esvvifvyg pour voir positionFxF 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 ernF yn fit l mme hose pour les ordonnes yF insuiteD on fit un swith 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 wD 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 ojetifsestnts 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 gesiyuAF sl su0t de tester si le oolen vut  fux D 9estEEdire s9il ne reste plus d9ojetifsF hns e sD on met l vrile ontinuer H pour rrter l prtie X
GG i on n9 trouv uun ojetif sur l rteD 9est qu9on ggn if @3ojetifsestntsA ontinuer a HY

Le joueur

sl nous reste litter le joueur X QWS

CHAPITRE 24. TP : MARIO SOKOBAN


GG yn ple le joueur l onne position positionFx a positiontoueurFx B esvvifvygY positionFy a positiontoueurFy B esvvifvygY hvfliturfe@mrioetuelD xvvD ernD 8positionAY

yn lule s position @en pixels ette foisA en fisnt une simple multiplition entre positiontoueur et esvvifvygF yn litte ensuite le joueur l position indiqueF
Flip !

yn tout fitD il ne nous reste plus qu9 0her l9rn u joueur X


hvplip@ernAY

Fin de la fonction : dchargements


eprs l oule prinipleD on doit fire quelques preeurfe pour lirer l mmoire des sprites qu9on hrgsF yn dstive ussi l rptition des touhes en envoynt les vleurs H l fontion hvinleueyepet X
GG hstivtion de l rptition des touhes @remise HA hvinleueyepet@HD HAY GG virtion des surfes hrges hvpreeurfe@murAY hvpreeurfe@isseAY hvpreeurfe@isseyuAY hvpreeurfe@ojetifAY for @i a H Y i ` R Y iCCA hvpreeurfe@mrioiAY

La fonction deplacerJoueur
v fontion deplertoueur se trouve elle ussi dns jeuFF 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 deplertoueur vri(e si on le droit de dpler le joueur dns l diretion demndeF ille met jour l position du joueur @positiontoueurA et ussi l rte si une isse t dpleF oii le prototype de l fontion X
void deplertoueur@int rtexffvygreiD hvet BposD int diretionAY

ge prototype est un peu prtiulierF ous voyez que j9envoie le tleu rte et que je prise l tille de l deuxime dimension @xffvygreiAF ourquoi el c QWT

LE JEU

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 eutre hose X vous noterez que positiontoueur 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 swith X
swith@diretionA { se reX GB etF 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 rekY pour sortir du swithD 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
if @posEby E I ` HA GG i le joueur dpsse l9rnD on rrte rekY

yn ommene pr vri(er si le joueur est dj tout en hut de l9rnF in e'etD si on essyit d9ppeler rteSEI 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
if @rteposEbxposEby E I aa wA GG 9il y un murD on rrte rekY

QWU

CHAPITRE 24. TP : MARIO SOKOBAN

v enore 9est simpleF yn vri(e s9il n9y ps un mur uEdessus du joueurF i tel est le sD on rrte @rekAF insuite @ttention les yeuxA X
GG if i on veut pousser une isseD il fut vrifier qu9il n9y ps de mur derrire @ou une utre isseD ou l limite du mondeA @@rteposEbxposEby E I aa gesi || rteposEbxposEby E I aa gesiyuA 88 @posEby E P ` H || rteposEbxposEby E P aa w || rteposEbxposEby E P aa gesi || rteposEbxposEby E P aa gesiyuAA rekY

ge gros test peut se trduire omme ei X  s uEdessus du joueur il y une isse @ou une isseokD 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 rekF 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
GG i on rrive lD 9est qu9on peut dpler le joueur 3 GG yn vrifie d9ord s9il y une isse dpler deplergisse@8rteposEbxposEby E ID 8rteposEbxposEby E PAY

Le dplacement de caisse : deplergisse

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
void deplergisse@int BpremieregseD int BseondegseA { if @Bpremieregse aa gesi || Bpremieregse aa gesiyuA { if @Bseondegse aa yftigspA Bseondegse a gesiyuY else Bseondegse a gesiY if @Bpremieregse aa gesiyuA Bpremieregse a yftigspY else Bpremieregse a shiY

QWV

LE JEU

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 gesiyuD il fut rempler l se o elle se trouvit pr un yftigspF inonD si 9est une simple gesiD lors on remple l se en question pr du shiF
Dplacer le joueur

yn retourne dns l fontion deplertoueurF gette fois 9est l onneD on peut dE pler le joueurF gomment fitEon c g9est trs trs simple X
posEbyEEY 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


swith@diretionA { se reX if @posEby E I ` HA GG i le joueur dpsse l9rnD on rrte rekY if @rteposEbxposEby E I aa wA GG 9il y un murD on rrte rekY GG i on veut pousser une isseD il fut vrifier qu9il n9y ps de mur derrire @ou une utre isseD ou l limite du mondeA if @@rteposEbxposEby E I aa gesi || rteposEbxposEby E I aa gesiyuA 88 @posEby E P ` H || rteposEbxposEby E P aa w || rteposEbxposEby E P aa gesi || rteposEbxposEby E P aa gesiyuAA rekY GG i on rrive lD 9est qu9on peut dpler le joueur 3 GG yn vrifie d9ord s9il y une isse dpler deplergisse@8rteposEbxposEby E ID 8rteposEbxposEby E PAY posEbyEEY GG yn peut enfin fire monter le joueur @oufff 3A rekY

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 QWW

CHAPITRE 24. TP : MARIO SOKOBAN

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 rer l9diteur F
5

Chargement et enregistrement de niveaux


ve (hier fihiersF ontient deux fontions X ! hrgerxiveu Y ! suvegrderxiveuF 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
int hrgerxiveu@int niveuxffvygreiAY

oyons le dut de l fontion X


psviB fihier a xvvY hr lignepihierxffvygveqi B xffvygrei C I a {H}Y int i a HD j a HY fihier a fopen@4niveuxFlvl4D 4r4AY if @fihier aa xvvA return HY

yn re un tleu de hr pour stoker temporirement le rsultt du hrgement du niveuF yn ouvre le (hier en leture seule @4r4AF yn rrte l fontion en renvoynt H @ fux A si l9ouverture houF glssiqueF ve (hier niveuxFlvl ontient une ligne qui est une suite de nomresF ghque nomre reprsente une se du niveuF r exemple X
IIIIIHHIIIIIIIIIIRHHHHHIIIIIHHHIIHHIHQQIHIHIIHIIHHHHHPHHIPIIIH FFF

yn v don lire ette ligne ve un fgets X


fgets@lignepihierD xffvygveqi B xffvygrei C ID fihierAY
5. Rassurez-vous, a ira bien plus vite !

RHH

CHARGEMENT ET ENREGISTREMENT DE NIVEAUX

yn v nlyser le ontenu de lignepihierF yn sit que les IP premiers rtres reprsentent l premire ligneD les IP suivnts l seonde ligneD etF
for @i a H Y i ` xffvygveqi Y iCCA { for @j a H Y j ` xffvygrei Y jCCA { swith @lignepihier@i B xffvygveqiA C jA { se 9H9X niveuji a HY rekY se 9I9X niveuji a IY rekY se 9P9X niveuji a PY rekY se 9Q9X niveuji a QY rekY se 9R9X niveuji a RY rekY } } }

r un simple petit lulD on prend le rtre qui nous intresse dns lignepihier et on nlyse s vleurF
Ce sont des  lettres  qui sont stockes dans le chier. Je veux dire par l que 9H9 est stock comme le caractre ASCII 9H9, et sa valeur n'est pas H ! Pour analyser le chier, il faut tester avec se 9H9 et non avec se H ! Attention ne pas mlanger les chires et les lettres !

ve swith fit l onversion 9H9 ab HD 9I9 ab ID etF sl ple tout dns le tleu rte F ne fois que 9est fitD on peut fermer le (hier et renvoyer I pour dire que tout s9est ien pss X
6

flose@fihierAY return IY

pinlementD le hrgement du niveu dns le (hier n9tit ps ien ompliquF ve seul pige viter 9tit de ien penser onvertir l vleur egss 9H9 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.

RHI

CHAPITRE 24. TP : MARIO SOKOBAN

sauvegarderNiveau

gette fontion est l enore simple X


int suvegrderxiveu@int niveuxffvygreiA { psviB fihier a xvvY int i a HD j a HY fihier a fopen@4niveuxFlvl4D 4w4AY if @fihier aa xvvA return HY for @i a H Y i ` xffvygveqi Y iCCA { for @j a H Y j ` xffvygrei Y jCCA { fprintf@fihierD 47d4D niveujiAY } } flose@fihierAY return IY

t9utilise fprintf pour  trduire les nomres du tleu niveu en rtres egssF g9tit l enore l seule di0ult @mis l9enversA X il ne fut ps rire H mis 9H9F

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 ihpF RHP

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
void editeur@hvurfeB ernA { hvurfe Bmur a xvvD Bisse a xvvD Bojetif a xvvD Bmrio a xvvY hvet positionY hvivent eventY int ontinuer a ID liquheingours a HD lihroitingours a HY int ojetetuel a wD i a HD j a HY int rtexffvygveqixffvygrei a {H}Y GG ghrgement des ojets et du niveu mur a swqvod@4murFjpg4AY isse a swqvod@4isseFjpg4AY ojetif a swqvod@4ojetifFpng4AY mrio a swqvod@4mriosFgif4AY if @3hrgerxiveu@rteAA exit@ispesviAY

RHQ

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 ojetetuel retient l9ojet tuellement sletionn pr l9utilisteurF r dfutD 9est un wF 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 liquheingours et lihroitingoursD 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 niveuxFlvl 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
hvs
se hvsX ontinuer a HY rekY

i on lique sur l roixD l oule s9rrte et on revient u menu prinipl F


8

hvwyifyxhyx
se hvwyifyxhyxX if @eventFuttonFutton aa hvfyxvipA { GG yn met l9ojet tuellement hoisi @murD isseFFFA l9endroit du li rteeventFuttonFx G esvvifvygeventFuttonFy G esvvifvyg a ojetetuelY liquheingours a IY GG yn retient qu9un outon est enfon } else if @eventFuttonFutton aa hvfyxsqrA 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.

RHR

L'DITEUR DE NIVEAUX
rteeventFuttonFx G esvvifvygeventFuttonFy Gesvvifvyg a shiY lihroitingours a IY

} rekY

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 l9ojetetuel 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 shi 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 @eventFuttonFx pr exempleA et de diviser ette vleur pr l tille d9un lo @esvvifvygAF 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 esvvifvyg qui vut ii QRF
US G QR a P

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
IH G QR a H

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
rteeventFuttonFx G esvvifvygeventFuttonFy G esvvifvyg a ojetetuelY

eutre hose trs importnte X on met un oolen liquheingours @ou lihroit selon le sA IF gel nous permettr de svoir lors d9un vnement wyiwysyx si un outon de l souris est enfon pendnt le dplementF
hvwyifyx
se hvwyifyxX GG yn dstive le oolen qui disit qu9un outon tit enfon

RHS

CHAPITRE 24. TP : MARIO SOKOBAN


if @eventFuttonFutton aa hvfyxvipA liquheingours a HY else if @eventFuttonFutton aa hvfyxsqrA lihroitingours a HY rekY

v9vnement wyifyx sert simplement remettre le oolen HF yn sit que le li est termin et don qu9il n9y plus de  li en ours F
hvwyiwysyx
se hvwyiwysyxX if @liquheingoursA GG i on dple l souris et que le outon guhe de l souris est enfon { rteeventFmotionFx G esvvifvygeventFmotionFy G esvvifvyg a ojetetuelY } else if @lihroitingoursA GG reil pour le outon droit de l souris { rteeventFmotionFx G esvvifvygeventFmotionFy G esvvifvyg a shiY } rekY

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 wyifyxhyx X on met un oolen liingours IF PF vors d9un wyiwysyx X on teste si le oolen liingours 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 wyifyx X on remet le oolen liingours HD r le li est termin @relhement du outon de l sourisAF RHT

L'DITEUR DE NIVEAUX
hvuihyx

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
se hvuihyxX swith@eventFkeyFkeysymFsymA { se hvuigeiX ontinuer a HY rekY se hvusX suvegrderxiveu@rteAY rekY se hvuX hrgerxiveu@rteAY rekY se hvuuIX ojetetuel a wY rekY se hvuuPX ojetetuel a gesiY rekY se hvuuQX ojetetuel a yftigspY rekY se hvuuRX ojetetuel a wesyY rekY } rekY

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
GG iffement de l9rn hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY GG lement des ojets l9rn for @i a H Y i ` xffvygveqi Y iCCA

RHU

CHAPITRE 24. TP : MARIO SOKOBAN


{

for @j a H Y j ` xffvygrei Y jCCA { positionFx a i B esvvifvygY positionFy a j B esvvifvygY swith@rteijA { se wX hvfliturfe@murD xvvD ernD 8positionAY rekY se gesiX hvfliturfe@isseD xvvD ernD 8positionAY rekY se yftigspX hvfliturfe@ojetifD xvvD ernD 8positionAY rekY se wesyX hvfliturfe@mrioD xvvD ernD 8positionAY rekY }

GG wise jour de l9rn hvplip@ernAY

sl ne fut ps oulier prs l oule priniple de fire les s9imposent X


hvpreeurfe@murAY hvpreeurfe@isseAY hvpreeurfe@ojetifAY hvpreeurfe@mrioAY

hvpreeurfe

qui

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 RHV

RSUM ET AMLIORATIONS

our viter de vous proposer des dizines de pges de ode qui rptent tout e qu9on vient de voirD je vous propose plutt de tlhrger le ode soure omplet du proE grmme insi que l9exutle F 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 hvsmge 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 Fp 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 F et FhF ge n9est ps ien ompliquD vous verrezF ous noterez que le projet ontientD en plus des F et des FhD un (hier ressouresFrF 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 gode we X VTPPQU
9. Compil pour Windows.

RHW

CHAPITRE 24. TP : MARIO SOKOBAN

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 @sokonFonlineFfrAF our tlhrger le wrio okon mlior pour indows X gode we X RHITQT it pour tlhrger l version vinux X gode we X TQHUIS
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)

RIH

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

RII

CHAPITRE 25. MATRISEZ LE TEMPS !

Le Delay et les ticks


hns un premier tempsD nous llons pprendre utiliser deux fontions trs simples X ! hvhely X permet de mettre en puse le progrmme un ertin nomre de milliseE ondes Y ! hvqetiks 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 hvhely peut don tre utilise pour rduire l9utilistion du proesseur F qre hvhelyD vous pourrez rendre votre progrmme moins gourmnd en ressoures proE esseurF sl fer don moins  rmer votre g si hvhely 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
void hvhely@intQP msAY

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
hvhely@IHHHAY

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-

RIP

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 hvhely 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 firefoxFexeD puis pendnt IIH ms sur explorerFexe Y ensuiteD pendnt VH ms tu vs trviller sur progrmmesdlFexeD puis retrviller sur firefoxFexe 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 hvhely 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 :
hvhely@IAY

. . . vous pouvez tre certains que votre programme ne sera pas mis en pause 1 ms mais un peu plus (peut-tre 9-10 ms).
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.

RIQ

CHAPITRE 25. MATRISEZ LE TEMPS !


hvhely 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 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
intQP hvqetiks@voidAY

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 hvhely est ssez file omprendre et utiliserD e n9est ps le s de l fontion hvqetiksF 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 gode we X SQRWIV sntressonsEnous ozorF xous voulons le fire ougerF our elD le mieux est d9utiliser hvqetiksF yn v voir esoin de deux vriles X tempsreedent et tempsetuelF illes vont stoker le temps retourn pr hvqetiks des moments di'rentsF sl nous su0r de fire l di'rene entre tempsetuel et tempsreedent 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
int tempsreedent a HD tempsetuel a HY

RIR

LE DELAY ET LES TICKS

Figure PSFI ! ozor u entre de l9rn

wintenntD dns notre oule in(nieD nous llons jouter le ode suivnt X
tempsetuel a hvqetiks@AY if @tempsetuel E tempsreedent b QHA GB i QH ms se sont oules BG { positionozorFxCCY GB yn ouge ozor BG tempsreedent a tempsetuelY GB ve temps 4tuel4 devient le temps 4preedent4 pour nos futurs luls BG }

gomprenez ien e qui se psseF IF yn prend le temps tuel gre hvqetiksF 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
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.

RIS

CHAPITRE 25. MATRISEZ LE TEMPS !

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
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 hvitiventF ille tit trs prtique jusqu9iiD puisqu9on n9vit ps grer le tempsF gette fontion mettit en puse le progrmme @un peu l mnire de hvhelyA 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 hvitivent 3 v solution c hvolliventF te vous vis dj prsent ette fontion X ontrirement hvitiventD 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


int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bzozor a xvvY hvet positionozorY hvivent eventY int ontinuer a IY int tempsreedent a HD tempsetuel a HY hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du temps en hv4D xvvAY zozor a hvvodfw@4zozorFmp4AY

RIT

LE DELAY ET LES TICKS


hvetgoloruey@zozorD hvggyvyuiD hvwpqf@zozorEbformtD HD HD PSSAAY positionozorFx a ernEbw G P E zozorEbw G PY positionozorFy a ernEbh G P E zozorEbh G PY hvinleueyepet@IHD IHAY while @ontinuerA { hvollivent@8eventAY GB yn utilise ollivent et non itivent pour ne ps loquer le progrmme BG swith@eventFtypeA { se hvsX ontinuer a HY rekY } tempsetuel a hvqetiks@AY if @tempsetuel E tempsreedent b QHA GB i QH ms se sont oules depuis le dernier tour de oule BG { positionozorFxCCY GB yn ouge ozor BG tempsreedent a tempsetuelY GB ve temps 4tuel4 devient le temps 4preedent4 pour nos futurs luls BG } hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY hvfliturfe@zozorD xvvD ernD 8positionozorAY hvplip@ernAY

hvpreeurfe@zozorAY hvuit@AY } return isggiY

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 RIU

gode

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 roessusA 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 testsdlFexeF 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 hvhely pour ptienter le temps qu9il fut (n que fsse QH msF yn v juste jouter un hvhely dns un else X
tempsetuel a hvqetiks@AY if @tempsetuel E tempsreedent b QHA { positionozorFxCCY tempsreedent a tempsetuelY } else GB i fit moins de QH ms depuis le dernier tour de ouleD on endort le progrmme le temps qu9il fut BG { hvhely@QH E @tempsetuel E tempsreedentAAY }

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 hvhely le temps qu9il fut pour tteindre les QH ms environF h9o mon petit lul QH E @tempsetuel E tempsreedentAF 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. . .
hvhely

mettra peut-tre quelques millisecondes de

RIV

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 versvhroite 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 positionozorFx et positionozorFy
4. Couramment abrg FPS pour  Frames per second .

RIW

CHAPITRE 25. MATRISEZ LE TEMPS !

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 ! 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 hvqetiksF 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 ougerinnemi@A 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 hvqetiks 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 hvsxsswiF ous devriez don ppeler votre fontion hvsnit omme ei X
hvsnit@hvsxsshiy | hvsxsswiAY

v hv est mintennt prte utiliser les timers 3

Ajouter un timer
our jouter un timerD on fit ppel l fontion hveddimer 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

RPH

LES TIMERS
hvimersh hveddimer@intQP intervlD hvxewimergllk llkD void BprmAY

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 hveddimer renvoie un numro de timer @un  sh AF ous devez stoker e rsultt dns une vrile de type hvimershF 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

hvimersh timerY GB rile pour stoker le numro du timer BG

F F F puis on v rer notre timer X


timer a hveddimer@QHD ougerozorD 8positionozorAY GB hmrrge 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 ougerozor 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 ougerozor ser de hnger l position de ozor toutes les QH msF
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. 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).

RPI

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
intQP nomhevpontion@intQP intervlleD void BprmetreAY

our rer le llk ougerozorD je devri don rire l fontion omme ei X


intQP ougerozor@intQP intervlleD void BprmetreAY

oii mintennt le ontenu de m fontion ougerozorD qui est plus dlite qu9il n9y prt X
GB pontion de llk @ser ppele toutes les QH msA BG intQP ougerozor@intQP intervlleD void BprmetreA { hvetB positionozor a prmetreY GB gonversion de voidB en hvetB BG positionozorEbxCCY } return intervlleY

v fontion ougerozor 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 hvet @positionozorAF 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 hvetB @un pointeur sur hvetAF our fire D je re un pointeur sur hvet dns m fontion qui prend omme vleurF F F le pointeur prmetreF
7

Quel intrt d'avoir cr un DEUXIME pointeur qui contient la mme adresse ?

v9intrtD 9est que positionozor est de type hvetB ontrirement l vrile prmetre qui tit de type voidBF
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.

RPP

LES TIMERS

ous pourrez don der positionozorEbx et positionozorEbyF i vous viez fit prmetreEbx ou prmetreEbyD le ompilteur urit tout rejet en lo pre 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 positionozorEbx pour dler ozor vers l droiteF hernire hoseD trs importnte X vous devez retourner l vrile intervlleF 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


hvemoveimer@timerAY GB errt du timer BG

sl su0t d9ppeler hvemoveimer en indiqunt l9sh du timer rrterF siD j9rrte le timer juste prs l oule in(nieD u mme endroit que les hvpreeurfeF

En rsum
! v fontion hvhely 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 hvqetiksF eve quelques petits lulsD on peut s9en servir pour e'etuer une gestion des vnements non loqunte ve hvolliventF ! 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 hvqetiks mis les timers ident rendre le progrmme plus lisile et mieux struturF

RPQ

CHAPITRE 25. MATRISEZ LE TEMPS !

RPR

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 hvurfe partir du texte que vous lui envoyez.

RPS

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

Installer SDL_ttf
sl fut svoir queD omme hvimgeD hvttf est une iliothque qui nessite que l hv soit instlle F out omme hvimgeD hvttf 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 ?


hvttf 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 hvttf fit ppel une utre iliothque X FreeTypeF g9est une iliothque ple de lire les (hiers de polie @FttfA et d9en sortir l9imgeF hvttf rupre don ette imge et l onvertit pour l hv en rnt une hvurfeF hvttf don esoin de l iliothque preeype pour fontionnerD sinon elle ne ser ps ple de lire les (hiers FttfF 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 hvttfFdllF 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 gode we X PHSVVI

Installer SDL_ttf
endezEvous sur l pge de tlhrgement de hvttfF gode we X IVUUPU vD hoisissez le (hier qu9il vous fut dns l setion Binary F ve (hier s ontient omme d9hitude un dossier inlude et un dossier liF lez le ontenu du dossier inlude dns mingwQPGinludeGhv et le ontenu du dossier li dns mingwQPGliF
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.

RPT

INSTALLER SDL_TTF

Vous

mingwQPGinludeGhv

devez

copier

Attention aux erreurs !

le chier hvttfFh dans le dossier et non pas dans mingwQPGinlude 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 hvttfF sl v flloir modi(er les options du linker pour qu9il ompile ien votre progrmme en utilisnt l iliothque hvttfF ous vez dj ppris fire ette oprtion pour l hv et pour hvimgeD 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 rojet G fuild yptions Y ! dns l9onglet vinkerD liquez sur le petit outon edd Y ! indiquez o se trouve le (hier hvttfFli 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 hvttfF ous n9vez ps vous prouper de preeypeD 9est hvttf 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 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
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. ;-)

RPU

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

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 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 hvttf 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 hvttfD mintennt 3
5

Chargement de SDL_ttf
L'include
evnt toute hoseD il fut jouter l9inlude suivnt en hut de votre (hier F X
5inlude `hvGhvttfFhb

i vous vez des erreurs de ompiltion e stdeD vri(ez si vous vez ien pl le (hier hvttfFh dns le dossier mingwQPGinludeGhv et non dns mingwQPGinlude tout ourtF

Dmarrage de SDL_ttf
out omme l hvD hvttf esoin d9tre dmrre et rrteF sl y don des fontions trs similires elles de l hv X ! psnit X dmrre hvttf Y ! puit X rrte hvttfF
Il n'est pas ncessaire que la SDL soit dmarre avant hvttf.

our dmrrer hvttf @on dit ussi  initiliser AD on doit don ppeler l fontion psnit@AF euun prmtre n9est nessireF v fontion renvoie EI s9il y eu une erreurF ous pouvez don dmrrer hvttf trs simplement omme ei X
psnit@AY
5. Oui, c'est peu !

RPV

CHARGEMENT DE SDL_TTF

i vous voulez vri(er s9il y une erreur et tre insi plus rigoureuxD utilisez plutt e ode X
if@psnit@A aa EIA { fprintf@stderrD 4irreur d9initilistion de psnit X 7sn4D pqetirror@AAY exit@ispesviAY }

9il y eu une erreur u dmrrge de hvttfD un (hier stderrFtxt ser r @sous indowsD du moinsA ontennt un messge explitif de l9erreurF our eux qui se poserient l question X l fontion pqetirror@A renvoie le dernier messge d9erreur de hvttfF g9est pour el qu9on l9utilise dns le fprintfF

Arrt de SDL_ttf
our rrter hvttfD on ppelle puit@AF v enoreD ps de prmtreD ps de prise de tteF ous pouvez ppeler puit vnt ou prs hvuitD peu importeF
puit@AY

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 hvttf 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 ! pypenpont X ouvre un (hier de polie @FttfA Y ! pglosepont X ferme une polie ouverteF pypenpont doit stoker son rsultt dns une vrile de type ppontF ous devez rer un pointeur de ppontD omme ei X
ppont Bpolie a xvvY

ve pointeur polie ontiendr don les informtions sur l polie une fois qu9on l9ur ouverteF v fontion pypenpont prend deux prmtres X ! le nom du (hier de polie @u formt FttfA ouvrirF v9idl 9est de mettre le (hier de polie dns le rpertoire de votre projetF ixemple de (hier X rilFttf @pour l polie erilA Y RPW

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 FttfF 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 g:indowspontsF 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 prolmeD n9utilisez que des minusules et vitez les espesF ! ixemple de nom inorret X swi xi ywexFp Y ! ixemple de nom orret X timesFttfF
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 dfontFomD qui est ien lssD trs ien fourni et vriF 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


Charger la police

te vous propose d9utiliser l polie engelin pour l suite des exemplesF ous pouvez l tlhrger en ligneF RQH

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFQ ! olie engelin

we X QIPSPR yn ouvrir l polie omme ei X


polie a pypenpont@4ngelinFttf4D TSAY

gode

v polie utilise ser ngelinFttfF 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 pypenpont stoke le rsultt dns l vrile polieF 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 puit@AF hns mon sD donner don le ode suivnt X
pglosepont@polieAY GB hoit tre vnt puit@A BG puit@AY

it voil le trvil 3

Les direntes mthodes d'criture


wintennt que hvttf est hrge et qu9on une vrile polie hrge elle ussiD plus rien ni personne ne nous empher d9rire du texte dns notre fentre hv 3 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 hvttf de dessiner du texteF RQI

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

! Solid @(gF PTFRA X 9est l tehnique l plus rpideF ve texte ser rpidement rit dns une hvurfeF 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 hvurfe 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 hvurfeF 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

Figure PTFS ! hded X mode d9riture lent mis plus joli r ntilis " fond oliE

gtoirement uni in rsum X

6. Cela signie que leurs contours seront adoucis, ce qui est plus agrable l'il.

RQP

LES DIFFRENTES MTHODES D'CRITURE

Figure PTFT ! flended X mode d9riture lent @et lit lentA mis ien plus eu r ntilis et fontionne sur un fond non uni

! 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 hvttfF 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 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 hr 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 ! penderextolid Y ! penderexthded Y ! penderextflendedF RQQ

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

Exemple d'criture de texte en Blended


our spi(er une ouleur hvttfD on ne v ps utiliser le mme type qu9ve l hv @un intQP r l9ide de l fontion hvwpqfAF eu ontrireD nous llons utiliser une struture toute prte de l hv X hvgolorF gette struture omporte trois sousEvriles X l quntit de rougeD de vert et de leuF i vous voulez rer une vrile ouleurxoireD vous devrez don rire X
hvgolor ouleurxoire a {HD HD H}Y

Attention ne pas confondre avec les couleurs qu'utilise habituellement la SDL ! La SDL utilise des intQP crs l'aide de hvwpqf. hvttf utilise des hvgolor.

yn v rire un texte en noir dns une hvurfe texte X


texte a penderextflended@polieD 4lut les rHs 34D ouleurxoireAY

ous voyez dns l9ordre les prmtres envoyer X l polie @de type ppontAD le texte rireD et en(n l ouleur @de type hvgolorAF ve rsultt est stok dns une hvurfeF hvttf 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 hvurfeD 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 hvurfeF ous n9urez qu9 rire X
texteEbw GB honne l lrgeur BG texteEbh GB honne l huteur BG

Code complet d'criture de texte


ous svez dsormis tout e qu9il fut onntre sur hvttfF oyons pour rsumer un ode omplet d9riture de texte en mode flended X
5inlude 5inlude 5inlude 5inlude 5inlude `stdliFhb `stdioFhb `hvGhvFhb `hvGhvimgeFhb `hvGhvttfFhb

int min@int rgD hr BrgvA {

RQR

LES DIFFRENTES MTHODES D'CRITURE


hvurfe Bern a xvvD Btexte a xvvD Bfond a xvvY hvet positionY hvivent eventY ppont Bpolie a xvvY hvgolor ouleurxoire a {HD HD H}Y int ontinuer a IY hvsnit@hvsxsshiyAY psnit@AY ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du texte ve hvttf4D xvvAY fond a swqvod@4morirFjpg4AY GB ghrgement de l polie BG polie a pypenpont@4ngelinFttf4D TSAY GB riture du texte dns l hvurfe texte en mode flended @optimlA BG texte a penderextflended@polieD 4lut les rHs 34D ouleurxoireAY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY } hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY positionFx a HY positionFy a HY hvfliturfe@fondD xvvD ernD 8positionAY GB flit du fond BG positionFx a THY positionFy a QUHY hvfliturfe@texteD xvvD ernD 8positionAY GB flit du texte BG hvplip@ernAY

pglosepont@polieAY puit@AY hvpreeurfe@texteAY hvuit@AY } return isggiY

RQS

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

we X PVSRWR ve rsultt vous est prsent sur l (gF PTFUF

gode

Figure PTFU ! n texte rit l9ide de hvttf

i vous voulez hnger de mode d9riture pour testerD il n9y qu9une ligne modi(er X elle rnt l surfe @ve l9ppel l fontion penderextflendedAF
La fonction penderexthded 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 hvgolor 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 polie vlideF ous pouvez lors fire ppel l fontion petponttyle 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 our les )gsD vous devez utiliser es onstntes X RQT

LES DIFFRENTES MTHODES D'CRITURE

! pvixywev X norml Y ! pvifyvh X grs Y ! pvisevsg X itlique Y ! pvixhivsxi X soulignF gomme 9est une liste de )gsD vous pouvez les ominer l9ide du symole | omme on ppris le fireF estons X
GB ghrgement de l polie BG polie a pypenpont@4ngelinFttf4D TSAY GB ve texte ser rit en itlique et soulign BG petponttyle@polieD pvisevsg | pvixhivsxiAY GB riture du texte en itlique et soulign BG texte a penderextflended@polieD 4lut les rHs 34D ouleurxoireAY

sulttD le texte est rit en itlique et soulign @(gF PTFVAF

Figure PTFV ! riture en itlique et soulign

our resturer une polie son tt normlD il su0t de refire ppel l fontion petponttyle en utilisnt ette fois le )g pvixywevF

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 RQU

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

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 hrB penderext 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 hrF
7

Veillez rserver susamment d'espace pour le tableau de hr si vous ne voulez pas dborder en mmoire !

ixemple X
sprintf@tempsD 4emps X 7d4D ompteurAY

siD temps est un tleu de hr @PH rtresAD et ompteur est un int qui ontient le tempsF eprs ette instrutionD l hne temps ontiendr pr exemple 4emps X SHH4F vous de jouer 3
Correction

oii une orretion possile de l9exerie X


int min@int rgD hr BrgvA { hvurfe Bern a xvvD Btexte a xvvY hvet positionY hvivent eventY ppont Bpolie a xvvY hvgolor ouleurxoire a {HD HD H}D ouleurflnhe a {PSSD PSSD PSS}Y int ontinuer a IY int tempsetuel a HD tempsreedent a HD ompteur a HY hr tempsPH a 44Y GB leu de hr suffismment grnd BG hvsnit@hvsxsshiyAY psnit@AY
7. Le  s  de sprintf signie  string , c'est--dire  chane  en anglais.

RQV

LES DIFFRENTES MTHODES D'CRITURE


ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du texte ve hvttf4D xvvAY GB ghrgement de l polie BG polie a pypenpont@4ngelinFttf4D TSAY GB snitilistion du temps et du texte BG tempsetuel a hvqetiks@AY sprintf@tempsD 4emps X 7d4D ompteurAY texte a penderexthded@polieD tempsD ouleurxoireD ouleurflnheAY while @ontinuerA { hvollivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY } hvpillet@ernD xvvD hvwpqf@ernEbformtD PSSD PSSD PSSAAY tempsetuel a hvqetiks@AY if @tempsetuel E tempsreedent ba IHHA GB i IHH ms u moins se sont oules BG { ompteur Ca IHHY GB yn rjoute IHH ms u ompteur BG sprintf@tempsD 4emps X 7d4D ompteurAY GB yn rit dns l hne 4temps4 le nouveu temps BG hvpreeurfe@texteAY GB yn supprime l surfe prdente BG texte a penderexthded@polieD tempsD ouleurxoireD ouleurflnheAY GB yn rit l hne temps dns l hvurfe BG tempsreedent a tempsetuelY GB yn met jour le tempsreedent BG } positionFx a IVHY positionFy a PIHY hvfliturfe@texteD xvvD ernD 8positionAY GB flit du texte BG hvplip@ernAY } pglosepont@polieAY puit@AY hvpreeurfe@texteAY hvuit@AY return isggiY

RQW

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF


}

we X WIQIHU v (gF PTFW vous prsente le rsultt u out de IQDW seondes trs extementF

gode

Figure PTFW ! ve ompteur u out de IQDW seondes

x9hsitez ps tlhrger e projet si vous souhitez l9tudier en dtil et l9mliorerF sl n9est ps enore prfit X on pourrit pr exemple utiliser hvhely pour viter d9utiliser IHH 7 du gF gode we X UTSTPW
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 RRH

LES DIFFRENTES MTHODES D'CRITURE

En rsum
! yn ne peut ps rire de texte en hvD moins d9utiliser une extension omme l iliothque hvttfF ! gette iliothque permet de hrger un (hier de polie u formt Fttf l9ide de l fontion pypenpontF ! sl y trois modes d9riture du texteD du plus simple u plus sophistiqu X SolidD Shaded et BlendedF ! yn rit dns une hvurfe vi des fontions omme penderextflendedF

RRI

CHAPITRE 26. CRIRE DU TEXTE AVEC SDL_TTF

RRP

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.

RRQ

CHAPITRE 27. JOUER DU SON AVEC FMOD

pwyh est sns uun doute une des meilleures iliothques udio qui existent e jourF sl urit t possile de trviller ve le module udio de l hvD mis tnt donn ses limittions il ser ien plus intressnt pour nous d9instller une iliothque spilise dns le domineD omme pwyhF
1

Installer FMOD
Tlcharger FMOD
our tlhrger l iliothqueD il fut vous rendre sur son site o0ielF gode we X RUVQWI
FMOD est une bibliothque gratuite mais pas sous license LGPL, contrairement la SDL. Cela signie que vous pouvez l'utiliser gratuitement du moment que vous ne l'utilisez pas pour raliser un programme payant . 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).
2

endezEvous sur l pge des tlhrgements @hownlodsA et prenez pwyh QF ettention X il y plusieurs versions de pwyhD et en prtiulier une plus renteD ppele pwyh ix @il s9git en fit de pwyh RAF outefoisD pwyh ix est une iliothque gCCD ontrirement pwyh Q qui est une iliothque gF

Installer FMOD
ve (hier que vous vez tlhrg est un (hier s F v9instlltion se droule de l mme mnire qu9ve les utres iliothques qu9on vues jusqu9iiF IF ous vez un dossier epi ve l hvv de pwyh @fmodFdllA pler dns le rpertoire de votre projetF PF hns le dossier piGinD vous trouverez les FhF lezEles t des utres Fh dns le dossier de votre shiF r exemple gode floksGmingwQPGinludeGpwyh @j9i r un dossier spil pour pwyh omme pour hvAF QF hns le dossier piGliD ruprez le (hier qui orrespond votre ompilteurF ! i vous utilisez gode: :floksD don le ompilteur mingwD opiez lifmodF dns le dossier li de votre shiF hns le s de gode: :floksD 9est le dossier godefloksGmingwQPGliF
3

1. On ne peut jouer que des sons WAV, par exemple. 2. On notera que de nombreux jeux clbres font partie des utilisateurs de FMOD, comme World of Warcraft, Need for Speed, Wolfenstein . . . FMOD fonctionne par ailleurs sur un trs grand nombre de plates-formes, particulirement sur des consoles de jeux comme la XBOX 360, la PS2, la PS3, la PSP, la Wii, etc. 3. Si c'est un excutable, c'est que vous avez pris FMOD Ex et non FMOD 3 !

RRR

INSTALLER FMOD

! i vous utilisez isul gCCD ruprez le (hier fmodvFliF RF in(nD et 9est peutEtre le plus importntD dns le dossier doumenttion vous trouverez un (hier d9ide qui orrespond l doumenttion de pwyhF te vous onseille de le pler quelque prt sur votre disque dur et d9en fire un rouri ien visileF in e'etD l doumenttion liste toutes les possiilits de pwyh dns le dtilF hns e hpitreD on ne pourr en voir que les priniplesF i vous voulez llez plus loinD il fudr don vous plonger dns ette do9F sl reste on(gurer notre projetF v enoreD 9est omme d9hitude X vous ouvrez votre projet ve votre shi fvori et vous joutez le (hier F @ou FliA l liste des (hiers que le linker doit ruprerF ous gode: :floksD menu rojet G fuild yptionsD onglet vinkerD liquez sur edd et indiquez o se trouve le (hier FF i on vous demnde Keep as a relative path ?D je vous onseille de rpondre pr l ngtiveD mis dns les deux s devrit de toute mnire mrherF pwyh est instlleD voyons rpidement de quoi elle est onstitueF

Les direntes sections de FMOD


pwyh Q est en fit l ominison de deux iliothques X ! FSOUND X ette prtie gre tous les sons de type gwF sl s9git tout simplement de sons  rels enregistrs Y el omprend ussi ien les formts ompresss que non ompresss X eD wQD yqqD etF ges sons peuvent tre des musiques ou des sons de ourte dure omme des ruits de psD de lleF F F h9illeursD pwyh distingue deux types de sons X ! les sons courts @ruit de psD ruit de lleA destins tre rpts souventD ! les sons longsD omme une musique durnt pr exemple Q minutes @qui peut tre l musique de fond de votre jeuA Y ! FMUSIC X ette setion gre les musiques u formt inireF gette foisD il n9y ps de son enregistrD juste des notes de musiqueF ve formt inire le plus onnu est prolement le wshsF ous svez prolement que les wshs sont des (hiers udio de petite tille X 9est justement pre qu9ils enregistrent seulement les notes de musique @il ne peut don ps y voir de  proles ve un tel formt de (hierAF gette setion peut tre trs utile pour jouer de vieilles musiques type qmeoy ou uperxiD omme pr exemple l musique de uper wrioD de etrisD etF hns e hpitreD nous verrons les trois types de sons r ils se hrgent et se lisent ve des fontions di'rentes X ! pyxh X sons ourts Y ! pyxh X sons longs @musiquesA Y ! pwsg X musique type wshsF RRS

CHAPITRE 27. JOUER DU SON AVEC FMOD

Initialiser et librer FMOD


gomme l pluprt des iliothques rites en gD il fut hrger @on dit ussi  initiE liser A pwyh et l lirer qund on n9en plus esoinF e niveuD ne devrit ps euoup vous hnger de l hvF

Inclure le header
evnt toute hose " vous vez d le fire instintivement mis ne ote rien de le priser " X il fut inlure le (hier Fh de pwyhF
5inlude `pwyhGfmodFhb

t9i pl e (hier dns un sousEdossier pwyhF edptez ette ligne en fontion de l position du (hier si hez vous 9est di'rentF

Initialiser FMOD
yn initilise pwyh ve l fontion pyxhsnitF ille prend Q prmtresF ! La frquence d'chantillonnage X e prmtre permet d9indiquer l qulit de son que doit grer pwyhF lus l frquene est leveD meilleur est le son @mis plus grnde est l puissne demndeAF oii quelques exemples de frquenes pour vous ider fire votre hoixF ! ulit gh X RR IHH rz ! ulit rdio X PP HSH rz ! ulit tlphonique X II HPS rz out u long de e hpitreD nous utiliserons une frquene de RR IHH rz F ! Le nombre maximal de canaux 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 sonF yn onseille gnrlement une vleur de QP @e ser su0snt pour l pluprt des petits jeuxAF our informtionD pwyh peut thoriquement grer jusqu9 IHPR nux di'rentsD mis e niveu risque de fire euoup trviller votre ordinteur 3 ! in(nD on peut indiquer des agsF sl n9y rien de ien intressnt mettre en gnrlD on se ontenter don d9envoyer H @ps de )gsAF xous pouvons don initiliser pwyh omme ei X
4

pyxhsnit@RRIHHD QPD HAY

ge qui signi(e X frquene de RR IHH rz @qulit gh u mieuxAD QP nux et ps d9options prtiulires @)g a HAF
4. Si le son que vous utilisez est de mauvaise qualit la base, FMOD ne l'amliorera pas. Par contre, si vous avez un son de frquence 44 100 Hz et que FMOD utilise une frquence de 22 050 Hz, sa qualit sera diminue.

RRT

LES SONS COURTS

Librer FMOD
yn rrte pwyh de l mnire l plus simple qui soit X
pyxhglose@AY

istEe que j9i vriment esoin de ommenter e ode c YEA

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 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 reours 3A Y ! des ppludissements Y ! etF frefD orrespond dns les grndes lignes tous les sons qui ne sont ps des muE siquesF qnrlementD es sons sont tellements ourts qu9on ne prend ps l peine de les ompresserF yn les trouve don le plus souvent u formt e non ompressF

Trouver des sons courts


evnt de ommenerD il fudrit fire le plein de sonsF he nomreux sites proposent justement des nques de sonsF i vous fites une reherhe l9ide de l9expression  pree ounds ve qoogle @ sons grtuits en nglisAD vous otenez des entines de millions de rsultts 3 ien qu9ve les sites de l premire pgeD vous devriez trouver votre onheurF ersonnellementD j9i retenu pindoundsFomD un moteur de reherhe pour sonsF gode we X VUTVUH in reherhnt  gun D on trouve des tonnes de sons de tir de fusil Y en tpnt  footsE teps on trouve des ruits de psD 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 RRU

CHAPITRE 27. JOUER DU SON AVEC FMOD

Le pointeur

remire tpe X rer un pointeur de type pyxhewvi qui reprsenter notre sonF
pyxhewvi Btir a xvvY

Charger le son

heuxime tpe X hrger le son ve l fontion pyxhmplevodF ille prendF F F S prmtresF ! ve numro de la sample pool dns lquelle pwyh doit grder une tre du sonF te m9explique X l sample pool est une sorte de tleu dns lequel pwyh grde une opie des pointeurs vers hun des sons ourts hrgsF gel lui permet de lirer utomtiquement l mmoire lorsqu9on ppelle pyxhglose@A @l fontion d9rrt de pwyhA X il su0t pwyh de lire e tleu et de lirer hun des lments qui s9y trouventF outefoisD plutt que de fire on(ne pwyhD il vut mieux penser ppeler nousEmmes l fontion de lirtion de mmoire @pyxhmplepree@AA que nous llons douvrir dns quelques instntsF our indiquer un numro de l smple poolD le mieux est d9envoyer pyxhpii l fontionF ille se hrger lors d9ouper le premier emplement lire de l smple pool qu9elle trouverF ! 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 ne nous intresse ps X il permet de priser les caractristiques du chier qu9on veut hrger @frquene d9hntillonngeD etFAF yrD dns le s des eD wQD yqq et gie D es informtions sont insrites dns le (hierF yn v don envoyer l vleur H pour ne rien priserF ! L'oset o doit ommener l letureF gel permet de ommener l leture du son un moment prisF wettez H pour ommener du dutF ! La longueur X si vous prisez un osetD il fudr ussi donner l longueur de son lireF yn mettr l enore H r on veut tout lireF v fontion renvoie l9dresse mmoire lquelle t hrg le sonF oii un exemple de hrgement X
tir a pyxhmplevod@pyxhpiiD 4pnFwv4D HD HD HAY

siD je hrge le son pnFwv et je le ple dns le premier nl lireF ve pointeur tir fer rfrene e son pr l suiteF ous remrquerez qu9en rgle gnrle on lisse les Q derniers prmtres HF te vous invite tlhrger e pnFwv pour fire des tests en mme temps que vous lisez e hpitreF gode we X PSPTHQ v fontion renvoie xvv si le (hier n9 ps t hrgF ous vez tout intrt vri(er si le hrgement russi ou s9il houF RRV

LES SONS COURTS

Jouer le son

ous voulez jouer le son c s de prolme ve l fontion pyxhlyound 3 sl su0t de lui donner un numro de nl sur lequel le jouer insi que le pointeur sur le sonF our le numro de nlD ne vous prenez ps l tte et envoyez pyxhpii pour lisser pwyh grer F
pyxhlyound@pyxhpiiD tirAY

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 pyxhmplepree X
pyxhmplepree@tirAY

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

ve ut est simple X rer un jeu de tirF yn ne v ps rliser un jeu omplet iiD mis juste l gestion du viseurF te vous propose de tlhrger le viseur de l (gF PUFI que j9i moureusement rlis moiEmme sous int F
5

Figure PUFI ! ve viseur

oil les ojetifsF ! 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 pnFwv doit tre jouF peut tre le dut d9un jeu de tirF rop file c ykD lors vous de jouer 3
5. Oui, je sais. . . J'aurais d faire les Beaux Arts.

RRW

CHAPITRE 27. JOUER DU SON AVEC FMOD

La correction

oii le ode omplet X


5inlude 5inlude 5inlude 5inlude 5inlude `stdliFhb `stdioFhb `hvGhvFhb `hvGhvimgeFhb `pwyhGfmodFhb

int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bviseur a xvvY hvivent eventY hvet positionY int ontinuer a IY pyxhewvi Btir a xvvY GB snitilistion de pwyh BG pyxhsnit@RRIHHD QPD HAY GB ghrgement du son et vrifition du hrgement BG tir a pyxhmplevod@pyxhpiiD 4pnFwv4D HD HD HAY if @tir aa xvvA { fprintf@stderrD 4smpossile de lire pnFwvn4AY exit@ispesviAY } GB snitilistion de l hv BG hvsnit@hvsxsshiyAY hvhowgursor@hvhsefviAY ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du son ve pwyh4D xvvAY viseur a swqvod@4viseurFpng4AY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvwyifyxhyxX GB vorqu9on liqueD on joue le son BG pyxhlyound@pyxhpiiD tirAY

RSH

LES SONS COURTS


rekY se hvwyiwysyxX GB vorsqu9on dple l sourisD on ple le entre du viseur l position de l souris BG positionFx a eventFmotionFx E @viseurEbw G PAY positionFy a eventFmotionFy E @viseurEbh G PAY rekY

hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY hvfliturfe@viseurD xvvD ernD 8positionAY hvplip@ernAY

GB yn ferme l hv BG hvpreeurfe@viseurAY hvuit@AY GB yn lire le son et on ferme pwyh BG pyxhmplepree@tirAY pyxhglose@AY } return isggiY

we X VQWUSW v (gF PUFP vous donne un peru du miniEjeuD mis le mieux est enore de voir le rsultt en vido ve le son sur le we 3 gode we X QIUVUP siD j9i hrg pwyh vnt l hv et je l9i lire 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 s9ouvreD sinon il urit peutEtre fllu ttendre quelques milliseondes le temps que pwyh se hrgeF 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 fontion de elF
Ides d'amlioration

gode

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 RSI

CHAPITRE 27. JOUER DU SON AVEC FMOD

Figure PUFP ! eperu du miniEjeu du viseur

tienneD vous vez le niveu mintennt et mme un ode de se pour dmrrer un jeu de tir 3 u9estEe que vous ttendez c YEA
6

Les musiques (MP3, OGG, WMA. . .)


in thorieD l fontion pyxhmplevod 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 l fontion pyxhmplevod hrge tout le (hier en mmoire @et 9est l version dompresse qui est mise en mmoireD prend don 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 des petits outs u fur et mesure de l letureF g9est e que font tous les leteurs udioF
6. Bien sr, les forums du Site du Zro (code web : 473573) 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 qu'on ait !

RSP

LES MUSIQUES (MP3, OGG, WMA. . .)

Trouver des musiques


te vous propose d9utiliser des hnsons lires de droits dns vos progrmmes F ves uE teurs vous utorisent di'user lirement leurs hnsonsD il n9y don uun prolme pour que vous les utilisiez dns vos progrmmesF
7

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 droits 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 !

our tlhrger des musiques liresD je vous reommnde tmendoD un des sites que je prfreD ien que e soit ps le seul qui existe dns le domineF gode we X RHUUQP ves hnsons sont lsses pr styleF ous vez euoup de hoixF yn y trouve de toutF te vis utiliser une hnson du groupe rype de l9lum  vies nd peehes D intitule  rome F ous pouvez l tlhrger u formt wQF gode we X WPTPHV
8

Les tapes suivre pour jouer une musique


gomme d9hitudeD il fut que pwyh soit hrg ve pyxhsnit et dhrg ve pyxhgloseF
Le pointeur

gette foisD le pointeur doit tre de type pyxhiewF


pyxhiew Bmusique a xvvY

Charger le son

gomme je vous l9i ditD le son ser hrg progressivement @on dit en streaming AF ouE tefoisD il fut qund mme ouvrir le (hierD r pour l9instnt notre pointeur musique vut toujours xvvD je vous rppelleF yn utilise ii l fontion pyxhtremypenF ille prend R prmtresD e sont les R mmes derniers prmtres que eux de l fontion pyxhmplevod qu9on vue
7. Vous n'tes pas sans savoir qu'il faut verser une redevance pour pouvoir utiliser la plupart des chansons que vous connaissez ! 8. Vous pouvez retrouver Hype sur leur page MySpace si vous voulez en savoir plus (code web : 839250).

RSQ

CHAPITRE 27. JOUER DU SON AVEC FMOD

tout l9heureF in lirD indiquez le nom du (hier ouvrir dns le premier prmtreD et lissez les Q utres prmtres HF v fontion retourne une dresse mmoire qu9on rupre ve notre pointeur musiqueF
musique a pyxhtremypen@4ryperomeFmpQ4D HD HD HAY

sl est l enore fortement onseill de vri(er si le (hier ien t hrgF in s d9heD le pointeur vut xvvF
Jouer la musique

g9est trs simple X on fit ppel pyxhtremlyF ille prend P prmtres X ! ve numro du nl sur lequel jouer le son @envoyez pyxhpii et pwyh se drouiller tout seul pour trouver un nl lireA ! ve pointeur vers le (hier lire @dns notre sD il s9ppelle musiqueAF yn peut don jouer notre musique ve X
pyxhtremly@pyxhpiiD musiqueAY

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 pprendre fire mintenntF
Modier le volume

eve l fontion pyxhetolumeD vous pouvez hnger le volume d9un nlF


pyxhetolume@pyxhevvD IPHAY

sl fut envoyer P prmtres X ! ve numro du nl dont on doit hnger le volume @pour hnger le volume de tous les nuxD envoyez pyxhevvA ! ve nouveu volume X indiquez un nomre de H @silenieuxA PSS @volume mximlA
Notez que cette fonction permet aussi de changer le volume des sons courts, et pas seulement celui des sons streams (longs).
Rptition de la chanson

yn souvent esoin de rpter l musique de fondF g9est justement e que propose l fontion pyxhtremetvoopgountF ille prend P prmtres X RSR

LES MUSIQUES (MP3, OGG, WMA. . .)

! ve pointeur vers l hnson ! ve nomre de fois qu9elle doit tre rpteF i vous mettez ID l hnson ser don rpte une seule foisF i vous mettez un nomre ngtif @omme EIAD elle ser joue ind(nimentF eve e ode soureD notre musique ser don rpte l9in(ni X
pyxhtremetvoopgount@musiqueD EIAY

our que l rptition fontionneD il fut envoyer pyxhvyyxywev en seond pE rmtre de l fontion pyxhtremypenF
Mettre en pause la chanson

sl y ii P fontions onntre X ! pyxhqetused@numerodunlA X indique si l hnson joue sur le nl indiqu est en puse ou nonF ille renvoie  vri si l hnson est en puseD  fux si elle est en trin d9tre joueF ! pyxhetused@numerodunlD ettA X met en puse ou rtive l leture de l hnson sur le nl indiquF invoyez I @ vri A pour mettre en puseD H @ fux A pour rtiver l letureF ge moreu de ode de fentre hv met en puse l hnson si on ppuie sur D et l rtive si on ppuie nouveu sur ensuiteF
se hvuihyxX if @eventFkeyFkeysymFsym aa hvupA GG i on ppuie sur { if @pyxhqetused@IAA GG i l hnson est en puse pyxhetused@pyxhevvD HAY GG yn enlve l puse else GG inonD elle est en ours de leture pyxhetused@pyxhevvD IAY GG yn met en puse } rekY

Stopper la lecture

sl su0t d9ppeler pyxhtremtopF yn lui envoie le pointeur vers l hnson rrterF


pyxhtremtop@musiqueAY

Et bien d'autres choses

yn peut fire euoup d9utres hosesD mis je ne vis ps toutes vous les numrer iiD utnt rpter l do9 3 te vous invite don l lire si vous herhez des fontions supplmentiresF RSS

CHAPITRE 27. JOUER DU SON AVEC FMOD

Librer la mmoire

our dhrger l musique de l mmoireD ppelez pyxhtremglose et donnezElui le pointeurF


pyxhtremglose@musiqueAY

Code complet de lecture du MP3


ve ode iEdessous vous montre un progrmme jount l musique  rome F v musique est joue ds le dut du progrmmeF yn peut l mettre en puse en ppuynt sur F
int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bpohette a xvvY hvivent eventY hvet positionY int ontinuer a IY pyxhiew Bmusique a xvvY pyxhsnit@RRIHHD QPD HAY GB yn ouvre l musique BG musique a pyxhtremypen@4ryperomeFmpQ4D pyxhvyyxywevD HD HAY if @musique aa xvvA GB yn vrifie si elle ien t ouverte @swyexA BG { fprintf@stderrD 4smpossile de lire ryperomeFmpQn4AY exit@ispesviAY }

pyxhtremetvoopgount@musiqueD EIAY GB yn tive l rptition de l musique l9infini BG pyxhtremly@pyxhpiiD musiqueAY GB yn joue l musique BG hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du son ve pwyh4D xvvAY pohette a swqvod@4hypeliesndspeehesFjpg4AY positionFx a HY positionFy a HY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY

RST

LES MUSIQUES (MIDI)


se hvuihyxX if @eventFkeyFkeysymFsym aa hvupA GGi on ppuie sur { if @pyxhqetused@IAA GG i l hnson est en puse pyxhetused@ID HAY GG yn enlve l puse else GG inonD elle est en ours de leture pyxhetused@ID IAY GG yn tive l puse } rekY

hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY hvfliturfe@pohetteD xvvD ernD 8positionAY hvplip@ernAY

pyxhtremglose@musiqueAY GB yn lire l mmoire BG pyxhglose@AY hvpreeurfe@pohetteAY hvuit@AY } return isggiY

we X UTQVTH 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 gode we X SIUSPT

gode

Les musiques (MIDI)


ves musiques de type wshs sont trs di'rentes des musiques de type wQD yqq ou we qu9on vient d9tudierF in e'etD u lieu d9enregistrer l musique ve un miroD ette fois l musique est re de toutes pies sur l9ordinteurF yn n9enregistre que des notes de musiqueD e qui explique pourquoi on ne peut ps enregistrer l voixF v9vntge c in enregistrnt uniquement les notesD on otient des (hiers trs trs petitsF ous vez peutEtre dj remrqu que les wshs tient de tous petits (hiersF ve dfut c ih ien on ne peut ps enregistrer de voix et les e'ets utoriss pr le formtD ien que nomreuxD sont limitsF ge formt est don indpt pour enregistrer des musiques qui pssent l rdioD pr exemple Y en revnheD il est tout fit dpt pour jouer de vieilles musiques de l9poque de l uperExiD qmefoyD weghriveD etF RSU

CHAPITRE 27. JOUER DU SON AVEC FMOD

Trouver des MIDI


yn trouve des kilotonnes de wshs sur le netF te ne m9en fis ps pour vousD vous trouverez votre onheur 3 ersonnellementD j9i retenu wusiootFomD un moteur de reherhe pour (hiers wshsF gode we X VQQPVT ersonnellementD j9i rupr une vieille musique de wrio @hD les souvenirs 3AF ous pouvez l tlhrger pour vos tests si vous le voulezF gode we X RITIWU

Les tapes suivre pour jouer un MIDI


ves fontions nessires pour jouer des wshs ommenent pr le pr(xe pwsg u lieu de pyxhF outefoisD les fontions de hrgement et de dhrgement de pwyh utiliser restent les mmes et elles ont ien le pr(xe pyxhF ous ommenez voir l9hitudeD je vis don ller mintennt un peu plus vite dns le listing des fontionsF
Le pointeur
pwsgwyhvi Bmusique a xvvY

Charger un MIDI
musique a pwsgvodong@4mrioFmid4AY

v fontion prend un seul prmtre X omme vous le voyezD 9est enore plus simpleF ille renvoie xvv si le (hier n9 ps pu tre hrgF
Jouer un MIDI
pwsglyong@musiqueAY

Rpter un MIDI
pwsgetvooping@musiqueD IAY

gette foisD 9est un peu di'rentF sl fut envoyer I @ vri A pour que l musique soit rpte l9in(niF RSV

LES MUSIQUES (MIDI)

Mettre en pause un MIDI

v fontion pwsgqetused indique si l hnson est en puse ou nonF


pwsgqetused@musiqueAY

v fontion pwsgetused met en puse ou rtive l leture de l hnsonF


pwsgetused@musiqueD IAY

invoyez I pour mettre en puseD H pour relner l letureF oii un exemple de ode grnt l puse si on ppuie sur X
se hvuihyxX if @eventFkeyFkeysymFsym aa hvupA GGi on ppuie sur { if @pwsgqetused@musiqueAA GG i l hnson est en puse pwsgetused@musiqueD HAY GG yn enlve l puse else GG inonD elle est en ours de leture pwsgetused@musiqueD IAY GG yn tive l puse }

Attention : bien que similaire, ce code est dirent du code de pause qu'on a vu tout l'heure. En particulier, il n'y a pas de canal indiquer ici.
Modier le volume
pwsgetwsterolume@musiqueD ISHAY

ve seond prmtre orrespond u volumeF ! H a silenieux ! PST a volume mximl


Stopper la lecture
pwsgtopong@musiqueAY

Librer la musique MIDI


pwsgpreeong@musiqueAY

RSW

CHAPITRE 27. JOUER DU SON AVEC FMOD

Code d'exemple pour rsumer


int min@int rgD hr BrgvA { hvurfe Bern a xvvD Bniveu a xvvY hvivent eventY hvet positionY int ontinuer a IY pwsgwyhvi Bmusique a xvvY pyxhsnit@RRIHHD QPD HAY musique a pwsgvodong@4mrioFmid4AY GG ghrgement de l hnson if @musique aa xvvA { fprintf@stderrD 4smpossile de lire mrioFmidn4AY exit@ispesviAY } pwsgetvooping@musiqueD IAY GG ptition infinie pwsglyong@musiqueAY GG yn joue l hnson hvsnit@hvsxsshiyAY ern a hvetideowode@TRHD RVHD QPD hvrpegi | hvhyfvifpAY hvwetgption@4qestion du son ve pwyh4D xvvAY niveu a swqvod@4mrioniveuFjpg4AY positionFx a HY positionFy a HY while @ontinuerA { hvitivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY se hvuihyxX if @eventFkeyFkeysymFsym aa hvupA GGi on ppuie sur { if @pwsgqetused@musiqueAA GG i l hnson est en puse pwsgetused@musiqueD HAY GG yn enlve l puse else GG inonD elle est en ours de leture pwsgetused@musiqueD IAY GG yn tive l puse } rekY } hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY hvfliturfe@niveuD xvvD ernD 8positionAY hvplip@ernAY

RTH

LES MUSIQUES (MIDI)


} pwsgpreeong@musiqueAY GG hhrgement de l hnson pyxhglose@AY hvpreeurfe@niveuAY hvuit@AY } return isggiY

we X IIIWRW ge ode reprend les fontions priniples qu9on vient de voirF te vous propose de douvrir e que donne en vido F gode we X IPHHSW
9

gode

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 Q types de sons ve pwyh X des sons ourtsD des sons longs @musiques wQD yqqF F FA et des musiques u formt inire @wshsAF ! ghun de es types se lit ve des fontions di'rentesF sl est onseill d9utiliser les fontions dptes et d9viter de hrger un son long omme si 9tit un son ourtD pr exempleF ! pwyh permet de jouer simultnment plusieurs sons di'rents l9ide de nuxF ! v frquene d9hntillonnge indique l qulit du son qui ser jouF

9. La compression de la vido a dtrior la qualit du MIDI original.

RTI

CHAPITRE 27. JOUER DU SON AVEC FMOD

RTP

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 !

RTQ

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 (gF 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 l9ordre et vous n9urez ps d9enE nuis 3

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 gode we X WPTPHV RTR

LES CONSIGNES

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. Activer le module DSP de FMOD


te vous vis dit dns le hpitre sur pwyh que nous n9vions ps vu toutes les possiE ilits de ette iliothqueF ille peut lire ussi des ghD e'etuer des enregistrementsD des modi(tions sur le sonD etF xous llons ii nous intresser un de ses modulesD ppel DSPF quoi servent les fontions du module h c ih ien e sont justement elles qui nous donnent des informtions sur le sonD (n que nous puissions rliser notre visulistion spetrleF sl v flloir tiver e module F gomme on n9en ps toujours esoinD le module h est dstiv pr dfutF reureusementD l9tiver est trs simple X
1

pyxhhetetive@pyxhhqetppnit@AD IAY

ve premier prmtre doit tre le rsultt renvoy pr pyxhhqetppnit@AF unt u seond prmtreD 9est un oolen X ! si on envoie  vri @IAD le module h est tiv Y ! si on envoie  fux @HAD le module h est dstivF r onsquentD si on veut dstiver le module h juste vnt l (n du progrmmeD il su0t d9rire X
pyxhhetetive@pyxhhqetppnit@AD HAY

3. Rcuprer les donnes spectrales du son


our omprendre le fontionnement de l visulistion spetrleD il est indispensle que je vous explique un peu omment fontionne l9intrieur F n son peut tre doup en frquenes @(gF PVFPAF 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 utiliseF ur l guhe de l fentreD nous fisons don pprtre les sses frquenes et sur l droite les hutesF
2

1. Le module DSP n'est pas activ par dfaut car il demande pas mal de calculs supplmentaires l'ordinateur. 2. Ce sera rapide je vous rassure, car je n'ai pas l'intention de transformer ce chapitre en cours de maths !

RTS

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

Figure PVFP ! houpge des frquenes


Mais comment rcuprer les quantits de chaque frquence ?

pwyh nous mhe le trvilF wintennt que le module h est tivD on peut fire ppel l fontion pyxhhqetpetrum@AF sl n9y uun prmtre lui donnerF in revnheD elle vous renvoie quelque hose de trs intressnt X un pointeur vers un tleu de SIP flotF
Rappel : le type flot est un type dcimal, au mme titre que doule. La dirence entre les deux vient du fait que doule est plus prcis que flot, mais dans notre cas le type flot est susant. C'est celui utilis par FMOD ici, c'est donc celui que nous devrons utiliser nous aussi.

sl vous fudr don dlrer un pointeur vers flotF pyxhhqetpetrum@A vous renvoie le pointeur sur le tleuD don sur le premier lmentF in lirD on dlre le pointeur X
flot Bspetre a xvvY

it lorsque l musique est en trin d9tre joue et que le module h est tivD on peut ruprer l9dresse du tleu de SIP flot que nous r pwyh X
spetre a pyxhhqetpetrum@AY

RTT

LES CONSIGNES

yn peut ensuite prourir e tleu pour otenir les vleurs de hune des frquenes X
spetreH GG prquene l plus sse @ guheA spetreI spetreP FFF spetreSHW spetreSIH spetreSII GG prquene l plus hute @ droiteA

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 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 R 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 flot 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 flot en refisnt ppel pyxhhqetpetrum@A toutes les PS ms D puis que vous mettiez jour votre grphique en rresF
3

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 en voir SIP 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 fondre 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
3. Relisez le chapitre sur la gestion du temps en SDL pour vous rappeler comment faire. Vous avez le choix entre une solution base de GetTicks ou base de callbacks. Faites ce qui vous parat le plus facile.

RTU

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

Mais. . . une surface ne peut avoir qu'une seule couleur si on utilise hvpillet@A. On ne peut pas faire de dgrad !

in e'etF yn pourrit ertes rer des surfes de I pixel de lrge et de hut pour hque ouleur du dgrdD mis ferit vriment euoup de surfes grer et ne serit ps trs optimis 3 gomment fitEon pour dessiner pixel pr pixel c te ne vous l9i ps ppris uprvnt 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 droit de l9rire nousEmmesF our e fireD il fut suivre es tpes mthodiquement dns l9ordreF IF pites ppel l fontion hvvokurfe 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 ern 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 nousEmmes dns notre progrmmeF gette fontionD je vous l donneF te l tire de l douE menttion 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
void setixel@hvurfe BsurfeD int xD int yD intQP pixelA { int pp a surfeEbformtEbfyteserixelY intV Bp a @intV BAsurfeEbpixels C y B surfeEbpith C x B ppY swith@ppA { se IX Bp a pixelY rekY se PX B@intIT BAp a pixelY rekY se QX if@hvfiyhi aa hvfsqixhsexA {

RTV

LES CONSIGNES
pH pI pP } else { pH pI pP } rekY a @pixel bb ITA 8 HxffY a @pixel bb VA 8 HxffY a pixel 8 HxffY a pixel 8 HxffY a @pixel bb VA 8 HxffY a @pixel bb ITA 8 HxffY

se RX B@intQP BAp a pixelY rekY }

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 hvvokurfeA 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 intQPD vous pouvez don l gnrer l9ide de l fontion hvwpqf@A 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 hvnlokurfeF
hvnlokurfe@ernAY

gode

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 ern @don u milieu de l fentreAF
hvvokurfe@ernAY GB yn loque l surfe BG GB yn dessine un pixel rouge u milieu de l9rn BG setixel@ernD ernEbw G PD ernEbh G PD hvwpqf@ernEbformtD PSSD HD HAAY hvnlokurfe@ernAY GB yn dloque l surfeBG

eve ette se vous devriez pouvoir rliser des dgrds du vert u rouge F
4

4. Un indice : il faut utiliser des boucles. :-p

RTW

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

La solution
elorsD omment vous vez 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 ompte 9est de (nir pr y rriverF uel que soit le projet dns lequel vous vous lnerezD vous urez forment des petits moments o il ne su0t ps de svoir progrmmerD il fut ussi tre logique et ien r)hirF

Le code
te vous donne le ode omplet iEdessousF xous le ommenterons ensuiteF
5inlude 5inlude 5inlude 5inlude 5define 5define 5define 5define `stdliFhb `stdioFhb `hvGhvFhb `pwyhGfmodFhb veqipixii SIP reipixii RHH esy @reipixii G PSSFHA hivesepesgrsiwix PS

void setixel@hvurfe BsurfeD int xD int yD intQP pixelAY int min@int rgD hr BrgvA { hvurfe Bern a xvvY hvivent eventY int ontinuer a ID huteurfrre a HD tempsetuel a HD tempsreedent a HD i a HD j a HY flot Bspetre a xvvY GB snitilistion de pwyh EEEEEEEEEEEEEEEEEEEEEE BG pyxhsnit@RRIHHD RD HAY pyxhiewB musique a pyxhtremypen@4ryperomeFmpQ4D HD HD HAY if @musique aa xvvA { fprintf@stderrD 4smpossile d9ouvrir l musique4AY exit@ispesviAY } pyxhhetetive@pyxhhqetppnit@AD IAY pyxhtremly@pyxhpiiD musiqueAY GB snitilistion de l hv

RUH

LA SOLUTION
EEEEEEEEEEEEEEEEEEEEEEEE BG hvsnit@hvsxsshiyAY ern a hvetideowode@veqipixiiD reipixiiD QPD hvpegi | hvhyfvifpAY hvwetgption@4isulistion spetrle du son4D xvvAY GB foule priniple BG while @ontinuerA { hvollivent@8eventAY swith@eventFtypeA { se hvsX ontinuer a HY rekY } hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY GB qestion du temps EEEEEEEEEEEEEEEEE BG tempsetuel a hvqetiks@AY if @tempsetuel E tempsreedent ` hivesepesgrsiwixA { hvhely@hivesepesgrsiwix E @tempsetuel E tempsreedentAAY } tempsreedent a hvqetiks@AY GB hessin du spetre sonore EEEEEEEEEEEEEEEEEEEEEEEE BG spetre a pyxhhqetpetrum@AY hvvokurfe@ernAY for @i a H Y i ` veqipixii Y iCCA { huteurfrre a spetrei B R B reipixiiY if @huteurfrre b reipixiiA huteurfrre a reipixiiY for @j a reipixii E huteurfrre Y j ` reipixii Y jCCA { setixel@ernD iD jD hvwpqf@ernEbformtD PSS E @j G

RUI

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

esyAD j G esyD HAAY

hvnlokurfe@ernAY } hvplip@ernAY

pyxhhetetive@pyxhhqetppnit@AD HAY pyxhtremglose@musiqueAY pyxhglose@AY hvuit@AY } return isggiY

void setixel@hvurfe BsurfeD int xD int yD intQP pixelA { int pp a surfeEbformtEbfyteserixelY intV Bp a @intV BAsurfeEbpixels C y B surfeEbpith C x B ppY swith@ppA { se IX Bp a pixelY rekY se PX B@intIT BAp a pixelY rekY se QX if@hvfiyhi aa hvfsqixhsexA { pH a @pixel bb ITA 8 HxffY pI a @pixel bb VA 8 HxffY pP a pixel 8 HxffY } else { pH a pixel 8 HxffY pI a @pixel bb VA 8 HxffY pP a @pixel bb ITA 8 HxffY } rekY se RX B@intQP BAp a pixelY rekY }

RUP

LA SOLUTION

ous pouvez ruprer e ode dns une version lrgement ommente si vous le dsirezF gode we X VWPPIT

Explication du code
hns un premier tempsD on initilise pwyhD l musique et le module hF yn hrge ensuite l hvF hns m oule prinipleD j9i hoisi de grer le temps vi hvqetiks @je n9i ps fit de llkAF te vri(e hque tour de oule qu9u moins PS ms se sont oulesF i e n9est ps le sD on ttend le temps qu9il fut ve hvhely pour tteindre les PS msF yn peut ensuite dessiner le spetre sonoreF yn rupre le tleu de SIP flot et on trville ensuite pixel pr pixel sur l surfe ern pour y dessiner les rres ve deux oules X l premire pour prourir l fentre en lrgeur et l seonde pour l prourir en huteur et y dessiner hque rreF gomme je vous l9vis ditD j9i multipli pr R l vleur du spetre pour  zoomer un peuF fien entenduD on risque lors de dpsser l huteur de l fentre X je tronque don l rre vertile si on dpsse reipixiiF insuiteD il ne reste plus qu9 prourir en huteur l fentre pour dessiner l rreF sl fut fire quelques lgers luls pour dpter proportionnellement l rre l huteur de l fentreF

Tlcharger et visualiser le rsultat


ous devriez otenir un rsultt orrespondnt l pture d9rn que je vous vis montre u dut du hpitreF fien entenduD il vut mieux une nimtion pour pprE ier e rsulttF g9est don e que je vous propose de visuliserF gode we X PHSRHR xotez que l ompression rduit l qulit du son et le nomre d9imges pr seondeF 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 ondiE tionsF gode we X VIUHSW
Il faut imprativement que le chier ryperomeFmpQ soit plac dans le dossier du programme pour que celui-ci fonctionne (sinon il s'arrtera de suite).

RUQ

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON

Ides d'amlioration
sl est toujours possile d9mliorer un progrmmeF siD j9i de nomreuses ides d9exE tensions 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 FmpQ prsents dns le dossier du progrmmeF yn n9 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 ! ous pourriez 0her le nom du wQ en ours de leture dns l fentre @il fudr utiliser hvttfAF ! ous pourriez 0her un inditeur pour qu9on she o en est de 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 leteurs udioD il ne tient plus qu9 vous de les oder 3
5

5. Indice : utilisez la bibliothque dirent (il faudra inclure dirent.h). vous de chercher des informations sur le web pour savoir comment l'utiliser.

RUR

Quatrime partie
Les structures de donnes

RUS

Chapitre

29
Dicult :

Les listes chanes

our stocker des donnes en mmoire, nous avons utilis des variables simples (type int, doule. . .), 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.

RUU

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

RUV

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

typedef strut ilement ilementY strut ilement { int nomreY ilement BsuivntY }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 douleD 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 suivntF 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.

RUW

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
typedef strut viste visteY strut viste { ilement BpremierY }Y

gette struture viste 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 suivntF
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 visteF 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 viste un pointeur vers le dernier ilementF outefoisD il y enore plus simple X il su0t de fire pointer le dernier lment de l liste vers xvvD 9estEEdire de mettre son pointeur suivnt xvvF 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.

RVH

CONSTRUCTION D'UNE LISTE CHANE

Figure PWFS ! v struture viste nous donne des informtions sur l9ensemle de l

liste hne

Figure PWFT ! ve dernier lment de l liste pointe vers xvv pour indiquer l (n de

liste

RVI

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 ! ilementD qui orrespond un lment de l liste et que l9on peut dupliquer utnt de fois que nessire Y ! visteD 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
viste Binitilistion@A { viste Bliste a mllo@sizeof@BlisteAAY ilement Belement a mllo@sizeof@BelementAAY if @liste aa xvv || element aa xvvA { exit@ispesviAY } elementEbnomre a HY elementEbsuivnt a xvvY listeEbpremier a elementY

RVP

LES FONCTIONS DE GESTION DE LA LISTE


return listeY

yn ommene pr rer l struture de ontrle liste F yn l9lloue dynmiquement ve un mlloF v tille llouer est lule utomtiquement ve sizeof@BlisteAF v9ordinteur sur qu9il doit llouer l9espe nessire u stokge de l struture viste 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@AF i tout s9est ien pssD on d(nit les vleurs de notre premier lment X ! l donne nomre est mise H pr dfut Y ! le pointeur suivnt pointe vers xvv 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 xvv 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
6 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
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.

RVQ

CHAPITRE 29. LES LISTES CHANES

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

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 suivnt 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
void insertion@viste BlisteD int nvxomreA { GB grtion du nouvel lment BG ilement Bnouveu a mllo@sizeof@BnouveuAAY if @liste aa xvv || nouveu aa xvvA { exit@ispesviAY } nouveuEbnomre a nvxomreY GB snsertion de l9lment u dut de l liste BG nouveuEbsuivnt a listeEbpremierY listeEbpremier a nouveuY

v fontion insertion@A 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 nvxomreF 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 RVR

LES FONCTIONS DE GESTION DE LA LISTE

PF fire pointer le pointeur premier vers notre nouvel lmentF


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
void suppression@viste BlisteA { if @liste aa xvvA { exit@ispesviAY } if @listeEbpremier 3a xvvA { ilement Bupprimer a listeEbpremierY listeEbpremier a listeEbpremierEbsuivntY free@upprimerAY }

RVS

CHAPITRE 29. LES LISTES CHANES

yn ommene pr vri(er que le pointeur qu9on nous envoie n9est ps xvvD sinon on ne peut ps trvillerF yn vri(e ensuite qu9il y u moins un lment dns l listeD sinon il n9y rien fireF ges vri(tions e'etuesD on peut suvegrder l9dresse de l9lment supprimer dns un pointeur upprimerF 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 upprimer 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
void ffiherviste@viste BlisteA { if @liste aa xvvA { exit@ispesviAY } ilement Btuel a listeEbpremierY while @tuel 3a xvvA {

RVT

ALLER PLUS LOIN


printf@47d Eb 4D tuelEbnomreAY tuel a tuelEbsuivntY

} printf@4xvvn4AY

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 suivnt pour psser l9lment qui suit hque foisF yn peut s9muser tester l rtion de notre liste hne et son 0hge ve un min X
int min@A { viste Bmviste a initilistion@AY insertion@mvisteD RAY insertion@mvisteD VAY insertion@mvisteD ISAY suppression@mvisteAY ffiherviste@mvisteAY } return HY

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 RVU

CHAPITRE 29. LES LISTES CHANES

! 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 nilements dns l struture visteF sl su0t d9inrmenter e nomre hque fois qu9on joute un lment et de le drmenter qund on en supprime unF te vous onseille de regrouper toutes les fontions de gestion de l liste hne dns des (hiers listehineeF et listehineeFh 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 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 viste 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

RVV

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.

RVW

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 xvv pour indiquer qu9on F F F touh le fond @(gF QHFSAF
2

1. Si vous voulez essayer, bon courage ! 2. Oui, comme dans Tetris. ;-)

RWH

LES PILES

Figure QHFP ! ne pile de int

Figure QHFQ ! impilge

RWI

CHAPITRE 30. LES PILES ET LES FILES

Figure QHFR ! hpilge

Figure QHFS ! ves lments sont relis entre eux et le dernier pointe vers xvv

RWP

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 min @omme toujoursA Y vous y ppelez l fontion jouer Y ette fontion jouer fit ppel son tour l fontion hrger Y une fois que l fontion hrger est termineD on retourne l fontion jouer Y une fois que l fontion jouer est termineD on retourne u min Y en(nD une fois le min 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 min en s 3 RWQ

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
typedef strut ilement ilementY strut ilement { int nomreY ilement BsuivntY }Y

v struture de ontrle ontiendr l9dresse du premier lment de l pileD elui qui se trouve tout en hut X
typedef strut ile ileY strut ile { ilement BpremierY }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 ileA insi que le nouveu nomre stoker F
3

void empiler@ile BpileD int nvxomreA {


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 !

RWR

LES PILES
ilement Bnouveu a mllo@sizeof@BnouveuAAY if @pile aa xvv || nouveu aa xvvA { exit@ispesviAY } nouveuEbnomre a nvxomreY nouveuEbsuivnt a pileEbpremierY pileEbpremier a nouveuY

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
int depiler@ile BpileA { if @pile aa xvvA { exit@ispesviAY } int nomrehepile a HY ilement Belementhepile a pileEbpremierY if @pile 3a xvv 88 pileEbpremier 3a xvvA { nomrehepile a elementhepileEbnomreY pileEbpremier a elementhepileEbsuivntY free@elementhepileAY } } return nomrehepileY

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.

RWS

CHAPITRE 30. LES PILES ET LES FILES

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

void ffiherile@ile BpileA { if @pile aa xvvA { exit@ispesviAY } ilement Btuel a pileEbpremierY while @tuel 3a xvvA { printf@47dn4D tuelEbnomreAY tuel a tuelEbsuivntY } } printf@4n4AY

gette fontion tnt ridiulement simpleD elle ne nessite uune explition F in revnheD 9est le moment de fire un min pour tester le omportement de notre pile X
6

int min@A { ile Bmile a initiliser@AY empiler@mileD empiler@mileD empiler@mileD empiler@mileD empiler@mileD empiler@mileD RAY VAY ISAY ITAY PQAY RPAY

printf@4nitt de l pile Xn4AY ffiherile@mileAY printf@4te depile 7dn4D depiler@mileAAY


5. Les fonctions empiler et depiler susent grer une pile ! 6. Et toc !

RWT

LES FILES
printf@4te depile 7dn4D depiler@mileAAY printf@4nitt de l pile Xn4AY ffiherile@mileAY } return HY

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 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 RWU

CHAPITRE 30. LES PILES ET LES FILES

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

Figure QHFU ! ne (le d9ttenteF ve premier rriv est le premier servi 3

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 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 hvollivent 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 xvv @(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
7. Ou SDL_WaitEvent : oui, c'est bien ! Je vois que a suit au fond de la classe. ;-)

RWV

LES FILES

rien d9insurmontle si vous vez ompris les pilesF xous llons rer une struture ilement et une struture de ontrle pile X
typedef strut ilement ilementY strut ilement { int nomreY ilement BsuivntY }Y typedef strut pile pileY strut pile { pile BpremierY }Y

gomme pour les pilesD hque lment de l (le ser de type ilementF 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
void enfiler@pile BfileD int nvxomreA { ilement Bnouveu a mllo@sizeof@BnouveuAAY if @file aa xvv || nouveu aa xvvA { exit@ispesviAY } nouveuEbnomre a nvxomreY nouveuEbsuivnt a xvvY if @fileEbpremier 3a xvvA GB v file n9est ps vide BG { GB yn se positionne l fin de l file BG ilement Belementetuel a fileEbpremierY while @elementetuelEbsuivnt 3a xvvA

RWW

CHAPITRE 30. LES PILES ET LES FILES


{

} else GB v file est videD notre lment est le premier BG { fileEbpremier a nouveuY }

elementetuel a elementetuelEbsuivntY } elementetuelEbsuivnt a nouveuY

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
int defiler@pile BfileA { if @file aa xvvA { exit@ispesviAY } int nomrehefile a HY GB yn vrifie s9il y quelque hose dfiler BG if @fileEbpremier 3a xvvA { ilement Belementhefile a fileEbpremierY nomrehefile a elementhefileEbnomreY fileEbpremier a elementhefileEbsuivntY free@elementhefileAY

} }

return nomrehefileY

vous de jouer !
sl resterit rire une fontion ffiherpileD omme on l9vit fit pour les pilesF gel vous permettrit de vri(er si votre (le se omporte orretementF SHH

LES FILES

lisez ensuite un min 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 itt de l file X IS IT PQ RP

termeD vous devriez pouvoir rer votre propre iliothque de (lesD ve des (hiers fileFh et fileF pr exempleF te vous propose de tlhrger le projet omplet de gestion des (lesD si vous le dsirezF sl inlut l fontion ffiherpileF 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

SHI

CHAPITRE 30. LES PILES ET LES FILES

SHP

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 !

SHQ

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

SHR

QU'EST-CE QU'UNE TABLE DE HACHAGE ?


int tleuR a {IPD UD IRD QQ}Y printf@47d4D tleuPAY

i on lui donne tleuPD 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
tleu4vu honieux4Y

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 ileveF 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 tleu4vu honieux4 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 !

SHS

CHAPITRE 31. LES TABLES DE HACHAGE

Figure QIFP ! n simple tleu ontennt des pointeurs vers des strutures ileve

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 SHT

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 ileveF
4

ileveB tleuIHHY

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

9v9 C 9u9 C 99 C 9 9 C 9h9 C 9o9 C 9n9 C 99 C 9i9 C 9e9 C 9u9 C 9x9

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 7F ous vous souvenez de lui c sl donne le reste de l division 3 i on fit le lul X
6

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
int hhge@hr BhineA { int i a HD nomrerhe a HY for @i a H Y hinei 3a 9H9 Y iCCA { nomrerhe Ca hineiY } nomrerhe 7a IHHY } return nomrerheY

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.

SHU

CHAPITRE 31. LES TABLES DE HACHAGE

we X SUVRUW i on lui envoie hhge@4vu honieux4AD elle renvoie SSF eve hhge@4nn wrtinez4AD 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

gode

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 nouveu selon une utre fontion en s de ollisionF illes sont plus e0es mis plus omplexes mettre en pleF
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.

SHV

GRER LES COLLISIONS

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 ! 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 SHW

CHAPITRE 31. LES TABLES DE HACHAGE

SIH

Index

dressge ouvert F F F F F F F F F F F F F F F F F F F F F SHV 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 PQS de tleuF F F F F F F F F F F F F F F F F F F F F F FPRS 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 RQP 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 IUH 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 IUT 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 FPWI stndrdF F F F F F F F F F F F F F FIQSD PITD PWH 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 FPWH 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 FQQR 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 QPR 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 QQR 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 PSQD PURD QTH 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 FPUW 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 PUS 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 FITP 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 FITP
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 FRPI 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 UR 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 SHW hne de rtresF F F F F F F F F F F F F F F F F FIUP initilistionF F F F F F F F F F F F F F F F F F F F FIUQ 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 IUH 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 QWQD QWUD SHV 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 SHRD SHU 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 IVH 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 FUS 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 SHH 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 IWH dpssement de mmoire F F F F F F F F F F F F F PUS dpilgeF F F F F F F F F F F F F F F F F F F F F F F F FRWHD RWS diretive de prproesseur F F F F F F F F QTD IVV 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

SII

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 FPPQ doule u'eringF F F F F F F F F F F F F F F F F F F F F FQTH 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 FPPR 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 PRP 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 RPT 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 PQH 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 IQT 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 PQP 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 FPQI 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 PPQ 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 RWHD RWR 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 RWW 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 PII environnement de dveloppementF F F F F FIP 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 FPUT 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 PPUD PVQ 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 PWI 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 QSP 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 PRP 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 FSHT ispesvi F F F F F F F F F F F F F F F F F F F F QIH SHR isggi F F F F F F F F F F F F F F F F F F F F QIH hhge @tle deAF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFSHV hhge linireF F 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 F F F F F F F F F F F F F F F F IQHD IVV 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 PPI 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 PPU 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 PPVD PUU (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 FPIS renommer F F F F F F F F F F F F F F F F F F F F F F F PQQ supprimer F F F F F F F F F F F F F F F F F F F F F F F PQR 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 RWU (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 FRWU )gF F F F F F F F F F F F F F F F F F F F F F F F FQHUD QIID QUR 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 FQUR )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 FRRR 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 FQUQ 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 RIT 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 FRPI 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 PIU 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 PPS 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 RIW SIP
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 IWU 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 IWU imges pr seondeF F F F F F F F F F F F F F F F F F FRIW 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 IVV 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 IWV 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 ITI 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 QSV 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 FPWID RRR 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 RWH 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 FRUV 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 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 FQPH 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 FIWQ 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 PRH 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 FSHU 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 FPUS 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 wshs F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RSU 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 RIQ 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 RWH 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 RPI de struture F F F F F F F F F F F F F F F F F F F F F PHV 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 RQH 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 IVU 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 IWT onstnte deF F F F F F F F F F F F F F F F F F F F FIWH 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 RIPD RIV 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 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 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
R P N M

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 PUR 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 PWI 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 QIW instlltion F F F F F F F F F F F F F F F F F F F F F F PWS 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 QIU tlhrgement F F F F F F F F F F F F F F F F F F PWR hvfliturfe F F F F F F F F F F F F F F F F F F F F QPR 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 FRIP 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 QTR hvqetiks F F F F F F F F F F F F F F F F F F F F F F RIR hvsmge F F F F F F F F F F F F F F F F F F F F F F F F F QRP 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 RPT 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 RTV 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 SHU 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 US 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 PQT 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 FQUV spetre sonoreF F F F F F F F F F F F F F F F F F F F F F F FRTS 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 IVSD RQV 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 QVH 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 FQHW 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 FPVH 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 IVH 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 IVP 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 FIVI 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 FIUV 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 RSP 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 IUT 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 IUT 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 IVR 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 IVR 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 FPVS 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 PVQ 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 FPHP initilistionF F F F F F F F F F F F F F F F F F F F FPHU pointeur deF F F F F F F F F F F F F F F F F F F F F FPHV 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 FQIU 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 SIQ

INDEX

tle de hhge F F F F F F F F F F F F F F F F F F F F F SHR 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 ITH tille dynmiqueF F F F F F F F F F F F F F FITP idimensionnel F F F F F F F F F F F F F F F F F F QVV 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 ITI initilistionF F F F F F F F F F F F F F F F F F F F FITR 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 US 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 RIR 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 RPH type personnlis F F F F F F F F F F F F F F F F F F F F PHP 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 PHR 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 PRI 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

SIR

Notes

Notes

Notes

Notes

Notes

Notes

Dpt lgal : novembre 2009 ISBN : 978-2-9535278-0-3 Code diteur : 978-2-9535278 Imprim en France

Achev d'imprimer le 1

er

fvrier 2010 (2

nde

impression)

sur les presses de ALBEDIA Imprimeurs (Aurillac) Imprim sur papier PEFC issu de forts gres durablement N PEFC : 10-31-1446

ALBEDIA Imprimeurs est agre IMPRIM'VERT

Mentions lgales : Crdit photo Mathieu Nebra 4

de couverture : Xavier Granet - 2009

Conception couverture : Fan Jiyong Illustrations chapitres : Yannick Piault 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