Académique Documents
Professionnel Documents
Culture Documents
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/
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
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
iii
CHAPITRE 0. AVANT-PROPOS
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
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
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
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
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
31
SOMMAIRE
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
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
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
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
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
12 Les tableaux
159
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
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
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
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
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
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
SOMMAIRE
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
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
25 Matrisez le temps !
411
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
SOMMAIRE
463
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
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
xii
Premire partie
Les bases de la programmation en C
Chapitre
1
Dicult :
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 ?
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
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
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
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.
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 !
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
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.
utnt de hoses ve l9un qu9ve l9utreF ge sont juste deux mnires de progrmmer ssez di'rentesF
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
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 :
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
IP
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
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
IS
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.
IT
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
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
IV
IW
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
PI
PP
gliquez sur ejouterF g9est onD vous llez pouvoir ommener rire du ode 3
PR
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, 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
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
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
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
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
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
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
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
SF TF UF VF WF
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
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 :
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
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
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 ?
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.
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
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
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 ).
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
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
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
QV
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
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
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
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
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
RI
otre ordinteur omprend qu9il doit 0her fonjour suivi d9un retour l ligne @(gF QFUAF
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
! 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
RQ
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
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
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
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
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
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
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
ge qui nous intresseD 9est e qu9il y l9intrieur de l9unit entrleF yuvronsEl @(gF RW
RFQAF
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
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
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
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
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.
! 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
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
r exempleD si je veux rer m vrile nomreheies de type intD je dois tper l ligne suivnte X
int nomreheiesY
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
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
int
appeles
nomreheies, niveu
et
it mintennt c wintennt qu9on r notre vrileD on v pouvoir lui donner une vleurF
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
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
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
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
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
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
TH
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
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
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
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
! 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
TR
Chapitre
5
Dicult :
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
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
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
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
in plus j9i une onne nouvelle X on vu toutes les oprtions de seF pinis les ours de mths 3
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
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
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
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
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
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
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
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
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
US
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
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
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 }
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
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.
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
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
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
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
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
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
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 }
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.
VR
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
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
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
aa IH
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,
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
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
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
VW
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
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.
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.
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
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
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
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
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
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
WU
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 }
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
IHH
Chapitre
8
Dicult :
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
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
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
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
IHQ
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
IHR
CORRECTION !
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
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
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
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
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
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
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
@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
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
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
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
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
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
4. Et encore, ce sera forcment toujours le mme texte puisque la fonction ne reoit aucun paramtre susceptible de modier son comportement !
IIR
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
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
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
IIT
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
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
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 }
gode
we X VHSQRQ IIW
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
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
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
} }
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
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
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
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
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
Les headers
tusqu9iiD nous n9vions qu9un seul (hier soure dns notre projetF ge (hier soureD je vous vis demnd de l9ppeler minFF
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
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
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
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
LES HEADERS
v rison est en fit ssez simpleF und dns votre ode vous fites ppel une fontionD votre ordinteur doit dj l onntreD svoir omien de prmtres elle prendD etF g9est que sert un prototype X 9est le mode d9emploi de l fontion pour l9ordinteurF out est une question d9ordre X si vous plez vos prototypes dns des 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
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
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
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
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
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
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
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
IQV
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
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
ur et exempleD m fontion triple ne renvoie plus rien @voidAF ille se ontente de IQW
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
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
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
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 :
'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
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
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
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
g9est un peu omme qu9on peut reprsenter l mmoire vive @ewA de votre ordiE nteurF IRT
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
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
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
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
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
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
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
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
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
ISI
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
! 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
ISQ
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
. . . 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
ISR
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
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
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
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
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
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
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
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
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
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
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
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
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
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
ITR
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.
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
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
moyenneleu
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
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 :
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
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
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
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
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
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
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
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
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
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
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
return HY
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
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
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
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
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
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
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
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
: 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
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
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
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.
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 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
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
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
strpbrk
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
gette fontion reherhe l premire ourrene d9une hne dns une utre hneF on prototype est X IVR
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
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
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
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
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
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
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
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
IWI
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
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
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
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
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
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
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
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.
IWS
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
#ifndef
5ifndef
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
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
PHH
Chapitre
15
Dicult :
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
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
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
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
}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
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
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
PHS
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
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
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
a H
et pointFy
a HF
PHU
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
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
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
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
@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.
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
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
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
PIR
Chapitre
16
Dicult :
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
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
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
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
: 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
PIV
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
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 ?
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
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
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
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
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
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
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
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
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
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
gode
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
} }
return HY
gode
we X IIWHQW
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
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
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
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
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
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.
gette fontion est trs simple utiliserF ille renvoie l position tuelle du urseur sous l forme d9un long X
long ftell@psviB pointeururpihierAY
fseek
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
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
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 un chier
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
remove
: supprimer un chier
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
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
PQT
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
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
PQU
int xY int yY
goordonnees X V otets
lus une struture ontient de sousEvrilesD plus elle prend de mmoireF errilement logiqueD n9estEe ps c
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
PQV
PQW
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
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
PRH
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
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
PRQ
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
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
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
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
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
PRV
Chapitre
18
Dicult :
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
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
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
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
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
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
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
PST
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
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
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
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
PTH
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
PTI
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
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
@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
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
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
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
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
gode
we X QTTQQR
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
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
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
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
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
PUH
IDES D'AMLIORATION
{
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
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
PUP
Chapitre
19
Dicult :
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
gode we X IISUPW uel est votre nom c ten hupont eh 3 ous vous ppelez don ten 3
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
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
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
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
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
PUT
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
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
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
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
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
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
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
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
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
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
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
PVQ
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
strtod
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
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
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
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
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
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
! 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
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
PWP
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
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
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
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
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
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
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
demnde ensuite le nom de votre projet et le dossier dns lequel il doit tre plD omme vous l9vez toujours fit @(gF PHFRAF
PWU
ient ensuite l prtie o vous devez indiquer o se trouve instlle l hv @(gF PHFSAF
gliquez sur le outon FFF droiteF ne nouvelle fentre un peu omplexe s9ouvre @(gF PHFTAF
ous devez simplement remplir le hmp nomm seF sndiquez le dossier o vous vez PWV
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
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
vide
ve projet est lors rF sl est videF ejoutezEy un nouveu (hier en fisnt un li droit QHH
sur pihiers
souresD ejouter
G xouvel
lment
@(gF PHFVAF
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
n dossier Ffrmework est un dossier ontennt tous les (hiers nessiresD omme les inires de l hv et les heders @(gF PHFIHAF
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
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
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 :
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
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
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
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
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
SDL_Quit
: arrt de la SDL
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
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
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
gode
QHW
! 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.
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
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
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
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
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
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
QIS
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.
QIT
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
! 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 }
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
! 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
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
QIW
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 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
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
On rsume !
gode
QPP
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
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
La surface ern n'a pas besoin d'tre libre avec cela est fait automatiquement lors de hvuit@A.
hvpreeurfe@A,
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
wintennt qu9on notre vrile positionD on peut litter notre retngle sur l9rn X
hvfliturfe@retngleD xvvD ernD 8positionAY
QPS
gode
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
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
QPU
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
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
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
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
gode
we X PTQWTH
QQH
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
QQP
Chapitre
22
Dicult :
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
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
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
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
QQT
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
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
QQW
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
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
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
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
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.
QRQ
! 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
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
! 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
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
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
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
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
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
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
! 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
QSH
Chapitre
23
Dicult :
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
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
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
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
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
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
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
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
! 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
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
QSU
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
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).
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
QSW
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
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
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
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
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
} 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
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
yn peut don dpler ozor o l9on veut sur l9rnD mintennt @(gF PQFRA 3
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
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
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 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
QTU
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
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
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
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
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
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.
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
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
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
hns l prtiqueD vous voudrez srement tester l9tt et le gin l foisF ous pourrez insi svoir extement e qui s9est pssF QUR
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
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
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
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
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
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
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
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
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
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
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
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
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
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
GG iffement de l9rn hvpillet@ernD xvvD hvwpqf@ernEbformtD HD HD HAAY hvfliturfe@menuD xvvD ernD 8positionwenuAY hvplip@ernAY
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
! 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
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
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
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
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
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
QVW
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)
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
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
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
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
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
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 !
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
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
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
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
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
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
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
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
RHH
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
sauvegarderNiveau
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
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
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
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
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
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 }
hvpreeurfe
qui
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
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
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
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
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
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
RIR
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
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
RIT
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
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
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
RIV
eve e odeD notre progrmme v dormir l pluprt du temps et don onsommer trs peu de g @(gF PSFQAF
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
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.
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
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
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
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
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
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
RPR
Chapitre
26
Dicult :
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
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
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
le chier hvttfFh dans le dossier et non pas dans mingwQPGinlude tout court.
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
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
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
! 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
te vous propose d9utiliser l polie engelin pour l suite des exemplesF ous pouvez l tlhrger en ligneF RQH
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
! 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
6. Cela signie que leurs contours seront adoucis, ce qui est plus agrable l'il.
RQP
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
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.
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
RQR
RQS
gode
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).
! 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
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
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
RQV
RQW
we X WIQIHU v (gF PTFW vous prsente le rsultt u out de IQDW seondes trs extementF
gode
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
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
RRP
Chapitre
27
Dicult :
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
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
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
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
Librer FMOD
yn rrte pwyh de l mnire l plus simple qui soit X
pyxhglose@AY
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
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
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
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
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
La correction
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
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
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
RSP
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
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
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
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
! 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
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
Librer la mmoire
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
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
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
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
RSW
RTH
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
RTI
RTP
Chapitre
28
Dicult :
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
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
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
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
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
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
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
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
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
RTW
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
hvnlokurfe@ernAY } hvplip@ernAY
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
RUQ
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 :
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
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
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
Figure PWFR ! ghque lment ontient une donne @exF X un intA et un pointeur vers l9lment suivnt
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
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
RVH
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
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
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
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
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
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
gel ur pour e'et d9insrer orretement notre nouvel lment dns l liste hne @(gF PWFWA 3
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
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
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
RVT
} 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
! 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 :
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
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
1. Si vous voulez essayer, bon courage ! 2. Oui, comme dans Tetris. ;-)
RWH
LES PILES
RWI
Figure QHFS ! ves lments sont relis entre eux et le dernier pointe vers xvv
RWP
LES PILES
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
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
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
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
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
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
illet de inmD vous fites l queue u guihet @(gF QHFUAF moins d9tre le frre du guihetierD vous llez devoir fire l queue omme tout le monde et ttendre derrireF g9est le premier rriv qui ser le premier serviF
in progrmmtionD les (les sont utiles pour mettre en ttente des informtions dns l9ordre dns lequel elles sont rrivesF r exempleD dns un logiiel de chat @type messgerie instntneAD si vous reevez trois messges peu de temps d9intervlleD vous les en(lez les uns l suite des utres en mmoireF ous vous oupez lors du 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
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
} else GB v file est videD notre lment est le premier BG { fileEbpremier 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
SHP
Chapitre
31
Dicult :
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
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
SHR
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
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
en prmtre
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
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
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
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
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
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
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