Documente Academic
Documente Profesional
Documente Cultură
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 tehnologiesF t9i eu mon premier ordinteur entre les mins juste vnt de rentrer u ollgeF g9tit e moment le lnement en grndes pompes de indows WSF t9i immditement voulu ller plus loinD svoir omment fontionne l9intrieur F won premier r)exe t d9umer les liriries de qurtier et plus prtiulirement leur setion miroEinformtique dj ien dveloppeF out @ou presqueA me fisit envie X grez votre site we en rwv en SH minutes D hveloppez vos propres progrmmes filement ve isul fsi D etF hes promesses quiD elles seulesD urient pu voir rison de mon rgent de poheF g9est en lisnt l qutrime de ouverture que les hoses ont ommen oiner X Ce livre est destin aux personnes ayant dj une bonne exprience en programmation F s de pniqueF sl su0t de trouver elui qui s9dresse ux dutnts omme moiF te repose le livre sur les tlges et je tente d9en sortir un utreF uis un utreF uis enore un utreF tusqu9 me rendre l9videne X pour pprendre progrmmerD il fut dj svoir progrmmerF ristoire de ne ps voir fit le trjet pour rienD je reprtiri qund mme ve un livre ou deux sous le rsD eux qui semlient les plus orrets du lotF te leur rends hommge ii X 9est ve eux que j9i dmrr et j9i euoup ppris leur letureF wis en les relisnt ve un peu de reul quelques mois plus trdD j9i (ni pr m9perevoir de ertines inohrenes X un hpitre simple sur l9instlltion d9un logiiel qui urit d tre pl tout u dutD des odes soure sns explitionsD qund e n9tit ps rrment un mot importnt utilis tout u long du livre et d(ni vers l (n 3 v ritique tit fileD mis il me fllit prouver que l9on pouvit fire plus clair et plus simpleF t9i don entrepris de reformuler mon premier livre tel que j'aurais souhait le lire en rnt mon premier site weF
CHAPITRE 0. AVANT-PROPOS
n formulire vous invite rentrer votre ode weF pites un premier essi ve le ode iEdessous X ester le ode we gode we X IPQRST ges odes we ont deux intrts X ! vous fire tlhrger les odes soure inlus dns e livreD e qui vous viter d9voir reopier ertins odes un peu longs Y ! vous rediriger vers les sites we prsents tout u long du oursF ge systme de rediretion nous permet de tenir jour le livre que vous vez entre les mins sns que vous yez esoin d9heter systmtiquement hque nouvelle ditionF i un site we hnge d9dresseD nous modi(erons l rediretion mis le ode we utiliser rester le mmeF i un site we disprtD nous vous redirigerons vers une pge du ite du ro expliqunt e qui s9est pss et vous proposnt une lterntiveF in lirD 9est un moyen de nous ssurer de l prennit de et ouvrge sns que vous yez fire quoi que e soit 3
http://www.siteduzero.com/codeweb.html
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 ! wohmed ou(q il eissoui @erthurusA pour l9ide qu9il m9 fournie pour mettre jour les explitions de pwyh vers pwyh ixF ! xotre infogrphisteD pn tiyongD pour l ouverture et les ines de e livreF
A 6
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 if... else F F F F F F F F F ves oolensD le oeur des onditions F F F v ondition switch F F F F F F F F F F F F ves ternires X des onditions ondenses F u9estEe qu9une oule c v oule while F F F F F v oule do... while F v oule for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
77
65
6 Les conditions
UV VR VU WI WR WR WU WV
7 Les boucles
93
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 cF F F F F F F F F
143
12 Les tableaux
161
ve type char F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUP ves hnes sont des tleux de char F F F F F F F F F F F F F F F F F F F F F F IUR pontions de mnipultion des hnes F F F F F F F F F F F F F F F F F F F F F F IUV F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
191
171
14 Le prprocesseur
h(nir une struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHT tilistion d9une struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHV ointeur de struture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PIP
205
ix
SOMMAIRE
yuvrir et fermer un (hier F F F F F F F F F hi'rentes mthodes de leture G riture e dpler dns un (hier F F F F F F F F F enommer et supprimer un (hier F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
F F F F
219
17 L'allocation dynamique
v tille des vriles F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRH ellotion de mmoire dynmique F F F F F F F F F F F F F F F F F F F F F F F F PRR ellotion dynmique d9un tleu F F F F F F F F F F F F F F F F F F F F F F F F PRW ves onsignes F F F F F F F F F F F F F F F F F v solution @I X le ode du jeuA F F F F F F F v solution @P X l gestion du ditionnireA F sdes d9mliortion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
253
239
ves limites de l fontion scanf F F F F F F F F F F F F F F F F F F F F F F F F F F PVH uprer une hne de rtres F F F F F F F F F F F F F F F F F F F F F F F F PVQ gonvertir l hne en nomre F F F F F F F F F F F F F F F F F F F F F F F F F F F PWH
279
293
295
ourquoi voir hoisi l hv c F F F F F F F F F F F F F F F F F F F F F F F F F F F PWT lhrgement de l hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QHH grer un projet hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QHI ghrger et rrter l hv F yuverture d9une fentre F F wnipultion des surfes F ixerie X rer un dgrd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
315
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 QRR qestion de l trnsprene F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRV ghrger plus de formts d9imge ve SDL_Image F F F F F F F F F F F F F F F F QSP ve prinipe des vnements F F F F ve lvier F F F F F F F F F F F F F F ixerie X diriger ozor u lvier F v souris F F F F F F F F F F F F F F ves vnements de l fentre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
361
343
24 TP : Mario Sokoban
ghier des hrges du okon F F F F F F ve main et les onstntes F F F F F F F F F ve jeu F F F F F F F F F F F F F F F F F F F F ghrgement et enregistrement de niveux v9diteur de niveux F F F F F F F F F F F F sum et mliortions F F F F F F F F F F
387
25 Matrisez le temps !
423
snstller SDL_ttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV ghrgement de SDL_ttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RRH ves di'rentes mthodes d9riture F F F F F F F F F F F F F F F F F F F F F F F F RRQ snstller pwyh F F F F F F F F F F F F F snitiliser et lirer un ojet systme F ves sons ourts F F F F F F F F F F F F F ves musiques @wQD yqqD weF F FA F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
455
475
SOMMAIRE
489
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
491
eprsenttion d9une liste hne gonstrution d9une liste hne F F ves fontions de gestion de l liste eller plus loin F F F F F F F F F F F F
F F F F
F F F F
ves piles F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR ves (les F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SII ourquoi utiliser une tle de hhge c u9estEe qu9une tle de hhge c F F F rire une fontion de hhge F F F F F qrer les ollisions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
517
503
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
0010110110010011010011110
ge que vous voyez lD 9est le lngge informtique de votre ordinteurD ppel langage binaire @retenez ien e mot 3AF otre ordinteur ne onnt que e lnggeEl etD omme vous pouvez le onstterD 9est solument inomprhensileF hon voil notre premier vri prolme X
Comment parler l'ordinateur plus simplement qu'en binaire avec des 0 et des 1 ?
otre ordinteur ne prle ps l9nglis et enore moins le frnisF ourtntD il est inonevle d9rire un progrmme en lngge inireF wme les informtiiens les plus fous ne le font psD 9est vous dire 3 ih ien l9ide que les informtiiens ont eueD 9est d9inventer de nouveux lngges qui serient ensuite trduits en inire pour l9ordinteurF ve plus dur fireD 9est de rliser le progrmme qui fit l trdution F reureusementD e progrmme dj t rit pr des informtiiens et nous n9urons ps le refire @ouf 3AF yn v u ontrire s9en servir pour rire des phrses omme X Fais le calcul 3 + 5 qui seront trduites pr le progrmme de trdution en quelque hose omme X 0010110110010011010011110 F ve shm IFP rsume e que je viens de vous expliquerF
1. J'invente, je ne connais quand mme pas la traduction informatique par cur.
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 .exe que l9on onnt sont des progrmmes iniresD il n9y plus de ode soure l9intrieurF ! v progrmmtion ne requiert ps en elleEmme de onnissnes mthmtiques pousses Y nnmoinsD il est nessire d9voir un on sens de l logique et d9tre mthodiqueF
5
5. Sauf dans quelques cas prcis o votre application doit faire appel des formules mathmatiques, comme c'est le cas des logiciels de cryptage.
IH
Chapitre
2
Dicult :
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
J'insiste l-dessus : si vous tes sous Windows, tlchargez la version incluant mingw dans le nom du programme d'installation. Si vous prenez la mauvaise version, vous ne pourrez pas compiler vos programmes par la suite !
v9instlltion est trs simple et rpideF vissez toutes les options pr dfut et lnez le progrmmeF ous devriez voir une fentre similire l (gF PFIF yn distingue R grndes setions dns l fentreD numrotes sur l9imge X IF la barre d'outils X elle omprend de nomreux outonsD mis seuls quelquesEuns nous seront rgulirement utilesF t9y reviendri plus loin Y PF la liste des chiers du projet X 9est guhe que s90he l liste de tous les (hiers soure de votre progrmmeF xotez que sur ette pture uun projet n9 t rD on ne voit don ps enore de (hiers l9intrieur de l listeF ous verrez ette setion se remplir dns inq minutes en lisnt l suite du ours Y QF la zone principale X 9est l que vous pourrez rire votre ode en lngge g Y RF la zone de notication X ussi ppele l zone de l mort D 9est ii que vous verrez les erreurs de ompiltion s90her si votre ode omporte des erreursF gel rrive trs rgulirement 3 sntressonsEnous mintennt une setion prtiulire de l rre d9outils @(gF PFPAF ous trouverez les outons suivnts @dns l9ordreA X CompilerD ExcuterD Compiler & Excuter et Tout recompilerF etenezElesD nous les utiliserons rgulirementF oii l signi(tion de hune des qutre ines que vous voyez sur l (gF PFPD dns l9ordre X ! compiler X tous les (hiers soure de votre projet sont envoys u ompilteur qui v se hrger de rer un exutleF 9il y des erreurs D l9exutle ne ser ps r et on vous indiquer les erreurs en s de gode: :floks Y
4
3. J'en prote pour vous rappeler que les codes web peuvent tre entrs dans le formulaire du Site du Zro prvu cet eet. Cela vous redirige automatiquement sur la page ou le chier qui vous intresse. Voir l'avant-propos pour plus d'informations ce sujet. 4. Ce qui a de fortes chances d'arriver tt ou tard !
IR
IS
! excuter X ette ine lne juste le dernier exutle que vous vez ompilF gel vous permettr don de tester votre progrmme et de voir insi e qu9il donneF hns l9ordreD si vous vez ien suiviD on doit d9ord ompilerD puis exuter pour tester e que donneF yn peut ussi utiliser le troisime outonF F F ! compiler & excuter X ps esoin d9tre un gnie pour omprendre que 9est l ominison des deux outons prdentsF g9est d9illeurs e outon que vous utiliserez le plus souventF xotez que s9il y des erreurs pendnt l ompiltion @pendnt l gnrtion de l9exutleAD le progrmme ne ser ps exutF l pleD vous urez droit une eeelle liste d9erreurs orriger 3 ! tout reconstruire X qund vous fites compilerD gode: :floks ne reompile en fit que les (hiers que vous vez modi(s et non les utresF rfois E je dis ien prfois E vous urez esoin de demnder gode: :floks de vous reompiler tous les (hiersF yn verr plus trd qund on esoin de e outonD et vous verrez plus en dtils le fontionnement de l ompiltion dns un hpitre futurF our l9instntD on se ontente de svoir le minimum nessire pour ne ps tout mlngerF ge outon ne nous ser don ps utile de suiteF
Je vous conseille d'utiliser les raccourcis plutt que de cliquer sur les boutons, parce que c'est quelque chose qu'on fait vraiment trs trs souvent. Retenez en particulier qu'il faut taper sur F9 pour faire Compiler & Excuter.
Comme vous pouvez le voir, Code: :Blocks propose de raliser pas mal de types de programmes dirents qui utilisent des bibliothques connues comme la SDL (2D), OpenGL (3D), Qt et wxWidgets (fentres), etc. Pour l'instant, ces icnes servent plutt faire joli car les bibliothques ne sont pas installes sur votre ordinateur, vous ne pourrez donc pas les faire marcher. Nous nous intresserons ces autres types de programmes bien plus tard. En attendant il faudra vous contenter de Console , car vous n'avez pas encore le niveau ncessaire pour crer les autres types de programmes.
gliquez sur Go pour rer le projetF n ssistnt s9ouvreF pites NextD ette premire pge ne servnt rienF yn vous demnde ensuite si vous llez fire du g ou du gCC @(gF PFRA X rpondez g F yn vous demnde le nom de votre projet @(gF PFSA et dns quel dossier les (hiers soure seront enregistrsF in(nD l dernire pge @(gF PFTA vous permet de hoisir de quelle fon le progrmme doit tre ompilF ous pouvez lisser les options pr dfutD n9ur ps d9inidene IT
IU
sur e que nous llons fire dns l9immdit @veillez e que l se Debug ou Release u moins soit oheAF
gliquez sur FinishD 9est on 3 gode: :floks vous rer un premier projet ve dj un tout petit peu de ode soure dednsF IV
hns le dre de guhe rojets D dveloppez l9roresene en liqunt sur le petit C pour 0her l liste des (hiers du projetF ous devriez voir u moins un main.c que vous pourrez ouvrir en douleEliqunt dessusF ous voil prs 3
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 lhrger isul gCC ixE press gode we X QQQUQQ letionnez ensuite isul gCC ixpress prnis un peu plus s sur l pgeF isul gCC ixpress est en frnis et totlement grtuitF ge n9est don ps une version d9essi limite dns le tempsF g9est une hne d9voir un shi ussi puissnt que elui de wirosoft disponile grtuitementD ne l lissez don ps psserF
Installation
v9instlltion devrit normlement se psser sns enomreF ve progrmme d9instlE ltion v tlhrger l dernire version de isul sur snternetF te vous onseille de lisser les options pr dfutF sl fut vous enregistrer dns les QH joursF s de pniqueD 9est grtuit et rpide Y mis il fut le fireF gliquez sur le lien qui vous est donn X vous rrivez sur le site de wirosoftF gonnetezE vous ve votre ompte indows vive sh @quivlent du ompte rotmil ou wxA ou rezEen un si vous n9en vez psD puis rpondez u petit questionnireF yn vous donner l (n une l d9enregistrementF ous devrez reopier ette l dns le menu ? / Inscrire le produitF
PI
ne fentre s9ouvreF letionnez Visual C++ guhe puis Fichier C++ (.cpp) F intrez un nom pour votre (hier X main.cD omme sur l (gF PFIPF gliquez sur AjouterF n (hier vide est rD je vous invite l9enregistrer rpidement sous le nom de main.cF
6
PP
PQ
gette fentre ressemle en tous points elle de gode: :floksF yn v rpidement @reAvoir qund mme e que signi(ent hune des prtiesF IF v rre d9outils X tout e qu9il y de plus stndrdF yuvrirD enregistrerD enreE gistrer toutD ouperD opierD ollerD etF r dfutD il semle qu9il n9y it ps de outon de rre d9outils pour ompilerF ous pouvez les rjouter en fisnt un li droit sur l rre d9outilsD puis en hoisissnt Dboguer et Gnrer dns l listeF outes es ines de ompiltion ont leur quivlent dns les menus Gnrer et DboguerF i vous fites GnrerD el rer l9exutle @ signi(e ompiler pour isulAF i vous fites Dboguer / ExcuterD on devrit vous proposer de ompiler vnt d9exuter le progrmmeF pU permet de gnrer le projetD et pS de l9exuterF PF hns ette zone trs importnte vous voyez normlement l liste des (hiers de votre projetF gliquez sur l9onglet Explorateur de solutions en sD si e n9est PR
dj fitF ous devriez voir que isul re dj des dossiers pour sprer les di'rents types de (hiers de votre projet @souresD enEtte et ressouresAF xous verrons un peu plus trd quels sont les di'rents types de (hiers qui onstituent un projetF QF v prtie priniple X 9est l qu9on modi(e les (hiers soureF oilD on fit le tour de isul gCCF ous pouvez ller jeter un il dns les options @Outils / OptionsA si vous hnteD mis n9y pssez ps trois heuresF sl fut dire qu9il y tellement de ses oher de prtout qu9on ne sit plus trop o donner de l tteF
Xcode, o es-tu ?
ous les utilisteurs de w y ne sont ps des progrmmeursF epple l9 ien ompris et n9instlle ps pr dfut d9shi ve w yF reureusementD pour eux qui voudrient progrmmerD tout est prvuF in e'etD ode @logo en (gF PFIRA est disponile sur le wepptoreF gommenez don pr le ruprer lEsF
r illeursD je vous onseille de mettre en fvoris l pge ddie ux dveloppeurs sur le site d9eppleF ous y trouverez une foule d9informtions utiles pour le dveloppement sous wF ous pourrez notmment y tlhrger plusieurs logiiels pour dvelopperF x9hsitez ps vous insrire l9ehg @ epple hevelopment gonnetion AD 9est grtuit et vous serez insi tenus u ournt des nouveutsF ge ddie ux dveloppeurs epple gode we X PTRUHV PS
Lancement de Xcode
ode est l9shi le plus utilis sous wD r pr epple luiEmmeF ves plus grnds logiielsD omme ihoto et ueynoteD ont t ods l9ide de odeF g9est rellement l9outil de dveloppement de hoix qund on un w 3 v premire hose fire est de rer un nouveu projetD lors ommenons pr F ellez dns le menu File / New ProjectF ne fentre de sletion de projet s9ouvre @(gF PFISAF
ellez dns l setion Application et sletionnez Command Line Tool F gliquez ensuite sur NextF yn vous demnder o vous voulez enregistrer votre projet @un projet doit toujours tre enregistr ds le dutA insi que son nomF lezEle dns le dossier que vous voulezF ne fois rD votre projet se prsenter sous l forme d9un dossier ontennt de mulE tiples (hiers dns le FinderF ve (hier l9extension .xcodeproj orrespond u (hier du projetF g9est lui que vous devrez sletionner l prohine fois si vous souhitez rouvrir votre projetF
7
7. Si vous avez une version plus ancienne du logiciel, il vous faudra probablement aller dans la section Command line utility et slectionner Standard tool.
PT
La fentre de dveloppement
hns odeD si vous sletionnez similire l (gF PFITF
main.c
v fentre est doupe en qutre prtiesD ii numrotes de I RF IF v premire prtie est l rre de outons tout en hutF ve plus importnt d9entre euxD RunD vous permettr d9exuter votre progrmmeF PF v prtie de guhe orrespond l9roresene de votre projetF gertines seE tions regroupent les erreursD les vertissementsD etF ode vous ple utomtiE quement dns l setion l plus utileD elle qui porte le nom de votre projetF QF v troisime prtie hnge en fontion de e que vous vez sletionn dns l prtie de guheF siD on le ontenu de notre (hier main.cF RF in(nD l qutrime prtie 0he le rsultt de l9exution du progrmme dns l onsoleD lorsque vous vez liqu sur RunF
our rer un nouveu (hier soure sous odeD rendezEvous dns le menu File / New FileF n ssistnt vous demnde quel type de (hier vous voulez rerF endezE vous dns l setion Mac OS X G C and C++ et sletionnez C File @pihier gAF ous devriez voir sous les yeux l (gF PFIUF
ous devrez donner un nom votre nouveu (hier @e que vous voulezAF v9extensionD elleD doit rester .cF rfois E nous le verrons plus loin ED il fudr ussi rer des (hiers .h @mis on en reprlerAF v se oher Also create fichier.h est l pour F our le momentD elle ne nous intresse psF gliquez ensuite sur FinishF g9est fit 3 otre (hier est r et jout votre projetD en plus de main.cF ous tes mintennt prts progrmmer sous w 3
En rsum
! ves progrmmeurs ont esoin de trois outils X un diteur de texteD un ompilteur et un dogueurF ! sl est possile d9instller es outils sprmentD mis il est ournt ujourd9hui d9voir un pkge troisEenEun que l9on ppelle IDED l9environnement de dveloppementF ! gode: :floksD isul gCC et ode omptent prmi les shi les plus lresF
PV
Chapitre
3
Dicult :
n a prpar le terrain jusqu'ici, maintenant il serait bien de commencer programmer un peu, qu'en dites-vous ? C'est justement l'objectif de ce chapitre ! la n de celuici, vous aurez russi crer votre premier programme ! Bon d'accord, ce programme sera en noir et blanc et ne saura que vous dire bonjour, il semblera donc compltement inutile mais ce sera votre premier ; je peux vous assurer que vous en serez ers.
PW
Console ou fentre ?
xous vons rpidement prl de l notion de progrmme onsole et de progrmme fentre dns le hpitre prdentF xotre shi nous demndit quel type de proE grmme nous voulions rer et je vous vis dit de rpondre consoleF sl fut svoir qu9en fit il existe deux types de progrmmesD ps plus X ! les progrmmes ve fentres Y ! les progrmmes en onsoleF
donD 9est un progrmme ve des fentresF te suppose que vous imeriez ien rer e type de progrmmesD hmm c ih ienF F F vous n9llez ps pouvoir de suite 3 in e'etD rer des progrmmes ve des fentres en g 9est possileD misF F F qund on duteD 9est ien trop ompliqu 3 our duterD il vut mieux ommener pr rer des progrmmes en onsoleF
Mais au fait, quoi a ressemble un programme en console ?
QH
CONSOLE OU FENTRE ?
frrrF F F erri(ntD hein c oilD vous vez mintennt une petite ide de e quoi ressemle une onsoleF gei ditD plusieurs remrques X ! ujourd9hui on sit 0her de l ouleurD tout n9est don ps en noir et ln omme on pourrit le roire Y ! l onsole est ssez peu ueillnte pour un dutnt Y ! 9est pourtnt un outil puissnt qund on sit le mtriserF gomme je vous l9i dit plus hutD rer des progrmmes en mode onsole omme iiD 9est trs file et idl pour duter @e qui n9est ps le s des progrmmes en mode fentre AF xotez que l onsole volu X elle peut 0her des ouleursD et rien ne vous emphe de mettre une imge de fondF
1. Oui vous l, ne regardez pas derrire vous, je sais que vous vous demandez ce que c'est.
QI
iD mis elle est un peuF F F he on v direF ous pouvez voir une onsole en fisnt Dmarrer / Accessoires / Invite de commandesD ou ien enore en fisnt Dmarrer / Excuter...D et en tpnt ensuite cmdF v (gF QFQ reprsente l mgni(que onsole de indowsF
i vous tes sous indowsD shez don que 9est dns une fentre qui ressemle que nous ferons nos premiers progrmmesF i j9i hoisi de ommener pr des petits progrmmes en onsoleD e n9est ps pour vous ennuyerD ien u ontrire 3 in ommennt pr fire des progrmmes en onsoleD vous pprendrez les ses nessires pour pouvoir ensuite rer des fentresF Soyez donc rassurs X ds que nous urons le niveu pour rer des fentresD nous verrons omment en fireF
Un minimum de code
our n9importe quel progrmmeD il fudr tper un minimum de odeF ge ode ne fer rien de prtiulier mis il est indispensleF g9est e ode minimum que nous llons douvrir mintenntF sl devrit servir de se pour l pluprt de vos progrmmes en lngge gF QP
UN MINIMUM DE CODE
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @A { printf @ 4 rello world 3 n 4 A Y return H Y }
Notez qu'il y a une ligne vide la n de ce code. Il est ncessaire de taper sur la touche Entre aprs la dernire accolade. Chaque chier en C devrait normalement se terminer par une ligne vide. Si vous ne le faites pas, ce n'est pas grave, mais le compilateur risque de vous acher un avertissement (warning ).
int min @A
ves deux ritures sont possilesD mis l seonde @l ompliqueA est l plus ournteF t9uri don tendne utiliser plutt ette dernire dns les prohins hpitresF in e qui nous onerneD que l9on utilise l9une ou l9utre des rituresD ne hnger rien pour nousF snutile don de s9y ttrderD surtout que nous n9vons ps enore le niveu pour nlyser e que signi(eF i vous tes sous un utre shiD opiez e ode soure dns votre (hier main.c pour que nous yons le mme ode vous et moiF inregistrez le toutF yui je sisD on n9 enore rien fitD mis enregistrez qund mmeD 9est une onne hitude prendreF xormlementD vous n9vez qu9un seul (hier soure ppel main.c @le resteD e sont des (hiers de projet gnrs pr votre shiAF QQ
ge sont des lignes spiles que l9on ne voit qu9en hut des (hiers soureF ges lignes sont filement reonnissles r elles ommenent pr un dise #F ges lignes spilesD on les ppelle directives de prprocesseur @un nom ompliquD n9estEe ps cAF ge sont des lignes qui seront lues pr un progrmme ppel prproesseurD un progrmme qui se lne u dut de l ompiltionF yui X omme je vous l9i dit plus ttD e qu9on vu u dut n9tit qu9un shm trs simpli( de l ompiltionF sl se psse en rlit plusieurs hoses pendnt une ompilE tionF yn les dtiller plus trd X pour le momentD vous vez juste esoin d9insrer es lignes en hut de hun de vos (hiersF
Oui mais elles signient quoi, ces lignes ? J'aimerais bien savoir quand mme !
ve mot include en nglis signi(e inlure en frnisF ges lignes demndent d9inE lure des (hiers u projetD 9estEEdire d9jouter des (hiers pour l ompiltionF sl y deux lignesD don deux (hiers inlusF ges (hiers s9ppellent stdio.h et stdlib.hF ges (hiers existent djD des (hiers soure tout prtsF yn verr plus trd qu9on les ppelle des bibliothques @ertins prlent ussi de librairies mis 9est un ngliE ismeAF in grosD es (hiers ontiennent du ode tout prt qui permet d90her du texte l9rnF ns es (hiersD rire du texte l9rn urit t mission impossileF v9ordinteur l se ne sit rien fireD il fut tout lui direF ous voyez l glre dns lquelle on est 3 frefD en rsum les deux premires lignes inluent les iliothques qui vont nous permettre @entre utresA d90her du texte l9rn ssez filement F ssons l suiteF v suiteD 9est tout X
1 2 3 4 5
ge que vous voyez lD 9est e qu9on ppelle une fonctionF n progrmme en lngge g est onstitu de fontionsD il ne ontient qusiment que F our le momentD notre progrmme ne ontient don qu9une seule fontionF QR
UN MINIMUM DE CODE
ne fontion permet grosso modo de rssemler plusieurs ommndes l9ordinteurF egroupes dns une fontionD les ommndes permettent de fire quelque hose de prisF r exempleD on peut rer une fontion ouvrir_fichier qui ontiendr une suite d9instrutions pour l9ordinteur lui expliqunt omment ouvrir un (hierF v9vnE tgeD 9est qu9une fois l fontion riteD vous n9urez plus qu9 dire ouvrir_fichierD et votre ordinteur sur omment fire sns que vous yez tout rpter 3 ns rentrer dns les dtils de l onstrution d9une fontion @il est trop ttD on reprE ler des fontions plus trdAD nlysons qund mme ses grndes prtiesF v premire ligne ontient le nom de l fontionD 9est le deuxime motF yui X notre fontion s9pE pelle don mainF g9est un nom de fontion prtiulier qui signi(e prinipl F main est l fontion priniple de votre progrmmeD c'est toujours par la fonction main que le programme commenceF ne fontion un dut et une (nD dlimits pr des oldes { et }F oute l fontion main se trouve don entre es oldesF i vous vez ien suiviD notre fontion main ontient deux lignes X
1 2
ges lignes l9intrieur d9une fontion ont un nomF yn les ppelle instructions @ en fit du voulire qu9il v flloir retenirAF ghque instrution est une ommnde l9ordinteurF ghune de es lignes demnde l9ordinteur de fire quelque hose de prisF gomme je vous l9i dit un peu plus hutD en regroupnt intelligemment @9est le trvil du progrmmeurA les instrutions dns des fontionsD on re si on veut des bouts de programmes tout prts F in utilisnt les onnes instrutionsD rien ne nous empherit don de rer une fontion ouvrir_fichier omme je vous l9i expliqu tout l9heureD ou enore une fontion avancer_personnage dns un jeu vidoD pr exempleF n progrmmeD e n9est u out du ompte rien d9utre qu9une srie d9instrutions X fis ei D fis el F ous donnez des ordres votre ordinteur et il les exute F
2
Trs important : toute instruction se termine obligatoirement par un pointvirgule ; . C'est d'ailleurs comme a qu'on reconnat ce qui est une instruction et ce qui n'en est pas une. Si vous oubliez de mettre un point-virgule la n d'une instruction, votre programme ne compilera pas !
v premire ligne X printf("Hello world!\n"); demnde 0her le messge rello world 3 l9rnF und votre progrmme rriver ette ligneD il v don 0her un messge l9rnD puis psser l9instrution suivnteF ssons l9instrution suivnte justement X return 0; ih ien D en grosD veut dire que 9est (ni @eh ouiD djAF gette ligne indique qu9on rrive l (n de notre fontion main et demnde de renvoyer l vleur HF
2. Du moins si vous l'avez bien dress.
QS
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
QT
eprs un temps d9ttente insupportle @l ompiltionAD votre premier progrmme v pprtre sous vos yeux totlement envhis de onheur @(gF QFSAF
ve progrmme 0he rello world 3 @sur l premire ligneAF ves lignes en dessous ont t gnres pr gode: :floks et indiquent que le progrmme s9est ien exut et omien de temps s9est oul depuis le lnementF yn vous invite ppuyer sur n9importe quelle touhe du lvier pour fermer l fentreF otre progrmme s9rrte lors F
4
ge ser en fit ssez simpleF i vous prtez du ode qui t donn plus hutD il vous su0t simplement de rempler rello world 3 pr fonjour dns l ligne qui fit ppel printfF gomme je vous le disis plus ttD printf est une instructionF ille ommnde l9orE dinteur X Ache-moi ce message l'cran F sl fut svoir que printf est en fit
4. Oui je sais, ce n'est pas transcendant. Mais bon, quand mme ! C'est un premier programme, un instant dont vous vous souviendrez toute votre vie ! . . . Non ?
QU
te vous vis dit qu9elles permettient d9jouter des iliothques dns votre proE grmmeF ves iliothques sont en fit des (hiers ve des tonnes de fontions toutes prtes l9intrieurF ges (hiersEl @stdio.h et stdlib.hA ontiennent l pluprt des fontions de se dont on esoin dns un progrmmeF stdio.h en prtiulier ontient des fontions permettnt d90her des hoses l9rn @omme printfA mis ussi de demnder l9utilisteur de tper quelque hose @e sont des fontions que l9on verr plus trdAF
printf @A Y
g9est ienD mis e n9est ps su0sntF sl fut indiquer quoi rire l9rnF our fire D il fut donner l fontion printf le texte 0herF our e fireD ouvrez des guillemets l9intrieur des prenthses et tpez le texte 0her entre es guillemetsD omme el vit dj t fit sur le ode minimlF hns notre sD on v don tper trs extement X
1
printf @ 4 fonjour 4 A Y
t9espre que vous n9vez ps ouli le pointEvirgule l (nD je vous rppelle que 9est trs importnt 3 gel permet d9indiquer que l9instrution s9rrte lF oii le ode soure que vous devriez voir sous les yeux X
1 2 3 4 5 6
QV
return H Y
yn don deux instrutions qui ommndent dns l9ordre l9ordinteur X IF 0he fonjour l9rn Y PF l fontion main est termineD renvoie HF ve progrmme s9rrte lorsF v (gF QFT vous montre e que donne e progrmme l9rnF
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
hns notre sD pour fire une entreD il su0t de tper \n pour rer un retour l ligneF i je veux don fire un retour l ligne juste prs le mot fonjour D je devris tper X
1
printf @ 4 fonjour n 4 A Y
otre ordinteur omprend qu9il doit 0her fonjour suivi d9un retour l ligne @(gF QFUAF
Le syndrome de Grard
Bonjour, je m'appelle Grard et j'ai voulu essayer de modier votre programme pour qu'il me dise Bonjour Grard . Seulement voil, j'ai l'impression que l'accent de Grard ne s'ache pas correctement. . . Que faire ?
out d9ordD onjour qrrdF g9est une question trs intressnte que vous nous posez lF te tiens en premier lieu vous fliiter pour votre esprit d9inititiveD 9est trs ien d9voir eu l9ide de modi(er un peu le progrmmeF g9est en idouillnt les progrmmes que je vous donne que vous llez en pprendre le plusF xe vous ontentez RH
ps de e que vous lisezD essyez un peu vos propres modi(tions des progrmmes que nous voyons ensemle 3 fien 3 wintenntD pour rpondre l question de notre mi qrrdD j9i une ien triste nouvelle vous nnoner X l onsole de indows ne gre ps les entsF r ontre l onsole de vinuxD ouiF prtir de l vous vez deux solutionsF ! Passer LinuxF g9est une solution un peu rdile et il me fudrit un ours entier pour vous expliquer omment vous servir de vinuxF i vous n9vez ps le niveuD ouliez ette possiilit pour le momentF ! Ne pas utiliser d'accentsF g9est mlheureusement l solution que vous risquez de hoisirF v onsole de indows ses dfutsD que voulezEvousF sl v vous flE loir prendre l9hitude d9rire sns entsF fien entenduD omme plus trd vous ferez prolement des progrmmes ve des fentresD vous ne renontrerez plus e prolmeElF te vous reommnde don de ne ps utiliser d9ents temporirementD pendnt votre pprentissge dns l onsoleF os futurs progrmmes professionE nels n9uront ps e prolmeD rssurezEvousF our ne ps tre gnD vous devrez don rire sns ent X
1
RI
sl y plusieurs mnires d9insrer un ommentireF out dpend de l longueur du ommentire que vous voulez rireF ! otre ommentire est court X il tient sur une seule ligneD il ne fit que quelques motsF hns e sD vous devez tper un doule slsh @//A suivi de votre ommentireF r exemple X
1
ous pouvez ussi ien rire un ommentire seul sur s ligneD ou ien droite d9une instrutionF g9est d9illeurs quelque hose de trs prtique r insiD on sit que le ommentire sert indiquer quoi sert l ligne sur lquelle il estF ixemple X
1
xotez que e type de ommentire normlement t introduit pr le lngge gCCD mis vous n9urez ps de prolme en l9utilisnt pour un progrmme en lngge g ujourd9huiF ! otre ommentire est long X vous vez euoup direD vous vez esoin d9rire plusieurs phrses qui tiennent sur plusieurs lignesF hns e sD vous devez tper un ode qui signi(e dut de ommentire et un utre ode qui signi(e (n de ommentire X ! pour indiquer le dbut du commentaire X tpez un slsh suivi d9une toile @/*A Y ! pour indiquer l n du commentaire X tpez une toile suivie d9un slsh @*/AF ous rirez don pr exemple X
1 2 3
eprenons notre ode soure qui rit fonjour D et joutonsElui quelques ommenE tires juste pour s9entrner X
1 2 3 4 5
6 7 8 9 10 11 12 13
GB gi E dessous D e sont des diretives de pr proesseur F ges lignes permettent d ' jouter des fihiers u projet D fihiers que l ' on ppelle ilioth ques F qr e es ilioth ques D on disposer de fontions toutes pr tes pour ffiher pr exemple un messge l ' rn F BG 5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GB gi E dessous D vous vez l fontion priniple du progrmme D ppel e texttt { min }F g ' est pr ette fontion que tous les progrmmes ommenent F si D m fontion se ontente d ' ffiher fonjour l ' rn F BG
14 15 16
RP
21
22
int min @A { printf @ 4 fonjour 4 A Y GG gette instrution ffihe fonjour l ' rn return H Y GG ve progrmme renvoie le nomre H puis s ' rr te }
oil e que donnerit notre progrmme ve quelques ommentiresF yuiD il l9ir d9tre plus grosD mis en fit 9est le mme que tout l9heureF vors de l ompiltionD tous les ommentires seront ignorsF ges ommentires n9pprtront ps dns le progrmme (nlD ils servent seulement ux progrmmeursF xormlementD on ne ommente ps hque ligne du progrmmeF t9i dit @et je le reE diriA que 9tit importnt de mettre des ommentires dns un ode soureD mis il fut svoir doser X ommenter hque ligne ne servir l pluprt du temps rienF foreD vous surez que le printf permet d90her un messge l9rnD ps esoin de l9indiquer hque foisF ve mieux est de ommenter plusieurs lignes l foisD 9estEEdire d9indiquer quoi sert une srie d9instrutions histoire d9voir une ideF eprsD si le progrmmeur veut se penher plus en dtil dns es instrutionsD il est ssez intelligent pour y rriver tout seulF Retenez donc X les ommentires doivent guider le progrmmeur dns son ode soureD lui permettre de se reprerF issyez de ommenter un ensemle de lignes plutt que toutes les lignes une pr uneF it pour (nir sur une petite touhe ulturelleD voii une ittion tire de hez sfw X
Si aprs avoir lu uniquement les commentaires d'un programme vous n'en comprenez pas le fonctionnement, jetez le tout !
En rsum
! ves progrmmes peuvent ommuniquer ve l9utilisteur vi une onsole ou une fentreF ! sl est euoup plus file pour nos premiers progrmmes de trviller ve l consoleD ien que elleEi soit moins ttirnte pour un dutnt F ! n progrmme est onstitu d9instructions qui se terminent toutes pr un pointE virguleF ! ves instrutions sont ontenues dns des fonctions qui permettent de les lsserD omme dns des otesF ! v fontion main @qui signi(e priniple A est l fontion pr lquelle dmrre votre progrmmeF g9est l seule qui soit oligtoireD uun progrmme ne peut tre ompil sns elleF
6
6. Cela ne nous empchera pas par la suite de travailler avec des fentres dans la partie III. Tout vient point qui sait attendre. ;-)
RQ
est une fontion toute prte qui permet d90her un messge l9rn dns une onsoleF ! printf se trouve dns une bibliothque o l9on retrouve de nomreuses utres fontions prtes l9emploiF
printf
RR
Chapitre
4
Dicult :
Un monde de variables
ous savez acher un texte l'cran. Trs bien. a ne vole peut-tre pas trs haut pour le moment, mais c'est justement parce que vous ne connaissez pas encore ce qu'on appelle les variables en programmation. Le principe dans les grandes lignes, c'est de faire retenir des nombres l'ordinateur. On va apprendre stocker des nombres dans la mmoire. Je souhaite que nous commencions par quelques explications sur la mmoire de votre ordinateur. Comment fonctionne une mmoire ? Combien un ordinateur possde-t-il de mmoires direntes ? Cela pourra paratre un peu simpliste certains d'entre vous, mais je pense aussi ceux qui ne savent pas bien ce qu'est une mmoire.
RS
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 RT
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
RU
ge qui nous intresseD 9est e qu9il y l9intrieur de l9unit entrleF yuvronsEl @(gF 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 l9il 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 RV
gomme vous le voyezD il fut en gros distinguer deux olonnesF ! sl y les adresses X une dresse est un nomre qui permet l9ordinteur de se reprer dns l mmoire viveF yn ommene l9dresse H @u tout dut de l mmoireA et on (nit l9dresse Q RRV UTS WHH IPT et des poussiresF F F iuhD en fit je ne onnis ps le nomre d9dresses qu9il y dns l ewD je sis juste qu9il y en euoupF in plus dpend de l quntit de mmoire vive que vous vezF lus vous vez de mmoire viveD plus il y d9dressesD don plus on peut stoker de hosesF ! hque dresseD on peut stoker une valeur @un nomreA X votre ordinteur stoke dns l mmoire vive es nomres pour pouvoir s9en souvenir pr l suiteF yn ne peut stoker qu9un nomre pr dresse 3 xotre ew ne peut stoker que des nomresF RW
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 @abcABC012A Y ! votre nom de vrile doit ommener pr une lettre Y ! les espes sont interditsF l pleD on peut utiliser le rtre undersore @qui ressemle un trit de soulignementAF g9est le seul rtre di'rent des lettres et hi'res utoris Y ! vous n9vez ps le droit d9utiliser des ents @ etFAF in(nD et 9est trs importnt svoirD le lngge g fit l di'rene entre les mjusE ules et les minusulesF our votre ultureD shez qu9on dit que 9est un lngge qui respete l sse F honD du oupD les vriles largeurD LARGEUR ou enore LArgEuR sont trois vriles di'rentes en lngge gD mme si pour nous l9ir de signi(er l mme hose 3 oii quelques exemples de noms de vriles orrets X nombreDeViesD prenomD nomD numero_de_telephoneD numeroDeTelephoneF ghque progrmmeur s propre fon de nommer des vrilesF endnt e oursD je vis vous montrer m mnire de fire X ! je ommene tous mes noms de vriles pr une lettre minusule Y ! s9il y plusieurs mots dns mon nom de vrileD je mets une lettre mjusule u dut de hque nouveu motF te vis vous demnder de fire de l mme mnire que moiD nous permettr d9tre sur l mme longueur d9ondesF
Quoi que vous fassiez, faites en sorte de donner des noms clairs vos variables. On aurait pu abrger nombreDeVies, en l'crivant par exemple ndv. C'est peut-tre plus court, mais c'est beaucoup moins clair pour vous quand vous relisez votre code. N'ayez donc pas peur de donner des noms un peu plus longs pour que a reste comprhensible.
! WVIHDUF in plus de D il y ussi des nomres entiers ngtifs X ! EVU Y ! EWITF F F F it des nomres ngtifs dimux 3 ! EUTDW Y ! EIHHDIIF otre puvre ordinteur esoin d9ide 3 vorsque vous lui demndez de stoker un nomreD vous devez dire de quel type il estF ge n9est ps vriment qu9il ne soit ps ple de le reonntre tout seulD misF F F l9ide euoup s9orgniserD et fire en sorte de ne ps prendre trop de mmoire pour rienF vorsque vous rez une vrileD vous llez don devoir indiquer son typeF oii les prinipux types de vriles existnt en lngge g X
Nom du type Nombres stockables
char int long float double
EIPV IPU EP IRU RVQ TRV P IRU RVQ TRU EP IRU RVQ TRV P IRU RVQ TRU EQFR x IH puissne QV QFR x IH puissne QV EIFU x IH puissne QHV IFU x IH puissne QHV
(Je suis loin d'avoir mis tous les types, mais j'ai conserv les principaux)
ves trois premiers types @charD intD longA permettent de stoker des nomres entiers X ID PD QD RF F F ves deux derniers @floatD doubleA permettent de stoker des nomres dimux X IQFVD ITFWIIF F F
Les types float et double permettent de stocker des nombres dcimaux extrmement grands. Si vous ne connaissez pas les puissances de 10, dites-vous par exemple que le type double permet de stocker le nombre 1 suivi de 308 zros derrire ! C'est-dire : 10000000000000000000000000000000000000000000000000000. . . (je ne vais quand mme pas crire 308 zros pour vous !). Vous remarquerez qu'un int et un long ont l'air identiques. Avant ce n'tait pas le cas (un int tait plus petit qu'un long), mais aujourd'hui les mmoires ont volu et on a assez de place pour stocker des grands nombres, on se moque donc un peu de la dirence entre un int et un long. Le langage C conserve tous ces types pour des raisons de compatibilit, mme si certains sont un peu de trop. En pratique, j'utilise principalement char, int et double.
ous verrez que l pluprt du temps on mnipule des nomres entiers @tnt mieuxD pre que 9est plus file utiliserAF SP
Attention avec les nombres dcimaux ! Votre ordinateur ne connat pas la virgule, il utilise le point. Vous ne devez donc pas crire 54,9 mais plutt 54.9 !
ge n9est ps tout 3 our les types stoknt des entiers @charD intD longF F FAD il existe d9utres types dits unsigned @non signsA qui eux ne peuvent stoker que des nomres positifsF our les utiliserD il su0t d9rire le mot unsigned devnt le type X unsigned char H PSS unsigned int H R PWR WTU PWS unsigned long H R PWR WTU PWS gomme vous le voyezD les unsigned sont des types qui ont le dfut de ne ps pouvoir stoker de nomres ngtifsD mis l9vntge de pouvoir stoker des nomres deux fois plus grnds @char s9rrte IPVD tndis que unsigned char s9rrte PSS pr exempleAF
Pourquoi avoir cr trois types pour les nombres entiers ? Un seul type aurait t susant, non ?
yuiD mis on r l9origine plusieurs types pour onomiser de l mmoireF einsiD qund on dit l9ordinteur qu9on esoin d9une vrile de type charD on prend moins d9espe en mmoire que si on vit demnd une vrile de type intF outefoisD 9tit utile surtout l9poque o l mmoire tit limiteF eujourd9huiD nos ordinteurs ont lrgement ssez de mmoire vive pour que ne soit plus vriment un prolmeF sl ne ser don ps utile de se prendre l tte pendnt des heures sur le hoix d9un typeF i vous ne svez ps si votre vrile risque de prendre une grosse vleurD mettez intF in rsumD on fer surtout l distintion entre nomres entiers et dimux X ! pour un nomre entierD on utiliser le plus souvent int Y ! pour un nomre dcimalD on utiliser gnrlement doubleF
r exempleD si je veux rer m vrile nombreDeVies de type intD je dois tper l ligne suivnte X
1
int nomreheies Y
fon refD vous vez ompris le prinipe je pense 3 ge qu9on fit l s9ppelle une dclaration de variable @un voulire retenirAF ous devez fire les dlrtions de vriles u dut des fontionsF gomme pour le moment on n9 qu9une seule fontion @l fontion mainAD vous llez dlrer l vrile omme ei X
1 2 3 4 5 6 7 8 9
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A GG quivlent de int min @A { int nomreheies Y } return H Y
i vous lnez le progrmme iEdessusD vous onstterez ve stupeurF F F qu9il ne fit rienF
Quelques explications
elorsD vnt que vous ne m9trngliez en roynt que je vous mne en teu depuis tout l9heureD lissezEmoi juste dire une hose pour m dfenseF in fitD il se psse des hosesD mis vous ne les voyez psF vorsque le progrmme rrive l ligne de l dlrtion de vrileD il demnde ien gentiment l9ordinteur s9il peut utiliser un peu d9espe dns l mmoire viveF i tout v ienD l9ordinteur rpond yui ien srD fis omme hez toi F qnrlementD el se psse sns prolme F oyez don sns rinteD vos vriles devrient normlement tre res sns souiF
1
Une petite astuce connatre : si vous avez plusieurs variables du mme type dclarer, inutile de faire une ligne pour chaque variable. Il vous sut de sparer les dirents noms de variables par des virgules sur la mme ligne : int nombreDeVies, niveau, ageDuJoueur;. Cela crera trois variables int appeles nombreDeVies, niveau et ageDuJoueur.
1. Le seul problme qu'il pourrait y avoir, c'est qu'il n'y ait plus de place en mmoire. . . Mais heureusement cela arrive rarement, car pour remplir toute la mmoire rien qu'avec des int il faut vraiment le vouloir !
SR
it mintennt c wintennt qu9on r notre vrileD on v pouvoir lui donner une vleurF
nomreheies a S Y
ien de plus fireF ous indiquez le nom de l vrileD un signe glD puis l vleur que vous voulez y mettreF siD on vient de donner l vleur S l vrile nombreDeViesF xotre progrmme omplet ressemle don ei X
1 2 3 4 5 6 7 8 9 10
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int nomreheies Y nomreheies a S Y } return H Y
v enoreD rien ne s90he l9rnD tout se psse dns l mmoireF uelque prt dns les trfonds de votre ordinteurD une petite se de mmoire vient de prendre l vleur SF x9estEe ps mgni(que c yn peut s9muser si on veut hnger l vleur pr l suite X
1 2 3 4
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
SS
int nomreheies Y
il rserve un petit emplement en mmoireD d9ordF wis quelle est l vleur de l vrile e momentEl c EtEil une vleur pr dfut @pr exemple HA c ih ienD rohezEvous X l rponse est nonF xonD non et nonD il n9y ps de vleur pr dfutF in fitD l9emplement est rserv mis l vleur ne hnge psF yn n9e'e ps e qui se trouve dns l se mmoire F hu oupD votre vrile prend l vleur qui se trouvit l vnt dns l mmoireD et cette valeur peut tre n'importe quoi 3 i ette zone de l mmoire n9 jmis t modi(eD l vleur est peutEtre HF wis vous n9en tes ps srsD il pourrit trs ien y voir le nomre QTQ ou IV l pleD 9estEEdire un reste d9un vieux progrmme qui est pss pr l vnt 3 sl fut don fire trs ttention si on veut viter des prolmes pr l suiteF ve mieux est d9initiliser l vrile ds qu9on l dlreF in gD 9est tout fit possileF in grosD onsiste ominer l dlrtion et l9'ettion d9une vrile dns l mme instrution X
1
int nomreheies a S Y
siD l vrile nombreDeVies est dlre et prend tout de suite l vleur SF v9vntgeD 9est que vous tes srs prs que ette vrile ontient une vleur orreteD et ps du n9importe quoiF
Les constantes
sl rrive prfois que l9on it esoin d9utiliser une vrile dont on voudrit qu9elle grde l mme vleur pendnt toute l dure du progrmmeF g9estEEdire qu9une fois dlreD vous voudriez que votre vrile onserve s vleur et que personne n9it le droit de hnger e qu9elle ontientF ges vriles prtiulires sont ppeles constantesD justement pre que leur vleur reste onstnteF our dlrer une onstnteD 9est en fit trs simple X il fut utiliser le mot const juste devnt le type qund vous dlrez votre vrileF r illeursD il fut oligtoirement lui donner une vleur u moment de s dlrtion omme on vient d9pprendre le fireF eprsD il ser trop trd X vous ne pourrez plus hnger l vleur de l onstnteF ixemple de dlrtion de onstnte X
1
Ce n'est pas une obligation, mais par convention on crit les noms des constantes entirement en majuscules comme je viens de le faire l. Cela nous permet ainsi de distinguer facilement les constantes des variables. Notez qu'on utilise l'underscore _ la place de l'espace.
prt D une onstnte s9utilise omme une vrile normleD vous pouvez 0her s vleur si vous le dsirezF v seule hose qui hngeD 9est que si vous essyez de modi(er ST
l vleur de l onstnte plus loin dns le progrmmeD le ompilteur vous indiquer qu9il y une erreur ve ette onstnteF ves erreurs de ompiltion sont 0hes en s de l9rn @dns e que j9ppelle l zone de l mort D vous vous souvenez cAF hns un tel sD le ompilteur vous fE (herit un mot doux du genre X [Warning] assignment of read-only variable 'NOMBRE_DE_VIES_INITIALES' F
2
ge symole spil dont je viens de vous prler est en fit un 7 suivi de l lettre d F gette lettre permet d9indiquer e que l9on doit 0herF d signi(e que 9est un nomre entierF sl existe plusieurs utres possiilitsD mis pour des risons de simpliit on v se ontenter de retenir es deuxEl X
Symbole Signication
%d %f
te vous prleri des utres symoles en temps vouluF our le momentD shez que si vous voulez 0her un int vous devez utiliser %dD et pour un double vous utiliserez %fF yn presque (niF yn indiqu qu9 un endroit pris on voulit 0her un nomre entierD mis on n9 ps pris lequel 3 sl fut don indiquer l fontion printf quelle est l vrile dont on veut 0her l vleurF our e fireD vous devez tper le nom de l vrile prs les guillemets et prs voir rjout une virguleD omme ei X
1
ve %d ser rempl pr l vrile indique prs l virguleD svoir nombreDeViesF yn se teste dns un progrmme c
1 2 3 4 5 6 7
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int nomreheies a S Y GG eu d prt D le joueur S vies
2. Traduction : Triple idiot, pourquoi tu essaies de modier la valeur d'une constante ?
SU
10 11
printf @ 4 ous vez 7 d vies n 4 D nomreheies A Y printf @ 4 BBBB f e w BBBB n 4 A Y GG v il se prend un grnd oup sur l t te nomreheies a R Y GG sl vient de perdre une vie 3 printf @ 4 eh desole D il ne vous reste plus que 7 d vies mintennt 3 n n 4 D nomreheies A Y } return H Y
12 13 14
pourrit presque tre un jeu vido @il fut juste euoup d9imgintionAF ge proE grmme 0he ei l9rn X
ous vez S vies BBBB f e w BBBB eh desole D il ne vous reste plus que R vies mintennt 3
ous devriez reonntre e qui se psse dns votre progrmmeF IF eu dprt le joueur S viesD on 0he dns un printfF PF insuiteD le joueur prend un oup sur l tte @d9o le fewAF QF pinlement il n9 plus que R viesD on 0he ussi ve un printfF frefD 9est plutt simpleF
Veillez bien indiquer vos variables dans le bon ordre. Le premier %d sera remplac par la premire variable (nombreDeVies), et le second %d par la seconde variable (niveau). Si vous vous trompez d'ordre, votre phrase ne voudra plus rien dire.
ellezD un petit test mintenntF xotez que j9enlve les lignes tout en hut @les diretives de prproesseur ommennt pr un 5AD je vis supposer que vous les mettez hque fois mintennt X
1 2 3
SV
printf @ 4 ous vez 7 d vies et vous etes u niveu n 7 d n 4 D nomreheies D niveu AY } return H Y
6 7 8
ge qui 0her X
ous vez S vies et vous etes u niveu n I
int ge a H Y snf @ 4 7 d 4 D 8 ge A Y
yn doit mettre le %d entre guillemetsF r illeursD il fut mettre le symole 8 devnt le nom de l vrile qui v reevoir l vleurF
Euh, pourquoi mettre un & devant le nom de la variable ?
vD il v flloir que vous me fssiez on(neF i je dois vous expliquer tout de suiteD on n9est ps sortis de l9uergeD royezEmoi 3 ue je vous rssure qund mme X je vous expliqueri un peu plus trd e que signi(e e symoleF our le momentD je hoisis de ne ps vous l9expliquer pour ne ps vous emrouillerD 9est don plutt un servie que je vous rends l 3
Attention : si vous voulez faire entrer un nombre dcimal (de type double), cette fois il ne faut pas utiliser %f comme on pourrait s'y attendre mais. . . %lf. C'est une petite dirence avec le printf qui lui prenait %f.
1
doule poids a H Y
SW
snf @ 4 7 lf 4 D 8 poids A Y
evenons notre progrmmeF vorsque eluiEi rrive un scanfD il se met en puse et ttend que l9utilisteur entre un nomreF ge nomre ser stok dns l vrile ageF oii un petit progrmme simple qui demnde l9ge de l9utilisteur et qui le lui 0he ensuite X
1 2 3 4 5 6 7 8 9 10
int min @ int rg D hr B rgv A { int ge a H Y GG yn initilise l vrile H printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 ge A Y GG yn demnde d ' entrer l ' ge ve snf printf @ 4 eh 3 ous vez don 7 d ns 3 n n 4 D ge A Y } return H Y
ve progrmme se met don en puse prs voir 0h l question uel ge vezE vous c F ve urseur pprt l9rnD vous devez tper un nomre entier @votre geAF pez ensuite sur intre pour vliderD et le progrmme ontinuer s9exuterF siD tout e qu9il fit prs 9est 0her l vleur de l vrile age l9rn @ Ah ! Vous avez donc 20 ans ! AF oilD vous vez ompris le prinipeF qre l fontion scanfD on peut don ommenE er intergir ve l9utilisteurF xotez que rien ne vous emphe de tper utre hose qu9un nomre entier X ! si vous rentrez un nomre dimlD omme PFWD il ser utomtiquement tronquD 9estEEdire que seule l prtie entire ser onserveF hns e sD 9est le nomre P qui urit t stok dns l vrile Y ! si vous tpez des lettres u hsrd @ ydf AD l vrile ne hnger ps de vleurF ge qui est ien iiD 9est qu9on vit initilis notre vrile H u dutF he e fitD le progrmme 0her H ns si n9 ps mrhF i on n9vit ps initilis l vrileD le progrmme urit pu 0her n9importe quoi 3
En rsum
! xos ordinteurs possdent plusieurs types de mmoireF he l plus rpide l plus lente X les registresD l mmoire heD l mmoire vive et le disque durF TH
! our retenir des informtionsD notre progrmme esoin de stoker des donnes dns l mmoireF sl utilise pour el l mmoire vive F ! hns notre ode soureD les variables sont des donnes stokes temporirement en mmoire viveF v vleur de es donnes peut hnger u ours du progrmmeF ! l9opposD on prle de constantes pour des donnes stokes en mmoire viveF v vleur de es donnes ne peut ps hngerF ! sl existe plusieurs types de vrilesD qui oupent plus ou moins d9espe en mmoireF gertins types omme int sont prvus pour stoker des nomres entiersD tndis que d9utres omme double stokent des nomres dimuxF ! v fontion scanf permet de demnder l9utilisteur de sisir un nomreF
3
3. Les registres et la mmoire cache sont aussi utiliss pour augmenter les performances, mais cela fonctionne automatiquement, nous n'avons pas nous en proccuper.
TI
TP
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.
TQ
s esoin d9tre un pro du lul mentl pour deviner que l vrile resultat ontiendr l vleur V prs exutionF fien srD rien ne s90he l9rn ve e odeF i vous voulez voir l vleur de l vrileD rjoutez un printf omme vous svez mintennt si ien le fire X
1
printf @ 4 S C Q a
7 d 4 D resultt A Y
l9rnD el donner X
S C Q a V
oil pour l9dditionF our les utres oprtionsD 9est l mme hoseD seul le signe utilis hnge @voir tF SFIAF i vous vez dj utilis l lultrie sur votre ordinteurD vous devriez onntre es signesF sl n9y ps de di0ult prtiulire pour es oprtionsD prt pour les deux dernires @l division et le moduloAF xous llons don prler un peu plus en dtil de hune d9ellesF
1. Je vous expliquerai ce que c'est si vous ne savez pas, pas de panique.
TR
eddition + oustrtion wultiplition * hivision / wodulo % Table SFI ! ignes des oprteurs
Opration
Signe
La division
ves divisions fontionnent normlement sur un ordinteur qund il n9y ps de resteF r exempleD 6 / 3 font PD votre ordinteur vous donner l rponse justeF tusqueEl ps de souiF wis prenons mintennt une division ve reste omme 5 / 2F F F ve rsultt devrit tre PFSF it pourtnt 3 egrdez e que fit e ode X
1 2 3 4
sl y un gros prolmeF yn demnd 5 / 2D on s9ttend voir PFSD et l9ordinteur nous dit que fit P 3 sl y nguille sous roheF xos ordinteurs serientEils stupides e point c in fitD qund il voit les hi'res S et PD votre ordinteur fit une division de nomres entiers F gel veut dire qu9il tronque le rsulttD il ne grde que l prtie entire @le PAF
2
H mais je sais pourquoi ! C'est parce que resultat est un int ! Si a avait t un double, il aurait pu stocker un nombre dcimal l'intrieur !
ih nonD e n9est ps l rison 3 issyez le mme ode en trnsformnt juste resultat en doubleD et vous verrez qu9on vous 0he qund mme PF re que les nomres de l9oprtion sont des nomres entiersD l9ordinteur rpond pr un nomre entierF i on veut que l9ordinteur 0he le on rsulttD il v flloir trnsformer les nomres S et P de l9oprtion en nomres dimuxD 9estEEdire rire SFH et PFH @e sont les mmes nomresD mis l9ordinteur onsidre que e sont des nomres dimuxD don il fit une division de nomres dimuxA X
1 2
doule resultt a H Y
2. Aussi appele division euclidienne .
TS
vD le nomre est orretF fon X il 0he des tonnes de zros derrire si lui hnteD mis le rsultt reste qund mme orretF gette proprit de l division de nomres entiers est trs importnteF sl fut que vous reteniez que pour un ordinteur X ! S G P a PY ! IH G Q a Q Y ! R G S a HF g9est un peu surprenntD mis 9est s fon de luler ve des entiersF i vous voulez voir un rsultt dimlD il fut que les nomres de l9oprtion soient dimux X ! SFH G PFH a PFS Y ! IHFH G QFH a QFQQQQQ Y ! RFH G SFH a HFVF in fitD en fisnt une division d9entiers omme 5 / 2D votre ordinteur rpond l question gomien y EtEil de fois P dns le nomre S c F v rponse est deux foisF he mmeD omien de fois y EtEil le nomre Q dns IH c rois foisF wis lors me direzEvousD omment on fit pour ruprer le reste de l division c g9est l que superEmodulo intervientF
Le modulo
ve modulo est une oprtion mthmtique qui permet d9otenir le reste d'une divisionF g9est peutEtre une oprtion moins onnue que les qutre utresD mis pour votre ordinteur reste une oprtion de seF F F prolement pour justement omler le prolme de l division d9entiers qu9on vient de voirF ve moduloD je vous l9i dit tout l9heureD se reprsente pr le signe %F oii quelques exemples de modulos X ! S 7 P a IY ! IR 7 Q a P Y ! R 7 P a HF ve modulo 5 % 2 est le reste de l division 5 / 2D 9estEEdire IF v9ordinteur lule que 5 = 2 * 2 + 1 @9est e ID le resteD que le modulo renvoieAF he mmeD 14 % 3, le lul est 14 = 3 * 4 + 2 @modulo renvoie le PAF in(nD pour 4 % 2D l division tome justeD il n9y ps de resteD don modulo renvoie HF oilD il n9y rien jouter u sujet des modulosF te tenis juste l9expliquer eux qui ne onntrient psF TT
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 nombre1 et nombre2D et stoke le rsultt dns l vrile resultatF it 9est l que les hoses ommenent devenir trs intressntesF enezD il me vient une ideF ous vez mintennt dj le niveu pour rliser une miniElultrieF iD siD je vous ssure 3 smginez un progrmme qui demnde deux nomres l9utilisteurF ges deux nomresD vous les stokez dns des vrilesF insuiteD vous fites l somme de es vriles et vous stokez le rsultt dns une vrile ppele resultatF ous n9vez plus qu9 0her le rsultt du lul l9rnD sous les yeux his de l9utilisteur qui n9urit jmis t ple de luler el de tte ussi viteF issyez de oder vousEmmes e petit progrmmeD 9est file et vous entrner 3 v rponse est iEdessous X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
int min @ int rg D hr B rgv A { int resultt a H D nomreI a H D nomreP a H Y GG yn demnde les nomres I et P l ' utilisteur X printf @ 4 intrez le nomre I X 4 A Y snf @ 4 7 d 4 D 8 nomreI A Y printf @ 4 intrez le nomre P X 4 A Y snf @ 4 7 d 4 D 8 nomreP A Y GG yn fit le lul X resultt a nomreI C nomreP Y GG it on ffihe l ' ddition l ' rn X printf @ 4 7 d C 7 d a 7 d n 4 D nomreI D nomreP D resultt A Y } return H Y
TU
ns en voir l9irD on vient de fire l notre premier progrmme ynt un intrtF xotre progrmme est ple d9dditionner deux nomres et d90her le rsultt de l9oprtion 3 ous pouvez essyer ve n9importe quel nomre @du moment que vous ne dpssez ps les limites d9un type intAD votre ordinteur e'etuer le lul en un lir F te vous onseille de fire l mme hose ve les utres oprtions pour vous entrner @soustrtionD multiplitionF F FAF ous ne devriez ps voir trop de ml vu qu9il y juste un ou deux signes hngerF ous pouvez ussi jouter une troisime vrile et fire l9ddition de trois vriles l foisD fontionne sns prolme X
3 1
Les raccourcis
gomme promisD nous n9vons ps de nouvelles oprtions voirF it pour use 3 xous les onnissons dj toutesF g9est ve es simples oprtions de se que vous pouvez tout rerF sl n9y ps esoin d9utres oprtionsF te reonnis que 9est di0ile vlerD se dire qu9un jeu Qh ne fit rien d9utre u (nl que des dditions et des soustrtionsD pourtntF F F 9est l strite vritF gei tntD il existe en g des tehniques permettnt de rourir l9riture des opE rtionsF ourquoi utiliser des rouris c re queD souventD on fit des oprtions rptitivesF ous llez voir e que je veux dire pr l tout de suiteD ve e qu9on ppelle l9inrmenttionF
L'incrmentation
ous verrez que vous serez souvent mens jouter I une vrileF eu fur et mesure du progrmmeD vous urez des vriles qui ugmentent de I en IF smginons que votre vrile s9ppelle nombre @nom trs originlD n9estEe ps cAF uriezE vous omment fire pour jouter I ette vrileD sns svoir quel est le nomre qu9elle ontient c oii omment on doit fire X
1
nomre a nomre C I Y
3. Encore heureux, parce que des oprations comme a, il doit en faire des milliards en une seule seconde !
TV
LES RACCOURCIS
ue se psseEtEil ii c yn fit le lul nombre + 1D et on rnge e rsultt dns l vrileF F F nombre 3 hu oupD si notre vrile nombre vlit RD elle vut mintennt SF i elle vlit VD elle vut mintennt WD etF gette oprtion est justement rptitiveF ves informtiiens tnt des gens prtiuliE rement finntsD ils n9vient gure envie de tper deux fois le mme nom de vrile @en oui quoiD 9est ftignt 3AF sls ont don invent un rouri pour ette oprE tion qu9on ppelle l'incrmentationF gette instrution produit extement le mme rsultt que le ode qu9on vient de voir X
1
nomre CCY
gette ligneD ien plus ourte que elle de tout l9heureD signi(e ejoute I l vrile nombre F sl su0t d9rire le nom de l vrile inrmenterD de mettre deux signes CD et ien entenduD de ne ps oulier le pointEvirguleF wine de rienD el nous ser ien prtique pr l suite rD omme je vous l9i ditD on ser souvent mens fire des inrmenttions @9estEEdire jouter I une vrileAF
Si vous tes perspicaces, vous avez d'ailleurs remarqu que ce signe ++ se trouve dans le nom du langage C++. C'est en fait un clin d'il des programmeurs, et vous tes maintenant capables de le comprendre ! C++ signie qu'il s'agit du langage C incrment , c'est--dire si on veut du langage C un niveau suprieur . En pratique, le C++ permet surtout de programmer diremment mais il n'est pas meilleur que le C : juste dirent.
La dcrmentation
g9est tout tement l9inverse de l9inrmenttion X on enlve I une vrileF wme si on fit plus souvent des inrmenttions que des drmenttionsD el reste une oprtion prtique que vous utiliserez de temps en tempsF v drmenttionD si on l9rit en forme longue X
1
nomre a nomre E I Y
nomre E EY
yn l9urit presque devin tout seul 3 eu lieu de mettre un ++D vous mettez un -- X si votre vrile vut TD elle vudr S prs l9instrution de drmenttionF
nomre a nomre B P Y
nomre Ba P Y
i le nomre vut S u dprtD il vudr IH prs ette instrutionF our les utres oprtions de seD el fontionne de l mme mnireF oii un petit progrmme d9exemple X
1 2 3 4 5 6 7
int nomre a P Y nomre nomre nomre nomre nomre Ca Ea Ba Ga 7a RY QY SY QY QY GG GG GG GG GG nomre vut T FFF FFF nomre vut mintennt Q FFF nomre vut IS FFF nomre vut S FFF nomre vut P @ r S a I B Q C P A
v9vntge ii est qu9on peut utiliser toutes les oprtions de seD et qu9on peut jouE terD soustrireD multiplier pr n9importe quel nomreF ge sont des rouris onntre si vous vez un jour des lignes rptitives tper dns un progrmmeF etenez qund mme que l9inrmenttion reste de loin le rouri le plus utilisF
La bibliothque mathmatique
in lngge gD il existe e qu9on ppelle des iliothques stndrd D 9estEEdire des iliothques toujours utilislesF ge sont en quelque sorte des iliothques de se qu9on utilise trs souventF ves iliothques sontD je vous le rppelleD des ensemles de fontions toutes prtesF ges fontions ont t rites pr des progrmmeurs vnt vousD elles vous vitent en quelque sorte d9voir rinventer l roue hque nouveu progrmmeF ous vez dj utilis les fontions printf et scanf de l iliothque stdio.hF sl fut svoir qu9il existe une utre iliothqueD ppele math.hD qui ontient de nomreuses fontions mthmtiques toutes prtesF in e'etD les inq oprtions de se que l9on vues sont loin d9tre su0sntes 3 fonD il se peut que vous n9yez jmis esoin de ertines oprtions omplexes omme les exponentielles F outefoisD l iliothque mthmtique ontient de nomreuses utres fontions dont vous urez trs prolement esoinF enez pr exempleD on ne peut ps fire de puissnes en g 3 gomment luler un simple rr c ous pouvez toujours essyer de tper 52 dns votre progrmmeD mis votre ordinteur ne le omprendr jmis r il ne sit ps e que 9estF F F moins que vous le lui expliquiez en lui indiqunt l iliothque mthmtique 3
4
4. Si vous ne savez pas ce que c'est, c'est que vous tes peut-tre un peu trop jeunes ou que vous n'avez pas assez fait de maths dans votre vie.
UH
LA BIBLIOTHQUE MATHMATIQUE
our pouvoir utiliser les fontions de l iliothque mthmtiqueD il est indispensle de mettre l diretive de prproesseur suivnte en hut de votre progrmme X
1
5 inlude ` mth Fh b
ne fois que 9est fitD vous pouvez utiliser toutes les fontions de ette iliothqueF t9i justement l9intention de vous les prsenterF fon X omme il y euoup de fonE tionsD je ne peux ps en fire l liste omplte iiF h9une prt vous ferit trop ssimilerD et d9utre prt mes puvres petits doigts urient fondu vnt l (n de l9riture du hpitreF te vis don me ontenter des fontions priniplesD 9estEEdire elles qui me semlent les plus importntesF
Vous n'avez peut-tre pas tous le niveau en maths pour comprendre ce que font ces fonctions. Si c'est votre cas, pas d'inquitude. Lisez juste, cela ne vous pnalisera pas pour la suite. Ceci tant, je vous ore un petit conseil gratuit : soyez attentifs en cours de maths, on ne dirait pas comme a, mais en fait a nit par servir !
fabs
gette fontion retourne l vleur solue d9un nomreD 9estEEdire |x| @9est l nottion mthmtiqueAF v vleur solue d9un nomre est s vleur positive X ! si vous donnez ESQ l fontionD elle vous renvoie SQ Y ! si vous donnez SQ l fontionD elle vous renvoie SQF in refD elle renvoie toujours l9quivlent positif du nomre que vous lui donnezF
1 2 3
gette fontion renvoie un doubleD don votre vrile absolu doit tre de type doubleF
Il existe aussi une fonction similaire appele abs, situe cette fois dans La fonction abs marche de la mme manire, sauf qu'elle utilise des entiers (int). Elle renvoie donc un nombre entier de type int et non un double comme fabs.
stdlib.h.
ceil
gette fontion renvoie le premier nomre entier prs le nomre diml qu9on lui donneF g9est une sorte d9rrondiF yn rrondit en fit toujours u nomre entier supE rieurF r exempleD si on lui donne PTFSIPD l fontion renvoie PUF gette fontion s9utilise de l mme mnire et renvoie un double X UI
oor
g9est l9inverse de l fontion prdente X ette foisD elle renvoie le nomre diretement en dessousF i vous lui donnez QUFWID l fontion floor vous renverr don QUF
pow
gette fontion permet de luler l puissne d9un nomreF ous devez lui indiquer deux vleurs X le nomre et l puissne lquelle vous voulez l9leverF oii le shm de l fontion X
1
r exempleD P puissne Q @que l9on rit hituellement PQ sur un ordinteurAD 9est le lul P B P B PD e qui fit V X
1 2 3
ous pouvez don utiliser ette fontion pour luler des rrsF sl su0t d9indiquer une puissne de PF
sqrt
gette fontion lule l rine rre d9un nomreF ille renvoie un doubleF
1 2 3
LA BIBLIOTHQUE MATHMATIQUE
exp
gette fontion lule l9exponentielle d9un nomreF ille renvoie un double @ouiD ouiD elle ussiAF
log
gette fontion lule le logrithme nprien d9un nomre @que l9on note ussi ln AF
log10
gette fontion lule le logrithme se IH d9un nomreF
En rsum
! n ordinteur n9est en fit qu9une calculatrice gante X tout e qu9il sit fireD e sont des oprtionsF ! ves oprtions onnues pr votre ordinteur sont trs basiques X l9dditionD l sousE trtionD l multiplitionD l division et le modulo F ! sl est possile d9eectuer des calculs entre des variablesF g9est d9illeurs e qu9un ordinteur sit fire de mieux X il le fit ien et viteF ! v9incrmentation est l9oprtion qui onsiste jouter I une vrileF yn rit variable++F ! v dcrmentation est l9oprtion inverse X on retire I une vrileF yn rit don variable--F ! our ugmenter le nomre d9oprtions onnues pr votre ordinteurD il fut hrger l bibliothque mathmatique F ! gette iliothque ontient des fonctions mathmatiques plus avancesD telles que l puissneD l rine rreD l9rrondiD l9exponentielleD le logrithmeD etF
5 6
UQ
UR
Chapitre
6
Dicult :
Les conditions
ous avons vu dans le premier chapitre qu'il existait de nombreux langages de programmation. Certains se ressemblent d'ailleurs : un grand nombre d'entre eux sont inspirs du langage C. En fait le langage C a t cr il y a assez longtemps, ce qui fait qu'il a servi de modle de nombreux autres plus rcents. La plupart des langages de programmation ont nalement des ressemblances, ils reprennent les principes de base de leurs ans. En parlant de principes de base : nous sommes en plein dedans. Nous avons vu comment crer des variables, faire des calculs avec (concept commun tous les langages de programmation !), nous allons maintenant nous intresser aux conditions. Sans conditions, nos programmes informatiques feraient toujours la mme chose !
US
aa b ` ba `a 3a
est gl est suprieur est infrieur est suprieur ou gl est infrieur ou gl est di'rent de
Faites trs attention, il y a bien deux symboles == pour tester l'galit. Une erreur courante que font les dbutants et de ne mettre qu'un symbole =, ce qui n'a pas la mme signication en C. Je vous en reparlerai un peu plus bas.
Un if simple
ettquons mintennt sns plus trderF xous llons fire un test simpleD qui v dire l9ordinteur X s l vrile vut D evy fis eiF UT
in nglisD le mot si se trduit pr ifF g9est elui qu9on utilise en lngge g pour introduire une onditionF rivez don un ifF yuvrez ensuite des prenthses X l9intrieur de es prenthses vous devrez rire votre onditionF insuiteD ouvrez une olde { et fermezEl un peu plus loin }F out e qui se trouve l9intrieur des oldes ser exut uniquement si l ondition est vri(eF gel nous donne don rire X
1 2 3 4
l ple de mon ommentire otre ondition D on v rire une ondition pour tester une vrileF r exempleD on pourrit tester une vrile age qui ontient votre geF enez pour s9entrnerD on v tester si vous tes mjeurD 9estEEdire si votre ge est suprieur ou gal 18 X
1 2 3 4
i vous voulez tester les odes prdents pour voir omment le if fontionneD il fudr pler le if l9intrieur d9une fontion main et ne ps oulier de dlrer une vrile age lquelle on donner l vleur de notre hoixF gel peut prtre vident pour ertinsD mis plusieurs leteurs visilement perdus m9ont enourg jouter ette explitionF oii don un ode omplet que vous pouvez tester X
1 2 3 4 5 6 7 8 9
UU
} }
return H Y
gopier e ode gode we X SQQURT siD l vrile age vut PHD don le ous tes mjeur 3 s90herF issyez de hnger l vleur initile de l vrile pour voirF wettez pr exemple IS X l ondition ser fusseD et don ous tes mjeur 3 ne s90her ps ette foisF tilisez e ode de se pour tester les prohins exemples du hpitreF
Une question de propret
v fon dont vous ouvrez les oldes n9est ps importnteD votre progrmme fonE tionner ussi ien si vous rivez tout sur une mme ligneF r exemple X
1
if @ ge ba IV A {
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.
sl su0t de rjouter le mot else prs l9olde fermnte du ifF etit exemple X
1 2 3 4 5 6 7 8
if @ ge ba IV A GG i l ' ge est sup rieur ou gl IV { printf @ 4 ous etes mjeur 3 4 A Y } else GG inon FFF { printf @ 4 eh ' est ete D vous etes mineur 3 4 A Y }
ves hoses sont ssez simples X si l vrile age est suprieure ou gle IVD on 0he le messge ous tes mjeur 3 D sinon on 0he ous tes mineur F
6 7 8 9 10 11
12
if @ ge ba IV A GG i l ' ge est sup rieur ou gl IV { printf @ 4 ous etes mjeur 3 4 A Y } else if @ ge b R A GG inon D si l ' ge est u moins sup rieur R { printf @ 4 fon t ' es ps trop jeune qund meme FFF 4 A Y } else GG inon FFF { printf @ 4 eg g g g 4 A Y GG vngge D vous pouvez ps omprendre }
v9ordinteur fit les tests dns l9ordreF IF h9ord il teste le premier if X si l ondition est vrieD lors il exute e qui se trouve entre les premires oldesF PF inonD il v u sinon si et fit nouveu un test X si e test est vriD lors il exute les instrutions orrespondntes entre oldesF UW
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
1
if @ ge b IV 88 ge ` PS A
ves deux symoles && signi(ent iF xotre ondition se dirit en frnis X si l9ge est suprieur IV i si l9ge est infrieur PS F
Test OU
our fire un yD on utilise les deux signes ||F te dois vouer que e signe n9est ps filement essile sur nos lviersF our le tper sur un lvier ei frnisD il fudr fire Alt Gr + 6F ur un lvier elgeD il fudr fire Alt Gr + &F smginons pour l9exemple un progrmme stupide qui dide si une personne le droit d9ouvrir un ompte en nqueF g9est ien onnuD pour ouvrir un ompte en nque il vut mieux ne ps tre trop jeune @on v dire ritrirement qu9il fut voir u moins VH
QH nsA ou ien voir euoup d9rgent @pre que lD mme IH ns on vous epter rs ouverts 3AF xotre test pour svoir si le lient le droit d9ouvrir un ompte en nque pourrit tre X
1 2 3 4 5 6 7 8
if @ ge b QH || rgent b IHHHHH A { printf @ 4 fienvenue hez isoufnque 3 4A Y } else { printf @ 4 rors de m vue D miserle 3 4 A Y }
ge test n9est vlide que si l personne plus de QH ns ou si elle possde plus de IHH HHH euros 3
Test NON
ve dernier symole qu9il nous reste tester est le point d9exlmtionF in informtiqueD le point d9exlmtion signi(e non F ous devez mettre e signe vnt votre ondition pour dire si el n9est ps vri X
1
if @3@ ge ` IV AA
gel pourrit se trduire pr si l personne n9est ps mineure F i on vit enlev le ! devntD el urit signi( l9inverse X si l personne est mineure F
N'oubliez pas de mettre deux signes gl dns un ifD omme ei X == i vous ne mettez qu9un seul signe =D lors votre vrile prendra l vleur IV @omme
on l9 ppris dns le hpitre sur les vrilesAF xous e qu9on veut fire iiD 9est tester l vleur de l vrileD non ps l hnger 3 pites trs ttention elD euoup d9entre vous n9en mettent qu9un qund ils dutent et formentF F F leur progrmme ne fontionne ps omme ils voudrient 3 VI
Le point-virgule de trop
ne utre erreur ournte de dutnt X vous mettez prfois un pointEvirgule l (n de l ligne d9un ifF yrD un if est une onditionD et on ne met de pointEvirgule qu9 l (n d9une instrution et non d9une onditionF ve ode suivnt ne mrher ps omme prvu r il y un pointEvirgule l (n du if X
1 2 3 4
if @ ge aa IV A Y GG xotez le point E virgule ii qui ne devrit e tre l { printf @ 4 u es tout juste mjeur 4 A Y }
sultt X
g 9 est vri
Mais ? On n'a pas mis de condition dans le if, juste un nombre. Qu'est-ce que a veut dire ? a n'a pas de sens.
VP
} else { }
sultt X
g 9 est fux
pites mintennt d9utres tests en remplnt le H pr n9importe quel utre nomre entierD omme RD ISD PPTD EIHD EQTD etF u9estEe qu9on vous rpond hque fois c yn vous rpond X g9est vri F Rsum de nos tests : si on met un HD le test est onsidr omme fuxD et si on met un I ou n9importe quel utre nomreD le test est vriF
if @ ge ba IV A
siD le test que vous fites est age >= 18F upposons que age ville PQF elors le test est vriD et l9ordinteur remple en quelque sorte age >= 18 pr IF insuiteD l9ordinteur otient @dns s tteA un if (1)F und le nomre est ID omme on l9 vuD l9ordinteur dit que l ondition est vrieD don il 0he g9est vri 3 he mmeD si l ondition est fusseD il remple age >= 18 pr le nomre HD et du oup l ondition est fusse X l9ordinteur v lire les instrutions du elseF
gomme vous le voyezD l ondition age >= 18 renvoy le nomre I r elle est vrieF hu oupD notre vrile majeur vut ID on vri(e d9illeurs el gre un printf qui montre ien qu9elle hng de vleurF pites le mme test en mettnt age == 10 pr exempleF gette foisD majeur vudr HF VQ
gomme mjeur vut ID l ondition est vrieD don on 0he u es mjeur 3 F ge qui est trs prtiqueD 9est que l ondition peut tre lue filement pr un tre huminF yn voit if (majeur)D e qui peut se trduire pr si tu es mjeur F ves tests sur des oolens sont don files lire et omprendreD pour peu que vous yez donn des noms lirs vos vriles omme je vous i dit de le fire ds le dutF enezD voii un utre test imginire X
1
if @ mjeur 88 gron A
ge test signi(e si tu es mjeur i que tu es un gron F garcon est ii une utre vrile oolenne qui vut I si vous tes un gronD et H si vous tesF F F une (lle 3 frvoD vous vez tout ompris 3 ves oolens permettent don de dire si quelque hose est vri ou fuxF g9est vriment utile et e que je viens de vous expliquer vous permettr de omprendre on nomre de hoses pr l suiteF
1. Pour tre tout fait exact, 0 = faux et tous les autres nombres valent vrai (on a eu l'occasion de le tester plus tt). Ceci dit, pour simplier les choses on va se contenter de n'utiliser que les nombres 0 et 1, pour dire si quelque chose est faux ou vrai .
VR
LA CONDITION SWITCH
(majeur == 1),
out fitF wis le prinipe des oolens 9est justement de rourir l9expression du if et de l rendre plus filement lisileF evouez que if (majeur) se omprend trs ienD non c Retenez donc X si votre vrile est ense ontenir un nomre @omme un geAD fites un test sous l forme if (variable == 1)F i u ontrire votre vrile est ense ontenir un oolen @9estEEdire soit I soit H pour dire vri ou fuxAD fites un test sous l forme if (variable)F
La condition switch
v ondition if... else que l9on vient de voir est le type de ondition le plus souvent utilisF in fitD il n9y ps QT fons de fire une ondition en gF ve if... else permet de grer tous les sF outefoisD le if... else peut s9vrer quelque peuF F F rptitifF renons et exemple X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
if @ ge aa P A { printf @ 4 lut ee 3 4 A Y } else if @ ge aa T A { printf @ 4 lut gmin 3 4 A Y } else if @ ge aa IP A { printf @ 4 lut jeune 3 4 A Y } else if @ ge aa IT A { printf @ 4 lut do 3 4 A Y } else if @ ge aa IV A { printf @ 4 lut dulte 3 4 A Y } else if @ ge aa TV A { printf @ 4 lut ppy 3 4 A Y } else { printf @ 4 te n ' i uune phrse de prete pour ton ge 4 A Y }
VS
Construire un switch
ves informtiiens dtestent fire des hoses rptitivesD on eu l9osion de le vri(er plus ttF elorsD pour viter d9voir fire des rptitions omme qund on teste l vleur d9une seule et mme vrileD ils ont invent une utre struture que le if... elseF gette struture prtiulire s9ppelle switchF oii un switch s sur l9exemple qu9on vient de voir X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
swith @ ge A { se P X printf @ 4 lut ee 3 4 A Y rek Y se T X printf @ 4 lut gmin 3 4 A Y rek Y se IP X printf @ 4 lut jeune 3 4 A Y rek Y se IT X printf @ 4 lut do 3 4 A Y rek Y se IV X printf @ 4 lut dulte 3 4 A Y rek Y se TV X printf @ 4 lut ppy 3 4 A Y rek Y defult X printf @ 4 te n ' i uune phrse de prete pour ton ge rek Y }
4AY
gopier e ode gode we X WWTWVV smprgnezEvous de mon exemple pour rer vos propres switchF yn les utilise plus rrementD mis 9est vri que 9est prtique r fit @un peuA moins de ode tperF v9ide 9est don d9rire switch (maVariable) pour dire je vis tester l vleur de l vrile maVariable F ous ouvrez ensuite des oldes que vous refermez tout en sF insuiteD l9intrieur de es oldesD vous grez tous les s X case 2D case 4D case 5D case 45F F F VT
LA CONDITION SWITCH
Vous devez mettre une instruction break; obligatoirement la n de chaque cas. Si vous ne le faites pas, alors l'ordinateur ira lire les instructions en dessous censes tre rserves aux autres cas ! L'instruction break; commande en fait l'ordinateur de sortir des accolades.
in(nD le s default orrespond en fit u else qu9on onnt ien mintenntF i l vrile ne vut uune des vleurs prdentesD l9ordinteur ir lire le defaultF
in onsoleD pour fire un menuD on fit des printf qui 0hent les di'rentes options possilesF ghque option est numroteD et l9utilisteur doit entrer le numro du menu qui l9intresseF oii pr exemple e que l onsole devr 0her X
aaa wenu aaa IF oyl gheese PF w heluxe QF w fon RF fig w otre hoix c
Voici votre mission (si vous l'acceptez) X reproduisez e menu l9ide de printf
@fileAD joutez un scanf pour enregistrer le hoix de l9utilisteur dns une vrile choixMenuD et en(n fites un switch pour dire l9utilisteur tu s hoisi le menu oyl gheese pr exempleF ellezD u trvil 3
Correction
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { int hoixwenu Y printf @ 4 aaa wenu aaa n n 4 A Y printf @ 4 I F oyl gheese n 4 A Y printf @ 4 P F w heluxe n 4 A Y
VU
printf @ 4 Q F w fon n 4 A Y printf @ 4 R F fig w n 4 A Y printf @ 4 notre hoix c 4 A Y snf @ 4 7 d 4 D 8 hoixwenu A Y printf @ 4 n 4 A Y swith @ hoixwenu A { se I X printf @ 4 ous vez hoisi le oyl gheese F fon hoix 3 4 A Y rek Y se P X printf @ 4 ous vez hoisi le w heluxe F ferk D trop de sue FFF 4 A Y rek Y se Q X printf @ 4 ous vez hoisi le w fon F fon D psse enore Y o A 4 A Y rek Y se R X printf @ 4 ous vez hoisi le fig w F ous devez voir tres fim 3 4 A Y rek Y defult X printf @ 4 ous n ' vez ps rentre un nomre orret F ous ne mngerez rien du tout 3 4 A Y rek Y } printf @ 4 n n 4 A Y } return H Y
25 26 27
28 29 30
31 32 33
34 35 36 37 38 39 40
gopier e ode gode we X SQRIIV it voil le trvil 3 t9espre que vous n9vez ps ouli le default l (n du switch 3 in e'etD qund vous progrmmez vous devez toujours penser tous les sF ous vez eu dire de tper un nomre entre I et RD vous trouverez toujours un imile qui ir tper 10 ou enore Salut lors que e n9est ps e que vous ttendezF frefD soyez toujours vigilnts de e tEi X ne fites ps on(ne l9utilisteurD il peut prfois entrer n9importe quoiF rvoyez toujours un s default ou un else si vous fites ve des ifF VV
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.
if @ mjeur A ge a IV Y else ge a IU Y
Notez que j'ai enlev dans cet exemple les accolades car elles sont facultatives s'il n'y a qu'une instruction, comme je vous l'ai expliqu plus tt.
ge a @ mjeur A c IV X IU Y
ves ternires permettentD sur une seule ligneD de hnger l vleur d9une vrile en fontion d9une onditionF si l ondition est tout simplement majeurD mis pourrit tre n9importe quelle ondition plus longue ien entendu F
2
VW
ve point d9interrogtion permet de dire estEe que tu es mjeur c F i ouiD lors on met l vleur IV dns ageF inon @le deuxEpoints : signi(e else iiAD on met l vleur IUF ves ternires ne sont ps du tout indispenslesD personnellement je les utilise peu r ils peuvent rendre l leture d9un ode soure un peu di0ileF gei tntD il vut mieux que vous les onnissiez pour le jour o vous tomerez sur un ode plein de ternires dns tous les sens 3
En rsum
! ves conditions sont l se de tous les progrmmesF g9est un moyen pour l9ordiE nteur de prendre une dcision en fontion de l vleur d9une vrileF ! ves motsEls ifD else ifD else signi(ent respetivement si D sinon si D siE non F yn peut rire utnt de else if que l9on dsireF ! n boolen est une vrile qui peut voir deux tts X vri @IA ou fux @HA F yn utilise des int pour stoker des oolens r e ne sont en fit rien d9utre que des nomresF ! ve switch est une lterntive u if qund il s9git d9nlyser l vleur d9une vrileF sl permet de rendre un ode soure plus lir si vous vous pprtiez tester de nomreux s F ! ves ternaires sont des onditions trs onises qui permettent d9'eter rpideE ment une vleur une vrile en fontion du rsultt d9un testF yn les utilise ve primonie r le ode soure tendne devenir moins lisile ve ellesF
3 4
3. Toute valeur dirente de 0 est en fait considre comme vraie . 4. Si vous utilisez de nombreux else if c'est en gnral le signe qu'un switch serait plus adapt pour rendre le code source plus lisible.
WH
Chapitre
7
Dicult :
Les boucles
prs avoir vu comment raliser des conditions en C, nous allons dcouvrir les boucles. Qu'est-ce qu'une boucle ? C'est une technique permettant de rpter les mmes instructions plusieurs fois. Cela nous sera bien utile par la suite, notamment pour le premier TP qui vous attend aprs ce chapitre. Relaxez-vous : ce chapitre sera simple. Nous avons vu ce qu'taient les conditions et les boolens dans le chapitre prcdent, c'tait un gros morceau avaler. Maintenant a va couler de source et le TP ne devrait pas vous poser trop de problmes. Enn protez-en, parce qu'ensuite nous ne tarderons pas entrer dans la partie II du cours, et l vous aurez intrt tre bien rveills !
WI
oii e qu9il se psse dns l9ordre X IF l9ordinteur lit les instrutions de hut en s @omme d9hitudeA Y PF puisD une fois rriv l (n de l ouleD il reprt l premire instrution Y QF il reommene lors lire les instrutions de hut en sF F F RF F F F et il reprt u dut de l ouleF ve prolme dns e systme 9est que si on ne l9rrte psD l9ordinteur est ple de rpter les instrutions l9in(ni 3 sl n9est ps du genre se plindreD vous svez X il fit e qu9on lui dit de fireF F F sl pourrit trs ien se loquer dns une oule in(nieD 9est d9illeurs une des nomreuses rintes des progrmmeursF it 9est l qu9on retrouveF F F les onditions 3 und on re une ouleD on indique toujours une onditionF gette ondition signi(er pte l oule tnt que ette ondition est vrie F gomme je vous l9i ditD il y plusieurs mnires de s9y prendreF oyons voir sns plus trder omment on rlise une oule de type while en gF
La boucle while
oii omment on onstruit une oule while X
1
while @ GB gondition BG A
WP
LA BOUCLE WHILE
2 3 4
{ }
GG snstrutions r p ter
g9est ussi simple que elF while signi(e nt que F yn dit don l9ordinteur nt que l ondition est vrieD rpte les instrutions entre oldes F te vous propose de fire un test simple X on v demnder l9utilisteur de tper le nomre RUF nt qu9il n9 ps tp le nomre RUD on lui redemnde le nomreF ve progrmme ne pourr s9rrter que si l9utilisteur tpe le nomre RU @je sisD je sisD je suis dioliqueA X
1 2 3 4 5 6 7
oii mintennt le test que j9i fitF xotez que j9i fit exprs de me tromper PEQ fois vnt de tper le on nomreF
pez pez pez pez le le le le nomre nomre nomre nomre RU RU RU RU 3 3 3 3 IH PU RH RU
ve progrmme s9est rrt prs voir tp le nomre RUF gette oule while se rpte don tnt que l9utilisteur n9 ps tp RUD 9est ssez simpleF wintenntD essyons de fire quelque hose d9un peu plus intressnt X on veut que notre oule se rpte un ertin nomre de foisF yn v pour el rer une vrile compteur qui vudr H u dut du progrmme et que l9on v incrmenter u fur et mesureF ous vous souvenez de l9inrmenttion c onsiste jouter I l vrile en fisnt variable++;F egrdez ttentivement e out de ode etD surtoutD essyez de le omprendre X
1 2 3 4 5 6 7
int ompteur a H Y while @ ompteur ` IH A { printf @ 4 lut les eros 3 n 4 A Y ompteur CCY }
sultt X
lut les eros 3 lut les eros 3 lut les eros 3
WQ
IF eu dprtD on une vrile compteur initilise HF ille vut don H u dut du progrmmeF PF v oule while ordonne l rptition ex i compteur est infrieur IHF gomme compteur vut H u dprtD on rentre dns l ouleF QF yn 0he l phrse lut les eros 3 vi un printfF RF yn incrmente l vleur de l vrile compteurD gre compteur++;F compteur vlit HD elle vut mintennt IF SF yn rrive l (n de l oule @olde fermnteA X on reprt don u dutD u niveu du whileF yn refit le test du while X Est-ce que compteur est toujours infrieure 10 ? F fen ouiD compteur vut I 3 hon on reommene les instrutions de l ouleF it insi de suiteF F F compteur v vloir progressivement HD ID PD QD F F FD VD WD et IHF vorsque compteur vut IHD l ondition compteur < 10 est fusseF gomme l9instrution est fusseD on sort de l ouleF yn pourrit d9illeurs voir que l vrile compteur ugmente u fur et mesure dns l ouleD en l90hnt dns le printf X
1 2 3 4 5 6 7
int ompteur a H Y while @ ompteur ` IH A { printf @ 4 v vrile ompteur vut 7d n 4 D ompteur A Y ompteur CCY } v v v v v v vrile vrile vrile vrile vrile vrile ompteur ompteur ompteur ompteur ompteur ompteur vut vut vut vut vut vut H I P Q R S
WR
oil X si vous vez ompris D vous vez tout ompris 3 ous pouvez vous muser ugmenter l limite du nomre de oules @< 100 u lieu de < 10AF gel m9urit t d9illeurs trs utile plus jeune pour rdiger les punitions que je devis rrire IHH foisF
ouvenezEvous des oolens X I a vriD H a fuxF siD l ondition est toujours vrieD e progrmme 0her don foule in(nie sns rrt 3
Pour arrter un tel programme sous Windows, vous n'avez pas d'autre choix que de fermer la console en cliquant sur la croix en haut droite. Sous Linux, faites Ctrl + C.
pites don trs ttention X vitez tout prix de tomer dns une oule in(nieF xotez toutefois que les oules in(nies peuvent s9vrer utilesD notmmentD nous le verrons plus trdD lorsque nous rliserons des jeuxF
int ompteur a H Y do {
u9estEe que hnge c g9est trs simple X l oule while pourrit trs ien ne jmis tre exute si l ondition est fusse ds le dprtF r exempleD si on vit WS
initilis le ompteur SHD l ondition urit t fusse ds le dut et on ne serit jmis rentr dns l ouleF our l oule do... whileD 9est di'rent X cette boucle s'excutera toujours au moins une foisF in e'etD le test se fit l (n omme vous pouvez le voirF i on initilise compteur SHD l oule s9exuter une foisF sl est don prfois utile de fire des oules de e typeD pour s9ssurer que l9on rentre u moins une fois dns l ouleF
Il y a une particularit dans la boucle do... while qu'on a tendance oublier quand on dbute : il y a un point-virgule tout la n ! N'oubliez pas d'en mettre un aprs le while, sinon votre programme plantera la compilation !
La boucle for
in thorieD l oule while permet de rliser toutes les oules que l9on veutF outeE foisD tout omme le switch pour les onditionsD il est dns ertins s utile d9voir un utre systme de oule plus ondens D plus rpide rireF ves oules for sont trs trs utilises en progrmmtionF te n9i ps de sttistiques sous l minD mis shez que vous utiliserez ertinement utnt de for que de whileD si e n9est plusD il vous fudr don svoir mnipuler es deux types de oulesF gomme je vous le disisD les oules for sont juste une utre fon de fire une oule whileF oii un exemple de oule while que nous vons vu tout l9heure X
1 2 3 4 5 6 7
int ompteur a H Y while @ ompteur ` IH A { printf @ 4 lut les eros 3 n 4 A Y ompteur CCY }
int ompteur Y for @ ompteur a H Y ompteur ` IH Y ompteur CCA { printf @ 4 lut les eros 3 n 4 A Y }
uelles di'renes c ! ous noterez que l9on n9 ps initilis l vrile compteur H ds s dlrtion @mis on urit pu le fireAF ! sl y euoup de hoses entre les prenthses prs le for @nous llons dtiller prsAF ! sl n9y plus de compteur++; dns l ouleF WT
LA BOUCLE FOR
sntressonsEnous e qui se trouve entre les prenthsesD r 9est l que rside tout l9intrt de l oule forF sl y trois instrutions ondensesD hune spre pr un pointEvirguleF ! v premire est l'initialisation X ette premire instrution est utilise pour prprer notre vrile compteurF hns notre sD on initilise l vrile HF ! v seonde est la condition X omme pour l oule whileD 9est l ondition qui dit si l oule doit tre rpte ou nonF nt que l ondition est vrieD l oule for ontinueF ! in(nD il y l'incrmentation X ette dernire instrution est exute l (n de hque tour de oule pour mettre jour l vrile compteurF v qusiEtotlit du temps on fer une inrmenttionD mis on peut ussi fire une drmenttion @variable--;A ou enore n9importe quelle utre oprtion @variable += 2; pour vner de P en P pr exempleAF frefD omme vous le voyez l oule for n9est rien d9utre qu9un ondensF hez vous en servirD vous en urez esoin plus d9une fois 3
En rsum
! ves boucles sont des strutures qui nous permettent de rpter une srie d9instruE tions plusieurs foisF ! sl existe plusieurs types de oules X whileD do... while et forF gertines sont plus dptes que d9utres selon les sF ! v oule for est prolement elle qu9on utilise le plus dns l prtiqueF yn y fit trs souvent des inrmenttions ou des drmenttions de vrilesF
WU
WV
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.
WW
Prparatifs et conseils
Le principe du programme
evnt toute hoseD il fut que je vous explique en quoi v onsister notre progrmmeF g9est un petit jeu que j9ppelle lus ou moins F ve prinipe est le suivntF IF v9ordinteur tire u sort un nomre entre I et IHHF PF sl vous demnde de deviner le nomreF ous entrez don un nomre entre I et IHHF QF v9ordinteur ompre le nomre que vous vez entr ve le nomre mystre qu9il tir u sortF sl vous dit si le nomre mystre est suprieur ou infrieur elui que vous vez entrF RF uis l9ordinteur vous redemnde le nomreF SF F F F it il vous indique si le nomre mystre est suprieur ou infrieurF TF it insi de suiteD jusqu9 e que vous trouviez le nomre mystreF ve ut du jeuD ien srD est de trouver le nomre mystre en un minimum de oupsF oii une pture d9rn d9une prtieD 9est e que vous devez rriver fire X
uel est le nomre c SH g 9 est plus 3 uel est le nomre c US g 9 est plus 3 uel est le nomre c VS g 9 est moins 3 uel est le nomre c VH g 9 est moins 3 uel est le nomre c UV g 9 est plus 3 uel est le nomre c UW frvo D vous vez trouve le nomre mystere 333
gertesD nous ne svons ps gnrer un nomre ltoireF sl fut dire que demnder el l9ordinteur n9est ps simple X il sit ien fire des lulsD mis lui demnder de hoisir un nomre u hsrdD D il ne sit ps fire 3 IHH
PRPARATIFS ET CONSEILS
in fitD pour essyer d9otenir un nomre ltoireD on doit fire fire des luls omplexes l9ordinteurF F F e qui revient u out du ompte fire des luls 3 fonD on don deux solutionsF ! oit on demnde l9utilisteur d9entrer le nomre mystre vi un scanf d9ordF implique qu9il y it deux joueurs X l9un entre un nomre u hsrd et l9utre essie de le deviner ensuiteF ! oit on tente le tout pour le tout et on essie qund mme de gnrer un nomre ltoire utomtiquementF v9vntge est qu9on peut jouer tout seul du oupF ve dfutF F F est qu9il v flloir que je vous explique omment fire 3 xous llons tenter l seonde solutionD mis rien ne vous emphe de oder l premire ensuite si vous voulezF our gnrer un nomre ltoireD on utilise l fontion rand()F gette fontion gnre un nomre u hsrdF wis nousD on veut que e nomre soit ompris entre I et IHH pr exemple @si on ne onnt ps les limitesD v devenir trop ompliquAF our e fireD on v utiliser l formule suivnte X
1 1 2
v premire ligne @ve srandA permet d9initiliser le gnrteur de nomres ltoiresF yuiD 9est un peu ompliquD je vous vis prvenusF nombreMystere est une vrile qui ontiendr le nomre tir u hsrdF
L'instruction srand ne doit tre excute qu'une seule fois (au dbut du programme). Il faut obligatoirement faire un srand une fois, et seulement une fois. Vous pouvez ensuite faire autant de rand() que vous voulez pour gnrer des nombres alatoires, mais il ne faut PAS que l'ordinateur lise l'instruction srand deux fois par programme, ne l'oubliez pas.
MAX
et MIN sont des onstntesD le premier est le nomre mximl @IHHA et le seond le nomre miniml @IAF te vous reommnde de d(nir es onstntes u dut du progrmmeD omme ei X
1
IHI
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
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` time Fh b int min @ int rg D hr BB rgv A { int nomrewystere a H D nomreintre a H Y onst int we a IHH D wsx a I Y GG q n rtion du nomre l toire srnd @ time @ xvv A A Y nomrewystere a @ rnd @A 7 @ we E wsx C I A A C wsx Y
IHP
CORRECTION !
17
GB v oule du progrmme F ille se r p te tnt que l ' utilisteur n ' ps trouv le nomre myst re BG do {
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
GG yn demnde le nomre printf @ 4 uel est le nomre c 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y GG yn ompre le nomre entr ve le nomre myst re
33 34 35
if @ nomrewystere b nomreintre A printf @ 4 g ' est plus 3 n n 4 A Y else if @ nomrewystere ` nomreintre A printf @ 4 g ' est moins 3 n n 4 A Y else printf @ 4 frvo D vous vez trouve le nomre mystere 333 n n 4 A Y } while @ nomreintre 3a nomrewystere A Y }
Excutable et sources
our eux qui le dsirentD je mets votre disposition en tlhrgement l9exutle du progrmme insi que les souresF lhrger le progrmme gode we X IUSSUR
L'excutable (.exe) est compil pour Windows, donc si vous tes sous un autre systme d'exploitation il faudra obligatoirement recompiler le programme pour qu'il marche chez vous.
sl y deux dossiersD l9un ve l9exutle @ompil sous indows je le rppelleA et l9utre ve les souresF hns le s de lus ou moins D les soures sont trs simples X il y juste un (hier main.cF x9ouvrez ps le (hier main.c diretementF yuvrez d9ord votre shi fvori @gode: :floksD isulD etFA et rez un nouveu projet de type onsoleD videF ne fois que 9est fitD demndez jouter u projet le (hier main.cF ous pourrez lors ompiler le progrmme pour tester et le modi(er si vous le dsirezF IHQ
Explications
te vis mintennt vous expliquer mon odeD en ommennt pr le dutF
Les directives de prprocesseur
ge sont les lignes ommennt pr # tout en hutF illes inluent les iliothques dont on esoinF te vous les i donnes tout l9heureD don si vous vez russi fire une erreur lD vous tes trs fortsF
Les variables
yn n9en ps eu esoin de euoupF tuste une pour le nomre entr pr l9utilisteur @nombreEntreA et une utre qui retient le nomre ltoire gnr pr l9ordinteur @nombreMystereAF t9i ussi d(ni les onstntes omme je vous l9i dit u dut de e hpitreF v9vntge de d(nir les onstntes en hut du progrmmeD 9est que pour hnger l di0ult @en mettnt IHHH pour MAX pr exempleA il su0t juste d9diter ette ligne et de reompilerF
La boucle
t9i hoisi de fire une oule do... whileF in thorieD une oule while simple urit pu fontionner ussiD mis j9i trouv qu9utiliser do... while tit plus logiqueF ourquoi c re queD souvenezEvousD do... while est une oule qui s9exute u moins une foisF it nousD on sit qu9on veut demnder le nomre l9utilisteur u moins une fois @il ne peut ps trouver le rsultt en moins d9un oupD ou lors 9est qu9il est super fort 3AF hque pssge dns l ouleD on redemnde l9utilisteur d9entrer un nomreF yn stoke le nomre qu9il propose dns nombreEntreF uisD on ompre e nombreEntre u nombreMystereF sl y trois possiilits X ! le nomre mystre est suprieur u nomre entrD on indique don l9indie g9est plus 3 Y ! le nomre mystre est infrieur u nomre entrD on indique l9indie g9est moins 3 Y ! et si le nomre mystre n9est ni suprieur ni infrieur c ih ienF F F 9est qu9il est glD forment 3 h9o le elseF hns e sD on 0he l phrse frvo vous vez trouv 3 F sl fut une ondition pour l ouleF gelleEi tit file trouver X on ontinue l oule TANT QUE le nombre entr n'est pas gal au nombre mystreF und es deux nomres sont gux @9estEEdire qund on trouvAD l oule s9rrteF ve progrmme est lors terminF IHR
IDES D'AMLIORATION
Ides d'amlioration
ous ne royiez tout de mme ps qu9on llit s9rrter l c te veux vous initer ontinuer mliorer e progrmmeD pour vous entrnerF x9ouliez ps que 9est en vous entrnnt omme el que vous progresserez 3 geux qui lisent les ours d9une trite sns jmis fire de tests font une grosse erreurD je l9i dit et je le rediri 3 pigurezEvous que j9i une imgintion dordnteD et mme sur un petit progrmme omme eluiEl je ne mnque ps d9ides pour l9mliorer 3 ettention X ette fois je ne vous fournis ps de orretionD il fudr vous drouiller tout seuls 3 i vous vez vriment des prolmesD n9hsitez ps ller fire un tour sur les forums du ite du roD setion lngge gF pites une reherhe pour voir si on n9 ps dj donn l rponse vos questionsD sinon rez un nouveu sujet pour poser es questionsF porum g du ite du ro gode we X RUQSUQ ! Faites un compteur de coups F ge ompteur devr tre une vrile que vous inrmenterez hque fois que vous pssez dns l ouleF vorsque l9utilisteur trouv le nomre mystreD vous lui direz frvoD vous vez trouv le nomre mystre en V oups pr exempleF ! vorsque l9utilisteur trouv le nomre mystreD le progrmme s9rrteF ourquoi ne ps demnder s9il veut fire une autre partie c i vous fites D il vous fudr fire une oule qui engloer l qusiEtotlit de votre progrmmeF gette oule devr se rpter ex i l9utilisteur n9 ps demnd rrter le progrmmeF te vous onseille de rjouter une vrile oolenne continuerPartie initilise I u dprtF i l9utilisteur demnde rrter le progrmmeD vous mettrez l vrile H et le progrmme s9rrterF ! smplmentez un mode 2 joueurs 3 ettentionD je veux qu9on it le hoix entre un mode I joueur et un mode P joueurs 3 ous devrez don fire un menu u dut de votre progrmme qui demnde l9utilisteur le mode de jeu qui l9intresseF v seule hose qui hnger entre les deux modes de jeuD 9est l gnrtion du nomre mystreF hns un s e ser un rand() omme on vuD dns l9utre s serF F F un scanfF ! grez plusieurs niveaux de dicultF eu dutD fites un menu qui demnde le niveu de di0ultF r exemple X ! I a entre I et IHH Y ! P a entre I et IHHH Y ! Q a entre I et IHHHHF i vous fites D vous devrez hnger votre onstnte weF F F ih ouiD ne peut plus tre une onstnte si l vleur doit hnger u ours du progrmme 3 enommez don ette vrile en nombreMaximum @vous prendrez soin d9enlever le motEl const sinon ser toujours une onstnte 3AF v vleur de ette vrile dpendr du niveu qu9on ur hoisiF oilD devrit vous ouper un petit out de tempsF emusezEvous ien et n9hsitez IHS
ps herher d9utres ides pour mliorer e lus ou woins D je suis sr qu9il y en 3 x9ouliez ps que les forums sont votre disposition si vous vez des questionsF
IHT
Chapitre
9
Dicult :
Les fonctions
ous terminerons la partie I du cours ( Les bases ) par cette notion fondamentale que sont les fonctions en langage C. Tous les programmes en C se basent sur le principe que je vais vous expliquer dans ce chapitre. Nous allons apprendre structurer nos programmes en petits bouts. . . un peu comme si on jouait aux Legos. Tous les gros programmes en C sont en fait des assemblages de petits bouts de code, et ces petits bouts de code sont justement ce qu'on appelle. . . des fonctions !
IHU
in hutD on y trouve les diretives de prproesseur @un nom rre sur lequel on reviendr d9illeursAF ges diretives sont files identi(er X elles ommenent pr un # et sont gnrlement mises tout en hut des (hiers souresF uis en dessousD il y vit e que j9vis dj ppel une fontion F siD sur mon shmD vous voyez une fontion main @ps trop remplie il fut le reonntreAF te vous vis dit qu9un progrmme en lngge g ommenit pr l fontion mainF te vous rssureD 9est toujours vri 3 eulementD jusqu9ii nous sommes rests l9intrieur de l fontion mainF xous n9en sommes jmis sortisF evoyez vos odes soures et vous verrez X nous sommes toujours rests l9intrieur des oldes de l fontion mainF
Eh bien, c'est mal d'avoir fait comme a ?
xon e n9est ps ml D mis e n9est ps e que les progrmmeurs en g font dns l rlitF usiment uun progrmme n9est rit uniquement l9intrieur des oldes de l fontion mainF tusqu9ii nos progrmmes tient ourtsD don ne posit ps de gros prolmesD mis imginez des plus gros progrmmes qui font des milliers de lignes de ode 3 i tout tit onentr dns l fontion mainD onjour le zrF F F xous llons don mintennt pprendre nous orgniserF xous llons en fit douper nos progrmmes en petits outs @souvenezEvous de l9imge des vegos que je vous i donne tout l9heureAF ghque petit out de progrmme ser e qu9on ppelle une fontionF ne fontion exute des tions et renvoie un rsulttF g9est un morceau de code qui sert fire quelque hose de prisF yn dit qu9une fontion possde une entre et une sortieF v (gF WFP reprsente une fontion shmtiquementF vorsqu9on ppelle une fontionD il y trois tpesF IF L'entre X on fit rentrer des informtions dns l fontion @en lui donnnt des informtions ve lesquelles trvillerAF IHV
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 afficherFenetre qui ouvrir une fentre l9rnF ne fois l fontion rite @9est l9tpe l plus di0ileAD on n9ur plus qu9 dire rep 3 toi l fontion afficherFenetreD ouvreEmoi une fentre 3 F yn pourr ussi rire une fontion deplacerPersonnage dont le ut ser de dpler le personnge d9un jeu l9rnD etF
ous reonnissez l forme de l fontion mainF oii e qu9il fut svoir sur e shmF
1. Bien entendu, les fonctions seront en gnral plus compliques.
IHW
@orrespond l sortieA X 9est le type de l fontionF gomme les vrilesD les fontions ont un typeF ge type dpend du rsultt que l fontion renvoie X si l fontion renvoie un nomre dimlD vous mettrez srement doubleD si elle renvoie un entier vous mettrez int ou long pr exempleF wis il est ussi possile de rer des fontions qui ne renvoient rien 3 sl y don deux sortes de fontions X ! les fontions qui renvoient une vleur X on leur met un des types que l9on onnt @charD intD doubleD etFA Y ! les fontions qui ne renvoient ps de vleur X on leur met un type spil void @qui signi(e vide AF ! nomFonction X 9est le nom de votre fontionF ous pouvez ppeler votre fontion omme vous voulezD du temps que vous respetez les mmes rgles que pour les vriles @ps d9entsD ps d9espesD etFAF ! parametres @orrespond l9entreA X entre prenthsesD vous pouvez envoyer des prmtres l fontion F ge sont des vleurs ve lesquelles l fontion v trvillerF r exempleD pour une fontion tripleD vous envoyez un nomre en prmtreF v fontion rupre e nomre et en lule le tripleD en le multiplint pr QF ille renvoie ensuite le rsultt de ses lulsF ! insuite vous vez les accolades qui indiquent le dut et l (n de l fontionF l9intrieur de es oldes vous mettrez les instrutions que vous voulezF our l fontion tripleD il fudr tper des instrutions qui multiplient pr Q le nomre reu en entreF ne fontionD 9est don un mnisme qui reoit des vleurs en entre @les prmtresA et qui renvoie un rsultt en sortieF
type
2
int triple @ int nomre A { int resultt a H Y resultt a Q B nomre Y GG yn multiplie le nomre fourni pr Q return resultt Y GG yn retourne l vrile resultt qui vut le triple de nomre
oil notre premire fontion 3 ne premire hose importnte X omme vous le voyezD l fontion est de type intF ille doit don renvoyer une vleur de type intF
2. Vous pouvez envoyer autant de paramtres que vous le voulez. Vous pouvez aussi n'envoyer aucun paramtre la fonction, mais a se fait plus rarement.
IIH
intre les prenthsesD vous vez les vriles que l fontion reoitF siD notre fontion triple reoit une vrile de type int ppele nombreF v ligne qui donne pour onsigne de renvoyer une vleur est elle qui ontient le returnF gette ligne se trouve gnrlement l (n de l fontionD prs les lulsF
1
return resultt Y
ge ode signi(e pour l fontion X errteEtoi l et renvoie le nomre resultat F gette vrile resultat hys tre de type intD r l fontion renvoie un int omme on l9 dit plus hutF v vrile resultat est dlre @a reA dns l fontion tripleF gel signi(e qu9elle n9est utilisle que dns ette fontionD et ps dns une utre omme l fontion main pr exempleF g9est don une vrile propre l fontion tripleF wis estEe l fon l plus ourte d9rire notre fontion triple c xonD on peut fire tout el en une ligne en fit X
1 2 3 4
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 addition qui dditionne deux nomres a et b X
1 2 3 4
sl su0t de sprer les di'rents prmtres pr une virgule omme vous le voyezF
Aucun paramtre
gertines fontionsD plus rresD ne prennent uun prmtre en entreF ges fontions feront gnrlement toujours l mme hoseF in e'etD si elles n9ont ps de nomres sur
3. Gnralement, vos fonctions contiendront plusieurs variables pour eectuer leurs calculs et leurs oprations, rares seront les fonctions aussi courtes que triple.
III
lesquels trvillerD vos fontions serviront juste e'etuer ertines tionsD omme 0her du texte l9rn F smginons une fontion bonjour qui 0he juste fonjour l9rn X
4 1 2 3 4
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
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A { return Q B nomre Y } int min @ int rg D hr B rgv A { int nomreintre a H D nomreriple a H Y printf @ 4 intrez un nomre FFF 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y nomreriple a triple @ nomreintre A Y printf @ 4 ve triple de e nomre est 7 d n 4 D nomreriple A Y } return H Y
4. Et encore, ce sera forcment toujours le mme texte puisque la fonction ne reoit aucun paramtre susceptible de modier son comportement !
IIP
gopier e ode gode we X VISRWT xotre progrmme ommene pr l fontion main omme vous le svezF yn demnde l9utilisteur d9entrer un nomreF yn envoie e nomre qu9il entr l fontion tripleD et on rupre le rsultt dns l vrile nombreTripleF egrdez en prtiulier ette ligneD 9est l plus intressnte r 9est l9ppel de l fontion X
1
intre prenthsesD on envoie une vrile en entre l fontion tripleD 9est le nomre sur lequel elle v trvillerF gette fontion renvoie une vleurD vleur qu9on rupre dns l vrile nombreTripleF yn ordonne don l9ordinteur dns ette ligne X hemnde l fontion triple de me luler le triple de nombreEntreD et stoke le rsultt dns l vrile nombreTriple F
Les mmes explications sous forme de schma
ous vez enore du ml omprendre omment fontionne onrtement c s de pnique 3 te suis sr que vous llez omprendre ve mes shmsF ge ode prtiulirement omment vous indique dns quel ordre le ode est luF gomE menez don pr lire l ligne numrote ID puis PD puis Q @on vous vez ompris je rois 3A X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A GG T { return Q B nomre Y GG U } int min @ int rg D hr B rgv A GG I { int nomreintre a H D nomreriple a HY GG P printf @ 4 intrez un nomre FFF 4 A Y GG Q snf @ 4 7 d 4 D 8 nomreintre A Y GG R nomreriple a triple @ nomreintre A Y GG S printf @ 4 ve triple de e nomre est 7 d n 4 D nomreriple A Y GG V } return H Y GG W
18 19 20
oii e qui se psseD ligne pr ligneF IF ve progrmme ommene pr l fontion mainF IIQ
PF QF RF SF TF UF VF WF
sl lit les instrutions dns l fontion une pr une dns l9ordreF sl lit l9instrution suivnte et fit e qui est demnd @printfAF he mmeD il lit l9instrution et fit e qui est demnd @scanfAF sl lit l9instrutionF F F eh 3 yn ppelle l fontion tripleD on doit don suter l ligne de l fontion triple plus hutF yn sute l fontion triple et on rupre un prmtre @nombreAF yn fit des luls sur le nomre et on termine l fontionF return signi(e l (n de l fontion et permet d9indiquer le rsultt renvoyerF yn retourne dns le main l9instrution suivnteF n return 3 v fontion min se termine et don le progrmme est terminF
i vous vez ompris dns quel ordre l9ordinteur lit les instrutionsD vous vez dj ompris le priniplF wintenntD il fut ien omprendre qu9une fontion reoit des prmtres en entre et renvoie une vleur en sortie @(gF WFRAF
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
IIR
Vous n'tes pas obligs de stocker le rsultat d'une fonction dans une variable ! Vous pouvez directement envoyer le rsultat de la fonction triple une autre fonction, comme si triple(nombreEntre) tait une variable.
egrdez ien eiD 9est le mme ode mis il y un hngement u niveu du dernier printfF he plusD on n9 ps dlr de vrile nombreTriple r on ne s9en sert plus X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int triple @ int nomre A { return Q B nomre Y } int min @ int rg D hr B rgv A { int nomreintre a H Y printf @ 4 intrez un nomre FFF 4 A Y snf @ 4 7 d 4 D 8 nomreintre A Y GG ve r sultt de l fontion est diretement envoy u printf et n ' est ps stok dns une vrile printf @ 4 ve triple de e nomre est 7 d n 4 D triple @ nomreintre A A Y } return H Y
17
18 19 20
gomme vous le voyezD triple(nombreEntre) est diretement envoy u printfF ue fit l9ordinteur qund il tome sur ette ligne c g9est trs simpleF sl voit que l ligne ommene pr printfD il v don ppeler l fontion printfF sl envoie l fontion printf tous les prmtres qu9on lui donneF ve premier prmtre est le texte 0her et le seond est un nomreF otre ordinteur voit que pour envoyer e nomre l fontion printf il doit d9ord ppeler l fontion tripleF g9est e qu9il fit X il ppelle tripleD il e'etue les luls de triple et une fois qu9il le rsultt il l9envoie diretement dns l fontion printf 3 g9est un peu une imrition de fontionsF it le plus (n dns tout D 9est qu9une fontion peut en ppeler une utre son tour 3 xotre fontion triple pourrit ppeler une utre fontionD qui elleEmme ppellerit une utre fontionD etF g9est le prinipe de l progrmmtion en g 3 out est ominD omme dns un jeu de vegoF eu (nlD le plus dur ser d9rire vos fontionsF ne fois que vous les urez ritesD vous n9urez plus qu9 ppeler les fontions sns vous souier des luls qu9elles peuvent ien fire l9intrieurF v permettre de simpli(er onsidrlement l9riture de nos progrmmes et royezEmoi on en ur ien esoin 3 IIS
doule onversion @ doule euros A { doule frns a H Y frns a T F SSWSU B euros Y return frns Y
int min @ int rg D hr B rgv A { printf @ 4 IH euros a 7 fp n 4 D onversion @ IH A A Y printf @ 4 SH euros a 7 fp n 4 D onversion @ SH A A Y printf @ 4 IHH euros a 7 fp n 4 D onversion @ IHH A A Y printf @ 4 PHH euros a 7 fp n 4 D onversion @ PHH A A Y } return H Y
IIT
sl n9y ps grndEhose de di'rent pr rpport l fontion tripleD je vous vis prvenusF h9illeursD m fontion conversion est un peu longue et pourrit tre rE ourie en une ligneD je vous lisse le fire je vous i dj expliqu omment fire plus hutF hns l fontion mainD j9i fit exprs de fire plusieurs printf pour vous montrer l9intrt d9voir une fontionF our otenir l vleur de SH eurosD je n9i qu9 rire conversion(50)F it si je veux voir l onversion en frns de IHH eurosD j9i juste esoin de hnger le prmtre que j9envoie l fontion @IHH u lieu de SHAF vous de jouer ! rivez une seonde fontion @toujours vnt l fontion mainA qui fer elle l onversion inverse X prns ab iurosF ge ne ser ps ien di0ileD il y juste un signe d9oprtion hngerF
La punition
yn v mintennt s9intresser une fontion qui ne renvoie rien @ps de sortieAF g9est une fontion qui 0he le mme messge l9rn utnt de fois qu9on lui demndeF gette fontion prend un prmtre en entre X le nomre de fois o il fut 0her l punitionF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
void punition @ int nomrehevignes A { int i Y for @ i a H Y i ` nomrehevignes Y i CCA { printf @ 4 te ne dois ps reopier mon voisin n 4 A Y }
mon mon mon mon mon mon voisin voisin voisin voisin voisin voisin
IIU
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
doule ireetngle @ doule lrgeur D doule huteur A { return lrgeur B huteur Y } int min @ int rg D hr B rgv A { printf @ 4 etngle de lrgeur S et huteur IH F eire a 7 f n 4 D ireetngle @S D IH A A Y printf @ 4 etngle de lrgeur P F S et huteur Q F S F eire a 7 f n 4 D ireetngle @ P FS D Q F S A AY printf @ 4 etngle de lrgeur R F P et huteur W F U F eire a 7 f n 4 D ireetngle @ R FP D W F U A AY } return H Y
10
11 12 13
etngle de lrgeur S et huteur IHF eire a SHFHHHHHH etngle de lrgeur PFS et huteur QFSF eire a VFUSHHHH etngle de lrgeur RFP et huteur WFUF eire a RHFURHHHH
5. Au cas o vous n'auriez pas vu, je vous rappelle qu'on n'a fait que manipuler des variables contenant des nombres depuis le dbut du cours !
IIV
fien sr 3 hns e sD l fontion ne renverrit plus rienD elle se ontenterit de luler l9ire et de l90her immditementF
1 2 3 4 5 6
void ireetngle @ doule lrgeur D doule huteur A { doule ire a H Y ire a lrgeur B huteur Y printf @ 4 etngle de lrgeur 7 f et huteur 7 f F eire a 7 f n 4 D lrgeur D huteur D ire A Y
7 8 9 10 11 12 13 14 15 16
gomme vous le voyezD le printf est l'intrieur de l fontion aireRectangle et proE duit le mme 0hge que tout l9heureF g9est juste une fon di'rente de proderF
Un menu
ge ode est plus intressnt et onretF yn re une fontion menu() qui ne prend uun prmtre en entreF gette fontion se ontente d90her le menu et demnde l9utilisteur de fire un hoixF v fontion renvoie le hoix de l9utilisteurF
1 2 3 4 5 6 7 8
int menu @A { int hoix a H Y while @ hoix ` I || hoix b R A { printf @ 4 wenu X n 4 A Y printf @ 4 I X oulet de dinde ux esrgots rotis l sue ernise n 4 A Y printf @ 4 P X gonomres sures l sue de myrtilles enroee de hoolt n4 A Y printf @ 4 Q X islope de kngourou signnte et s gelee ux frises poivree n 4 A Y printf @ 4 R X v surprise du ghef @ j ' en slive d ' vne FFFA n 4 A Y printf @ 4 otre hoix c 4 A Y
10
11
12
IIW
} }
snf @ 4 7 d 4 D 8 hoix A Y
return hoix Y
34 35 36 37 38
int min @ int rg D hr B rgv A { swith @ menu @A A { se I X printf @ 4 ous vez pris le poulet n 4A Y rek Y se P X printf @ 4 ous vez pris les onomres n 4 A Y rek Y se Q X printf @ 4 ous vez pris l ' eslope n 4 A Y rek Y se R X printf @ 4 ous vez pris l surprise du ghef F ous etes un sre venturier dites don 3 n 4 A Y rek Y } } return H Y
gopier e ode gode we X IIRHRS t9en i pro(t pour mliorer le menu @pr rpport e qu9on fisit hituellementA X l fontion menu 0he nouveu le menu tnt que l9utilisteur n9 ps entr un nomre ompris entre I et RF gomme D uun risque que l fontion renvoie un nomre qui ne (gure ps u menu 3 hns le mainD vous vez vu qu9on fit un switch(menu())F ne fois que l fontion menu() est termineD elle renvoie le hoix de l9utilisteur diretement dns le switchF g9est une mthode rpide et prtiqueF vous de jouer ! ve ode est enore mliorle X on pourrit 0her un messge d9erreur si l9utilisteur entre un muvis nomre plutt que de simplement 0her une nouvelle fois le menuF
En rsum
! ves fontions s9ppellent entre ellesF einsiD le main peut ppeler des fontions toutes prtes telles que printf ou scanfD mis ussi des fontions que nous vons resF ! ne fontion rupre en entre des vriles qu9on ppelle paramtresF IPH
! ille e'etue ertines oprtions ve es prmtres puis retourne en gnrl une vleur l9ide de l9instrution returnF
IPI
IPP
Deuxime partie
Techniques avances du langage C
IPQ
Chapitre
10
Dicult :
La programmation modulaire
ans cette seconde partie, nous allons dcouvrir des concepts plus avancs du langage C. Je ne vous le cache pas, et vous vous en doutiez srement, la partie II est d'un cran de dicult suprieur. Lorsque vous serez arrivs la n de cette partie, vous serez capables de vous dbrouiller dans la plupart des programmes crits en C. Dans la partie suivante nous verrons alors comment ouvrir une fentre, crer des jeux 2D, etc. Jusqu'ici nous n'avons travaill que dans un seul chier appel main.c. Pour le moment c'tait acceptable car nos programmes taient tout petits, mais ils vont bientt tre composs de dizaines, que dis-je de centaines de fonctions, et si vous les mettez toutes dans un mme chier celui-l va nir par devenir trs long ! C'est pour cela que l'on a invent ce qu'on appelle la programmation modulaire. Le principe est tout bte : plutt que de placer tout le code de notre programme dans un seul chier (main.c), nous le sparons en plusieurs petits chiers.
IPS
Les prototypes
tusqu9iiD je vous i demnd de pler votre fontion vnt l fontion mainF ourquoi c re que l9ordre une relle importne ii X si vous mettez votre fontion vnt le main dns votre ode soureD votre ordinteur l9ur lue et l onntrF vorsque vous ferez un ppel l fontion dns le mainD l9ordinteur onntr l fontion et sur o ller l herherF in revnheD si vous mettez votre fontion prs le mainD ne mrher ps r l9ordinteur ne onntr ps enore l fontionF issyezD vous verrez 3
Mais. . . c'est un peu mal fait, non ?
out fit d9ord ve vous 3 wis rssurezEvousD les progrmmeurs s9en sont rendu ompte vnt vous et ont prvu le oupF qre e que je vis vous pprendre mintenntD vous pourrez positionner vos fonE tions dns n9importe quel ordre dns le ode soureF g9est mieux de ne ps voir s9en souierD royezEmoiF
gopiez l premire ligne @double aireRectangleF F FA tout en hut de votre (hier soure @juste prs les #includeAF Rajoutez un point-virgule l (n de ette nouE velle ligneF it voil 3 wintenntD vous pouvez pler votre fontion aireRectangle prs l fontion main si vous le voulez 3 ous devriez voir le ode suivnt sous les yeux X
1 2 3 4
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GG v ligne suivnte est le prototype de l fontion ireetngle X doule ireetngle @ doule lrgeur D doule huteur A Y int min @ int rg D hr B rgv A {
5 6 7 8
IPT
LES PROTOTYPES
9
10
11
printf @ 4 etngle de lrgeur S et huteur IH F eire a 7 f n 4 D ireetngle @S D IH A A Y printf @ 4 etngle de lrgeur P F S et huteur Q F S F eire a 7 f n 4 D ireetngle @ P FS D Q F S A A Y printf @ 4 etngle de lrgeur R F P et huteur W F U F eire a 7 f n 4 D ireetngle @ R FP D W F U A A Y } return H Y
12 13 14 15 16
17 18 19 20
GG xotre fontion ireetngle peut mintennt tre mise n ' importe o dns le ode soure X doule ireetngle @ doule lrgeur D doule huteur A { return lrgeur B huteur Y }
gopier e ode gode we X QVUUPQ ge qui hng iiD 9est l9jout du prototype en hut du ode soureF n prototypeD 9est en fit une indition pour l9ordinteurF gel lui indique qu9il existe une fontion ppele aireRectangle qui prend tels prmtres en entre et renvoie une sortie du type que vous indiquezF gel permet l9ordinteur de s9orgniserF qre ette ligneD vous pouvez mintennt pler vos fontions dns n9importe quel ordre sns vous prendre l tte 3 rivez toujours les prototypes de vos fontionsF os progrmmes ne vont ps trder se omplexi(er et utiliser de nomreuses fontions X mieux vut prendre ds mintennt l onne hitude d9rire le prototype de hune d9ellesF gomme vous le voyezD l fontion main n9 ps de prototypeF in fitD 9est l seule qui n9en nessite psD pre que l9ordinteur l onnt @9est toujours l mme pour tous les progrmmesD lors il peut ien l onntreD fore 3AF our tre tout fit extD il fut svoir que dns l ligne du prototype il est fulttif d9rire les noms de vriles en entreF v9ordinteur juste esoin de onntre les types des vrilesF yn urit don pu simplement rire X
1
outefoisD l9utre mthode que je vous i montre tout l9heure fontionne ussi ienF v9vntge ve m mthodeD 9est que vous vez juste esoin de opierEoller l preE mire ligne de l fontion et de rjouter un pointEvirguleF v plus viteF
N'oubliez JAMAIS de mettre un point-virgule la n d'un prototype. C'est ce qui permet l'ordinateur de direncier un prototype du vritable dbut d'une fonction. Si vous ne le faites pas, vous risquez d'avoir des erreurs incomprhensibles lors de la compilation.
IPU
Les headers
tusqu9iiD nous n9vions qu9un seul (hier soure dns notre projetF ge (hier soureD je vous vis demnd de l9ppeler main.cF
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 main.cF vissezEmoi mintennt vous montrer un vri projet que vous rliserez un peu plus loin dns le ours X un jeu de okon @(gF IHFPAF gomme vous le voyezD il y plusieurs (hiersF n vri projet ressemler X vous verE rez plusieurs (hiers dns l olonne de guheF ous reonnissez dns l liste le (hier main.c X 9est elui qui ontient l fontion mainF in gnrl dns mes progrmmesD je ne mets que le main dns main.c F
1
Mais pourquoi avoir cr plusieurs chiers ? Et comment je sais combien de chiers je dois crer pour mon projet ?
1. Pour information, ce n'est pas du tout une obligation, chacun s'organise comme il veut. Pour bien me suivre, je vous conseille nanmoins de faire comme moi.
IPV
LES HEADERS
D 9est vous qui hoisissezF in gnrlD on regroupe dns un mme (hier des fontions ynt le mme thmeF einsiD dns le (hier editeur.c j9i regroup toutes les fontions onernnt l9diteur de niveu Y dns le (hier jeu.cD j9i regroup toutes les fontions onernnt le jeu luiEmmeD etF
Fichiers .h et .c
gomme vous le voyezD il y deux types de (hiers di'rents sur l (gF IHFPF ! Les .hD ppels (hiers headersF ges (hiers ontiennent les prototypes des fontionsF ! Les .c X les (hiers soureF ges (hiers ontiennent les fontions ellesEmmesF in gnrlD on met don rrement les prototypes dns les (hiers .c omme on l9 fit tout l9heure dns le main.c @suf si votre progrmme est tout petitAF our hque (hier .c, il y son quivlent .h qui ontient les prototypes des fontionsF tetez un il plus ttentif l (gF IHFP X ! il y editeur.c @le ode des fontionsA et editeur.h @les prototypes des fontionsA Y ! il y jeu.c et jeu.h Y ! etF
Mais comment faire pour que l'ordinateur sache que les prototypes sont dans un autre chier que le .c ?
sl fut inlure le (hier .h gre une diretive de prproesseurF ettentionD prprezE vous omprendre euoup de hoses d9un oup 3 gomment inlure un (hier heder cF F F ous svez le fireD vous l9vez dj fit 3 egrdez pr exemple le dut de mon (hier jeu.c X
1
5 inlude ` stdli Fh b
IPW
v9inlusion se fit gre l diretive de prproesseur #include que vous onnissez ien mintenntF egrdez les premires lignes du ode soure iEdessus X
1 2 3
yn inlut trois (hiers .h X stdioD stdlib et jeuF xotez une di'rene X les (hiers que vous vez rs et pls dns le rpertoire de votre projet doivent tre inlus ve des guillemets @"jeu.h"A tndis que les (hiers orrespondnt ux iliothques @qui sont gnrlement instllsD euxD dns le rpertoire de votre shiA sont inlus entre hevrons @<stdio.h>AF ous utiliserez don X ! les chevrons < > pour inlure un (hier se trouvnt dns le rpertoire inlude de votre shi Y ! les guillemets " " pour inlure un (hier se trouvnt dns le rpertoire de votre projet @ t des .cD gnrlementAF v ommnde #include demnde d9insrer le ontenu du (hier dns le .cF g9est don une ommnde qui dit snsre ii le (hier jeu.h pr exempleF it dns le (hier jeu.hD que trouveEtEon c yn trouve simplement les prototypes des fontions du (hier jeu.c 3
1 2 3 4 5 6 7 8 9 10 11
GB jeu F h EEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X prototypes des fontions du jeu F BG void jouer @ hvurfe B ern A Y void deplertoueur @ int rte xffvygrei D hvet B pos D int diretion A Y void deplergisse @ int B premieregse D int B seondegse A Y
12
IQH
LES HEADERS
v rison est en fit ssez simpleF und dns votre ode vous fites ppel une fontionD votre ordinteur doit dj l onntreD svoir omien de prmtres elle prendD etF g9est que sert un prototype X 9est le mode d9emploi de l fontion pour l9ordinteurF out est une question d9ordre X si vous plez vos prototypes dns des .h @hedersA inlus en hut des (hiers .cD votre ordinteur onntr le mode d9emploi de toutes vos fontions ds le dut de l leture du (hierF in fisnt elD vous n9urez insi ps vous souier de l9ordre dns lequel les fontions se trouvent dns vos (hiers .cF i mintennt vous fites un petit progrmme onteE nnt deux ou trois fontionsD vous vous rendrez peutEtre ompte que les prototypes semlent fulttifs @ mrhe snsAF wis ne durer ps longtemps 3 hs que vous urez un peu plus de fontionsD si vous ne mettez ps vos prototypes de fontions dns des .hD l ompiltion houer sns uun douteF
Lorsque vous appellerez une fonction situe dans fonctions.c depuis le chier main.c, vous aurez besoin d'inclure les prototypes de fonctions.c dans main.c. Il faudra donc mettre un #include "fonctions.h" en haut de main.c. Souvenez-vous de cette rgle : chaque fois que vous faites appel une fonction X dans un chier, il faut que vous ayez inclus les prototypes de cette fonction dans votre chier. Cela permet au compilateur de vrier si vous l'avez correctement appele. Comment puis-je ajouter des chiers .c et .h mon projet ?
dpend de l9shi que vous utilisezD mis glolement l produre est l mme X Fichier / Nouveau / Fichier sourceF gel re un nouveu (hier videF ge (hier n9est ps enore de type .c ou .hD il fut que vous l9enregistriez pour le direF inregistrez don e nouveu (hier @mme s9il est enore vide 3AF yn vous demnder lors quel nom vous voulez donner u (hierF g9est l que vous hoisissez si 9est un .c ou un .h X ! si vous l9ppelez fichier.cD e ser un .c Y ! si vous l9ppelez fichier.hD e ser un .hF g9est ussi simple que elF inregistrez votre (hier dns le rpertoire dns lequel se trouvent les utres (hiers de votre projet @le mme dossier que main.cAF qnrlementD vous enregistrerez tous vos (hiers dns le mme rpertoireD les .c omme les .hF ve dossier du projet ressemle u (nl l (gF IHFQF ous y voyez des .c et des .h ensemleF otre (hier est mintennt enregistrD mis il n9est ps enore vriment jout u projet 3 our l9jouter u projetD fites un li droit dns l prtie guhe de l9rn @o il y l liste des (hiers du projetA et hoisissez Add files @(gF IHFRAF ne fentre s9ouvre et vous demnde quels (hiers jouter u projetF letionnez le (hier que vous venez de rer et 9est fitF ve (hier fit mintennt prtie du projet IQI
IQP
LA COMPILATION SPARE
sl fut gnrlement herher un dossier includeF vEdednsD vous llez trouver de trs nomreux (hiersF ge sont des heders @.hA des iliothques stndrdD 9estEEdire des iliothques disponiles prtout @que e soit sous indowsD wD vinuxF F FAF ous y retrouverez don stdio.h et stdlib.hD entre utresF ous pouvez les ouvrir si vous voulezD mis risque de piquer un peu les yeuxF in e'etD 9est un peu ompliqu @il y ps ml de hoses qu9on n9 ps enore vuesD notmment ertines diretives de prproesseurAF i vous herhez ienD vous verrez que e (hier est rempli de prototypes de fontions stndrdD omme printf pr exempleF
Ok, je sais maintenant o se trouvent les prototypes des fonctions standard. Mais comment pourrais-je voir le code source de ces fonctions ? O sont les .c ?
ous ne les vez ps 3 in fitD les (hiers .c sont dj ompils @en ode inireD 9estE Edire en ode mhineAF sl est don totlement impossile de les lireF ous pouvez retrouver les (hiers ompils dns un rpertoire ppel lib F ghez moiD on peut les trouver dns le rpertoire X
2
C:\Program Files\CodeBlocks\MinGW\lib
ves (hiers ompils des iliothques ont l9extension .a sous gode: :floks @qui utilise le ompilteur ppel mingwA et ont l9extension .lib sous isul gCC @qui utilise le ompilteur VisualAF x9essyez ps de les lire X e n9est solument ps omestile pour un huminF in rsumD dns vos (hiers .cD vous inluez les .h des iliothques stndrd pour pouvoir utiliser des fontions stndrd omme printfF otre ordinteur insi les prototypes sous les yeux et peut vri(er si vous ppelez les fontions orretementD pr exemple que vous n9ouliez ps de prmtresF
La compilation spare
wintennt que vous svez qu9un projet est ompos de plusieurs (hiers soureD nous pouvons rentrer plus en dtil dns le fontionnement de l ompiltionF tusqu9iiD nous
2. C'est l'abrviation de library qui signie bibliothque en franais.
IQQ
vions vu un shm trs simpli(F v (gF IHFS est un shm ien plus pris de l ompiltionF g9est le genre de shms qu9il est fortement onseill de omprendre et de onntre pr ur 3
D 9est un vri shm de e qu9il se psse l ompiltionF htillonsEleF IF Prprocesseur X le prproesseur est un progrmme qui dmrre vnt l ompiE ltionF on rle est d9exuter les instrutions spiles qu9on lui donnes dns des diretives de prproesseurD es fmeuses lignes qui ommenent pr un #F our l9instntD l seule diretive de prproesseur que l9on onnt est #includeD qui permet d9inlure un (hier dns un utreF ve prproesseur sit fire d9utres hosesD mis D nous le verrons plus trdF ve #include est qund mme e qu9il y de plus importnt onntreF ve prproesseur remple don les lignes #include pr le (hier indiquF sl met l9intrieur de hque (hier .c le ontenu des (hiers .h qu9on demnd d9inlureF e momentEl de l ompiE ltionD votre (hier .c est omplet et ontient tous les prototypes des fontions que vous utilisez @votre (hier .c est don un peu plus gros que l normleAF PF Compilation X ette tpe trs importnte onsiste trnsformer vos (hiers soure en ode inire omprhensile pr l9ordinteurF ve ompilteur ompile hque (hier .c un unF sl ompile tous les (hiers soure de votre projetD d9o l9importne d9voir ien jout tous vos (hiers u projet @ils doivent tous pprtre dns l fmeuse liste guheAF ve ompilteur gnre un (hier .o @ou .objD dpend du ompilteurA pr (hier .c ompilF ge sont des (hiers inires temporiresF qnrlementD es (hiers sont supprims l (n de l ompiltionD mis selon les options de votre shiD vous pouvez hoisir de les onserver F
3
3. Bien qu'inutiles puisque temporaires, on peut trouver un intrt conserver les .o. En eet, si parmi les 10 chiers .c de votre projet seul l'un d'eux a chang depuis la dernire compilation, le compilateur n'aura qu' recompiler seulement ce chier .c. Pour les autres, il possde dj les .o compils.
IQR
LA COMPILATION SPARE
QF dition de liens X le linker @ou diteur de liens en frnisA est un progrmme dont le rle est d9ssemler les (hiers inires .oF sl les ssemle en un seul gros (hier X l9exutle (nl 3 get exutle l9extension .exe sous indowsF i vous tes sous un utre yD il devrit prendre l9extension dquteF wintenntD vous svez omment se psse l9intrieurF te le dis et je le rpteD e shm de l (gF IHFS est trs importntF sl fit l di'rene entre un progrmmeur du dimnhe qui opie sns omprendre des odes soure et un utre qui sit et omprend e qu9il fitF v pluprt des erreurs surviennent l ompiltionD mis il m9est ussi rriv d9voir des erreurs de linkerF gel signi(e que le linker n9est ps rriv ssemler tous les .o @il en mnquit peutEtreAF xotre shm est pr ontre enore un peu inompletF in e'etD les iliothques n9y pprissent ps 3 gomment el se psseEtEil qund on utilise des iliothques c in fitD le dut du shm reste le mmeD 9est seulement le linker qui v voir un peu plus de trvilF sl v ssemler vos .o @temporiresA ve les iliothques ompiles dont vous vez esoin @.a ou .lib selon le ompilteurAF v (gF IHFT est don une version mliore de l (gF IHFSF
xous y sommesD le shm est ette fois ompletF os (hiers de iliothques .a @ou sont rssemls dns l9exutle ve vos .oF IQS
g9est omme el qu9on peut otenir u (nl un progrmme IHH 7 ompletD qui ontient toutes les instrutions nessires l9ordinteurD mme elles qui lui expliquent omE ment 0her du texte 3 r exempleD l fontion printf se trouve dns un .aD et ser don rssemle ve votre ode soure dns l9exutleF hns quelque tempsD nous pprendrons utiliser des iliothques grphiquesF gellesEi seront l ussi dns des .a et ontiendront des instrutions pour indiquer l9ordinteur omment ouvrir une fentre l9rnD pr exempleF wis ptieneD r tout vient point qui sit ttendreD 9est ien onnuF
int triple @ int nomre A { int resultt a H Y GG v vrile resultt est r e en m moire resultt a Q B nomre Y return resultt Y } GG v fontion est termin e D l vrile resultt est supprim e de l m moire
4 5 6 7
ne vrile dlre dns une fontion n9existe don que pendnt que l fontion est exuteF u9estEe que veut direD onrtement c ue vous ne pouvez ps y der depuis une utre fontion 3
1 2 3 4 5 6 7 8 9 10 11 12 13
int triple @ int nomre A Y int min @ int rg D hr B rgv A { printf @ 4 ve triple de IS est 7 d n 4 D triple @ IS A A Y printf @ 4 ve triple de IS est 7 d 4 D resultt A Y GG irreur } return H Y
IQT
hns le mainD j9essie ii d9der l vrile resultatF yrD omme ette vrile resultat t re dns l fontion tripleD elle n9est ps essile dns l fontion main 3 Retenez bien X une vrile dlre dns une fontion n9est essile qu9 l9intrieur de ette fontionF yn dit que 9est une vrile loleF
sl est possile de dlrer des vriles qui seront essiles dns toutes les fontions de tous les (hiers du projetF te vis vous montrer omment fire pour que vous shiez que existeD mis gnrlement il fut viter de le fireF ur l9ir de simpli(er votre ode u dutD mis ensuite vous risquez de vous retrouver ve de nomreuses vriles essiles prtoutD e qui risquer de vous rer des souisF our dlrer une vrile glole essile prtoutD vous devez fire l dlrtion de l vrile en dehors des fontionsF ous ferez gnrlement l dlrtion tout en hut du (hierD prs les #includeF
1 2 3 4 5 6 7 8 9 10
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int resultt a H Y GG h lrtion de vrile glole void triple @ int nomre A Y GG rototype de fontion int min @ int rg D hr B rgv A { triple @ IS A Y GG yn ppelle l fontion triple D qui modifie l vrile glole resultt printf @ 4 ve triple de IS est 7 d n 4 D resultt A Y GG yn s resultt } return H Y
11
12 13 14 15 16 17 18 19
IQU
ur et exempleD m fontion triple ne renvoie plus rien @voidAF ille se ontente de modi(er l vrile glole resultat que l fontion main peut ruprerF w vrile resultat ser essile dns tous les (hiers du projetD on pourr don fire ppel elle dns yi les fontions du progrmmeF
Ce type de choses est gnralement bannir dans un programme en C. Utilisez plutt le retour de la fonction (return) pour renvoyer un rsultat.
Variable globale accessible uniquement dans un chier
v vrile glole que nous venons de voir tit essile dns tous les (hiers du projetF sl est possile de l rendre essile uniquement dns le (hier dns lequel elle se trouveF reste une vrile glole qund mmeD mis disons qu9elle n9est glole qu9ux fontions de e (hierD et non toutes les fontions du progrmmeF our rer une vrile glole essile uniquement dns un (hierD rjoutez simpleE ment le motEl static devnt X
1
int triple @ int nomre A { stti int resultt a H Y GG v vrile resultt est r e l premi re fois que l fontion est ppel e resultt a Q B nomre Y return resultt Y } GG v vrile resultt n ' est e supprim e lorsque l fontion est termin e F
4 5 6 7
u9estEe que signi(eD onrtement c u9on pourr rppeler l fontion plus trd et l vrile resultat ontiendr toujours l vleur de l dernire foisF oii un petit exemple pour ien omprendre X
1 2
int inremente @A Y
IQV
siD l premire fois qu9on ppelle l fontion incrementeD l vrile nombre est reF ille est inrmente ID et une fois l fontion termine l vrile n9est ps supprimeF vorsque l fontion est ppele une seonde foisD l ligne de l dlrtion de vrile est tout simplement sute F yn ne rere ps l vrileD on rutilise l vrile qu9on vit dj reF gomme l vrile vlit ID elle vudr mintennt PD puis QD puis RD etF
IQW
wintenntD votre fontion static triple ne peut tre ppele que depuis une utre fontion du mme (hierF i vous essyez d9ppeler l fontion triple depuis une fontion d9un utre (hierD ne mrher ps r triple n9y ser ps essileF sumons tous les types de porte qui peuvent exister pour les vriles X ! ne vrile dlre dns une fontion est supprime l (n de l fontionD elle n9est essile que dns ette fontionF ! ne vrile dlre dns une fontion ve le motEl static devnt n9est ps supprime l (n de l fontionD elle onserve s vleur u fur et mesure de l9exution du progrmmeF ! ne vrile dlre en dehors des fontions est une vrile gloleD essile depuis toutes les fontions de tous les (hiers soure du projetF ! ne vrile glole ve le motEl static devnt est glole uniquement dns le (hier dns lequel elle se trouveD elle n9est ps essile depuis les fontions des utres (hiersF he mmeD voii les types de porte qui peuvent exister pour les fontions X ! ne fontion est pr dfut essile depuis tous les (hiers du projetD on peut don l9ppeler depuis n9importe quel utre (hierF ! i on veut qu9une fontion ne soit essile que dns le (hier dns lequel elle se trouveD il fut rjouter le motEl static devntF
En rsum
! n progrmme ontient de nomreux (hiers .cF in rgle gnrleD hque (hier .c un petit frre du mme nom ynt l9extension .h @qui signi(e headerAF ve .c ontient les fontions tndis que le .h ontient les prototypesD 9estEEdire l signture de es fontionsF ! ve ontenu des (hiers .h est inlus en hut des .c pr un progrmme ppel prprocesseurF ! ves .c sont trnsforms en (hiers .o inires pr le compilateurF ! ves .o sont ssemls en un exutle @.exeA pr le linkerD ussi ppel diteur de liensF ! ne vrile dlre dns une fontion n9est ps essile dns une utre fontionF yn prle de porte des variablesF
IRH
Chapitre
11
Dicult :
'heure est venue pour vous de dcouvrir les pointeurs. Prenez un grand bol d'air avant car ce chapitre ne sera probablement pas une partie de plaisir. Les pointeurs reprsentent en eet une des notions les plus dlicates du langage C. Si j'insiste autant sur leur importance, c'est parce qu'il est impossible de programmer en langage C sans les connatre et bien les comprendre. Les pointeurs sont omniprsents, nous les avons d'ailleurs dj utiliss sans le savoir. Nombre de ceux qui apprennent le langage C titubent en gnral sur les pointeurs. Nous allons faire en sorte que ce ne soit pas votre cas. Redoublez d'attention et prenez le temps de comprendre les nombreux schmas de ce chapitre.
IRI
i on indique intD on renverr un nomre de type int @gre l9instrution returnAF yn peut ussi rire une fontion qui ne renvoie uune vleur ve le motEl void X
1 2 3 4
void fontion @A { }
wis renvoyer deux vleurs l foisF F F 9est impossileF yn ne peut ps fire deux returnF upposons que je veuille rire une fontion lquelle on envoie un nomre de minutesF gelleEi renverrit le nomre d9heures et minutes orrespondntes X IF si on envoie RSD l fontion renvoie H heure et RS minutes Y PF si on envoie THD l fontion renvoie I heure et H minutes Y QF si on envoie WHD l fontion renvoie I heure et QH minutesF oyons fousD tentons le oup X
1 2 3 4 5 6 7 8 9 10 11 12
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b GB te mets le prototype en hut F gomme ' est un tout petit progrmme je ne le mets ps dns un Fh D mis en temps norml @ dns un vri progrmme A D j ' uris pl le prototype dns un fihier F h ien entendu BG void deoupewinutes @ int heures D int minutes A Y int min @ int rg D hr B rgv A {
IRP
int heures a H D minutes a WH Y GB yn une vrile minutes qui vut WH F epr s ppel de l fontion D je veux que m vrile 4 heures 4 ville I et que m vrile 4 minutes 4 ville QH BG deoupewinutes @ heures D minutes A Y printf @ 4 7 d heures et 7 d minutes 4 D heures D minutes A Y } return H Y
void deoupewinutes @ int heures D int minutes A { heures a minutes G TH Y GG WH G TH a I minutes a minutes 7 TH Y GG WH 7 TH a QH }
utD zutD zut et rezutD n9 ps mrhF ue s9estEil pss c in fitD qund vous envoyez une vrile une fontionD une opie de l vrile est rliseF einsiD l vrile heures dns l fontion decoupeMinutes n9est ps l mme que elle de l fontion main 3 g9est simplement une opie 3 otre fontion decoupeMinutes fit son joF l9intrieur de decoupeMinutesD les vriles heures et minutes ont les onnes vleurs X I et QHF wis ensuiteD l fontion s9rrte lorsqu9on rrive l9olde fermnteF gomme on l9 ppris dns les hpitres prdentsD toutes les vriles res dns une fontion sont dtruites l (n de ette fontionF os opies de heures et de minutes sont don supprimesF yn retourne ensuite l fontion mainD dns lquelle vos vriles heures et minutes vlent toujours H et WHF g9est un he 3
Notez que, comme une fonction fait une copie des variables qu'on lui envoie, vous n'tes pas du tout obligs d'appeler vos variables de la mme faon que dans le main. Ainsi, vous pourriez trs bien crire : void decoupeMinutes(int h, int m). h pour heures et m pour minutes. Si vos variables ne s'appellent pas de la mme faon dans la fonction et dans le main, a ne pose donc aucun problme !
frefD vous urez eu retourner le prolme dns tous les sensF F F vous pouvez essyer de renvoyer une vleur ve l fontion @en utilisnt un return et en mettnt le type IRQ
l fontionAD mis vous n9rriveriez renvoyer qu9une des deux vleursF ous ne pouvez ps renvoyer les deux vleurs l foisF he plusD vous ne pouvez ps utiliser de vriles gloles rD omme on l9 vuD ette prtique est fortement donseilleF oilD le prolme est posF gomment les pointeurs vontEils nous permettre de le rE soudre c
int
g9est un peu omme qu9on peut reprsenter l mmoire vive @ewA de votre ordiE nteurF sl fut lire e shm ligne pr ligneF v premire ligne reprsente l ellule du IRR
tout dut de l mmoire viveF ghque ellule un numroD 9est son adresse F v mmoire omporte un grnd nomre d9dressesD ommennt l9dresse numro H et se terminnt l9dresse numro (insrez un trs grand nombre ici) F hque dresseD on peut stoker un nomreF n et x iv nomreF yn ne peut ps stoker deux nomres pr dresseF otre mmoire n9est fite que pour stoker des nomresF ille ne peut stoker ni lettres ni phrsesF our ontourner e prolmeD on invent une tle qui fit l liison entre les nomres et les lettresF gette tle dit pr exemple X ve nomre VW reprsente l lettre F xous reviendrons dns un prohin hpitre sur l gestion des rtres Y pour l9instntD nous nous onentrons sur le fontionnement de l mmoireF
1 2
Adresse et valeur
und vous rez une vrile age de type int pr exempleD en tpnt X
1
int ge a IH Y
F F F votre progrmme demnde u systme d9exploittion @indowsD pr exempleA l permission d9utiliser un peu de mmoireF ve systme d9exploittion rpond en indiqunt quelle dresse en mmoire il vous lisse le droit d9insrire votre nomreF g9est d9illeurs justement l un des rles prinipux d9un systme d9exploittion X on dit qu9il lloue de l mmoire ux progrmmesF g9est un peu lui le hefD il ontrle hque progrmme et vri(e que e dernier l9utoristion de se servir de l mmoire l9endroit o il le fitF
C'est d'ailleurs l la cause no 1 de plantage des programmes : si votre programme essaie d'accder une zone de la mmoire qui ne lui appartient pas, le systme d'exploitation (abrgez OS ) le refuse et coupe brutalement le programme en guise de punition ( C'est qui le chef ici ? ). L'utilisateur, lui, voit une jolie bote de dialogue du type Ce programme va tre arrt parce qu'il a eectu une opration non conforme .
evenons notre vrile ageF v vleur IH t insrite quelque prt en mmoireD disons pr exemple l9dresse no RTSSF ge qu9il se psse @et 9est le rle du ompilteurAD 9est que le mot age dns votre progrmme est rempl pr l9dresse RTSS l9exutionF gel fit queD hque fois que vous vez tp le mot age dns votre ode soureD il est rempl pr RTSSD et votre ordinteur voit insi quelle dresse il doit ller herher en mmoire 3 hu oupD l9ordinteur se rend en mmoire l9dresse RTSS et rpond (rement X v vrile age vut IH 3 F yn sit don omment ruprer l vleur de l vrile X il su0t tout tement de tper age dns son ode soureF i on veut 0her l9geD on peut utiliser l fontion printf X
1. Le vocabulaire est trs important, retenez-le. 2. Le nombre d'adresses disponibles dpend en fait de la quantit de mmoire dont dispose votre ordinateur.
IRS
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 %p @le p du mot poinE teur A dns le printfF in outreD on doit envoyer l fontion printf non ps l vrile ageD mis son dresseF F F it pour fire elD vous devez mettre le symole & devnt l vrile ageD omme je vous vis demnd de le fire pour les scanfD il y quelque tempsD sns vous expliquer pourquoiF pez don X
1
sultt X
v 9 dresse de l vrile ge est X HHPQ ppUR
ge que vous voyez l est l9dresse de l vrile age u moment o j9i ln le proE grmme sur mon ordinteurF yuiD ouiD HHPQppUR est un nomreD il est simplement rit dns le systme hexdimlD u lieu du systme diml dont nous vons l9hitudeF i vous remplez %p pr %dD vous otiendrez un nomre diml que vous onnissezF
Si vous excutez ce programme sur votre ordinateur, l'adresse sera trs certainement dirente. Tout dpend de la place que vous avez en mmoire, des programmes que vous avez lancs, etc. Il est totalement impossible de prdire quelle adresse la variable sera stocke chez vous. Si vous lancez votre programme plusieurs fois d'ale, il se peut que l'adresse soit identique, la mmoire n'ayant pas beaucoup chang entre temps. Si par contre vous redmarrez votre ordinateur, vous aurez srement une valeur dirente.
y je veux en venir ve tout c ih ien en fitD je veux vous fire retenir ei X ! age X dsigne la valeur de l vrile Y ! &age X dsigne l'adresse de l vrileF eve ageD l9ordinteur v lire l vleur de l vrile en mmoire et vous renvoie ette vleurF eve &ageD votre ordinteur vous dit en revnhe quelle dresse se trouve l vrileF IRT
g9est extF wis es nomres uront une signi(tion prtiulire X ils indiqueront l9dresse d9une utre vrile en mmoireF
Crer un pointeur
our rer une vrile de type pointeurD on doit rjouter le symole * devnt le nom de l vrileF
1
int B monointeur Y
Notez qu'on peut aussi crire int* monPointeur;. Cela revient exactement au mme. Cependant, la premire mthode est prfrer. En eet, si vous voulez dclarer plusieurs pointeurs sur la mme ligne, vous serez obligs de mettre l'toile devant le nom : int *pointeur1, *pointeur2, *pointeur3;.
gomme je vous l9i pprisD il est importnt d9initiliser ds le dut ses vrilesD en leur donnnt l vleur H pr exempleF g9est enore plus importnt de le fire ve les pointeurs 3 our initiliser un pointeurD 9estEEdire lui donner une vleur pr dfutD on n9utilise gnrlement ps le nomre H mis le motEl NULL X
3 1
vD vous vez un pointeur initilis NULLF gomme D vous surez dns l suite de votre progrmme que votre pointeur ne ontient uune dresseF ue se psseEtEil c ge ode v rserver une se en mmoire omme si vous viez r une vrile normleF gependntD et 9est e qui hngeD l vleur du pointeur est fite pour ontenir une dresseF v9dresseF F F d9une utre vrileF ourquoi ps l9dresse de l vrile age c ous svez mintennt omment indiquer l9dresse d9une vrile u lieu de s vleur @en utilisnt le symole &AD lors llonsEy 3 nous donne X
1 2
IRU
v premire ligne signi(e X grer une vrile de type int dont l vleur vut IH F v seonde ligne signi(e X grer une vrile de type pointeur dont l vleur vut l9dresse de l vrile age F v seonde ligne fit don deux hoses l foisF i vous le souhitezD pour ne ps tout mlngerD shez qu9on peut l douper en deux temps X
1 2 3
int ge a IH Y int B pointeururege Y GG I A signifie 4 te r e un pointeur 4 pointeururege a 8 ge Y GG P A signifie 4 pointeururege ontient l ' dresse de l vrile ge 4
ous vez remrqu qu9il n9y ps de type pointeur omme il y un type int et un type doubleF yn n9rit don ps X
1
pointeur pointeururege Y
eu lieu de D on utilise le symole *D mis on ontinue rire intF u9estEe que signi(e c in fitD on doit indiquer quel est le type de l vrile dont le pointeur v ontenir l9dresseF gomme notre pointeur pointeurSurAge v ontenir l9dresse de l vrile age @qui est de type intAD lors mon pointeur doit tre de type int* 3 i m vrile age vit t de type doubleD lors j9uris d rire double *monPointeurF Vocabulaire X on dit que le pointeur pointeurSurAge pointe sur l vrile ageF v (gF IIFP rsume e qu9il s9est pss dns l mmoireF hns e shmD l vrile age t ple l9dresse IUURSH @vous voyez d9illeurs que s vleur est IHAD et le pointeur pointeurSurAge t pl l9dresse Q @9est tout fit le fruit du hsrdAF vorsque mon pointeur est rD le systme d9exploittion rserve une se en mmoire omme il l9 fit pour ageF v di'rene iiD 9est que l vleur de pointeurSurAge est un peu prtiulireF egrdez ien le shm X 9est l9dresse de l vrile age 3 geiD hers leteursD est le seret solu de tout progrmme rit en lngge gF yn y estD nous venons de rentrer dns le monde merveilleux des pointeurs 3
Et. . . a sert quoi ?
ne trnsforme ps enore votre ordinteur en mhine fD ertesF eulement mintenntD on un pointeurSurAge qui ontient l9dresse de l vrile ageF issyons de voir e que ontient le pointeur l9ide d9un printf X
1 2 3 4
IRV
IRW
rumF in fitD el n9est ps trs tonnntF yn demnde l vleur de pointeurSurAgeD et s vleur 9est l9dresse de l vrile age @IUURSHAF gomment fire pour demnder voir l vleur de l vrile se trouvnt l9dresse indique dns pointeurSurAge c sl fut pler le symole * devnt le nom du pointeur X
1 2 3 4
IH
rourr 3 xous y sommes rrivs 3 in plnt le symole * devnt le nom du pointeurD on de l vleur de l vrile ageF i u ontrire on vit utilis le symole & devnt le nom du pointeurD on urit otenu l9dresse lquelle se trouve le pointeur @iiD 9est QAF
Qu'est-ce qu'on y gagne ? On a simplement russi compliquer les choses ici. On n'avait pas besoin d'un pointeur pour acher la valeur de la variable age !
gette question @que vous devez invitlement vous poserA est lgitimeF eprs toutD qui pourrit vous en vouloir c etuellement l9intrt n9est ps videntD mis petit petitD tout u long des hpitres suivntsD vous omprendrez que tout el n9 ps t invent pr pur plisir de ompliquer les hosesF pites l9impsse sur l frustrtion que vous devez ressentir @ out pour c AF i vous vez ompris le prinipeD 9est l9essentielF ves hoses s9liriront d9ellesEmmes pr l suiteF
retenir absolument
oii e qu9il fut voir ompris et e qu9il fut retenir pour l suite de e hpitre X ! sur une vrileD omme l vrile age X ! age signi(e X te veux l vleur de l vrile age D ! &age signi(e X te veux l9dresse lquelle se trouve l vrile age Y ! sur un pointeurD omme pointeurSurAge X ! pointeurSurAge signi(e X te veux l vleur de pointeurSurAge @ette vleur tnt une dresseAD ! *pointeurSurAge signi(e X te veux l vleur de l vrile qui se trouve l9dresse ontenue dns pointeurSurAge F gontentezEvous de ien retenir es qutre pointsF pites des tests et vri(ez que mrheF ve shm de l (gF IIFQ devrit ien vous ider situer hun de es lmentsF ISH
ISI
Attention ne pas confondre les direntes signications de l'toile ! Lorsque vous dclarez un pointeur, l'toile sert juste indiquer qu'on veut crer un pointeur : int *pointeurSurAge;. En revanche, lorsqu'ensuite vous utilisez votre pointeur en crivant printf("%d", *pointeurSurAge);, cela ne signie pas Je veux crer un pointeur mais : Je veux la valeur de la variable sur laquelle pointe mon pointeurSurAge .
out el est fonEdEmenEtlF sl fut onntre el pr ur et surtout le omprendreF x9hsitez ps lire et relire e qu9on vient d9pprendreF te ne peux ps vous en vouloir si vous n9vez ps ompris du premier oup et e n9est ps une honte non plusD d9illeursF sl fut en gnrl quelques jours pour ien omprendre et souvent quelques mois pour en sisir toutes les sutilitsF i vous vous sentez un peu perdusD pensez es gens qui sont ujourd9hui de grnds gourous de l progrmmtion X uun d9entre eux n9 ompris tout le fontionnement des pointeurs du premier oupF it si jmis ette personne existeD il fudr vriment me l prsenterF
void tripleointeur @ int B pointeururxomre A Y int min @ int rg D hr B rgv A { int nomre a S Y tripleointeur @8 nomre A Y GG yn envoie l ' dresse de nomre l fontion printf @ 4 7 d 4 D nomre A Y GG yn ffihe l vrile nomre F v fontion diretement modifi l vleur de l vrile r elle onnissit son dresse } return H Y
9 10 11 12 13 14 15
16
ISP
v fontion triplePointeur prend un prmtre de type int* @9estEEdire un pointeur sur intAF oii e qu9il se psse dns l9ordreD en prtnt du dut du main X IF une vrile nombre est re dns le mainF yn lui 'ete l vleur SF D vous onnissez Y PF on ppelle l fontion triplePointeurF yn lui envoie en prmtre l9dresse de notre vrile nombre Y QF l fontion triplePointeur reoit ette dresse dns pointeurSurNombreF l9inE trieur de l fontion triplePointeurD on don un pointeur pointeurSurNombre qui ontient l9dresse de l vrile nombre Y RF mintennt qu9on un pointeur sur nombreD on peut modi(er diretement l vrile nombre en mmoire 3 sl su0t d9utiliser *pointeurSurNombre pour dsiE gner l vrile nombre 3 our l9exempleD on fit un simple test X on multiplie l vrile nombre pr Q Y SF de retour dns l fontion mainD notre nomre vut mintennt IS r l fontion triplePointeur modi( diretement l vleur de nombreF fien srD j9uris pu fire un simple return omme on ppris le fire dns le hpitre sur les fontionsF wis l9intrtD lD 9est que de ette mnireD en utilisnt des pointeursD on peut modi(er l vleur de plusieurs vriles en mmoire @on peut don renvoyer plusieurs vleurs AF xous ne sommes plus limits une seule vleur 3
Quel est l'intrt maintenant d'utiliser un return dans une fonction si on peut se servir des pointeurs pour modier des valeurs ?
dpendr de vous et de votre progrmmeF g9est vous de diderF sl fut svoir que les return sont el et ien toujours utiliss en gF ve plus souventD on s9en sert pour renvoyer e qu9on ppelle un ode d9erreur X l fontion renvoie I @vriA si tout s9est ien pssD et H @fuxA s9il y eu une erreur pendnt le droulement de l fontionF
void tripleointeur @ int B pointeururxomre A Y int min @ int rg D hr B rgv A { int nomre a S Y int B pointeur a 8 nomre Y GG pointeur prend l ' dresse de nomre tripleointeur @ pointeur AY GG yn envoie pointeur @ l ' dresse de nomre A l fontion printf @ 4 7 d 4 D B pointeur A Y GG yn ffihe l vleur de nomre ve B pointeur } return H Y
7 8
10 11 12 13 14 15 16
17
gopier e ode gode we X QWIQIU gomprez ien e ode soure ve le prdentF sl y de sutiles di'renes et pourtnt le rsultt est stritement le mme X
IS
ge qui ompteD 9est d9envoyer l9dresse de l vrile nombre l fontionF yrD pointeur vut l9dresse de l vrile nombreD don 9est on de e t 3 yn le fit seulement d9une mnire di'rente en rnt un pointeur dns l fontion mainF hns le printf @et 9est juste pour l9exerieAD j90he le ontenu de l vrile nombre en tpnt *pointeurF xotez qu9 l pleD j9uris pu rire nombre X le rsultt urit t identique r *pointeur et nombre dsignent l mme hose dns l mmoireF hns le progrmme lus ou woins D nous vons utilis des pointeurs sns vriment le svoirF g9tit en fit en ppelnt l fontion scanfF in e'etD ette fontion pour rle de lire e que l9utilisteur entr u lvier et de renvoyer le rsulttF our que l fontion puisse modi(er diretement le ontenu de votre vrile (n d9y pler l vleur tpe u lvierD elle esoin de l9dresse de l vrile X
1 2
v fontion trville ve un pointeur sur l vrile nombre et peut insi modi(er diretement le ontenu de nombreF gomme on vient de le voirD on pourrit rer un pointeur qu9on enverrit l fontion scanf X ISR
ettention ne ps mettre le symole & devnt pointeur dns l fontion scanf 3 siD pointeur ontient luiEmme l9dresse de l vrile nombreD ps esoin de mettre un & 3 i vous fisiez D vous enverriez l9dresse o se trouve le pointeur X or 9est de l9dresse de nombre dont on esoinF
void deoupewinutes @ int B pointeurreures D int B pointeurwinutes A Y int min @ int rg D hr B rgv A { int heures a H D minutes a WH Y GG yn envoie l ' dresse de heures et minutes deoupewinutes @8 heures D 8 minutes A Y GG gette fois D les vleurs ont t modifi es 3 printf @ 4 7 d heures et 7 d minutes 4 D heures D minutes A Y } return H Y
19
20
21 22 23 24
void deoupewinutes @ int B pointeurreures D int B pointeurwinutes A { GB ettention ne ps oulier de mettre une toile devnt le nom des pointeurs 3 gomme D vous pouvez modifier l vleur des vriles D et non leur dresse 3 ous ne voudriez ps diviser des dresses D n ' est E e ps c Y o A BG B pointeurreures a B pointeurwinutes G TH Y B pointeurwinutes a B pointeurwinutes 7 TH Y }
ISS
I heures et QH minutes
ien ne devrit vous surprendre dns e ode soureF outefoisD omme on n9est jmis trop prudentD je vis rher une fois de plus e qui se psse dns e ode (n d9tre ertin que tout le monde me suit ien F
4
IF ves vriles heures et minutes sont res dns le mainF PF yn envoie l fontion decoupeMinutes l9dresse de heures et minutesF QF v fontion decoupeMinutes rupre es dresses dns des pointeurs ppels pointeurHeures et pointeurMinutesF xotez que l enoreD le nom importe peuF t9uris pu les ppeler h et mD ou mme enore heures et minutes F RF v fontion decoupeMinutes modi(e diretement les vleurs des vriles heures et minutes en mmoire r elle possde leurs dresses dns des pointeursF v seule ontrinteD un peu gnnte je dois le reonntreD 9est qu9il fut imprtivement mettre une toile devnt le nom des pointeurs si on veut modi(er l vleur de heures et de minutesF i on n9vit ps fit D on urit modi( l9dresse onteE nue dns les pointeursD e qui n9urit serviF F F rienF
5
De nombreux lecteurs m'ont fait remarquer qu'il tait possible de rsoudre le problme sans utiliser de pointeurs. Oui, bien sr c'est possible, mais il faut contourner certaines rgles que nous nous sommes xes : on peut utiliser des variables globales (mais on l'a dit, c'est mal), ou encore faire un printf dans la fonction decoupeMinutes (alors que c'est dans le main qu'on veut faire le printf !). L'exercice est un peu scolaire et peut donc tre contourn si vous tes malins, ce qui vous fait peut-tre douter de l'intrt des pointeurs. Soyez assurs que cet intrt vous paratra de plus en plus vident au cours des chapitres suivants.
En rsum
! ghque vrile est stoke une adresse prise en mmoireF ! ves pointeurs sont semlles ux vrilesD ei prs qu9u lieu de stoker un nomre ils stokent l9dresse lquelle se trouve une vrile en mmoireF ! i on ple un symole & devnt un nom de vrileD on otient son dresse u lieu de s vleur @exF X &ageAF ! i on ple un symole * devnt un nom de pointeurD on otient l vleur de l vrile stoke l9dresse indique pr le pointeurF
4. C'est un chapitre important, vous devez faire beaucoup d'eorts pour comprendre : je peux donc bien en faire moi aussi pour vous. 5. Je ne l'ai pas fait car je ne veux pas que vous risquiez de confondre avec les variables heures et minutes du main, qui ne sont pas les mmes.
IST
! ves pointeurs onstituent une notion essentielle du lngge gD mis nnmoins un peu omplexe u dutF sl fut prendre le temps de ien omprendre omment ils fontionnent r euoup d9utres notions sont ses dessusF
ISU
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 double pr exempleF in rsumD voii e qu9il fut retenir sur les tleuxF ! vorsqu9un tleu est rD il prend un espe ontigu en mmoire X les ses sont les unes l suite des utresF ! outes les ses d9un tleu sont du mme typeF einsiD un tleu de int ontiendr uniquement des intD et ps utre hoseF
Dnir un tableau
our ommenerD nous llons voir omment d(nir un tleu de R int X
1
int tleu R Y
ITH
DFINIR UN TABLEAU
oilD 9est toutF sl su0t don de rjouter entre rohets le nomre de ses que vous voulez mettre dns votre tleuF sl n9y ps de limite F wintenntD omment der hque se du tleu c g9est simpleD il fut rire tableau[numeroDeLaCase]F
1
Attention : un tableau commence l'indice no 0 ! Notre tableau de 4 int a donc les indices 0, 1, 2 et 3. Il n'y a pas d'indice 4 dans un tableau de 4 cases ! C'est une source d'erreurs trs courantes, souvenez-vous-en.
i je veux mettre dns mon tleu les mmes vleurs que elles indiques sur l (gF IPFID je devri don rire X
1 2 3 4 5 6
in fitD si vous rivez juste tableauD vous otenez un pointeurF g9est un pointeur sur l premire se du tleuF pites le test X
1 2 3
in revnheD si vous indiquez l9indie de l se du tleu entre rohetsD vous otenez l vleur X
1 2 3
he mme pour les utres indiesF xotez que omme tableau est un pointeurD on peut utiliser le symole * pour onntre l premire vleur X
1. part peut-tre la taille de votre mmoire, quand mme.
ITI
sl est ussi possile d9otenir l vleur de l seonde se ve *(tableau de tleu C IAF ves deux lignes suivntes sont don identiques X
1 2
+ 1) @dresse
tleu I GG envoie l vleur de l seonde se @ l premi re se tnt H A B@ tleu C I A GG sdentique X renvoie l vleur ontenue dns l seonde se
in lirD qund vous rivez tableau[0]D vous demndez l vleur qui se trouve l9dresse tleu C H se @9estEEdire ITHHAF i vous rivez tableau[1]D vous deE mndez l vleur se trouvnt l9dresse tleu C I se @9estEEdire ITHIAF it insi de suite pour les utres vleursF
yr el n9est ps forment reonnu pr tous les ompilteursD ertins plnteront sur l seonde ligneF ve lngge g que je vous enseigne depuis le dut @ppel le gVWA n9utorise ps e genre de hosesF xous onsidrerons don que fire el est interditF xous llons nous mettre d9ord sur ei X vous n9vez ps le droit d9utiliser une vrile entre rohets pour l d(nition de l tille du tleuD mme si ette vrile est une onstnte 3 ve tleu doit voir une dimension (xeD 9estEEdire que vous devez rire noir sur ln le nomre orrespondnt l tille du tleu X
1
int tleu S Y
Mais alors. . . il est interdit de crer un tableau dont la taille dpend d'une variable ?
xonD rssurezEvous X 9est possileD mme en gVWF wis pour fire elD nous utiliserons une utre tehnique @plus sre et qui mrhe prtoutA ppele l'allocation dynamiqueF xous verrons el ien plus loin dns e oursF ITP
PARCOURIR UN TABLEAU
Parcourir un tableau
upposons que je veuille mintennt 0her les vleurs de hque se du tleuF te pourris fire utnt de printf qu9il y de sesF wis onD e serit rptitif et lourd F ve mieux est de se servir d9une ouleF ourquoi ps d9une oule for c ves oules for sont trs prtiques pour prourir un tleu X
2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int min @ int rg D hr B rgv A { int tleu R D i a H Y tleu H tleu I tleu P tleu Q a a a a IH Y PQ Y SHS Y VY
xotre oule prourt le tleu l9ide d9une vrile ppele i @9est le nom trs originl que les progrmmeurs donnent en gnrl l vrile qui leur permet de prourir un tleu 3AF ge qui est prtiulirement prtiqueD 9est qu9on peut mettre une vrile entre roE hetsF in e'etD l vrile tit interdite pour l rtion du tleu @pour d(nir s tilleAD mis elle est heureusement utorise pour prourir le tleuD 9estEEdire 0her ses vleurs 3 siD on mis l vrile iD qui vut suessivement HD ID PD et QF he ette fonD on v don 0her l vleur de tableau[0]D tableau[1]D tableau[2] et tableau[3] 3
2. Imaginez un peu la taille de notre code si on devait acher le contenu de chaque case du tableau une une !
ITQ
Attention ne pas tenter d'acher la valeur de tableau[4] ! Un tableau de 4 cases possde les indices 0, 1, 2 et 3, point barre. Si vous tentez d'acher tableau[4], vous aurez soit n'importe quoi, soit une belle erreur, l'OS coupant votre programme car il aura tent d'accder une adresse ne lui appartenant pas.
Initialiser un tableau
wintennt que l9on sit prourir un tleuD nous sommes ples d9initiliser toutes ses vleurs H en fisnt une oule 3 fonD prourir le tleu pour mettre H hque seD 9est de votre niveu mintennt X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
int min @ int rg D hr B rgv A { int tleu R D i a H Y GG snitilistion du tleu for @ i a H Y i ` R Y i CCA { tleu i a H Y } GG effihge de ses vleurs pour v rifier for @ i a H Y i ` R Y i CCA { printf @ 4 7 d n 4 D tleu i A Y } } return H Y
ITR
} H H H H
return H Y
wis en fitD 9est mme mieux que X vous pouvez d(nir les vleurs des premires ses du tleuD toutes elles que vous n9urez ps renseignes seront utomtiquement mises HF einsiD si je fis X
1
F F F l se no H prendr l vleur IHD l no I prendr PQD et toutes les utres prendront l vleur H @pr dfutAF gomment initiliser tout le tleu H en shnt c ih ien il vous su0t d9initiliser u moins l premire vleur HD et toutes les utres vleurs non indiques prendront l vleur HF
1
gette tehnique l9vntge de fontionner ve un tleu de n9importe quelle tille @lD mrhe pour R sesD mis s9il en vit eu IHH urit t on ussiAF
Attention, on rencontre souvent int tableau[4] = 1;, ce qui insre les valeurs suivantes : 1, 0, 0, 0. Contrairement ce que beaucoup d'entre vous semblent croire, on n'initialise pas toutes les cases 1 en faisant cela : seule la premire case sera 1, les autres seront 0. On ne peut donc pas initialiser toutes les cases 1 automatiquement, moins de faire une boucle.
sl v flloir envoyer deux informtions l fontion X le tleu @en(nD l9dresse du tleuA et ussi et surtout s tille 3 in e'etD notre fontion doit tre ple d9initiE liser un tleu de n9importe quelle tilleF yrD dns votre fontionD vous ne onnissez ps l tille de votre tleuF g9est pour el qu9il fut envoyer en plus une vrile que vous ppellerez pr exemple tailleTableauF gomme je vous l9i ditD tableau peut tre onsidr omme un pointeurF yn peut don l9envoyer l fontion omme on l9urit fit ve un vulgire pointeur X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
GG rototype de l fontion d ' ffihge void ffihe @ int B tleu D int tilleleu A Y int min @ int rg D hr B rgv A { int tleu R a { IH D IS D Q }Y GG yn ffihe le ontenu du tleu ffihe @ tleu D R A Y } return H Y
void ffihe @ int B tleu D int tilleleu A { int i Y for @ i a H Y i ` tilleleu Y i CCA { printf @ 4 7 d n 4 D tleu i A Y }
v fontion n9est ps di'rente de elles que l9on tudies dns le hpitre sur les pointeursF ille prend en prmtre un pointeur sur int @notre tleuAD insi que l tille du tleu @trs importnt pour svoir qund s9rrter dns l oule 3AF out le ontenu du tleu est 0h pr l fontion vi une ouleF xotez qu9il existe une utre fon d9indiquer que l fontion reoit un tleuF lutt que d9indiquer que l fontion ttend un int *tableauD mettez ei X
1
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 porum g du ite du ro gode we X RUQSUQ
Exercice 1
grez une fontion sommeTableau qui renvoie l somme des vleurs ontenues dns le tleu @utilisez un return pour renvoyer l vleurAF our vous iderD voii le prototype de l fontion rer X
1
Exercice 2
moyenneTableau
grez une fontion copierTableau qui prend en prmtre deux tleuxF ve ontenu du premier tleu devr tre opi dns le seond tleuF rototype X
1
ITU
Exercice 4
grez une fontion maximumTableau qui ur pour rle de remettre H toutes les ses du tleu ynt une vleur suprieure un mximumF gette fontion prendr en prmtres le tleu insi que le nomre mximum utoris @valeurMaxAF outes les ses qui ontiennent un nomre suprieur valeurMax doivent tre mises HF rototype X
1
Exercice 5
get exerie est plus di0ileF grez une fontion ordonnerTableau qui lsse les vleurs d9un tleu dns l9ordre roissntF einsiD un tleu qui vut {15, 81, 22, 13} doit l (n de l fontion vloir {13, 15, 22, 81}F rototype X
1
get exerie est don un peu plus di0ile que les utresD mis tout fit rlisleF v vous ouper un petit momentF
Faites-vous un petit chier de fonctions appel tableaux.c (avec son homologue tableaux.h qui contiendra les prototypes, bien sr !) contenant toutes les fonctions de votre cru ralisant des oprations sur des tableaux.
eu trvil 3 XEA
En rsum
! ves tableaux sont des ensemles de vriles du mme type stokes te te en mmoireF ! v tille d9un tleu doit tre dtermine vnt l ompiltionD elle ne peut ps dpendre d9une vrileF ! ghque se d9un tleu de type int ontient une vrile de type intF ! ves ses sont numrotes vi des indices ommennt H X tableau[0]D tableau[1]D tableau[2]D etF
ITV
Chapitre
13
Dicult :
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 charF i vous vous souvenez ienD le type char permet de stoker des nomres ompris entre EIPV et IPUF
Si ce type char permet de stocker des nombres, il faut savoir qu'en C on l'utilise rarement pour a. En gnral, mme si le nombre est petit, on le stocke dans un int. Certes, a prend un peu plus de place en mmoire, mais aujourd'hui, la mmoire, ce n'est vraiment pas ce qui manque sur un ordinateur.
ve type char est en fit prvu pour stokerF F F une lettre 3 ettentionD j9i ien dit X xi lettreF gomme l mmoire ne peut stoker que des nomresD on invent une tle qui fit l onversion entre les nomres et les lettresF gette tle indique insi pr exemple que le nomre TS quivut l lettre eF ve lngge g permet de fire trs filement l trdution lettre `ab nomre orE respondntF our otenir le nomre ssoi une lettreD il su0t d9rire ette lettre entre postrophesD omme ei X 'A'F l ompiltionD 'A' ser rempl pr l vleur orrespondnteF estons X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { hr lettre a ' e ' Y printf @ 4 7 d n 4 D lettre A Y } TS return H Y
yn sit don que l lettre e mjusule est reprsente pr le nomre TSF f vut TTD g vut TUD etF estez ve des minusules et vous verrez que les vleurs sont di'rentesF in e'etD l lettre 'a' n9est ps identique l lettre 'A'D l9ordinteur fisnt l di'rene entre les mjusules et les minusules F v pluprt des rtres de se sont ods entre les nomres H et IPUF ne tle fit l onversion entre les nomres et les lettres X l tle egss @prononez eski AF ve site esiileFom est lre pour proposer ette tle mis e n9est ps le seulD on peut ussi l retrouver sur ikipdi et ien d9utres sites enoreF le des rtres egss gode we X PSRUVP
1
IUH
LE TYPE CHAR
Acher un caractre
v fontion printfD qui n9 didemment ps (ni de nous tonnerD peut ussi 0her un rtreF our elD on doit utiliser le symole %c @ omme rtreA X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { hr lettre a ' e ' Y printf @ 4 7 n 4 D lettre A Y } e return H Y
rourr 3 xous svons 0her une lettreF yn peut ussi demnder l9utilisteur d9entrer une lettre en utilisnt le %c dns un snf X
1 2 3 4 5 6 7 8 9
int min @ int rg D hr B rgv A { hr lettre a H Y snf @ 4 7 4 D 8 lettre A Y printf @ 4 7 n 4 D lettre A Y } return H Y
f f
oii peu prs tout e qu9il fut svoir sur le type charF etenez ien X ! le type char permet de stoker des nomres llnt de EIPV IPUD unsigned char des nomres de H PSS Y ! il y une tle que votre ordinteur utilise pour onvertir les lettres en nomres et inversementD l tle egss Y ! on peut don utiliser le type char pour stoker xi lettre Y ! 'A' est rempl l ompiltion pr l vleur orrespondnte @TS en l9ourreneAF yn utilise don les postrophes pour otenir l vleur d9une lettreF
2. Le premier des deux B est celui que j'ai tap au clavier, le second est celui ach par le printf.
IUI
hr hine S Y
et qu9on met dns chaine[0] l lettre 'S'D dns chaine[1] l lettre 'a'F F F on peut insi former une hne de rtresD 9estEEdire du texteF v (gF IQFI vous donne une ide de l fon dont l hne est stoke en mmoire @ttention X je vous prviens de suiteD 9est un peu plus ompliqu que en rlitD je vous explique prs pourquoiAF
gomme on peut le voirD 9est un tleu qui prend S ses en mmoire pour reprsenter le mot lut F our l vleurD j9i volontirement rit sur le shm les lettres entre postrophes pour indiquer que 9est un nomre qui est stokD et non une lettreF in rlitD dns l mmoireD e sont el et ien les nomres orrespondnt es lettres qui sont stoksF outefoisD une hne de rtres ne ontient ps que des lettres 3 ve shm de l (gF IQFI est en fit inompletF ne hne de rtre doit imprativement contenir un caractre spcial la n de la chaneD ppel rtre de (n de hne F ge rtre s9rit '\0'F
Pourquoi faut-il que la chane de caractres se termine par un \0 ?
out simplement pour que votre ordinteur she qund s9rrte l hne 3 ve rtre IUP
permet de dire X topD 9est (niD y9 plus rien lire prsD irulez 3 r onsquentD pour stoker le mot lut @qui omprend S lettresA en mmoireD il ne fut ps un tleu de S charD mis de T 3 ghque fois que vous rez une hne de rtresD vous llez don devoir penser prvoir de l ple pour le rtre de (n de hneF sl fut toujours toujours toujours jouter un lo de plus dns le tleu pour stoker e rtre \0D 9est imprtif 3 yulier le rtre de (n \0 est une soure d9erreurs impitoyle du lngge gF te le sis pour en voir fit les fris plus d9une foisF v (gF IQFP est le shm orret de l reprsenttion de l hne de rtres lut en mmoireF
\0
gomme vous le voyezD l hne prend T rtres et non ps SD il v flloir s9y fireF v hne se termine pr '\0'D le rtre de (n de hne qui permet d9indiquer l9ordinteur que l hne se termine lF oyez le rtre \0 omme un vntgeF qre luiD vous n9urez ps retenir l tille de votre tleu r il indique que le tleu s9rrte et endroitF ous pourrez psser votre tleu de char une fontion sns voir jouter t une vrile indiqunt l tille du tleuF gel n9est vlle que pour les hnes de rtres @9estEEdire le type char*D qu9on peut ussi rire char[]AF our les utres types de tleuxD vous tes toujours oligs de retenir l tille du tleu quelque prtF
hr hine T Y GG leu de T hr pour stoker E El Eu E t C le H hine H hine I hine P hine Q hine R hine S a a a a a a ' 'Y ' 'Y 'l 'Y 'u 'Y 't 'Y 'H 'Y
2 3 4 5 6 7 8
gette mthode mrheF yn peut le vri(er ve un printfF our fire un printf il fut utiliser le symole %s @s omme string D qui signi(e hne en nglisAF oii le ode omplet qui re une hne lut en mmoire et qui l90he X
1 2 3 4 5 6
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr hine T Y GG leu de T hr pour stoker E El Eu E t C le H GG snitilistion de l h ne @ on rit les rt res un un en m moire A hine H a ' ' Y hine I a ' ' Y hine P a ' l ' Y hine Q a ' u ' Y hine R a ' t ' Y hine S a ' H ' Y GG effihge de l h ne gr e u 7 s du printf printf @ 4 7 s 4 D hine A Y } return H Y
7 8
9 10 11 12 13 14 15 16 17 18 19 20
ous remrquerez que 9est un peu ftignt et rptitif de devoir rire les rtres un un omme on l9 fit dns le tleu chaineF our initiliser une hneD il existe heureusement une mthode plus simple X
1
IUR
hr hine a 4 lut 4 Y GG v tille du tleu hine est utomtiquement lul e printf @ 4 7 s 4 D hine AY
4 5 6 7 8
return H Y
gomme vous le voyez l premire ligneD je re une vrile de type char[]F t9uris pu rire ussi char*D le rsultt urit t le mmeF in tpnt entre guillemets l hne que vous voulez mettre dns votre tleuD le ompilteur g lule utomtiquement l tille nessireF g9estEEdire qu9il ompte les lettres et joute I pour pler le rtre \0F sl rit ensuite une une les lettres du mot lut en mmoire et joute le \0 omme on l9 fit nousEmmes mnuellement quelques instnts plus ttF frefD 9est ien plus prtiqueF sl y toutefois un dfut X ne mrhe que pour l9initilistion 3 ous ne pouvez ps rire plus loin dns le ode X
1
hine a 4 lut 4 Y
gette tehnique est don rserver l9initilistionF eprs elD il fudr rire les rtres mnuellement un un en mmoire omme on l9 fit u dutF
IUS
printf @ 4 gomment t ' ppelles E tu petit ero c 4 A Y snf @ 4 7 s 4 D prenom A Y printf @ 4 lut 7s D je suis heureux de te renontrer 3 4 D prenom A Y } return H Y
8 9 10
gomment t 9 ppelles E tu petit ero c wteoPI lut wteoPI D je suis heureux de te renontrer 3
5 inlude ` string Fh b
i vous ne le fites psD l9ordinteur ne onntr ps les fontions que je vis vous prsenter r il n9ur ps les prototypesD et l ompiltion plnterF in refD n9ouE liez ps d9inlure ette iliothque hque fois que vous utilisez des fontions de mnipultion de hnesF
strlen
strlen est une fontion qui lule l longueur d9une hne de rtres @sns ompter le rtre \0 AF ous devez lui envoyer un seul prmtre X votre hne de rtresF
wintennt que vous svez e qu9est un prototypeD je vis vous donner le prototype des fontions dont je vous prleF ves progrmmeurs s9en servent omme mode d9emploi de l fontion @mme si quelques explitions t ne sont jmis super)uesA X
1
size_t est un type spcial qui signie que la fonction renvoie un nombre correspondant une taille. Ce n'est pas un type de base comme int, long ou char, c'est un type invent . Nous apprendrons nous aussi crer nos propres types de variables quelques chapitres plus loin. Pour le moment, on va se contenter de stocker la valeur renvoye par strlen dans une variable de type int (l'ordinateur convertira de size_t en int automatiquement). En toute rigueur, il faudrait plutt stocker le rsultat dans une variable de type size_t, mais en pratique un int est susant pour cela.
v fontion prend un prmtre de type const char*F ve const @qui signi(e onstnteD rppelezEvousA fit que l fontion strlen s9interdit en quelque sorte de modi(er votre hneF und vous voyez un constD vous svez que l vrile n9est ps modi(e pr l fontionD elle est juste lueF estons l fontion strlen X
1 2 3 4 5 6 7 8 9 10
int min @ int rg D hr B rgv A { hr hine a 4 lut 4 Y int longueurghine a HY GG yn r up re l longueur de l h ne dns longueurghine longueurghine a strlen @ hine A Y GG yn ffihe l longueur de l h ne printf @ 4 v hine 7 s fit 7 d rteres de long 4 D hine D longueurghine A Y } return H Y
11 12 13
gette fontion strlen est d9illeurs file rireF sl su0t de fire une oule sur le tleu de char qui s9rrte qund on tome sur le rtre \0F n ompteur s9inrmente hque tour de ouleD et 9est e ompteur que l fontion retourneF iensD tout m9 donn envie d9rire moiEmme une fontion similire strlenF vous permettr en plus de ien omprendre omment l fontion mrhe X IUU
int longueurghine @ onst hr B hine A Y int min @ int rg D hr B rgv A { hr hine a 4 lut 4 Y int longueur a H Y longueur a longueurghine @ hine A Y printf @ 4 v hine 7 s fit 7 d rteres de long 4 D hine D longueur A Y return H Y
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
} while @ rtereetuel 3a ' H ' A Y GG yn oule tnt qu ' on n ' est ps rriv l ' H nomrehegrteres E EY GG yn retire I rt re de long pour ne ps ompter le rt re H } return nomrehegrteres Y
27 28
29 30 31
gopier e ode gode we X ISHUVS v fontion longueurChaine fit une oule sur le tleu chaineF ille stoke les rtres un pr un dns caractereActuelF hs que caractreActuel vut '\0'D l oule s9rrteF hque pssge dns l ouleD on joute I u nomre de rtres qu9on nlyssF l (n de l ouleD on retire I rtre u nomre totl de rtres qu9on omptsF gel permet de ne ps ompter le rtre \0 dns le lotF in(nD on retourne nombreDeCaracteres et le tour est jou 3 IUV
strcpy
v fontion strcpy @omme string opy A permet de opier une hne l9intrieur d9une utreF on prototype est X
1
gette fontion prend deux prmtres X ! copieDeLaChaine X 9est un pointeur vers un char* @tleu de charAF g9est dns e tleu que l hne ser opie Y ! chaineACopier X 9est un pointeur vers un utre tleu de charF gette hne ser opie dns copieDeLaChaineF v fontion renvoie un pointeur sur copieDeLaChaineD e qui n9est ps trs utileF in gnrlD on ne rupre ps e que ette fontion renvoieF estons el X
1 2 3 4
5 6 7 8 9 10 11
int min @ int rg D hr B rgv A { GB yn r e une h ne 4 hine 4 qui ontient un peu de texte et une opie @ vide A de tille IHH pour tre s r d ' voir l ple pour l opie BG hr hine a 4 exte 4 D opie IHH a { H }Y strpy @ opie D hine AY GG yn opie 4 hine 4 dns 4 opie 4 GG i tout s ' est ien pss D l opie devrit tre identique hine printf @ 4 hine vut X 7 s n 4 D hine A Y printf @ 4 opie vut X 7 s n 4 D opie A Y } return H Y
12 13 14 15 16
yn voit que chaine vut exte F tusqueElD 9est normlF r ontreD on voit ussi que l vrile copieD qui tit vide u dprtD t remplie pr le ontenu de chaineF v hne don ien t opie dns copieF IUW
Vriez que la chane copie est assez grande pour accueillir le contenu de chaine. Si, dans mon exemple, j'avais dni copie[5] (ce qui n'est pas susant car il n'y aurait pas eu de place pour le \0), la fonction strcpy aurait dbord en mmoire et probablement fait planter votre programme. viter tout prix, sauf si vous aimez faire planter votre ordinateur, bien sr.
ghque rtre de chaine t pl dns copieF v hne copie ontient de nomreux rtres inutilissD vous l9urez remrquF te lui i donn l tille IHH pr suritD mis en toute rigueurD l tille T urit su0tF v9vntge de rer un tleu un peu plus grndD 9est que de ette fon l hne copie ser ple de reevoir d9utres hnes peutEtre plus grndes dns l suite du progrmmeF
strcat
: concatner 2 chanes
gette fontion joute une hne l suite d9une utreF yn ppelle el l ontntionF upposons que l9on it les vriles suivntes X ! chaine1 = "Salut " ! chaine2 = "Mateo21" i je ontne chaine2 dns chaine1D lors chaine1 vudr "Salut Mateo21"F unt chaine2D elle n9ur ps hng et vudr don toujours "Mateo21"F eule chaine1 est modi(eF g9est extement e que fit strcatD dont voii le prototype X
1
gomme vous pouvez le voirD chaine2 ne peut ps tre modi(e r elle est d(nie omme onstnte dns le prototype de l fontionF v fontion retourne un pointeur vers chaine1D e quiD omme pour strcpyD ne sert ps grndEhose dns le s prsent X on peut don ignorer e que l fontion nous renvoieF v fontion joute chaine1 le ontenu de chaine2F egrdonsEy de plus prs X
1 2 3
int min @ int rg D hr B rgv A { GB yn r e P h nes F hineI doit tre ssez grnde pour ueillir le ontenu de hineP en plus D sinon risque de plntge BG
IVH
hr hineI IHH a 4 lut 4 D hineP a 4 wteoPI 4 Y strt @ hineI D hineP A Y GG yn ont ne hineP dns hineI GG i tout s ' est ien pss D hineI vut 4 lut wteoPI 4 printf @ 4 hineI vut X 7 s n 4 D hineI A Y GG hineP n ' ps hng X printf @ 4 hineP vut toujours X 7 s n4 D hineP A Y } return H Y
8 9 10 11 12 13 14 15
ri(ez solument que chaine1 est ssez grnde pour qu9on puisse lui jouter le ontenu de chaine2D sinon vous ferez un dordement en mmoire qui peut onduire un plntgeF g9est pour el que j9i d(ni chaine1 de tille IHHF unt chaine2D j9i liss l9ordinteur luler s tille @je n9i don ps pris l tilleA r ette hne n9est ps modi(eD il n9y don ps esoin de l rendre plus grnde que nessireF v (gF IQFR rsume le fontionnement de l ontntionF
ve tleu chaine2 t jout l suite de chaine1 @qui omprenit une entine de sesAF ve \0 de chaine1 t supprim @en fitD il t rempl pr le w de wteoPIAF in e'etD il ne fut ps lisser un \0 u milieu de l hneD sinon elleEi urit t oupe u milieu 3 yn ne met qu9un \0 l (n de l hneD une fois qu9elle est (nieF
strcmp
strcmp
1
: comparer 2 chanes
ves vriles chaine1 et chaine2 sont ompresF gomme vous le voyezD uune d9elles n9est modi(e r elles sont indiques omme onstntesF IVI
sl est importnt de ruprer e que l fontion renvoieF in e'etD strcmp renvoie X ! H si les hnes sont identiques Y ! une utre vleur @positive ou ngtiveA si les hnes sont di'rentesF
Il aurait t plus logique, je le reconnais, que la fonction renvoie 1 si les chanes avaient t identiques pour dire vrai (rappelez-vous des boolens). La raison est simple : la fonction compare les valeurs de chacun des caractres un un. Si tous les caractres sont identiques, elle renvoie 0. Si les caractres de la chaine1 sont suprieurs ceux de la chaine2, la fonction renvoie un nombre positif. Si c'est l'inverse, la fonction renvoie un nombre ngatif. Dans la pratique, on se sert surtout de strcmp pour vrier si 2 chanes sont identiques ou non.
int min @ int rg D hr B rgv A { hr hineI a 4 exte de test 4 D hineP a 4 exte de test 4 Y if @ strmp @ hineI D hineP A aa H A GG i h nes identiques { printf @ 4 ves hines sont identiques n4 A Y } else { printf @ 4 ves hines sont differentes n 4 A Y } } return H Y
4 5 6 7 8 9 10 11 12 13 14 15
ves hnes tnt identiquesD l fontion strcmp renvoy le nomre HF xotez que j9uris pu stoker e que renvoie strcmp dns une vrile de type intF outefoisD e n9est ps oligtoireD on peut diretement mettre l fontion dns le if omme je l9i fitF te n9i ps grndEhose jouter propos de ette fontionF ille est ssez simple utiliser en fitD mis il ne fut ps oulier que H signi(e identique et une utre vleur signi(e di'rent F g9est l seule soure d9erreurs possile iiF IVP
strchr
1
: rechercher un caractre
v fontion prend P prmtres X ! chaine X l hne dns lquelle l reherhe doit tre fite Y ! caractereARechercher X le rtre que l9on doit reherher dns l hneF
Vous remarquerez que caractereARechercher est de type int et non de type char. Ce n'est pas rellement un problme car, au fond, un caractre est et restera toujours un nombre. Nanmoins, on utilise quand mme plus souvent un char qu'un int pour stocker un caractre en mmoire.
v fontion renvoie un pointeur vers le premier rtre qu9elle trouvD 9estEEdire qu9elle renvoie l9dresse de e rtre dns l mmoireF ille renvoie NULL si elle n9 rien trouvF hns l9exemple suivntD je rupre e pointeur dns suiteChaine X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { hr hine a 4 exte de test 4 D B suiteghine a xvv Y suiteghine a strhr @ hine D ' d ' A Y if @ suiteghine 3a xvv A GG i on trouv quelque hose { printf @ 4 oii l fin de l hine prtir du premier d X 7 s 4 D suiteghine A Y } } return H Y
9 10 11 12
evezEvous ien ompris e qu9il se psse ii c g9est un peu prtiulierF in fitD suiteChaine est un pointeur omme chaineD suf que chaine pointe sur le premier rtre @le 'T' mjusuleAD tndis que suiteChaine pointe sur le premier rtre 'd' qui t trouv dns chaineF ve shm de l (gF IQFS vous montre o pointe hque pointeur X chaine ommene u dut de l hine @'T' mjusuleAD tndis que suiteChaine pointe sur le 'd' minusuleF vorsque je fis un printf de suiteChaineD il est don norml que l9on m90he juste de test F v fontion printf 0he tous les rtres qu9elle renontre @9d9D 9e9D 9 9D IVQ
9t9D 9e9D 9s9D 9t9A jusqu9 e qu9elle tome sur le \0 qui lui dit que l hne s9rrte lF
Variante
sl existe une fontion strrchr stritement identique strchrD suf que elleEl renvoie un pointeur vers le dernier caractre qu9elle trouv dns l hne plutt que vers le premierF
strpbrk
gette fontion ressemle euoup l prdenteF gelleEi reherhe un des rtres dns l liste que vous lui donnez sous forme de hneD ontrirement strchr qui ne peut reherher qu9un seul rtre l foisF r exempleD si on forme l hne "xds" et qu9on en fit une reherhe dns "Texte de test"D l fontion renvoie un pointeur vers le premier de es rtres qu9elle y trouvF in l9ourreneD le premier rtre de "xds" qu9elle trouve dns "Texte de test" est le xD don strpbrk renverr un pointeur sur 'x'F rototype X
1
estons l fontion X
1 2 3 4 5
int min @ int rg D hr B rgv A { hr B suiteghine Y GG yn herhe l premi re ourrene de x D d ou s dns 4 exte de test 4 suiteghine a strprk @ 4 exte de test 4 D 4 xds 4 A Y if @ suiteghine 3a xvv A { printf @ 4 oii l fin de l hine prtir du premier des rteres trouves X 7 s 4 D suiteghine A Y } } return H Y
6 7 8 9 10
11 12 13 14
IVR
oii l fin de l hine prtir du premier des rteres trouves X xte de test
our et exempleD j9i diretement rit les vleurs envoyer l fontion @entre guilleE metsAF xous ne sommes en e'et ps oligs d9employer une vrile tous les oupsD on peut trs ien rire l hne diretementF sl fut simplement retenir l rgle suivnte X ! si vous utilisez les guillemets ""D el signi(e chane Y ! si vous utilisez les postrophes D el signi(e caractreF
strstr
gette fontion reherhe l premire ourrene d9une hne dns une utre hneF on prototype est X
1
ve prototype est similire strpbrkD mis ttention ne ps onfondre X strpbrk reherhe x des rtresD tndis que strstr reherhe toute l hneF ixemple X
1 2 3 4 5
int min @ int rg D hr B rgv A { hr B suiteghine Y GG yn herhe l premi re ourrene de 4 test 4 dns 4 exte de test 4 X suiteghine a strstr @ 4 exte de test 4 D 4 test 4 A Y if @ suiteghine 3a xvv A { printf @ 4 remiere ourrene de test dns exte de test X 7 s n 4 D suiteghine A Y } } return H Y
6 7 8 9
10 11 12 13
IVS
v fontion strstr reherhe l hne 4test4 dns 4exte de test4F ille renvoieD omme les utresD un pointeur qund elle trouv e qu9elle herhitF ille renvoie NULL si elle n9 rien trouvF tusqu9iiD je me suis ontent d90her l hne prtir du pointeur retourn pr les fontionsF hns l prtiqueD n9est ps trs utileF ous ferez juste un if (resultat != NULL) pour svoir si l reherhe ou non donn quelque hoseD et vous 0herez ve texte que vous reherhiez t trouv F
sprintf
ge nom doit vguement vous rppeler quelque hoseF gette fontion ressemle norE mment u printf que vous onnissez misD u lieu d9rire l9rnD sprintf rit dnsF F F une hne 3 h9o son nom d9illeursD qui ommene pr le s de string @hne en nglisAF g9est une fontion trs prtique pour mettre en forme une hneF etit exemple X
1 2 3 4 5 6 7 8 9 10 11 12
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr hine IHH Y int ge a IS Y GG yn rit 4 u s IS ns 4 dns hine sprintf @ hine D 4 u s 7 d ns 3 4 D ge A Y GG yn ffihe hine pour v rifier qu ' elle ontient ien el X printf @ 4 7 s 4 D hine A Y } return H Y
13 14 15 16
ille s9utilise de l mme mnire que printfD mis prt le fit que vous devez lui donner en premier prmtre un pointeur vers l hne qui doit reevoir le texteF IVT
hns mon exempleD j9ris dns chaine u s 7d ns D o %d est rempl pr le ontenu de l vrile ageF outes les rgles du printf s9ppliquentD vous pouvez don si vous le voulez mettre des %s pour insrer d9utres hnes l9intrieur de votre hne 3 gomme d9hitudeD vri(ez que votre hne est su0smment grnde pour ueillir tout le texte que le sprintf v lui envoyerF inonD omme on l9 vuD vous vous exposez des dpssements de mmoire et don un plntge de votre progrmmeF
En rsum
! n ordinteur ne sit ps mnipuler du texteD il ne onnt que les nomresF our rgler le prolmeD on ssoie hque lettre de l9lphet un nomre orrespondnt dns une tle ppele l table ASCIIF ! ve type char est utilis pour stoker une et une seule lettre F ! our rer un mot ou une phrseD on doit onstruire une chane de caractresF our elD on utilise un tableau de charF ! oute hne de rtre se termine pr un rtre spil ppel \0 qui signi(e (n de hne F ! sl existe de nomreuses fontions toutes prtes de mnipultion des hnes dns l bibliothque stringF sl fut inlure string.h pour pouvoir les utiliserF
4
4. Il stocke en ralit un nombre mais ce nombre est automatiquement traduit par l'ordinateur l'achage.
IVU
IVV
Chapitre
14
Dicult :
Le prprocesseur
prs ces derniers chapitres harassants sur les pointeurs, tableaux et chanes de caractres, nous allons faire une pause. Vous avez d intgrer un certain nombre de nouveauts dans les chapitres prcdents, je ne peux donc pas vous refuser de souer un peu. Ce chapitre va traiter du prprocesseur, ce programme qui s'excute juste avant la compilation. Ne vous y trompez pas : les informations contenues dans ce chapitre vous seront utiles. Elles sont en revanche moins complexes que ce que vous avez eu assimiler rcemment.
IVW
Les include
gomme je vous l9i expliqu dns les tout premiers hpitres du oursD on trouve dns les odes soure des lignes un peu prtiulires ppeles directives de prprocesseurF ges diretives de prproesseur ont l rtristique suivnte X elles ommenent toujours pr le symole #F illes sont don files reonntreF v premire @et seuleA diretive que nous yons vue pour l9instnt est #includeF gette diretive permet d9inlure le ontenu d9un (hier dns un utreD je vous l9i dit plus ttF yn s9en sert en prtiulier pour inlure des (hiers .h omme les (hiers .h des iliothques @stdlib.hD stdio.hD string.hD math.hF F FA et vos propres (hiers .hF our inlure un (hier .h se trouvnt dns le dossier o est instll votre shiD vous devez utiliser les hevrons < > X
1
5 inlude ` stdli Fh b
our inlure un (hier .h se trouvnt dns le dossier de votre projetD vous devez en revnhe utiliser les guillemets X
1
5 inlude 4 monfihier F h 4
gonrtementD le prproesseur est dmrr vnt l ompiltionF sl prourt tous vos (hiers l reherhe de diretives de prproesseurD es fmeuses lignes qui omE menent pr un #F vorsqu9il renontre l diretive #includeD il insre littrlement le ontenu du (hier indiqu l9endroit du #includeF upposons que j9ie un fichier.c ontennt le ode de mes fontions et un fichier.h ontennt les prototypes des fontions de fichier.cF yn pourrit rsumer l sitution dns le shm de l (gF IRFIF
out le ontenu de fichier.h est mis l9intrieur de fichier.cD l9endroit o il y l diretive #include fichier.hF smginons qu9on it dns le fichier.c X
1 2 3 4 5
5 inlude 4 fihier F h 4 int mpontion @ int tru D doule idule A { GB gode de l fontion BG
IWH
LES DEFINE
6 7 8 9 10 11
it dns le fichier.h X
1 2
int mpontion @ int tru D doule idule A Y void utrepontion @ int vleur A Y
vorsque le prproesseur psse pr lD juste vnt l ompiltion de fichier.cD il insre fichier.h dns fichier.cF eu (nlD le ode soure de fichier.c juste avant l ompiltion ressemle X
1 2 3 4 5 6 7 8 9 10 11 12
int mpontion @ int tru D doule idule A Y void utrepontion @ int vleur A Y int mpontion @ int tru D doule idule A { GB gode de l fontion BG } void utrepontion @ int vleur A { GB gode de l fontion BG }
ve ontenu du .h est venu se mettre l9emplement de l ligne #includeF ge n9est ps ien ompliqu omprendreD je pense d9illeurs que on nomre d9entre vous devient se douter que fontionnit omme F eve es explitions supplE mentiresD j9espre voir mis tout le monde d9ordF ve #include ne fit rien d9utre qu9insrer un (hier dns un utreD 9est importnt de ien le omprendreF
Si on a dcid de mettre les prototypes dans les .h, au lieu de tout mettre dans les .c, c'est essentiellement par principe. On pourrait a priori mettre les prototypes en haut des .c (d'ailleurs, dans certains trs petits programmes on le fait parfois), mais pour des questions d'organisation il est vivement conseill de placer ses prototypes dans des .h. Lorsque votre programme grossira et que plusieurs chiers .c feront appel un mme .h, vous serez heureux de ne pas avoir copier-coller les prototypes des mmes fonctions plusieurs fois !
Les define
xous llons douvrir mintennt une nouvelle diretive de prproesseur X le #defineF IWI
gette diretive permet de d(nir une constante de prprocesseurF gel permet d9ssoier une vleur un motF oii un exemple X
1
5 define xywfisisxssevi Q
ous devez rire dns l9ordre X ! le #define Y ! le mot uquel l vleur v tre ssoie Y ! l vleur du motF ettention X mlgr les pprenes @notmment le nom que l9on l9hitude de mettre en mjusulesAD el est trs di'rent des onstntes que nous vons tudies jusqu9iiD telles que X
1
ves onstntes oupient de l ple en mmoireF wme si l vleur ne hngeit psD votre nomre Q tit stok quelque prt dns l mmoireF ge n9est ps le s des onstntes de prproesseur 3 gomment fontionne c in fitD le #define remple dns votre ode soure tous les mots pr leur vleur orrespondnteF g9est un peu omme l fontion eherher G empler de ord si vous voulezF einsiD l ligne X
1
5 define xywfisisxssevi Q
F F F remple dns le (hier hque NOMBRE_VIES_INITIALES pr QF oii un exemple de (hier .c vnt pssge du prproesseur X
1 2 3 4 5 6 7
5 define xywfisisxssevi Q int min @ int rg D hr B rgv A { int vies a xywfisisxssevi Y GB gode FFF BG
evnt l ompiltionD tous les #define uront don t rempls pr les vleurs orE respondntesF ve ompilteur voit le (hier prs pssge du prproesseurD dns lequel tous les remplements uront t e'etusF
Quel intrt par rapport l'utilisation de constantes comme on l'a vu jusqu'ici ?
IWP
LES DEFINE
ih ienD omme je vous l9i ditD ne prend ps de ple en mmoireF g9est logiqueD vu que lors de l ompiltion il ne reste plus que des nomres dns le ode soureF n utre intrt est que le remplement se fit dns tout le (hier dns lequel se trouve le #defineF i vous viez d(ni une onstnte en mmoire dns une fontionD elleEi n9urit t vlle que dns l fontion puis urit t supprimeF ve #define en revnhe s9ppliquer toutes les fontions du (hierD e qui peut s9vrer prfois prtique selon les esoinsF n exemple onret d9utilistion des #define c in voii un que vous ne trderez ps utiliserF vorsque vous ouvrirez une fentre en gD vous urez prolement envie de d(nir des onstntes de prproesseur pour indiquer les dimensions de l fentre X
1 2
VHH THH
v9vntge est que si plus trd vous didez de hnger l tille de l fentre @pre que vous semle trop petitAD il vous su0r de modi(er les #define puis de reompilerF noter X les #define sont gnrlement pls dns des .hD t des prototypes @vous pouvez d9illeurs ller voir les .h des iliothques omme stdlib.hD vous verrez qu9il y des #define 3AF ves #define sont don files d9s D vous pouvez hnger les dimensions de l fentre en modi(nt les #define plutt que d9ller herher u fond de vos fontions l9endroit o vous ouvrez l fentre pour modi(er les dimensionsF g9est don du temps ggn pour le progrmmeurF in rsumD les onstntes de prproesseur permettent de on(gurer votre proE grmme vnt s ompiltionF g9est une sorte de miniEon(gurtionF
5 define esvviwe
IHHH
Mais. . . je croyais qu'on ne pouvait pas mettre de variable ni de constante entre les crochets lors d'une dnition de tableau ?
yuiD mis TAILLE_MAX n9est e une vrile ni une onstnteF in e'et je vous l9i ditD le prproesseur trnsforme le (hier vnt ompiltion en X
1 2 3 4
IWQ
F F F et el est vlide 3 in d(nissnt TAILLE_MAX insiD vous pouvez vous en servir pour rer des tleux d9une ertine tilleF i l9venir el s9vre insu0sntD vous n9urez qu9 modi(er l ligne du #defineD reompilerD et vos tleux de char prendront tous l nouvelle tille que vous urez indiqueF
v vleur de NOMBRE_PIXELS est remple vnt l ompiltion pr le ode suiE vnt X @LARGEUR_FENETRE * HAUTEUR_FENETREAD 9estEEdire pr @VHH B THHAD e qui fit RVHHHHF wettez toujours votre lul entre prenthses omme je l9i fit pr suE rit pour ien isoler l9oprtionF ous pouvez fire toutes les oprtions de se que vous onnissez X ddition @CAD soustrtion @EAD multiplition @BAD division @GA et modulo @7AF
printf @ 4 irreur l ligne 7 d du fihier 7 s n 4 D vsxi D psvi A Y printf @ 4 ge fihier ete ompile le 7 s 7 s n 4 D hei D swi A Y irreur l ligne W du fihier min F ge fihier ete ompile le tn IQ PHHT IWXPIXIH
1. Vous trouverez ce symbole sous le chire 8, tout du moins si vous avez un clavier AZERTY franais. Il faut appuyer sur les touches Alt Gr et 8 en mme temps.
IWR
LES MACROS
5 define gyxexi
F F F sns priser de vleurF gel veut dire pour le prproesseur que le mot CONSTANTE est d(niD tout simplementF sl n9 ps de vleurD mis il existe F
Quel peut en tre l'intrt ?
v9intrt est moins vident que tout l9heureD mis il y en un et nous llons le douvrir trs rpidementF
Les macros
xous vons vu qu9ve le #define on pouvit demnder u prproesseur de rempler un mot pr une vleurF r exemple X
1
5 define xywfi W
F F F signi(e que tous les NOMBRE de votre ode seront rempls pr WF xous vons vu qu9il s9gissit en fit d9un simple reherherErempler fit pr le prproesseur vnt l ompiltionF t9i du nouveu 3 in fitD le #define est enore plus puissnt que F sl permet de rempler ussi prF F F un ode soure tout entier 3 und on utilise #define pour reherherErempler un mot pr un ode soureD on dit qu9on re une macroF
ge qui hnge iiD e sont les prenthses qu9on joutes prs le motEl @ii COUCOU()AF xous verrons quoi elles peuvent servir tout l9heureF estons l mro dns un ode soure X
1 2 3 4 5 6 7 8
5 define gygy @A printf @ 4 gouou 4 A Y int min @ int rg D hr B rgv A { gygy @A } return H Y
IWS
gouou
te vous l9ordeD e n9est ps originl pour le momentF ge qu9il fut dj ien omE prendreD 9est que les mros ne sont en fit que des outs de ode qui sont diretement rempls dns votre ode soure juste vnt l ompiltionF ve ode qu9on vient de voir ressemler en fit lors de l ompiltion X
1 2 3 4 5 6
xonD heureusement il est possile de mettre plusieurs lignes de ode l foisF sl su0t de pler un \ vnt hque nouvelle ligneD omme ei X
1
printf @ 4 gouou D je m ' ppelle frie printf @ 4 t ' hite xie n 4 A Y printf @ 4 t ' ime l glisse n 4A Y
2 3 4 5 6 7 8 9 10
emrquez dns le main que l9ppel de l mro ne prend ps de pointEvirgule l (nF in e'etD 9est une ligne pour le prproesseurD elle ne nessite don ps d9tre termine pr un pointEvirguleF
LES MACROS
rourir un ode un peu longD surtout s9il est men tre rpt de nomreuses fois dns votre ode soureF gependntD les mros deviennent rellement intressntes lorsqu9on leur met des pE rmtresF gel mrhe qusiment omme ve les fontionsF
1 2 3 4 5 6 7 8 9
5 define weti @ ge A if @ ge ba IV A printf @ 4 ous etes mjeur n 4 A Y int min @ int rg D hr B rgv A { weti @ PP A } return H Y
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.
yn met entre prenthses le nom d9une vrile qu9on nomme ageF hns tout notre ode de mroD age ser rempl pr le nomre qui est indiqu lors de l9ppel l mro @iiD 9est PPAF einsiD notre ode soure prdent ressemler ei juste prs le pssge du prproE esseur X
1 2 3 4 5 6 7
ve ode soure t mis l ple de l9ppel de l mroD et l vleur de l vrile age t mise diretement dns le ode soure de remplementF sl est possile ussi de rer une mro qui prend plusieurs prmtres X
1 2 3 4
5 define weti @ ge D nom A if @ ge ba IV A printf @ 4 ous etes mjeur 7 s n 4 D nom AY int min @ int rg D hr B rgv A
IWU
oil tout e qu9on peut dire sur les mrosF sl fut don retenir que 9est un simple remplement de ode soure qui l9vntge de pouvoir prendre des prmtresF
Normalement, vous ne devriez pas avoir besoin d'utiliser trs souvent les macros. Toutefois, certaines bibliothques assez complexes comme wxWidgets ou Qt (bibliothques de cration de fentres que nous tudierons bien plus tard) utilisent beaucoup de macros. Il est donc prfrable de savoir comment cela fonctionne ds maintenant pour ne pas tre perdu plus tard.
Les conditions
enezEvous ien X il est possile de rliser des onditions en lngge prproesseur 3 oii omment el fontionne X
1 2 3 4
5 if ondition GB gode soure ompiler si l ondition est vrie BG 5 elif onditionP GB inon si l ondition P est vrie ompiler e ode soure BG 5 endif
ve motEl #if permet d9insrer une ondition de prproesseurF #elif signi(e else if @sinon siAF v ondition s9rrte lorsque vous insrez un #endifF ous noterez qu9il n9y ps d9oldes en prproesseurF v9intrtD 9est qu9on peut insi fire des compilations conditionnellesF in e'etD si l ondition est vrieD le ode qui suit ser ompilF inonD il ser tout simplement supE prim du (hier le temps de l ompiltionF sl n9pprtr don ps dns le progrmme (nlF
#ifdef, #ifndef
xous llons voir mintennt l9intrt de fire un #define d9une onstnte sns priser de vleurD omme je vous l9i montr pge IWU X
1
5 define gyxexi
#ifndefD
in e'etD il est possile d9utiliser #ifdef pour dire i l onstnte est d(nie F luiD sert dire i l onstnte n9est ps d(nie F yn peut lors imginer ei X IWV
LES CONDITIONS
1 2 3 4 5 6 7 8 9 10 11 12 13
5 define sxhy 5 ifdef sxhy GB gode soure pour indows BG 5 endif 5 ifdef vsx GB gode soure pour vinux BG 5 endif 5 ifdef weg GB gode soure pour w BG 5 endif
g9est omme que font ertins progrmmes multiEpltesEformes pour s9dpter l9y pr exempleF elorsD ien entenduD il fut reompiler le progrmme pour hque y @e n9est ps mgiqueAF i vous tes sous indowsD vous rivez un #define WINDOWS en hutD puis vous ompilezF i vous voulez ompiler votre progrmme pour vinux @ve l prtie du ode soure spi(que vinuxAD vous devrez lors modi(er le define et mettre l ple X #define LINUXF eompilezD et ette fois 9est l portion de ode soure pour vinux qui ser ompileD les utres prties tnt ignoresF
#ifndef
#ifndef
est trs utilis dns les .h pour viter les inlusions in(nies F
Une inclusion innie ? C'est--dire ?
smginezD 9est trs simpleF t9i un (hier A.h et un (hier B.hF ve (hier A.h ontient un include du (hier B.hF ve (hier f est don inlus dns le (hier eF wisD et 9est l que ommene oinerD supposez que le (hier B.h ontienne son tour un include du (hier A.h 3 rrive quelques fois en progrmmtion 3 ve premier (hier esoin du seond pour fontionnerD et le seond esoin du premierF i on y r)hit un peuD on imgine vite e qu9il v se psser X IF l9ordinteur lit A.h et voit qu9il fut inlure B.h Y PF il lit B.h pour l9inlureD et l il voit qu9il fut inlure A.h Y QF il inlut don A.h dns B.hD mis dns A.h on lui indique qu9il doit inlure B.h 3 RF reeloteD il v voir B.h et voit nouveu qu9il fut inlure A.h Y SF etF ous vous doutez ien que tout el est sns (n 3 in fitD fore de fire trop d9inluE sionsD le prproesseur s9rrter en disnt t9en i mrre des inlusions 3 e qui fer plnter votre ompiltionF IWW
gomment dile fire pour viter et 'reux uhemr c oii l9stueF hsormisD je vous demnde de fire omme dans TOUS vos chiers .h sns exeption X
1
5 ifndef hipxywhpsgrsi GG i le fihier n ' jmis t 5 define hipxywhpsgrsi GG yn prohine fois le fihier
l onstnte n ' ps t d finie inlus d finit l onstnte pour que l ne soit plus inlus
3 4
5 6
gopier e ode gode we X TWVIIV ous mettrez en fit tout le ontenu de votre (hier .h @ svoir vos utres includeD vos prototypesD vos defineF F FA entre le #ifndef et le #endifF gomprenezEvous ien omment e ode fontionne c v premire fois qu9on m9 prsent ette tehniqueD j9tis ssez dsorient X je vis essyer de vous l9expliquerF smginez que le (hier .h est inlus pour l premire foisF ve prproesseur lit l ondition i l onstnte DEF_NOMDUFICHIER n9 ps t d(nie F gomme 9est l premire fois que le (hier est luD l onstnte n9est ps d(nieD don le prproesseur entre l9intrieur du ifF v premire instrution qu9il renontre est justement X
1
5 define hipxywhpsgrsi
wintenntD l onstnte est d(nieF v prohine fois que le (hier ser inlusD l ondition ne ser plus vrie et don le (hier ne risque plus d9tre inlus nouveuF fien entenduD vous ppelez votre onstnte omme vous voulezF woiD je l9ppelle DEF_NOMDUFICHIER pr hitudeF ge qui ompte en revnheD et j9espre que vous l9viez ien omprisD 9est de hnger de nom de onstnte hque (hier .h di'rentF sl ne fut ps que soit l mme onstnte pour tous les (hiers .hD sinon seul le premier (hier .h serit lu et ps les utres 3 ous remplerez don NOMDUFICHIER pr le nom de votre (hier .hF
Je vous invite aller consulter les .h des bibliothques standard sur votre disque dur. Vous verrez qu'ils sont TOUS construits sur le mme principe (un #ifndef au dbut et un #endif la n). Ils s'assurent ainsi qu'il ne pourra pas y avoir d'inclusions innies.
PHH
LES CONDITIONS
En rsum
! ve prproesseur est un progrmme qui nlyse votre ode soure et y e'etue des modi(tions vnt l ompiltionF ! v9instrution de prproesseur #include insre le ontenu d9un utre (hierF ! v9instrution #define d(nit une onstnte de prproesseurF ille permet de remE pler un motEl pr une vleur dns le ode soureF ! ves mros sont des moreux de ode tout prts d(nis l9ide d9un #defineF sls peuvent epter des prmtresF ! sl est possile d9rire des onditions en lngge prproesseur pour hoisir e qui ser ompilF yn utilise notmment les motsEls #ifD #elif et #endifF ! our viter qu9un (hier .h ne soit inlus un nomre in(ni de foisD on le protge l9ide d9une ominison de onstntes de prproesseur et de onditionsF ous vos futurs (hiers .h devront tre protgs de ette mnireF
PHI
PHP
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 Fichier ou encore, un peu plus tard, d'autres de types Fenetre, Audio, Clavier, etc.
PHQ
strut xomheotretruture { int vrileI Y int vrileP Y int utrerile Y doule nomreheiml Y }Y
ne d(nition de struture ommene pr le motEl structD suivi du nom de votre struture @pr exemple FichierD ou enore EcranAF
J'ai personnellement l'habitude de nommer mes structures en suivant les mmes rgles que pour les noms de variables, except que je mets la premire lettre en majuscule pour pouvoir faire la dirence. Ainsi, quand je vois le mot ageDuCapitaine dans mon code, je sais que c'est une variable car cela commence par une lettre minuscule. Quand je vois MorceauAudio je sais qu'il s'agit d'une structure (un type personnalis) car cela commence par une majuscule.
eprs le nom de votre strutureD vous ouvrez les oldes et les fermez plus loinD omme pour une fontionF
Attention, ici c'est particulier : vous DEVEZ mettre un point-virgule aprs l'accolade fermante. C'est obligatoire. Si vous ne le faites pas, la compilation plantera.
it mintenntD que mettre entre les oldes c g9est simpleD vous y plez les vriles dont est ompose votre strutureF ne struture est gnrlement ompose d9u moins deux sousEvriles D sinon elle n9 ps trop d9intrtF gomme vous le voyezD l rtion d9un type de vrile personnlis n9est ps ien omplexeF outes les strutures que vous verrez sont en fit des ssemlges de vriles de type de seD omme longD intD doubleD etF sl n9y ps de mirleD un type Fichier n9est don ompos que de nomres de se 3 PHR
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 Coordonnees qui permette de stoker l fois l vleur de l9sisse @xA et elle de l9ordonne @yA d9un point c ellonsD llonsD e n9est ps ien di0ile X
1 2 3 4 5
xotre struture s9ppelle Coordonnees et est ompose de deux vrilesD x et yD 9estE Edire de l9sisse et de l9ordonneF i on le voulitD on pourrit filement fire une struture Coordonnees pour de l Qh X il su0rit d9jouter une troisime vrile @pr exemple zA qui indiquerit l huteurF eve D nous urions une struture fite pour grer des points en Qh dns l9espe 3
strut ersonne { hr nom IHH Y hr prenom IHH Y hr dresse IHHH Y int ge Y int gron Y GG fool en X I a gr on D H a fille
}Y
gette struture est ompose de inq sousEvrilesF ves trois premires sont des hnes qui stokeront le nomD le prnom et l9dresse de l personneF ves deux dernires stokent l9ge et le sexe de l personneF ve sexe est un oolenD I a vri a gronD H a fux a (lleF gette struture pourrit servir rer un progrmme de rnet d9dressesF fien enE tenduD vous pouvez rjouter des vriles dns l struture pour l omplter si vous le voulezF sl n9y ps de limite u nomre de vriles dns une strutureF
5 inlude 4 min F h 4 GG snlusion du F h qui ontient les prototypes et strutures int min @ int rg D hr B rgv A { strut goordonnees point Y GG gr tion d ' une vrile 4 point 4 de type goordonnees } return H Y
2 3 4 5
6 7 8
xous vons insi r une vrile point de type CoordonneesF gette vrile est uE tomtiquement ompose de deux sousEvriles X x et y @son sisse et son ordonneAF
Faut-il obligatoirement crire le mot-cl variable ?
struct
lors de la dnition de la
yui X el permet l9ordinteur de di'renier un type de se @omme intA d9un type personnlisD omme CoordonneesF outefoisD les progrmmeurs trouvent souvent un peu lourd de mettre le mot struct hque d(nition de vrile personnliseF our rgler e prolmeD ils ont invent une instrution spile X le typedefF PHT
Le typedef
etournons dns le (hier .h qui ontient l d(nition de notre struture de type CoordonneesF xous llons jouter une instrution ppele typedef qui sert rer un lis de strutureD 9estEEdire dire qu9rire telle hose quivut rire telle utre hoseF xous llons jouter une ligne ommennt pr typedef juste vnt l d(nition de l struture X
1 2 3 4 5 6
gette ligne doit tre doupe en trois moreux @nonD je n9i ps gy le mot Coordonnees 3A X ! typedef X indique que nous llons rer un lis de struture Y ! struct Coordonnees X 9est le nom de l struture dont vous llez rer un lis @9estEEdire un quivlent A Y ! Coordonnees X 9est le nom de l9quivlentF in lirD ette ligne dit rire le mot Coordonnees est dsormis quivlent rire struct Coordonnees F in fisnt elD vous n9urez plus esoin de mettre le mot struct hque d(nition de vrile de type CoordonneesF yn peut don retourner dns notre main et rire tout simplement X
1 2 3
4 5
int min @ int rg D hr B rgv A { goordonnees point Y GG v ' ordinteur omprend qu ' il s ' git de 4 strut goordonnees 4 gr e u typedef return H Y }
te vous reommnde de fire un typedef omme je l9i fit ii pour CoordonneesF v pluprt des progrmmeurs font omme elF leur vite d9voir rire le mot struct prtout F
1
PHU
yn insi modi( l vleur de pointD en lui donnnt une sisse de IH et une ordonne de PHF xotre point se situe dsormis l position @IH Y PHA F our der don hque omposnte de l strutureD vous devez rire X
2 1
vrile F nomhevgomposnte
ve point fit l sprtion entre l vrile et l omposnteF i on prend l struture Personne que nous vons vue tout l9heure et qu9on demnde le nom et le prnomD on devr fire omme X
1 2 3 4 5 6 7 8 9 10
int min @ int rg D hr B rgv A { ersonne utilisteur Y printf @ 4 uel est votre nom c 4 A Y snf @ 4 7 s 4 D utilisteur F nom A Y printf @ 4 otre prenom c 4 A Y snf @ 4 7 s 4 D utilisteur F prenom A Y printf @ 4 ous vous ppelez 7 s 7 s 4 D utilisteur F prenom D utilisteur F nom A Y } return H Y
11 12 13
uel est votre nom c hupont otre prenom c ten ous vous ppelez ten hupont
yn envoie l vrile utilisateur.nom scanf qui rir diretement dns notre vrile utilisateurF yn fit de mme pour prenomD et on pourrit ussi le fire pour l9dresseD l9ge et le sexeD mis je n9i gure envie de me rpter F ous uriez pu fire l mme hose sns onntre les struturesD en rnt juste une vrile nom et une utre prenomF wis l9intrt ii est que vous pouvez rer une utre vrile de type Personne qui ur ussi son propre nomD son propre prnomD etF yn peut don fire X
3 1
PHV
F F F et stoker insi les informtions sur hque joueurF ghque joueur son propre nomD son propre prnomD etF yn peut mme fire enore mieux X on peut rer un tleu de Personne 3 g9est file fire X
1
ersonne joueurs P Y
joueurs H F nom
v9vntge d9utiliser un tleu iiD 9est que vous pouvez fire une oule pour demnE der les infos du joueur I et du joueur PD sns voir rpter deux fois le mme odeF sl su0t de prourir le tleu joueur et de demnder hque fois nomD prnomD dresseF F F Exercice X rez e tleu de type Personne et demndez les infos de hun gre une oule @qui se rpte tnt qu9il y des joueursAF pites un petit tleu de P joueurs pour ommenerD mis si vous museD vous pourrez grndir l tille du tleu plus trdF e0hez l (n du progrmme les infos que vous vez reueillies sur hun des joueursF
goordonnees point a {H D H }Y
gel d(nirD dns l9ordreD point.x = 0 et point.y = 0F evenons l struture Personne @qui ontient des hnesAF ous vez ussi le droit d9initiliser une hne en rivnt juste "" @rien entre les guillemetsAF te ne vous i ps prl de ette possiilit dns le hpitre sur les hnesD mis il n9est ps trop trd pour l9pprendreF yn peut don initiliser dns l9ordre nomD prenomD adresseD age et garcon omme ei X PHW
ersonne utilisteur a { 4 4 D 4 4 D 4 4 D H D H }Y
outefoisD j9utilise ssez peu ette tehniqueD personnellementF te prfre envoyer pr exemple m vrile point une fontion initialiserCoordonnees qui se hrge de fire les initilistions pour moi sur m vrileF our fire el il fut envoyer un pointeur de m vrileF in e'et si j9envoie juste m vrileD une opie en ser rlise dns l fontion @omme pour une vrile de seA et l fontion modi(er les vleurs de l opie et non elle de m vrie vrileF evoyez le (l rouge du hpitre sur les pointeurs si vous vez ouli omment el fontionneF sl v don flloir pprendre utiliser des pointeurs sur des struturesF ves hoses vont ommener se orser un petit peu 3
Pointeur de structure
n pointeur de struture se re de l mme mnire qu9un pointeur de intD de double ou de n9importe quelle utre type de se X
1
yn insi un pointeur de Coordonnees ppel pointF gomme un rppel ne fer de ml personneD je tiens vous rpter que l9on urit ussi pu mettre l9toile devnt le nom du pointeurD el revient extement u mme X
1
te fis d9illeurs ssez souvent omme elD r pour d(nir plusieurs pointeurs sur l mme ligneD nous sommes oligs de pler l9toile devnt hque nom de pointeur X
1
PIH
POINTEUR DE STRUCTURE
7 8 9 10 11 12 13
return H Y
w vrile monPoint est don re dns le mainF yn envoie son dresse l fontion initialiserCoordonnees qui rupre ette vrile sous l forme d9un pointeur pE pel point @on urit d9illeurs pu l9ppeler n9importe omment dns l fontionD el n9urit ps eu d9inideneAF fien X mintennt que nous sommes dns initialiserCoordonneesD nous llons iniE tiliser hune des vleurs une uneF sl ne fut ps oulier de mettre une toile devnt le nom du pointeur pour der l vrileF i vous ne le fites psD vous risquez de modi(er l9dresseD et e n9est ps e que nous voulons fireF yui mis voilD prolmeF F F yn ne peut ps vriment fire X
1 2 3 4 5
ge serit trop fileF F F ourquoi on ne peut ps fire c re que le point de sprE tion s9pplique sur le mot point et non sur *point en entierF yrD nous e qu9on veutD 9est der *point pour en modi(er l vleurF our rgler le prolmeD il fut pler des prenthses utour de *pointF gomme elD le point de sprtion s9ppliquer *point et non juste point X
1 2 3 4 5
ge ode fontionneD vous pouvez testerF v vrile de type Coordonnees t trnsE mise l fontion qui initilis x et y HF
En langage C, on initialise gnralement nos structures avec la mthode simple qu'on a vue plus haut. En C++ en revanche, les initialisations sont plus souvent faites dans des fonctions . Le C++ n'est en fait rien d'autre qu'une sorte de super-amlioration des structures. Bien entendu, beaucoup de choses dcoulent de cela et il faudrait un livre entier pour en parler .
4
PII
@B point A F x a H Y
yui mis voilD enore une fois les progrmmeurs trouvent trop longF ves prenthses utour de *pointD quelle plie 3 elorsD omme les progrmmeurs sont des gens finnts @mis D je l9i dj ditD je roisAD ils ont invent le rouri suivnt X
1
point E b x a H Y
ge rouri onsiste former une )he ve un tiret suivi d9un hevron >F rire point->x est don sgiwix quivlent rire (*point).xF
N'oubliez pas qu'on ne peut utiliser la che que sur un pointeur ! Si vous travaillez directement sur la variable, vous devez utiliser le point comme on l'a vu au dbut.
etenez ien e rouri de l )heD nous llons le rutiliser un ertin nomre de foisF it surtoutD ne onfondez ps l )he ve le point F v )he est rserve ux pointeursD le point est rserv ux vrilesF tilisez e petit exemple pour vous en souvenir X
1 2 3 4 5 6
int min @ int rg D hr B rgv A { goordonnees monoint Y goordonnees B pointeur a 8 monoint Y monoint F x a IH Y GG yn trville sur une vrile D on utilise le 4 point 4 pointeur E b x a IH Y GG yn trville sur un pointeur D on utilise l fl he
5. Quand je vous disais que les pointeurs vous poursuivraient jusque dans votre tombe, je ne le disais presque pas en rigolant !
PIP
LES NUMRATIONS
9 10
return H Y
yn modi(e l vleur du x IH de deux mnires di'rentesD ii X l premire fois en trvillnt diretement sur l vrileD l seonde fois en pssnt pr le pointeurF
Les numrations
ves numrtions onstituent une fon un peu di'rente de rer ses propres types de vrilesF ne numrtion ne ontient ps de sousEvriles omme 9tit le s pour les struturesF g9est une liste de vleurs possiles pour une vrileF ne numrtion ne prend don qu9une se en mmoire et ette se peut prendre une des vleurs que vous d(nissez @et une seule l foisAF oii un exemple d9numrtion X
1 2 3 4 5
ous noterez qu9on utilise un typedef l ussiD omme on l9 fit jusqu9iiF our rer une numrtionD on utilise le motEl enumF xotre numrtion s9ppelle ii VolumeF g9est un type de vrile personnlis qui peut prendre une des trois vleurs qu9on indiques X soit FAIBLED soit MOYEND soit FORTF yn v pouvoir rer une vrile de type VolumeD pr exemple musiqueD qui stoker le volume tuel de l musiqueF yn peut pr exemple initiliser l musique u volume MOYEN X
1
oil qui est fitF lus trd dns le progrmmeD on pourr modi(er l vleur du volume et l mettre soit FAIBLED soit FORTF
gontrirement u #defineD 9est le ompilteur qui ssoie MOYEN I pr exempleD et non le prproesseurF eu out du ompteD revient un peu u mmeF in fitD qund on initilis l vrile musique MOYEND on don mis l se en mmoire l vleur IF
En pratique, est-ce utile de savoir que MOYEN vaut 1, FORT vaut 2, etc. ?
xonF in gnrl nous est glF g9est le ompilteur qui ssoie utomtiquement un nomre hque vleurF qre D vous n9vez plus qu9 rire X
1 2 3 4
eu importe l vleur de MOYEND vous lissez le ompilteur se hrger de grer les nomresF v9intrt de tout c g9est que de e fit votre ode est trs lisileF in e'etD tout le monde peut filement lire le if prdent @on omprend ien que l ondition signi(e i l musique est u volume moyen AF
siD le volume FAIBLE orrespondr IH 7 de volumeD le volume MOYEN SH 7D etF yn pourrit filement jouter de nouvelles vleurs possiles omme MUETF yn ssoierit dns e s MUET l vleurF F F H 3 ous vez omprisF
En rsum
! ne struture est un type de vrile personnlis que vous pouvez rer et utiliser dns vos progrmmesF g9est vous de l d(nirD ontrirement ux types de se tels que int et double que l9on retrouve dns tous les progrmmesF PIR
LES NUMRATIONS
! ne struture est ompose de sousEvriles qui sont en gnrl des vriles de type de se omme int et doubleD mis ussi des tleuxF ! yn de un des omposnts de l struture en sprnt le nom de l vrile et l omposnte d9un point X joueur.prenomF ! i on mnipule un pointeur de struture et qu9on veut der une des omposntesD on utilise une )he l ple du point X pointeurJoueur->prenomF ! ne numrtion est un type de vrile personnlis qui peut seulement prendre une des vleurs que vous prd(nissez X FAIBLED MOYEN ou FORT pr exempleF
PIS
PIT
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.
PIU
essurezEvous donD pour ommenerD que vous inluez ien u moins les iliothques stdio.h et stdlib.h en hut de votre (hier .c X
1 2
ges iliothques sont tellement fondmentlesD tellement siquesD que je vous reomE mnde d9illeurs de les inlure dns tous vos futurs progrmmesD quels qu9ils soientF fienF wintennt que les onnes iliothques sont inlusesD nous llons pouvoir ttE quer les hoses srieusesF oii e qu9il fut fire hque fois dns l9ordre qund on veut ouvrir un (hierD que e soit pour le lire ou pour y rireF IF yn ppelle l fontion d9ouverture de chier fopen qui nous renvoie un poinE teur sur le (hierF PF On vrie si l'ouverture a russi @9estEEdire si le (hier existitA en testnt l vleur du pointeur qu9on reuF i le pointeur vut NULLD 9est que l9ouverture du (hier n9 ps fontionnD dns e s on ne peut ps ontinuer @il fut 0her un messge d9erreurAF QF i l9ouverture fontionn @si le pointeur est di'rent de NULL donAD lors on peut s9muser lire et crire dans le chier trvers des fontions que nous verrons un peu plus loinF RF ne fois qu9on termin de travailler sur le chierD il fut penser le fermer ve l fontion fcloseF xous llons dns un premier temps pprendre nous servir de fopen et fcloseF ne fois que vous surez fire elD nous pprendrons lire le ontenu du (hier et y rire du texteF PIV
fopen
: ouverture du chier
1
hns le hpitre sur les hnesD nous nous sommes servis des prototypes des fontions omme d9un mode d9emploi F g9est omme que les progrmmeurs font en gnrl X ils lisent le prototype et omprennent omment ils doivent utiliser l fontion F oyons justement le prototype de l fontion fopen X
1
gette fontion ttend deux prmtres X ! le nom du (hier ouvrir Y ! le mode d9ouverture du (hierD 9estEEdire une indition qui mentionne e que vous voulez fire X seulement rire dns le (hierD seulement le lireD ou les deux l foisF gette fontion renvoieF F F un pointeur sur FILE 3 g9est un pointeur sur une struture de type FILEF gette struture est d(nie dns stdio.hF ous pouvez ouvrir e (hier pour voir de quoi est onstitu le type FILED mis n9 uun intrt en e qui nous onerneF
Pourquoi le nom de la structure est-il tout en majuscules (FILE) ? Je croyais que les noms tout en majuscules taient rservs aux constantes et aux define ?
gette rgle D 9est moi qui me l suis (xe @et nomre d9utres progrmmeurs suivent l mmeD d9illeursAF n9 jmis t une oligtionF pore est de roire que eux qui ont progrmm stdio ne suivient ps extement les mmes rgles 3 gel ne doit ps vous perturer pour utntF ous verrez d9illeurs que les iliothques que nous tudierons ensuite respetent les mmes rgles que moiD svoir ii mettre juste l premire lettre d9une struture en mjusuleF evenons notre fontion fopenF ille renvoie un FILE*F sl est extrmement importnt de ruprer e pointeur pour pouvoir ensuite lire et rire dns le (hierF xous llons don rer un pointeur de FILE u dut de notre fontion @pr exemple l fontion mainA X
1 2 3 4 5 6
ve pointeur est initilis NULL ds le dutF te vous rppelle que 9est une rgle fondmentle que d9initiliser ses pointeurs NULL ds le dut si on n9 ps d9utre vleur leur donnerF i vous ne le fites psD vous ugmentez onsidrlement le risque d9erreur pr l suiteF
1. Je reconnais nanmoins que l'on a toujours besoin de quelques petites explications ct quand mme !
PIW
Vous noterez qu'il n'est pas ncessaire d'crire struct FILE* fichier = Les crateurs de stdio ont donc fait un typedef comme je vous ai appris le faire il n'y a pas longtemps. Notez que la forme de la structure peut changer d'un OS l'autre (elle ne contient pas forcment les mmes sous-variables partout). Pour cette raison, on ne modiera jamais le contenu d'un FILE directement (on ne fera pas fichier.element par exemple). On passera par des fonctions qui manipulent le FILE notre place.
NULL.
wintenntD nous llons ppeler l fontion fopen et ruprer l vleur qu9elle renvoie dns le pointeur fichierF wis vnt D il fut que je vous explique omment se servir du seond prmtreD le prmtre modeOuvertureF in e'etD il y un ode envoyer qui indiquer l9ordinteur si vous ouvrez le (hier en mode de leture seuleD d9riture seuleD ou des deux l foisF oii les modes d9ouverture possilesF ! "r" : lecture seuleF ous pourrez lire le ontenu du (hierD mis ps y rireF Le ! !
chier doit avoir t cr au pralable.
"w" "a"
: mode d'ajoutF ous rirez dns le (hierD en prtnt de l (n du (hierF ous jouterez don du texte l (n du (hierF Si le chier n'existe pas, il sera cr. ! "r+" : lecture et critureF ous pourrez lire et rire dns le (hierF Le chier doit
: criture seuleF ous pourrez rire dns le (hierD mis ps lire son ontenuF
! !
"w+" : lecture et criture, avec suppression du contenu au pralableF ve (hier est don d9ord vid de son ontenuD vous pouvez y rireD et le lire ensuiteF
avoir t cr au pralable.
: ajout en lecture / criture la nF ous rivez et lisez du texte prtir de l (n du (hierF Si le chier n'existe pas, il sera cr. our informtionD je ne vous i prsent qu9une prtie des modes d9ouvertureF sl y en le douleD en rlit 3 our hque mode qu9on vu lD si vous joutez un "b" prs le premier rtre @"rb"D "wb"D "ab"D "rb+"D "wb+"D "ab+"AD lors le (hier est ouvert en mode inireF g9est un mode un peu prtiulier que nous ne verrons ps iiF in fitD le mode texte est fit pour stokerF F F du texte omme le nom l9indique @uniquement des rtres 0hlesAD tndis que le mode inire permet de stokerF F F des informtions otet pr otet @des nomresD priniplementAF g9est sensilement di'rentF ve fontionnement est de toute fon qusiment le mme que elui que nous llons voir iiF ersonnellementD j9utilise souvent "r" @letureAD "w" @ritureA et "r+" @leture et riE tureAF ve mode "w+" est un peu dngereux pre qu9il vide de suite le ontenu du (hierD sns demnde de on(rmtionF sl ne doit tre utilis que si vous voulez d9ord rinitiliser le (hierF ve mode d9jout @"a"A peut tre utile dns ertins sD si vous voulez seulement jouter des informtions l (n du (hierF
"a+"
Si vous avez juste l'intention de lire un chier, il est conseill de mettre "r". Certes, le mode "r+" aurait fonctionn lui aussi, mais en mettant "r" vous vous assurez que le chier ne pourra pas tre modi, ce qui est en quelque sorte une scurit.
PPH
i vous rivez une fontion chargerNiveau @pour hrger le niveu d9un jeuD pr exempleAD le mode "r" su0tF i vous rivez une fontion enregistrerNiveauD le mode "w" ser lors dptF ve ode suivnt ouvre le (hier test.txt en mode "r+" @leture G ritureA X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y } return H Y
sl doit tre situ dns le mme dossier que votre exutle @.exeAF our les esoins de e hpitreD rez un (hier test.txt omme moi dns le mme dossier que le .exe @(gF ITFIAF
Figure ITFI ! ve (hier doit tre pl dns le mme dossier que l9exutle
gomme vous le voyezD je trville tuellement ve l9shi gode: :floksD e qui explique PPI
l prsene d9un (hier de projet .cbp @u lieu de .slnD si vous vez isul gCC pr exempleAF frefD e qui ompte 9est de ien voir que mon progrmme @tests.exeA est situ dns le mme dossier que le (hier dns lequel on v lire et rire @test.txtAF
Le chier doit-il tre de type .txt ?
xonF g9est vous qui hoisissez l9extension lorsque vous ouvrez le (hierF ous pouvez trs ien inventer votre propre formt de (hier .niveau pour enregistrer les niveux de vos jeux pr exempleF
Le chier doit-il tre obligatoirement dans le mme rpertoire que l'excutable ?
siD le (hier test.txt est dns un sousEdossier ppel dossierF gette mthodeD que l9on ppelle chemin relatif est plus prtiqueF gomme D el fontionner peu importe l9endroit o est instll votre progrmmeF sl est ussi possile d9ouvrir un utre (hier n9importe o illeurs sur le disque durF hns e sD il fut rire le hemin omplet @e qu9on ppelle le chemin absolu A X
1
Files\Notepad++F
J'ai d mettre deux antislashs \ chaque fois comme vous l'avez remarqu. En eet, si j'en avais crit un seul, votre ordinateur aurait cru que vous essayiez d'insrer un symbole spcial comme \n ou \t. Pour crire un antislash dans une chane, il faut donc l'crire deux fois ! Votre ordinateur comprend alors que c'est bien le symbole \ que vous vouliez utiliser.
ve dfut des hemins solusD 9est qu9ils ne fontionnent que sur un y prisF ge n9est ps une solution portleD donF i vous viez t sous vinuxD vous uriez d rire un hemin ElElinuxD tel que X
1
te vous reommnde don d9utiliser des hemins reltifs plutt que des hemins solusF x9utilisez les hemins solus que si votre progrmme est fit pour un y pris et doit modi(er un (hier pris quelque prt sur votre disque durF PPP
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y if @ fihier 3a xvv A { GG yn peut lire et rire dns le fihier } else { GG yn ffihe un messge d ' erreur si on veut printf @ 4 smpossile d ' ouvrir le fihier test F txt 4 A Y } } return H Y
pites toujours el lorsque vous ouvrez un (hierF i vous ne le fites ps et que le (hier n9existe psD vous risquez un plntge du progrmme pr l suiteF
fclose
: fermer le chier
i l9ouverture du (hier russiD vous pouvez le lire et y rire @nous llons voir sous peu omment fireAF ne fois que vous urez (ni de trviller ve le (hierD il fudr le fermer F yn utilise pour el l fontion fclose qui pour rle de lirer l mmoireD 9estEEdire supprimer votre (hier hrg dns l mmoire viveF on prototype est X
1
gette fontion prend un prmtre X votre pointeur sur le (hierF ille renvoie un int qui indique si elle russi fermer le (hierF get int vut X PPQ
! 0 X si l fermeture mrh Y ! EOF X si l fermeture houF EOF est un define situ dns stdio.h qui orrespond un nomre spilD utilis pour dire soit qu9il y eu une erreurD soit que nous sommes rrivs l (n du (hierF hns le s prsent el signi(e qu9il y eu une erreurF e prioriD l fermeture se psse toujours ien X je n9i don ps l9hitude de tester si le fclose mrhF ous pouvez nnmoins le fire si vous le voulezF our fermer le (hierD on v don rire X
1
flose @ fihier A Y
eu (nlD le shm que nous llons suivre pour ouvrir et fermer un (hier ser le suivnt X
1 2 3 4 5 6 7 8 9 10 11 12 13
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 r C 4 A Y if @ fihier 3a xvv A { GG yn lit et on rit dns le fihier GG FFF flose @ fihier A Y GG yn ferme le fihier qui t ouvert
14 15 16 17
} }
return H Y
te n9i ps mis le else ii pour 0her un messge d9erreur si l9ouverture houD mis vous pouvez le fire si vous le dsirezF sl fut toujours penser fermer son (hier une fois que l9on (ni de trviller veF gel permet de lirer de l mmoireF i vous ouliez de lirer l mmoireD votre progrmme risque l (n de prendre normment de mmoire qu9il n9utilise plusF ur un petit exemple omme e n9est ps )grntD mis sur un gros progrmmeD onjour les dgts 3 yulier de lirer l mmoireD rriveF vous rriver d9illeurs trs ertinementF hns e sD vous serez tmoins de e que l9on ppelle des fuites mmoire F otre proE grmme se mettr lors utiliser plus de mmoire que nessire sns que vous rriviez omprendre pourquoiF fien souventD il s9git simplement d9un ou deux dtils omme des petits fclose oulisF PPR
ille prend deux prmtresF ! ve rtre rire @de type intD e qui omme je vous l9i dit revient plus ou moins utiliser un charD suf que le nomre de rtres utilisles est ii plus grndAF ous pouvez don rire diretement 'A' pr exempleF ! ve pointeur sur le (hier dns lequel rireF hns notre exempleD notre pointeur s9ppelle fichierF v9vntge de demnder le pointeur de (hier hque foisD 9est que vous pouvez ouvrir plusieurs (hiers en mme temps et don lire et rire dns hun de es (hiersF ous n9tes ps limits un seul (hier ouvert l foisF v fontion retourne un intD 9est un ode d9erreurF get int vut EOF si l9riture houD sinon il une utre vleurF gomme le (hier normlement t ouvert ve susD je n9i ps l9hitude de tester si hun de mes fputc russiD mis vous pouvez le fire enore une fois si vous le voulezF ve ode suivnt rit l lettre 'A' dns test.txt @si le (hier existeD il est rempl Y s9il n9existe psD il est rAF sl y tout dns e ode X ouvertureD test de l9ouvertureD riture et fermetureF
1 2 3 4 5 6 7
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A
PPS
{ } }
return H Y
gopier e ode gode we X SIUWRR yuvrez votre (hier test.txtF ue voyezEvous c g9est mgiqueD le (hier ontient minE tennt l lettre 'A' omme le montre l (gF ITFPF
gette fontion est trs similire fputcD l di'rene prs qu9elle rit tout une hneD e qui est en gnrl plus prtique que d9rire rtre pr rtreF gel ditD fputc reste utile lorsque vous devez rire rtre pr rtreD e qui rrive frquemmentF rototype de l fontion X
1
ves deux prmtres sont files omprendreF ! chaine X l hne rireF xotez que le type ii est const char* X en joutnt le mot const dns le prototypeD l fontion indique que pour elle l hne ser onsidre omme une onstnteF in un mot omme en ent X elle s9interdit de modi(er le ontenu de votre hneF g9est logique qund on y pense X fputs doit juste lire votre hneD ps l modi(erF g9est don pour vous une informtion @et une suritA omme quoi votre hne ne suir ps de modi(tionF ! pointeurSurFichier X omme pour fputcD il s9git de votre pointeur de type FILE* sur le (hier que vous vez ouvertF v fontion renvoie EOF s9il y eu une erreurD sinon 9est que el fontionnF v non plusD je ne teste en gnrl ps l vleur de retourF PPT
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A { fputs @ 4 lut les rHs ngomment llez E vous c 4 D fihier A Y flose @ fihier A Y } } return H Y
10 11 12 13 14
gopier e ode gode we X VRHTVU v (gF ITFQ prsente le (hier une fois modi( pr le progrmmeF
oii un utre exemplire de l fontion printfF gelleEi peut tre utilise pour rire dns un (hierF ille s9utilise de l mme mnire que printf d9illeursD exept le fit que vous devez indiquer un pointeur de FILE en premier prmtreF ge ode demnde l9ge de l9utilisteur et l9rit dns le (hier @rsultt (gF ITFRA X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int ge a H Y fihier a fopen @ 4 test F txt 4 D 4 w 4 A Y if @ fihier 3a xvv A
PPU
GG yn demnde l ' ge printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 ge A Y GG yn l ' rit dns le fihier fprintf @ fihier D 4 ve wonsieur qui utilise le progrmme D il 7 d ns 4 D ge A Y flose @ fihier A Y
16 17 18 19 20
} }
return H Y
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
PPV
gette fontion retourne un int X 9est le rtre qui t luF i l fontion n9 ps pu lire de rtreD elle retourne EOFF
Mais comment savoir quel caractre on lit ? Si on veut lire le troisime caractre, ainsi que le dixime caractre, comment doit-on faire ?
in fitD u fur et mesure que vous lisez un (hierD vous vez un urseur qui vneF g9est un urseur virtuel ien entenduD vous ne le voyez ps l9rnF ous pouvez imginer que e urseur est omme l rre lignotnte lorsque vous ditez un (hier sous floExotesF sl indique o vous en tes dns l leture du (hierF xous verrons peu prs omment svoir quelle position le urseur est situ dns le (hier et glement omment modi(er l position du urseur @pour le remettre u dut du (hier pr exempleD ou le pler un rtre prisD omme le dixime rtreAF fgetc vne le urseur d9un rtre hque fois que vous en lisez unF i vous pE pelez fgetc une seonde foisD l fontion lir don le seond rtreD puis le troisime et insi de suiteF ous pouvez don fire une oule pour lire les rtres un pr un dns le (hierF yn v rire un ode qui lit tous les rtres d9un (hier un un et qui les rit hque fois l9rnF v oule s9rrte qund fgetc renvoie EOF @qui signi(e ind yf pile D 9estEEdire (n du (hier AF
1 2 3 4 5 6 7 8 9 10 11 12 13
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int rtereetuel a H Y fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { GG foule de leture des rt res un un do { rtereetuel a fget @ fihier A Y GG yn lit le rt re printf @ 4 7 4 D rtereetuel A Y GG yn l ' ffihe } while @ rtereetuel 3a iyp A Y GG yn ontinue tnt que fget n ' ps retourn iyp @ fin de fihier A } } flose @ fihier A Y
14 15
16 17 18 19 20 21
return H Y
PPW
gopier e ode gode we X UQPTQP v onsole 0her tout le ontenu du (hierD pr exemple X
gouou D je suis le ontenu du fihier test F txt 3
fgets
gette fontion lit une hne dns le (hierF vous vite d9voir lire tous les rE tres un pr unF v fontion lit au maximum une ligne @elle s9rrte u premier \n qu9elle renontreAF i vous voulez lire plusieurs lignesD il fudr fire une ouleF oii le prototype de fgets X
1
gette fontion demnde un prmtre un peu prtiulierD qui v en fit s9vrer trs prtique X le nomre de rtres lireF gel demnde l fontion fgets de s9rrter de lire l ligne si elle ontient plus de rtresF evntge X nous permet de nous ssurer que l9on ne fer ps de dpssement de mmoire 3 in e'etD si l ligne est trop grosse pour rentrer dns chaineD l fontion urit lu plus de rtres qu9il n9y de pleD e qui urit prolement provoqu un plntge du progrmmeF xous llons d9ord voir omment lire une ligne ve fgets @nous verrons ensuite omment lire tout le (hierAF our elD on re une hne su0smment grnde pour stoker le ontenu de l ligne qu9on v lire F ous llez voir l tout l9intrt d9utiliser un define pour d(nir l tille du tleu X
2 1 2 3 4 5 6
5 define esvviwe IHHH GG leu de tille IHHH int min @ int rg D hr B rgv A { psvi B fihier a xvv Y hr hine esvviwe a 4 4 Y GG gh ne vide de tille esvviwe fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { fgets @ hine D esvviwe D fihier A Y GG yn lit mximum esvviwe rt res du fihier D on stoke le tout dns 4 hine 4 printf @ 4 7 s 4 D hine A Y GG yn ffihe l h ne
2. Du moins on l'espre, car on ne peut pas en tre sr 100 %.
7 8 9 10 11 12
13 14
PQH
} }
flose @ fihier A Y
return H Y
gopier e ode gode we X VQHWWP ve rsultt est le mme que pour le ode de tout l9heureD svoir que le ontenu s9rit dns l onsole X
gouou D je suis le ontenu du fihier test F txt 3
v di'reneD 9est qu9ii on ne fit ps de ouleF yn 0he toute l hne d9un oupF ous urez srement remrqu mintennt l9intrt que peut voir un #define dns son ode pour d(nir l tille mximle d9un tleu pr exempleF in e'etD TAILLE_MAX est ii utilis deux endroits du ode X ! une premire fois pour d(nir l tille du tleu rer Y ! une utre fois dns le fgets pour limiter le nomre de rtres lireF v9vntge iiD 9est que si vous vous rendez ompte que l hne n9est ps ssez grnde pour lire le (hierD vous n9vez qu9 hnger l ligne du define et reompilerF gel vous vite d9voir herher tous les endroits du ode qui indiquent l tille du tleuF ve prproesseur rempler tous les TAILLE_MAX dns le ode pr leur nouvelle vleurF gomme je vous l9i ditD fgets lit u mximum toute une ligne l foisF ille s9rrte de lire l ligne si elle dpsse le nomre mximum de rtres que vous utorisezF yui mis voil X pour le momentD on ne sit lire qu9une seule ligne l fois ve fgetsF gomment dile lire tout le (hier c v rponse est simple X ve une oule 3 v fontion fgets renvoie NULL si elle n9est ps prvenue lire e que vous vez demndF v oule doit don s9rrter ds que fgets se met renvoyer NULLF yn n9 plus qu9 fire un while pour ouler tnt que fgets ne renvoie ps NULL X
1 2 3 4 5 6 7 8 9 10 11 12
5 define esvviwe IHHH int min @ int rg D hr B rgv A { psvi B fihier a xvv Y hr hine esvviwe a 4 4 Y fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { while @ fgets @ hine D esvviwe D fihier A 3a xvv A GG yn lit le fihier tnt qu ' on ne re oit ps d ' erreur @ xvv A
PQI
{ } } }
15 16 17 18 19 20 21
flose @ fihier A Y
return H Y
gopier e ode gode we X RWWUWQ ge ode soure lit et 0he tout le ontenu de mon (hierD ligne pr ligneF v ligne de ode l plus intressnte est elle du while X
1
v ligne du while fit deux hoses X elle lit une ligne dns le (hier et vri(e si fgets ne renvoie ps NULLF ille peut don se trduire omme ei X vire une ligne du (hier tnt que nous ne sommes ps rrivs l (n du (hier F
fscanf
g9est le mme prinipe que l fontion scanfD l enoreF gette fontion lit dns un (hier qui doit voir t rit d9une mnire priseF upposons que votre (hier ontienne trois nomres sprs pr un espeD qui sont pr exemple les trois plus huts sores otenus votre jeu X 15 20 30F ous voudriez ruprer hun de es nomres dns une vrile de type intF v fontion fscanf v vous permettre de fire rpidementF
1 2 3 4 5 6 7 8 9 10
int min @ int rg D hr B rgv A { psvi B fihier a xvv Y int sore Q a { H }Y GG leu des Q meilleurs sores fihier a fopen @ 4 test F txt 4 D 4 r 4 A Y if @ fihier 3a xvv A { fsnf @ fihier D 4 7 d 7 d 7 d 4 D 8 sore H D 8 sore I D 8 sore P A Y printf @ 4 ves meilleurs sores sont X 7d D 7 d et 7 d4 D sore H D sore I D sore P A Y } flose @ fihier A Y
11
12 13 14
PQP
return H Y
gomme vous le voyezD l fontion fscanf ttend trois nomres sprs pr un espe @"%d %d %d"AF ille les stoke ii dns notre tleu de trois losF yn 0he ensuite hun des nomres ruprsF
Jusqu'ici, je ne vous avais fait mettre qu'un seul %d entre guillemets pour la fonction scanf. Vous dcouvrez aujourd'hui qu'on peut en mettre plusieurs, les combiner. Si votre chier est crit d'une faon bien prcise, cela permet d'aller plus vite pour rcuprer chacune des valeurs.
gette fontion est trs simple utiliserF ille renvoie l position tuelle du urseur sous l forme d9un long X
1
fseek
v fontion fseek permet de dpler le urseur d9un ertin nomre de rtres @indiqu pr deplacementA prtir de l position indique pr origineF ! ve nomre deplacement peut tre un nomre positif @pour se dpler en vntAD nul @a HA ou ngtif @pour se dpler en rrireAF ! unt u nomre origineD vous pouvez mettre omme vleur l9une des trois onstntes @gnrlement des defineA listes iEdessous X ! SEEK_SET X indique le dut du (hier Y ! SEEK_CUR X indique l position tuelle du urseur Y ! SEEK_END X indique l (n du (hierF oii quelques exemples pour ien omprendre omment on jongle ve deplacement et origineF ! ve ode suivnt ple le urseur deux rtres aprs le dut X
1
emrquez que deplacement est ngtif r on se dple en rrireF ! ve ode suivnt ple le urseur l (n du (hier X
1
i vous rivez prs voir fit un fseek qui mne l (n du (hierD el jouter vos informtions l suite dns le (hier @le (hier ser ompltAF in revnheD si vous plez le urseur u dut et que vous rivezD el rser le texte qui se trouvit lF sl n9y ps de moyen d9 insrer de texte dns le (hier F
3
Mais comment puis-je savoir quelle position je dois aller lire et crire dans le chier ?
g9est vous de le grerF i 9est un (hier que vous vez vousEmmes ritD vous svez omment il est onstruitF ous svez don o ller herher vos informtions X pr exemple les meilleurs sores sont en position HD les noms des derniers joueurs sont en position SHD etF xous trvillerons sur un un peu plus trd dns lequel vous omprendrezD si e n9est ps dj le sD omment on fit pour ller herher l9informtion qui nous intresseF
3. moins de coder soi-mme une fonction qui lit les caractres d'aprs pour s'en souvenir avant de les craser !
PQR
x9ouliez ps que 9est vous qui d(nissez omment votre (hier est onstruitF g9est don vous de dire X je ple le sore du meilleur joueur sur l premire ligneD elui du seond meilleur joueur sur l seonde ligneD etF
La fonction fseek peut se comporter bizarrement sur des chiers ouverts en mode texte. En gnral, on l'utilise plutt pour se dplacer dans des chiers ouverts en mode binaire. Quand on lit et crit dans un chier en mode texte, on le fait gnralement caractre par caractre. La seule chose qu'on se permet en mode texte avec fseek c'est de revenir au dbut ou de se placer la n.
rewind
: retour au dbut
gette fontion est quivlente utiliser fseek pour nous renvoyer l position H dns le (hierF
1
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
1 2 3 4 5 6
int min @ int rg D hr B rgv A { renme @ 4 test F txt 4 D 4 testrenomme F txt 4 A Y } return H Y
PQS
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 test.txtD je peux don me permettre de le supprimer X
1 2 3 4 5 6
4. moins de faire appel des outils spciques de rcupration de chiers sur le disque, mais l'opration peut tre longue, complexe et ne pas russir.
PQT
Chapitre
17
Dicult :
L'allocation dynamique
outes les variables que nous avons cres jusqu'ici taient construites automatiquement par le compilateur du langage C. C'tait la mthode simple. Il existe cependant une faon plus manuelle de crer des variables que l'on appelle l'allocation dynamique. Un des principaux intrts de l'allocation dynamique est de permettre un programme de rserver la place ncessaire au stockage d'un tableau en mmoire dont il ne connaissait pas la taille avant la compilation. En eet, jusqu'ici, la taille de nos tableaux tait xe en dur dans le code source. Aprs lecture de ce chapitre, vous allez pouvoir crer des tableaux de faon bien plus exible ! Il est impratif de bien savoir manipuler les pointeurs pour pouvoir lire ce chapitre ! Si vous avez encore des doutes sur les pointeurs, je vous recommande d'aller relire le chapitre correspondant avant de commencer.
PQU
int monxomre a H Y
vorsque le progrmme rrive une ligne omme elleEiD il se psse en fit les hoses suivntes X IF votre progrmme demnde u systme d9exploittion @indowsD vinuxD w yF F FA l permission d9utiliser un peu de mmoire Y PF le systme d9exploittion rpond votre progrmme en lui indiqunt o il peut stoker ette vrile @il lui donne l9dresse qu9il lui rserveA Y QF lorsque l fontion est termineD l vrile est utomtiquement supprime de l mmoireF otre progrmme dit u systme d9exploittion X te n9i plus esoin de l9espe en mmoire que tu m9vis rserv telle dresseD meri 3 F tusqu9iiD les hoses tient utomtiquesF vorsqu9on dlrit une vrileD le systme d9exploittion tit utomtiquement ppel pr le progrmmeF ue diriezEvous de fire el mnuellement c xon ps pr pur plisir de fire quelque hose de ompliqu @mme si 9est tentnt 3AD mis plutt pre que nous llons prfois tre oligs de proder omme elF hns e hpitreD nous llons X ! tudier le fontionnement de l mmoire @ouiD enore 3A pour douvrir l tille que prend une vrile en fontion de son type Y ! puis ttquer le sujet luiEmme X nous verrons omment demnder mnuellement de l mmoire u systme d9exploittionF yn fer e qu9on ppelle de l9llotion dynmique de mmoire Y ! en(nD douvrir l9intrt de fire une llotion dynmique de mmoire en pprennt rer un tleu dont l tille n9est onnue qu9 l9exution du progrmmeF
1
PQV
lngge gF ous devez juste indiquer entre prenthses le type que vous voulez nlyserF our onntre l tille d9un intD on devr don rire X
1
sizeof @ int A
l ompiltionD el ser rempl pr un nomre X le nomre d9otets que prend int en mmoireF ghez moiD sizeof(int) vut RD e qui signi(e que int oupe R otetsF ghez vousD 9est prolement l mme vleurD mis e n9est ps une rgleF estez pour voirD en 0hnt l vleur l9ide d9un printf pr exemple X
1 2 3 4
printf @ 4 hr X 7 d otets n 4 D sizeof @ hr A A Y printf @ 4 int X 7 d otets n 4 D sizeof @ int A A Y printf @ 4 long X 7 d otets n 4 D sizeof @ long A A Y printf @ 4 doule X 7d otets n 4 D sizeof @ doule A A Y
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
2. En revanche, tous ces types ont encore de l'intrt si vous crez des programmes pour de l'informatique embarque o la mmoire disponible est plus faible. Je pense par exemple aux programmes destins des tlphones portables, des robots, etc.
PQW
}Y
int y Y
int min @ int rg D hr B rgv A { printf @ 4 goordonnees X 7 d otets n 4 D sizeof @ goordonnees A A Y } return H Y
goordonnees X V otets
lus une struture ontient de sousEvrilesD plus elle prend de mmoireF errilement logiqueD n9estEe ps c
int nomre a IV Y
F F F et que sizeof(int) indique R otets sur notre ordinteurD lors l vrile ouper R otets en mmoire 3 upposons que l vrile nombre soit lloue l9dresse ITHH en mmoireF yn urit lors le shm de l (gF IUFIF siD on voit ien que notre vrile nombre de type int qui vut IV oupe R otets dns l mmoireF ille ommene l9dresse ITHH @9est son dresseA et termine l9dresse ITHQF v prohine vrile ne pourr don tre stoke qu9 prtir de l9dresse ITHR 3 i on vit fit l mme hose ve un charD on n9urit lors oup qu9un seul otet en mmoire @(gF IUFPAF smginez mintennt un tleu de int 3 ghque se du tleu ouper R otetsF i notre tleu fit IHH ses X
1
fien sr 3 v ple en mmoire est rserveD uun utre progrmme n9 le droit d9y touE her @ prt le vtreAF ne fois qu9une vrile est dlreD elle prend immditement PRH
PRI
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 malloc pour demnder de l mmoire Y PF vri(er l vleur retourne pr malloc pour svoir si l9y ien russi llouer l mmoire Y QF une fois qu9on (ni d9utiliser l mmoireD on doit l lirer ve freeF i on ne le fit psD on s9expose des fuites de mmoireD 9estEEdire que votre progrmme risque u (nl de prendre euoup de mmoire lors qu9il n9 en rlit plus esoin de tout et espeF ges trois tpes vous rppellentEelles le hpitre sur les (hiers c illes devrient 3 ve prinipe est extement le mme qu9ve les (hiers X on lloueD on vri(e si l9llotion mrhD on utilise l mmoireD puis on l lire qund on (ni de l9utiliserF
malloc
3. Si vous avez suivi mes conseils, vous devriez avoir inclus cette bibliothque dans tous vos programmes, de toute faon.
PRP
v fontion prend un prmtre X le nomre d9otets rserverF einsiD il su0r d9rire sizeof(int) dns e prmtre pour rserver su0smment d9espe pour stoker un intF wis 9est surtout e que l fontion renvoie qui est urieux X elle renvoie unF F F void* 3 i vous vous souvenez du hpitre sur les fontionsD je vous vis dit que void signi(it vide et qu9on utilisit e type pour indiquer que l fontion ne retournit uune vleurF elors iiD on urit une fontion qui retourne unF F F pointeur sur vide c in voil une ien onne 3 ges progrmmeurs ont didment un sens de l9humour trs dveloppF ssurezEvousD il y une risonF in fitD ette fontion renvoie un pointeur indiqunt l9dresse que l9y rserve pour votre vrileF i l9y trouv de l ple pour vous l9dresse ITHHD l fontion renvoie don un pointeur ontennt l9dresse ITHHF ve prolmeD 9est que l fontion malloc ne sit ps quel type de vrile vous herhez rerF in e'etD vous ne lui donnez qu9un prmtre X le nomre d9otets en mmoire dont vous vez esoinF i vous demndez R otetsD pourrit ussi ien tre un int qu9un long pr exemple 3 gomme malloc ne sit ps quel type elle doit retournerD elle renvoie le type void*F ge ser un pointeur sur n'importe quel typeF yn peut dire que 9est un pointeur universelF ssons l prtiqueF i je veux m9muser @hum 3A rer mnuellement une vrile de type int en mmoireD je devris indiquer malloc que j9i esoin de sizeof(int) otets en mmoireF te rupre le rsultt du malloc dns un pointeur sur intF
1 2 3
int B memoireellouee a xvv Y GG yn r e un pointeur sur int memoireellouee a mllo @ sizeof @ int A A Y GG v fontion mllo insrit dns notre pointeur l ' dresse qui t reserv e F
l (n de e odeD memoireAllouee est un pointeur ontennt une dresse qui vous t rserve pr l9yD pr exemple l9dresse ITHH pour reprendre mes shms prE dentsF
Tester le pointeur
v fontion malloc don renvoy dns notre pointeur memoireAllouee l9dresse qui t rserve pour vous en mmoireF heux possiilits X ! si l9llotion mrhD notre pointeur ontient une dresse Y ! si l9llotion houD notre pointeur ontient l9dresse NULLF sl est peu prole qu9une llotion houeD mis el peut rriverF smginez que vous demndiez utiliser QR qo de mmoire viveD il y trs peu de hnes que l9y vous rponde fvorlementF sl est nnmoins reommnd de toujours tester si l9llotion mrhF yn v fire ei X si l9llotion houD 9est qu9il n9y vit plus de mmoire de lire @9est un s ritiqueAF hns un tel sD le mieux est d9rrter immditement le progrmme pre PRQ
queD de toute mnireD il ne pourr ps ontinuer onvenlementF yn v utiliser une fontion stndrd qu9on n9vit ps enore vue jusqu9ii X exit()F ille rrte immditement le progrmmeF ille prend un prmtre X l vleur que le progrmme doit retourner F
4 1 2 3 4 5 6 7 8 9 10 11 12 13 14
int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y if @ memoireellouee aa xvv A GG i l ' llotion hou { exit @ H A Y GG yn rr te imm ditement le progrmme } GG yn peut ontinuer le progrmme normlement sinon } return H Y
i le pointeur est di'rent de NULLD le progrmme peut ontinuerD sinon il fut 0her un messge d9erreur ou mme mettre (n u progrmmeD pre qu9il ne pourr ps ontinuer orretement s9il n9y plus de ple en mmoireF
free
: librer de la mmoire
out omme on utilisit l fontion fclose pour fermer un (hier dont on n9vit plus esoinD on v utiliser l fontion free pour lirer l mmoire dont on ne se sert plusF
1
v fontion free juste esoin de l9dresse mmoire lirerF yn v don lui envoyer notre pointeurD 9estEEdire memoireAllouee dns notre exempleF oii le shm omE plet et (nlD ressemlnt s9y mprendre e qu9on vu dns le hpitre sur les (hiers X
1 2 3 4 5 6
int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y if @ memoireellouee aa xvv A GG yn v rifie si l m moire t llou e { exit @ H A Y GG irreur X on rr te tout 3 } GG yn peut utiliser ii l m moire
4. Cela correspond en fait au return du main().
7 8 9 10 11
PRR
13 14 15
int min @ int rg D hr B rgv A { int B memoireellouee a xvv Y memoireellouee a mllo @ sizeof @ int A A Y GG ellotion de l m moire if @ memoireellouee aa xvv A { exit @ H A Y } GG tilistion de l m moire printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D memoireellouee A Y printf @ 4 ous vez 7 d ns n 4 D B memoireellouee A Y free @ memoireellouee A Y GG vi rtion de m moire } return H Y
6 7 8 9 10 11 12 13 14 15 16 17 18 19
PRS
Attention : comme memoireAllouee est un pointeur, on ne l'utilise pas de la mme manire qu'une vraie variable. Pour obtenir la valeur de la variable, il faut placer une toile devant : *memoireAllouee (regardez le printf). Tandis que pour indiquer l'adresse, on a juste besoin d'crire le nom du pointeur memoireAllouee (regardez le scanf). Tout cela a t expliqu dans le chapitre sur les pointeurs. Toutefois, on met gnralement du temps s'y faire et il est probable que vous confondiez encore. Si c'est votre cas, vous devez relire le chapitre sur les pointeurs, qui est fondamental.
evenons notre odeF yn y llou dynmiquement une vrile de type intF eu (nlD e qu9on rit revient extement u mme que d9utiliser l mthode utoE mtique qu9on onnt ien mintennt X
1 2 3
int min @ int rg D hr B rgv A { int mrile a H Y GG ellotion de l m moire @ utomtique A GG tilistion de l m moire printf @ 4 uel ge vez E vous c 4 A Y snf @ 4 7 d 4 D 8 mrile A Y printf @ 4 ous vez 7 d ns n 4 D mrile A Y return H Y } GG vi rtion de l m moire @ utomtique l fin de l fontion A
4 5 6 7 8 9 10 11
in rsumD il y deux fons de rer une vrileD 9estEEdire d9llouer de l mmoireF oit on le fit X ! utomtiquement X 9est l mthode que vous onnissez et qu9on utilise jusqu9ii Y ! mnuellement @dynamiquement A X 9est l mthode que je vous enseigne dns e hpitreF
Je trouve la mthode dynamique complique et inutile !
n peu plus ompliqueF F F ertesF wis inutileD non 3 xous sommes prfois oligs d9llouer mnuellement de l mmoireD omme nous llons le voir mintenntF PRT
int geemis IS Y
wis qui vous dit que l9utilisteur IS mis c eutEtre qu9il en plus que 3 vorsque vous rivez le ode soureD vous ne onnissez ps l tille que vous devez donner votre tleuF ous ne le surez qu9 l9exutionD lorsque vous demnderez l9utilisteur omien il d9misF v9intrt de l9llotion dynmique est l X on v demnder le nomre d9mis l9utiliE steurD puis on fer une llotion dynmique pour rer un tleu ynt extement l tille nessire @ni trop petitD ni trop grndAF i l9utilisteur IS misD on rer un tleu de IS int Y s9il en PVD on rer un tleu de PV intD etF gomme je vous l9i pprisD il est interdit en g de rer un tleu en indiqunt s tille l9ide d9une vrile X
1
Ce code fonctionne peut-tre sur certains compilateurs mais uniquement dans des cas prcis, il est recommand de ne pas l'utiliser !
v9vntge de l9llotion dynmiqueD 9est qu9elle nous permet de rer un tleu qui extement l tille de l vrile nombreDAmisD et el gre un ode qui fontionner prtout 3 yn v demnder u malloc de nous rserver nombreDAmis * sizeof(int) otets en mmoire X
1
ge ode permet de rer un tleu de type int qui une tille orrespondnt exE tement u nomre d9mis 3 oii e que fit le progrmme dns l9ordre X IF demnder l9utilisteur omien il d9mis Y PF rer un tleu de int ynt une tille gle son nomre d9mis @vi mallocA Y PRU
QF demnder l9ge de hun de ses mis un unD qu9on stoke dns le tleu Y RF 0her l9ge des mis pour montrer qu9on ien mmoris tout el Y SF l (nD puisqu9on n9 plus esoin du tleu ontennt l9ge des misD le lirer ve l fontion freeF
1 2 3 4
int min @ int rg D hr B rgv A { int nomrehemis a H D i a H Y int B geemis a xvv Y GG ge pointeur v servir de tleu pr s l ' ppel du mllo GG yn demnde le nomre d ' mis l ' utilisteur printf @ 4 gomien d ' mis vez E vous c 4 A Y snf @ 4 7 d 4 D 8 nomrehemis A Y if @ nomrehemis b H A GG sl fut qu ' il it u moins un mi @ je le plins un peu sinon X p A { geemis a mllo @ nomrehemis B sizeof @ int A A Y GG yn lloue de l m moire pour le tleu if @ geemis aa xvv A GG yn v rifie si l ' llotion mrh ou non { exit @ H A Y GG yn rr te tout } GG yn demnde l ' ge des mis un un for @ i a H Y i ` nomrehemis Y i CCA { printf @ 4 uel ge l ' mi numero 7 d c 4 D i C I A Y snf @ 4 7 d 4 D 8 geemis i A Y } GG yn ffihe les ges stok s un un printf @ 4 n nos mis ont les ges suivnts X n 4 A Y for @ i a H Y i ` nomrehemis Y i CCA { printf @ 4 7 d ns n 4 D geemis i A Y } GG yn li re l m moire llou e ve mllo D on n ' en plus esoin free @ geemis A Y
5 6 7 8 9 10
11 12
13
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33 34 35 36 37
} }
return H Y
gomien d 9 mis vez E vous c S uel ge l 9 mi numero I c IT uel ge l 9 mi numero P c IV uel ge l 9 mi numero Q c PH uel ge l 9 mi numero R c PT uel ge l 9 mi numero S c PU os mis ont les ges suivnts X IT ns IV ns PH ns PT ns PU ns
ge progrmme est tout fit inutile X il demnde les ges et les 0he ensuiteF t9i hoisi de fire el r 9est un exemple simple @en(nD si vous vez ompris le mallocAF te vous rssure X dns l suite du oursD nous urons l9osion d9utiliser le malloc pour des hoses ien plus intressntes que le stokge de l9ge de ses mis 3
En rsum
! ne vrile oupe plus ou moins d9espe en mmoire en fontion de son typeF ! yn peut onntre le nomre d9otets oups pr un type l9ide de l9oprteur sizeof()F ! v9llotion dynmique onsiste rserver mnuellement de l9espe en mmoire pour une vrile ou un tleuF ! v9llotion est e'etue ve malloc() et il ne fut surtout ps oulier de lirer l mmoire ve free() ds qu9on n9en plus esoinF ! v9llotion dynmique permet notmment de rer un tleu dont l tille est dtermine pr une vrile u moment de l9exutionF
PRW
PSH
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 !
PSI
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 BBB q B
i ensuite on tpe un D omme l lettre s9y trouveD on l9joute l liste des lettres trouves et on 0he nouveu le mot ve les lettres dj douvertes X
wot seret X BB q B
1. Mais vous pouvez changer ce nombre maximal pour corser la dicult, bien sr !
PSP
LES CONSIGNES
hns ertins motsD une mme lettre peut pprtre deux ou trois foisD voire plus 3 r exempleD il y deux dns vi Y de mmeD il y trois i dns iviwixF ue fitEon dns un s omme c ves rgles du endu sont lires X si le joueur tpe l lettre iD toutes les lettres i du mot iviwix doivent tre douvertes d9un seul oup X
wot seret X i B i B i BB
sl ne fut don ps voir tper trois fois l lettre i pour que tous les i soient douvertsF
Exemple d'une partie complte
oii quoi devrit ressemler une prtie omplte en onsole lorsque votre progrmme ser termin X
fienvenue dns le endu 3 sl vous reste IH oups jouer uel est le mot seret c BBBBBB roposez une lettre X i sl vous reste W oups jouer uel est le mot seret c BBBBBB roposez une lettre X e sl vous reste W oups jouer uel est le mot seret c B e BBBB roposez une lettre X y sl vous reste W oups jouer uel est le mot seret c B e BB yB roposez une lettre X
it insi de suite jusqu9 e que le joueur it douvert toutes les lettres du mot @ou ien qu9il ne lui reste plus de oups jouerA X
sl vous reste V oups jouer uel est le mot seret c we BB yx roposez une lettre X qgne 3 ve mot seret etit ien X weyx
PSQ
v leture d9une lettre dns l onsole est plus omplique qu9il n9y prtF sntuitiveE mentD pour ruprer un rtreD vous devriez voir pens X
1
snf @ 4 7 4 D 8 mvettre A Y
it e'etivementD 9est ienF %c indique que l9on ttend un rtreD qu9on stoker dns maLettre @une vrile de type charAF out se psse trs ienF F F tnt qu9on ne refit ps un scanfF in e'etD vous pouvez tester le ode suivnt X
1 2 3 4 5 6 7 8 9 10 11 12
int min @ int rg D hr B rgv A { hr mvettre a HY snf @ 4 7 4 D 8 mvettre A Y printf @ 4 7 4 D mvettre A Y snf @ 4 7 4 D 8 mvettre A Y printf @ 4 7 4 D mvettre A Y } return H Y
xormlementD e ode est ens vous demnder une lettre et vous l90herD et el deux foisF estezF ue se psseEtEil c ous entrez une lettreD d9ordD misF F F le progrmme s9rrte de suite prsD il ne vous demnde ps l seonde lettre 3 yn dirit qu9il ignore le seond scanfF
Que s'est-il pass ?
in fitD qund vous entrez du texte en onsoleD tout e que vous tpez est stok quelque prt en mmoireD y compris l'appui sur la touche Entre @\nAF einsiD l premire fois que vous entrez une lettre @pr exemple eA puis que vous ppuyez sur EntreD 9est l lettre e qui est renvoye pr le scanfF wis l seonde foisD scanf renvoie le \n orrespondnt l touhe Entre que vous viez presse uprvnt 3 our viter elD le mieux 9est de rer notre propre petite fontion lireCaractere() X
1 2 3 4 5 6
hr liregrtere @A { hr rtere a H Y rtere a gethr @A Y GG yn lit le premier rt re rtere a toupper @ rtere A Y GG yn met l lettre en mjusule si elle ne l ' est ps d j
PSR
LES CONSIGNES
8
9 10 11
GG yn lit les utres rt res m moris s un un jusqu ' u n @ pour les effer A while @ gethr @A 3a ' n ' A Y return rtere Y GG yn retourne le premier rt re qu ' on lu
12
gopier e ode gode we X UTRITV gette fontion utilise getchar() qui est une fontion de stdio qui revient extement rire scanf("%c", &lettre);F v fontion getchar renvoie le rtre que le joueur tpF eprsD j9utilise une fontion stndrd qu9on n9 ps eu l9osion d9tudier dns le ours X toupper()F gette fontion trnsforme l lettre indique en mjusuleF gomme D le jeu fontionner mme si le joueur tpe des lettres minusulesF sl fudr inlure ctype.h pour pouvoir utiliser ette fontion @ne l9ouliez ps 3AF ient ensuite l prtie l plus intressnte X elle o je vide les utres rtres qui urient pu voir t tpsF in e'etD en rppelnt getchar on prend le rtre suivnt que l9utilisteur tp @pr exemple l9Entre \nAF ge que je fis est simple et tient en une ligne X j9ppelle l fontion getchar en oule jusqu9 tomer sur le rtre \nF v oule s9rrte lorsD e qui signi(e qu9on lu tous les utres rtresD ils ont don t vids de l mmoireF yn dit qu9on vide le buerF
Pourquoi y a-t-il un point-virgule la n du while et pourquoi ne voit-on pas d'accolades ?
in fitD je fis une oule qui ne ontient ps d9instrutions @l seule instrutionD 9est le getchar entre les prenthsesAF ves oldes ne sont ps nessires vu que je n9i rien d9utre fire qu9un getcharF te mets don un pointEvirgule pour rempler les oldesF ge pointEvirgule signi(e ne rien fire hque pssge dns l oule F g9est un peu prtiulier je le reonnisD mis 9est une tehnique onntreD tehnique qu9utilisent les progrmmeurs pour fire des oules trs ourtes et trs simplesF hitesEvous que le while urit ussi pu tre rit omme ei X
1 2 3 4
sl n9y rien entre oldesD 9est volontireD vu qu9on n9 rien d9utre fireF w tehnique onsistnt pler juste un pointEvirgule est simplement plus ourte que elle des oldesF PSS
in(nD l fontion lireCaractere retourne le premier rtre qu9elle lu X l vrile caractereF En rsumD pour ruprer une lettre dns votre odeD vous n9utiliserez ps X
1
snf @ 4 7 4 D 8 mvettre A Y
mvettre a liregrtere @A Y
Dictionnaire de mots
hns un premier temps pour vos testsD je vis vous demnder de (xer le mot seret diretement dns votre odeF ous rirez don pr exemple X
1
hr moteret a 4 weyx 4 Y
elors ouiD ien srD le mot seret ser toujours le mme si on lisse omme D e qui n9est ps trs rigoloF te vous demnde de fire omme dns un premier temps pour ne ps mlnger les prolmesF in e'etD une fois que votre jeu de endu fontionner orretement @et seulement prtir de e momentElAD vous ttquerez l seonde phse X l rtion du ditionnire de motsF
Qu'est-ce que c'est, le dictionnaire de mots ?
g9est un (hier qui ontiendr de nomreux mots pour votre jeu de enduF sl doit y voir un mot pr ligneF ixemple X
wesyx fvi esyx vyryxi efisvvi swwifvi qyhsx xisqi iy
hque nouvelle prtieD votre progrmme devr ouvrir e (hier et prendre un des mots u hsrd dns l listeF qre ette tehniqueD vous urez un (hier prt que vous pourrez diter tnt que vous voudrez pour jouter des mots serets possiles pour le enduF PST
LES CONSIGNES
Vous aurez remarqu que depuis le dbut je fais exprs d'crire tous les mots du jeu en majuscules. En eet, dans le Pendu on ne fait pas la distinction entre les majuscules et les minuscules, le mieux est donc de se dire ds le dbut : tous mes mots seront en majuscules . vous de prvenir le joueur, dans le mode d'emploi du jeu par exemple, qu'il est cens entrer des lettres majuscules et non des minuscules. Par ailleurs, on fait exprs d'ignorer les accents pour simplier le jeu . Vous devrez donc crire vos mots dans le dictionnaire entirement en majuscules et sans accents.
2
ve prolme qui se poser rpidement vous ser de svoir omien il y de mots dns le ditionnireF in e'etD si vous voulez hoisir un mot u hsrdD il fudr tirer u sort un nomre entre H et D et vous ne svez ps priori omien de mots ontient votre (hierF our rsoudre le prolmeD il y deux solutionsF ous pouvez indiquer sur l premire ligne du (hier le nomre de mots qu9il ontient X
Q wesyx fvi esyx
gependnt ette tehnique est ennuyeuseD r il fudr reompter mnuellement le nomre de mots hque fois que vous en jouterez un F eussi je vous propose plutt de ompter utomtiquement le nomre de mots en lisnt une premire fois le (hier ve votre progrmmeF our svoir omien il y de motsD 9est simple X vous omptez le nomre de \n @retours l ligneA dns le (hierF ne fois que vous urez lu le (hier une premire fois pour ompter les \nD vous ferez un rewind pour revenir u dutF ous n9urez lors plus qu9 tirer un nomre u sort prmi le nomre de mots que vous vez omptsD puis vous rendre u mot que vous vez hoisi et le stoker dns une hne en mmoireF te vous lisse un peu r)hir tout elD je ne vis ps trop vous ider qund mmeD sinon ne serit plus un 3 hez que vous vez quis toutes les onnissnes qu9il fut dns les hpitres prdentsD vous tes don prfitement ples de rliser e jeuF v prendre plus ou moins de temps et 9est moins file qu9il n9y prtD mis en vous orgnisnt orretement @et en rnt su0smment de fontionsAD vous y rriverezF fon ourgeD et surtout X perEsEvErez 3
3
2. Si on doit commencer tester le , le , le , le . . . on n'a pas ni ! 3. Ou ajouter 1 ce nombre si vous tes malins plutt que de tout recompter, mais a reste quand mme une solution un peu bancale.
PSU
PSV
ykD jusqueEl tout le monde devrit suivreF xotre main v grer l pluprt du jeu et fire ppel quelquesEunes de nos fontions qund il en ur esoinF gommenons pr dlrer les vriles nessires X
5 1 2 3 4 5 6 7
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` type Fh b int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret a 4 weyx 4 Y GG g ' est le mot trouver int lettrerouvee T a { H }Y GG leu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e int oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A int i a H Y GG ne petite vrile pour prourir les tleux } return H Y
8 9
10
11
12 13 14
t9i volontirement rit une dlrtion de vrile pr ligne insi que plusieurs omE mentires pour que vous ompreniez l9intrt de hque vrileF in prtiqueD vous n9urez ps forment esoin de mettre tous es ommentires et vous pourrez grouper plusieurs dlrtions de vriles sur l mme ligneF te pense que l pluprt de es vriles semlent logiques X l vrile lettre stoke l lettre que l9utilisteur tpe hque foisD motSecret le mot trouverD coupsRestants le nomre de oupsD etF v vrile i est une petite vrile que j9utilise pour prourir mes tleux ve des forF ille n9est don ps extrmement importnte mis nessire si on veut fire nos oulesF in(nD l vrile lquelle il fllit penserD elle qui fit l di'reneD 9est mon tleu de oolens lettreTrouveeF ous remrquerez que je lui i donn pour tille le nomre de lettres du mot seret @TAF ge n9est ps un hsrd X hque se de e tleu de oolens reprsente une lettre du mot seretF einsiD l premire se reprsente l premire lettreD l seonde l seonde lettreD etF ves ses du tleu sont u dprt initilises HD e qui signi(e vettre non trouve F eu fur et mesure de l9vnement
5. Rassurez-vous, je n'ai pas pens de suite toutes ces variables, il y en avait un peu moins la premire fois que j'ai crit le code !
PSW
du jeuD e tleu ser modi(F our hque lettre du mot seret trouveD l se orrespondnte du tleu lettreTrouvee ser mise IF r exempleD si un moment du jeu j9i l90hge wBBxD 9est que mon tleu d9int les vleurs IHIIHI @I pour hque lettre qui t trouveAF sl est insi file de svoir qund on ggn X il su0t de vri(er si le tleu de oolens ne ontient que des IF in revnheD on perdu si le ompteur coupsRestants tome HF ssons l suite X
1
g9est un messge de ienvenueD il n9y rien de ien plpitntF in revnheD l oule priniple du jeu est plus intressnte X
1 2
ve jeu ontinue tnt qu9il reste des oups @coupsRestants > 0A et tnt qu9on n9 ps ggnF i on n9 plus de oups jouerD 9est qu9on perduF i on ggnD 9estF F F qu9on ggnF hns les deux sD il fut rrter le jeuD don rrter l oule du jeu qui redemnde hque fois une nouvelle lettreF gagne est une fontion qui nlyse le tleu lettreTrouveeF ille renvoie vri @IA si le joueur ggn @le tleu lettreTrouvee ne ontient que des IAD fux @HA si le joueur n9 ps enore ggnF te ne vous explique ps ii le fontionnement de ette fontion en dtilD on verr el plus trdF our le momentD vous vez juste esoin de svoir e que fit l fontionF v suite X
1 2 3 4
printf @ 4 n nsl vous reste 7 d oups jouer 4 D oupsestnts A Y printf @ 4 nuel est le mot seret c 4 A Y GB yn ffihe le mot seret en msqunt les lettres non trouv es ixemple X B e BB yx BG for @ i a H Y i ` T Y i CCA { if @ lettrerouvee i A GG i on trouv l lettre n i printf @ 4 7 4 D moteret i A Y GG yn l ' ffihe else printf @ 4 B 4 A Y GG inon D on ffihe une toile pour les lettres non trouv es }
5 6 7 8
9 10 11
12
yn 0he hque oup le nomre de oups restnts insi que le mot seret @msqu pr des B pour les lettres non trouvesAF v90hge du mot seret msqu pr des B se fit gre une oule forF yn nlyse hque lettre pour svoir si elle t trouve @if lettreTrouvee[i]AF i 9est le sD on 0he l lettreF inonD on 0he une B de remplement pour msquer l lettreF PTH
te fis ppel notre fontion lireCaractere()F gelleEi lit le premier rtre tpD le met en mjusule et vide le u'erD 9estEEdire qu9elle vide les utres rtres qui urient pu persister dns l mmoireF
1 2 3 4 5 6
GG i e n ' tit e l onne lettre if @3 reherhevettre @ lettre D moteret D lettrerouvee A A { oupsestnts E EY GG yn enl ve un oup u joueur } }
yn vri(e si l lettre entre se trouve dns motSecretF yn fit ppel pour el une fontion mison ppele rechercheLettreF xous verrons peu prs le ode de ette fontionF our le momentD tout e que vous vez esoin de svoirD 9est que ette fontion renvoie vri si l lettre se trouve dns le motD fux si elle ne s9y trouve psF won ifD vous l9urez remrquD ommene pr un point d9exlmtion ! qui signi(e non F v ondition se lit don i l lettre n9 ps t trouve F ue fitEon si l lettre n9 ps t trouve c yn diminue le nomre de oups restntsF
Notez que la fonction rechercheLettre met aussi jour le tableau de boolens lettreTrouvee. Elle met des 1 dans les cases des lettres qui ont t trouves.
v oule priniple du jeu s9rrte lF yn reommene don u dut de l oule et on vri(e s9il reste des oups jouer et si on n9 ps dj ggnF vorsqu9on sort de l oule priniple du jeuD il reste 0her si on ggn ou non vnt que le progrmme ne s9rrte X
1 2
3 4 5 6 7
if @ ggne @ lettrerouvee A A printf @ 4 n nqgne 3 ve mot seret etit ien X 7 s4 D moteret A Y else printf @ 4 n nerdu 3 ve mot seret etit X 7 s 4 D moteret A Y return H Y }
yn fit ppel l fontion gagne pour vri(er si on ggnF i 9est le sD lors on 0he le messge qgn 3 Y sinonD 9est qu9on n9vit plus de oups jouerD on t penduF PTI
int ggne @ int lettrerouvee A { int i a H Y int joueurqgne a I Y for @ i a H Y i ` T Y i CCA { if @ lettrerouvee i aa H A joueurqgne a H Y } } return joueurqgne Y
gette fontion prend le tleu de oolens lettreTrouvee pour prmtreF ille renE voie un oolen X vri si on ggnD fux si on perduF ve ode de ette fontion est plutt simpleD vous devriez tous le omprendreF yn prE ourt lettreTrouvee et on vri(e si xi des ses vut fux @HAF i une des lettres n9 ps enore t trouveD 9est qu9on perdu X on met lors le oolen joueurGagne fux @HAF inonD si toutes les lettres ont t trouvesD le oolen vut vri @IA et l fontion renverr don vri F
int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A { int i a H Y int onnevettre a H Y GG yn prourt moteret pour v rifier si l lettre propos e y est for @ i a H Y moteret i 3a ' H ' Y i CCA { if @ lettre aa moteret i A GG i l lettre y est { onnevettre a I Y GG yn m morise que ' tit une onne lettre lettrerouvee i a I Y GG yn met I l se du tleu de ool ens orrespondnt l lettre
7 8 9 10 11
12
PTP
13 14 15 16 17
} }
return onnevettre Y
yn prourt don l hne motSecret rtre pr rtreF hque foisD on vri(e si l lettre que le joueur propose est une lettre du motF i l lettre orrespondD lors on fit deux hoses X ! on hnge l vleur du oolen bonneLettre ID pour que l fontion retourne I r l lettre se trouvit e'etivement dns motSecret Y ! on met jour le tleu lettreTrouvee l position tuelle pour indiquer que ette lettre t trouveF v9vntge de ette tehniqueD 9est qu9insi on prourt tout le tleu @on ne s9rrte ps l premire lettre trouveAF gel nous permet de ien mettre jour le tleu lettreTrouveeD u s o une lettre serit prsente en plusieurs exemplires dns le mot seretD omme 9est le s pour les deux de weyxF
PTQ
iy
ne fois que j9uri termin de oder le progrmmeD je reviendri ien sr sur e ditionE nire et j9y jouteri videmment des tooonnes de mots tordus omme vyryxiD ou rllonge omme exsgyxssyxxivviwixF wis pour le momentD retournons nos instrutionsF
5 inlude 4 dio F h 4
La fonction piocherMot
gette fontion v prendre un prmtre X un pointeur sur l zone en mmoire o elle pourr rire le motF ge pointeur ser fourni pr le main()F v fontion renverr un int qui ser un oolen X I a tout s9est ien pssD H a il y eu une erreurF oii le dut de l fontion X
1 2 3
4 5
int pioherwot @ hr B motiohe A { psvi B dio a xvv Y GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a H D numwotghoisi a H D i a H Y int rterevu a H Y
te d(nis quelques vriles qui me seront indispenslesF gomme pour le main()D je n9i ps pens mettre toutes es vriles ds le dutD il y en ertines que j9i joutes pr l suite lorsque je me suis rendu ompte que j9en vis esoinF ves noms des vriles prlent d9euxEmmesF yn notre pointeur sur (hier dico dont on v se servir pour lire le (hier dico.txtD des vriles temporires qui vont
7. Du moins, j'en ai le pressentiment.
PTR
stoker les rtresD etF xotez que j9utilise ii un int pour stoker un rtre @caractereLuA r l fontion fgetc que je vis utiliser renvoie un intF sl est don prfrle de stoker le rsultt dns un intF ssons l suite X
1
dio a fopen @ 4 dio F txt 4 D 4 r 4 A Y GG yn ouvre le ditionnire en leture seule GG yn v rifie si on r ussi ouvrir le ditionnire if @ dio aa xvv A GG i on n ' e r ussi ouvrir le fihier { printf @ 4 nsmpossile de hrger le ditionnire de mots 4 A Y return H Y GG yn retourne H pour indiquer que l fontion hou GG l leture du return D l fontion s ' rr te imm ditement F }
2 3 4 5 6 7
te n9i ps grndEhose jouter iiF t9ouvre le (hier dico.txt en leture seule @"r"A et je vri(e si j9i russi en testnt si dico vut NULL ou nonF i dico vut NULLD le (hier n9 ps pu tre ouvert @(hier introuvle ou utilis pr un utre progrmmeAF hns e sD j90he une erreur et je fis un return 0F ourquoi un return l c in fitD l9instrution return ommnde l9rrt de l fontionF i le dio n9 ps pu tre ouvertD l fontion s9rrte l et l9ordinteur n9ir ps lire plus loinF yn retourne H pour indiquer u main que l fontion houF hns l suite de l fontionD on suppose don que le (hier ien t ouvertF
1 2 3 4 5 6 7
GG yn ompte le nomre de mots dns le fihier @ il suffit de ompter les entr es n do { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A nomrewots CCY } while @ rterevu 3a iyp A Y
vD on prourt tout le (hier oups de fgetc @rtre pr rtreAF yn ompte le nomre de \n @entresA qu9on dteteF hque fois qu9on tome sur un \nD on inrE mente l vrile nombreMotsF qre e out de odeD on otient dns nombreMots le nomre de mots dns le (hier F
8 1
siD je fis ppel une fontion de mon ru qui v gnrer un nomre ltoire entre I et nombreMots @le prmtre qu9on envoie l fontionAF g9est une fontion toute simple que j9i ple ussi dns dico.c @je vous l dtilleri tout l9heureAF frefD elle
8. Rappelez-vous que le chier contient un mot par ligne.
PTS
renvoie un nomre @orrespondnt un numro de ligne du (hierA u hsrd qu9on stoke dns numMotChoisiF
1 2 3 4 5 6 7 8
GG yn reommene lire le fihier depuis le d ut F yn s ' rr te lorsqu ' on est rriv u on mot rewind @ dio A Y while @ numwotghoisi b H A { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A numwotghoisi E EY }
wintennt qu9on le numro du mot qu9on veut pioherD on reprt u dut gre un ppel rewind()F yn prourt l enore le (hier rtre pr rtre en omptnt les \nF gette foisD on drmente l vrile numMotChoisiF i pr exemple on hoisi le mot numro SD hque entre l vrile v tre drmente de IF ille v don vloir SD puis RD QD PD IF F F et HF vorsque l vrile vut HD on sort du whileD l ondition numMotChoisi > 0 n9tnt plus remplieF ge out de odeD que vous devez imprtivement omprendreD vous montre don omE ment on prourt un (hier pour se pler l position voulueF ge n9est ps ien ompliquD mis e n9est ps non plus vident F essurezEvous don de ien omE prendre e que je fis lF wintenntD on devrit voir un urseur positionn juste devnt le mot seret qu9on hoisi de pioherF yn v le stoker dns motPioche @le prmtre que l fontion reoitA gre un simple fgets qui v lire le mot X
1 2 3 4 5 6
GB ve urseur du fihier est positionn u on endroit F yn n ' plus qu ' fire un fgets qui lir l ligne BG fgets @ motiohe D IHH D dio A Y GG yn vire le n l fin motiohe strlen @ motiohe A E I a ' H ' Y
yn demnde u fgets de ne ps lire plus de IHH rtres @9est l tille du tleu motPiocheD qu9on d(ni dns le mainAF x9ouliez ps que fgets lit toute une ligneD y ompris le \nF gomme on ne veut ps grder e \n dns le mot (nlD on le supprime en le remplnt pr un \0F gel ur pour e'et de ouper l hne juste vnt le \nF itF F F voil qui est fit 3 yn rit le mot seret dns l mmoire l9dresse de motPiocheF yn n9 plus qu9 fermer le (hierD retourner I pour que l fontion s9rrte et pour dire que tout s9est ien pss X
1 2 3 4
La fonction nombreAleatoire
g9est l fontion dont j9vis promis de vous prler tout l9heureF yn tire un nomre u hsrd et on le renvoie X
1 2 3 4 5
int nomreeletoire @ int nomrewx A { srnd @ time @ xvv A A Y return @ rnd @A 7 nomrewx A Y }
v premire ligne initilise le gnrteur de nomres ltoiresD omme on ppris le fire dns le premier lus ou woins F v seonde ligne prend un nomre u hsrd entre H et nombreMax et le renvoie F
9
Le chier dico.h
sl s9git juste des prototypes des fontionsF ous remrquerez qu9il y l protetion #ifndef que je vous vis demnd d9inlure dns tous vos (hiers .h @revoyez le hpitre sur le prproesseur u esoinAF
1 2 3 4 5 6 7
5 ifndef hiphsgy 5 define hiphsgy int pioherwot @ hr B motiohe A Y int nomreeletoire @ int nomrewx A Y 5 endif
Le chier dico.c
oii le (hier dico.c en entier X
1 2 3 4 5 6 7
GB teu du endu dio F EEEEEE ges fontions piohent u hsrd un mot dns un fihier ditionnire pour le jeu du endu BG
8 9
9. Notez que j'ai fait tout a en une ligne, c'est tout fait possible, bien que peut-tre parfois moins lisible.
PTU
5 inlude 4 dio F h 4 int pioherwot @ hr B motiohe A { psvi B dio a xvv Y GG ve pointeur de fihier qui v ontenir notre fihier int nomrewots a H D numwotghoisi a H D i a H Y int rterevu a H Y dio a fopen @ 4 dio F txt 4 D 4 r 4 A Y GG yn ouvre le ditionnire en leture seule GG yn v rifie si on r ussi ouvrir le ditionnire if @ dio aa xvv A GG i on n ' e r ussi ouvrir le fihier { printf @ 4 nsmpossile de hrger le ditionnire de mots 4AY return H Y GG yn retourne H pour indiquer que l fontion hou GG l leture du return D l fontion s ' rr te imm ditement F } GG yn ompte le nomre de mots dns le fihier @ il suffit de ompter les GG entr es n do { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A nomrewots CCY } while @ rterevu 3a iyp A Y numwotghoisi a nomreeletoire @ nomrewots A Y GG yn piohe un mot u hsrd GG yn reommene lire le fihier depuis le d ut F yn s ' rr te lorsqu ' on est rriv u on mot rewind @ dio A Y while @ numwotghoisi b H A { rterevu a fget @ dio A Y if @ rterevu aa ' n ' A numwotghoisi E EY
21 22 23
24 25 26
27 28
29
30
31 32 33
34 35 36 37 38 39 40 41 42
43 44
45 46 47 48 49 50
PTV
} GB ve urseur du fihier est positionn u on endroit F yn n ' plus qu ' fire un fgets qui lir l ligne BG fgets @ motiohe D IHH D dio A Y GG yn vire le n l fin motiohe strlen @ motiohe A E I a ' H ' Y flose @ dio A Y } return I Y GG out s ' est ien pss D on retourne I
int nomreeletoire @ int nomrewx A { srnd @ time @ xvv A A Y return @ rnd @A 7 nomrewx A Y }
our ommenerD les d(nitions de vriles vont un peu hngerF hjD on n9initilise plus l hne motSecretD on re juste un grnd tleu de char @IHH sesAF unt u tleu lettreTrouveeF F F s tille dpendr de l longueur du mot seret qu9on ur piohF gomme on ne onnt ps enore ette tilleD on re un simple pointeurF out l9heureD on fer un malloc et pointer e pointeur vers l zone mmoire qu9on ur lloueF gei est un exemple prfit de l9solue nessit de l9llotion dynmique X on ne onnt ps l tille du tleu vnt l ompiltionD on est don olig de rer un pointeur et de fire un mallocF te ne dois ps oulier de lirer l mmoire ensuite qund je n9en i plus esoinD d9o l prsene d9un free() l (n du mainF yn v ussi voir esoin d9une vrile tailleMot qui v stokerF F F l tille du motF in e'etD si vous regrdez le main() tel qu9il tit dns l premire prtieD on supposit que le mot fisit T rtres prtout @et 9tit vri r weyx omporte T lettresAF wis mintennt que le mot peut hnger de tilleD il v flloir tre ple de s9dpter PTW
tous les mots 3 oii don les d(nitions de vriles du main en version (nle X
1 2 3
4 5
int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret IHH a { H }Y GG ge ser le mot trouver int B lettrerouvee a xvv Y GG n tleu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e int oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A int i a H Y GG ne petite vrile pour prourir les tleux int tillewot a H Y
g9est priniplement le dut du main qui v hngerD don nlysonsEle de plus prs X
1 2
yn fit d9ord ppel piocherMot diretement dns le ifF piocherMot v pler dns motSecret le mot qu9elle ur piohF he plusD piocherMot v renvoyer un oolen pour nous dire si l fontion russi ou houF ve rle du if est d9nlyser e oolenF i n9 e mrh @le ! permet d9exprimer l ngtionAD lors on rrte tout @exit(0)AF
1
yn stoke l tille du motSecret dns tailleMot omme je vous l9i dit tout l9heureF
1
2 3
lettrerouvee a mllo @ tillewot B sizeof @ int AA Y GG yn lloue dynmiquement le tleu lettrerouvee @ dont on ne onnissit ps l tille u d prt A if @ lettrerouvee aa xvv A exit @ H A Y
wintennt on doit llouer l mmoire pour le tleu lettreTrouveeF yn lui donne l tille du mot @tailleMotAF yn vri(e ensuite si le pointeur n9est ps NULLF i 9est le sD 9est que l9llotion houF hns e sD on rrte immditement le progrmme @on fit ppel exit()AF i les lignes suivntes sont luesD 9est don que tout s9est ien pssF oil tous les prprtifs qu9il vous fllit fire iiF t9i d ensuite modi(er le reste du (hier main.c pour rempler tous les nomres T @l9nienne longueur de weyx qu9on vit (xeA pr l vrile tailleMotF r exemple X
1 2
PUH
ge ode met toutes les ses du tleu lettreTrouvee HD en s9rrtnt lorsqu9on prouru tailleMot sesF t9i d ussi remnier le prototype de l fontion gagne pour jouter l vrile tailleMotF ns elD l fontion n9urit ps su qund rrter s ouleF oii le (hier main.c (nl en entier X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
GB teu du endu min F EEEEEE pontions priniples de gestion du jeu BG 5 inlude 5 inlude 5 inlude 5 inlude ` stdio Fh b ` stdli Fh b ` type Fh b ` string Fh b
5 inlude 4 dio F h 4 int ggne @ int lettrerouvee D long tillewot A Y int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A Y hr liregrtere @A Y int min @ int rg D hr B rgv A { hr lettre a H Y GG toke l lettre propos e pr l ' utilisteur @ retour du snf A hr moteret IHH a { H }Y GG ge ser le mot trouver int B lettrerouvee a xvv Y GG n tleu de ool ens F ghque se orrespond une lettre du mot seret F H a lettre non trouv e D I a lettre trouv e long oupsestnts a IH Y GG gompteur de oups restnts @ H a mort A long i a H Y GG ne petite vrile pour prourir les tleux long tillewot a H Y printf @ 4 fienvenue dns le endu 3 n n 4 A Y if @3 pioherwot @ moteret A A exit @ H A Y tillewot a strlen @ moteret A Y lettrerouvee a mllo @ tillewot B sizeof @ int A AY GG yn lloue dynmiquement le tleu lettrerouvee @ dont on
19 20 21 22 23
24 25
26
27
28 29 30 31 32 33 34 35 36 37
PUI
38 39 40 41 42 43 44
45 46
47 48
49 50 51
52 53 54 55
56 57 58
59 60 61 62 63 64 65 66 67 68 69 70 71 72
73 74
if @ ggne @ lettrerouvee D tillewot A A printf @ 4 n nqgne 3 ve mot seret etit ien X 7 s 4 D moteret A Y else printf @ 4 n nerdu 3 ve mot seret etit X 7 s 4 D moteret A Y free @ lettrerouvee A Y GG yn li re l m moire llou e mnuellement @ pr mllo A
75 76
77
PUP
return H Y
hr liregrtere @A { hr rtere a H Y rtere a gethr @A Y GG yn lit le premier rt re rtere a toupper @ rtere AY GG yn met l lettre en mjusule si elle ne l ' est ps d j GG yn lit les utres rt res m moris s un un jusqu ' u n while @ gethr @A 3a ' n ' A Y return rtere Y GG yn retourne le premier rt re qu ' on lu
87 88
89 90 91
int ggne @ int lettrerouvee D long tillewot A { long i a H Y int joueurqgne a I Y for @ i a H Y i ` tillewot Y i CCA { if @ lettrerouvee i aa H A joueurqgne a H Y } } return joueurqgne Y
int reherhevettre @ hr lettre D hr moteret D int lettrerouvee A { long i a H Y int onnevettre a H Y GG yn prourt moteret pour v rifier si l lettre propos e y est for @ i a H Y moteret i 3a ' H ' Y i CCA { if @ lettre aa moteret i A GG i l lettre y est { onnevettre a I Y GG yn m morise que ' tit une onne lettre lettrerouvee i a I Y GG yn met I l se du tleu de ool ens orrespondnt l lettre tuelle
119
PUQ
} }
return onnevettre Y
Ides d'amlioration
Tlcharger le projet
our ommenerD je vous invite tlhrger le projet omplet du enduF lhrger le projet gode we X SVUSRS i vous tes sous vinux ou sous wD supprimez le (hier dico.txt et rerezEen unF ves (hiers sont enregistrs de mnire di'rente sous indows X don si vous utilisez le mienD vous risquez d9voir des ugsF x9ouliez ps qu9il fut qu9il y it une Entre prs hque mot du ditionnireF ensez en prtiulier mettre une Entre prs le dernier mot de l listeF gel v vous permettre de tester pr vousEmmes le fontionnement du projetD de proder des mliortions personnellesD etF fien entenduD le mieux serit que vous yez dj russi le endu pr vousEmmes et que vous n9yez mme ps esoin de voir mon projet pour voir omment j9i fit misF F F je suis rlisteD je sis que e d tre ssez dlit pour on nomre d9entre vousF ous trouverez dns e Fzip les (hiers .c et .h insi que le (hier .cbp du projetF g9est un projet fit sous gode: :floksF i vous utilisez un utre shiD ps de pniqueF ous rez un nouveu projet onsole et vous y joutez mnuellement les .c et .h que vous trouverez dns le FzipF ous trouverez ussi l9exutle @.exe indowsA insi qu9un ditionnire @dico.txtAF
Amliorez le Pendu !
wine de rienD le endu est dj ssez volu omme F yn un jeu qui lit un (hier de ditionnire et qui prend hque fois un mot u hsrdF oii qund mme quelques ides d9mliortion que je vous invite implmenterF ! etuellementD on ne vous propose de jouer qu9une foisF sl serit ien de pouvoir ouler nouveu l (n du main pour lancer une nouvelle partie si le joueur le dsireF PUR
IDES D'AMLIORATION
! ous pourriez rer un mode deux joueurs dns lequel le premier joueur entre un mot que le deuxime joueur doit devinerF ! ge n9est ps utile @don 9est indispensleA X pourquoi ne ps dessiner un bonhomme qui se fait pendre hque fois que l9on fit une erreur c renez ien le temps de omprendre e et mliorezEle u mximumF sl fut que vous soyez ples de refire e petit jeu de endu les yeux ferms 3 ellezD ourgeF
10
PUS
PUT
Chapitre
19
Dicult :
a saisie de texte est un des aspects les plus dlicats du langage C. Vous connaissez la fonction scanf, que vous avez vue au dbut du cours. Vous vous dites : quoi de plus simple et de plus naturel ? Eh bien gurez-vous que non, en fait, c'est tout sauf simple. Ceux qui vont utiliser votre programme sont des humains. Tout humain qui se respecte fait des erreurs et peut avoir des comportements inattendus. Si vous lui demandez : Quel ge avez-vous ? , qu'est-ce qui vous garantit qu'il ne va pas vous rpondre Je m'appelle Franois je vais bien merci ? Le but de ce chapitre est de vous faire dcouvrir les problmes que l'on peut rencontrer en utilisant la fonction scanf et de vous montrer une alternative plus sre avec la fonction fgets.
PUU
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr nom PH a { H }Y printf @ 4 uel est votre nom c 4 A Y snf @ 4 7 s 4 D nom A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y
uel est votre nom c ten hupont eh 3 ous vous ppelez don ten 3
re que l fontion scanf s9rrte si elle tome u ours de s leture sur un espeD une tultion ou une entreF ous ne pouvez don ps ruprer l hne si elleEi omporte un espeF PUV
En fait, le mot "Dupont" se trouve toujours en mmoire, dans ce qu'on appelle le buer . La prochaine fois qu'on appellera scanf, la fonction lira toute seule le mot Dupont qui tait rest en attente dans la mmoire.
yn peut utiliser l fontion scanf de telle sorte qu9elle lise les espesD mis 9est ssez ompliquF i vous voulez pprendre ien vous servir de scanfD on peut trouver des ours trs dtills sur le we F epprofondir l fontion
1
scanf gode we
X RVTRRH
hr nom S a { H }Y
ous voyez que j9i llou S ses pour mon tleu de char ppel nomF gel signi(e qu9il y l ple d9rire R rtresD le dernier tnt toujours rserv u rtre de (n de hne \0F evoyez solument le ours sur les hnes de rtres @pge IUIA si vous vez ouli tout elF v (gF IWFI vous prsente l9espe qui t llou pour nomF
ue se psseEtEil si vous rivez plus de rtres qu9il n9y d9espe prvu pour les stoker c
uel est votre nom c trie eh 3 ous vous ppelez don trie 3
e prioriD il ne s9est rien pssF it pourtntD e que vous voyez l est un vritle uhemr de progrmmeur 3 yn dit qu9on vient de fire un dpassement de mmoireD ussi ppel buer overow en nglisF gomme vous le voyez sur l (gF IWFPD on vit llou S ses pour stoker le nomD mis en fit il en fllit VF u9 fit l fontion scanf c ille ontinu rire l suite en
1. Attention, c'est assez dicile.
PUW
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
ns entrer dns les dtilsD r on pourrit en prler pendnt SH pges sns voir (ni D il fut svoir que si le progrmme ne ontrle ps e genre de sD l9utilisteur peut rire e qu9il veut l suite en mmoireF in prtiulierD il peut insrer du ode en mmoire et fire en sorte qu9il soit exut pr le progrmmeF g9est l9attaque par buer overowD une ttque de pirte lre mis di0ile rliserF ve ut de e hpitre ser de suriser l sisie de nos donnesD en emphnt l9utilisE teur de fire dorder et de provoquer un u'er over)owF fien srD on pourrit llouer un trs grnd tleu @IH HHH rtresAD mis ne hngerit rien u prolme X une personne qui veut fire dpsser de l mmoire n9ur qu9 envoyer plus de IH HHH rtres et son ttque mrher tout ussi ienF eussi te que el puisse prtreD tous les progrmmeurs n9ont ps toujours fit ttention elF 9ils vient fit les hoses proprement depuis le dutD une onne prtie des filles de surit dont on entend prler enore ujourd9hui ne serit jmis pprue 3
2
2. Si l'attaque par buer overow vous intresse, vous pouvez lire l'article Dpassement de tampon de Wikipdia (code web : 251507). Attention c'est quand mme assez compliqu.
PVH
La fonction fgets
ve prototype de l fontion fgetsD situ dns stdio.hD est le suivnt X
1
sl est importnt de ien omprendre e prototypeF ves prmtres sont les suivntsF ! str X un pointeur vers un tleu llou en mmoire o l fontion v pouvoir rire le texte entr pr l9utilisteurF ! num X l tille du tleu str envoy en premier prmtreF xotez que si vous vez llou un tleu de IH charD fgets lir W rtres u mximum @il rserve toujours un rtre d9espe pour pouvoir rire le H de (n de hneAF ! stream X un pointeur sur le (hier lireF hns notre sD le (hier lire est l9entre stndrdD 9estEEdire le lvierF our demnder lire l9entre stndrdD on enverr le pointeur stdinD qui est utomtiquement d(ni dns les heders de l iliothque stndrd du g pour reprsenter le lvierF outefoisD il est ussi possile d9utiliser fgets pour lire des (hiersD omme on pu le voir dns le hpitre sur les (hiersF v fontion fgets retourne le mme pointeur que str si l fontion s9est droule sns erreurD ou NULL s9il y eu une erreurF sl su0t don de tester si l fontion renvoy NULL pour svoir s9il y eu une erreurF estons 3
1 2 3 4 5 6 7 8 9
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y fgets @ nom D IH D stdin A Y
PVI
uel est votre nom c wteo eh 3 ous vous ppelez don wteo 3
fontionne trs ienD un dtil prs X qund vous pressez intre D fgets onserve le \n orrespondnt l9ppui sur l touhe intre F gel se voit dns l onsole r il y un sut l ligne prs wteo dns mon exempleF yn ne peut rien fire pour empher fgets d9rire le rtre \nD l fontion est fite omme F in revnheD rien ne nous interdit de rer notre propre fontion de sisie qui v ppeler fgets et supprimer utomtiquement hque fois les \n 3
v fontion lire v ppeler fgets etD si tout s9est ien pssD elle v reherher le rtre \n l9ide de l fontion strchr que vous devriez dj onntreF i un \n est trouvD elle le remple pr un \0 @(n de hneA pour viter de onserver une intre F oii le odeD omment ps ps X
1 2 3 4 5 6 7 8 9 10
5 inlude ` stdio Fh b 5 inlude ` stdli Fh b 5 inlude ` string Fh b GG enser inlure string F h pour strhr @A int lire @ hr B hine D int longueur A { hr B positionintree a xvv Y GG yn lit le texte sisi u lvier if @ fgets @ hine D longueur D stdin A 3a xvv A erreur de sisie c { GG s d '
11
PVP
13
14 15
16 17
18 19 20 21 22 23
} else { } }
positionintree a strhr @ hine D ' n ' A Y GG yn reherhe l ' 4 intr e 4 if @ positionintree 3a xvv A GG i on trouv le retour l ligne { B positionintree a ' H ' Y GG yn remple e rt re pr H } return I Y GG yn renvoie I si l fontion s ' est d roul e sns erreur
gopier e ode gode we X SIWQIV ous noterez que je me permets d9ppeler l fontion fgets diretement dns un ifF m9vite d9voir ruprer l vleur de fgets dns un pointeur juste pour tester si eluiEi est NULL ou nonF prtir du premier ifD je sis si fgets s9est ien droule ou s9il y eu un prolme @l9utilisteur rentr plus de rtres qu9il n9tit utorisAF i tout s9est ien pssD je peux lors prtir l reherhe du \n ve strchr et rempler et \n pr un \0 @(gF IWFRAF
ge shm montre que l hne rite pr fgets tit Mateo\n\0 F xous vons rempl le \n pr un \0D e qui donn u (nl X Mateo\0\0 F ge n9est ps grve d9voir deux \0 d90leF v9ordinteur s9rrte u premier \0 qu9il renontre et onsidre que l hne de rtres s9rrte lF ve rsultt c ih ien mrheF
1 2 3 4 5
int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y
PVQ
uel est votre nom c wteo eh 3 ous vous ppelez don wteo 3
Vider le buer
xous ne sommes ps enore u out de nos ennuisF xous n9vons ps tudi e qui se pssit si l9utilisteur tentit de mettre plus de rtres qu9il n9y vit de ple 3
uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3
v fontion fgets tnt suriseD elle s9est rrte de lire u out du We rtre r nous vions llou un tleu de IH char @il ne fut ps oulier le rtre de (n de hne \0 qui oupe l IHe positionAF ve prolmeD 9est que le reste de l hne qui n9 ps pu tre luD svoir rd elert Ier D n9 ps dispru 3 sl est toujours dns le buerF ve u'er est une sorte de zone mmoire qui reoit diretement l9entre lvier et qui sert d9intermdiire entre le lvier et votre tleu de stokgeF in gD on dispose d9un pointeur vers le u'erD 9est e fmeux stdin dont je vous prlis un peu plus ttF te rois qu9un petit shm ne ser ps de refus pour mettre les ides u lir @(gF IWFSAF vorsque l9utilisteur tpe du texte u lvierD le systme d9exploittion @indowsD pr exempleA opie diretement le texte tp dns le u'er stdinF ge u'er est l pour reevoir temporirement l9entre du lvierF ve rle de l fontion fgets est justement d9extrire du u'er les rtres qui s9y trouvent et de les opier dns l zone mmoire que vous lui indiquez @votre tleu chaineAF eprs voir e'etu son trvil de opieD fgets enlve du u'er tout e qu9elle pu opierF i tout s9est ien pssD fgets don pu opier tout le u'er dns votre hneD et insi le u'er se retrouve vide l (n de l9exution de l fontionF wis si l9utilisteur entre euoup de rtresD et que l fontion fgets ne peut opier qu9une prtie d9entre eux @pre que vous vez llou un tleu de IH char seulementAD seuls les rtres lus seront supprims du u'erF ous eux qui n9uront ps t lus y resteront 3 estons ve une longue hne X
1 2 3
PVR
printf @ 4 uel est votre nom c 4 A Y lire @ nom D IH A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y } return H Y
uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3
v fontion fgets n9 pu opier que les W premiers rtres omme prvuF ve proE lmeD 9est que les utres se trouvent toujours dns le u'er @(gF IWFTA 3 gel signi(e que si vous fites un utre fgets ensuiteD eluiEi v ller ruprer e qui tit rest en mmoire dns le u'er 3 estons e ode X
1 2 3 4 5 6 7 8
int min @ int rg D hr B rgv A { hr nom IH Y printf @ 4 uel est votre nom c 4 A Y lire @ nom D IH A Y printf @ 4 eh 3 ous vous ppelez don 7 s 3 n n 4 D nom A Y lire @ nom D IH A Y
PVS
xous ppelons deux fois l fontion lireF ourtntD vous llez voir qu9on ne vous lisse ps tper deux fois votre nom X en e'etD l fontion fgets ne demnde ps l9utilisteur de tper du texte l seonde fois r elle trouve du texte ruprer dns le u'er 3
uel est votre nom c ten idourd elert I er eh 3 ous vous ppelez don ten idou 3 eh 3 ous vous ppelez don rd eler 3
i l9utilisteur tpe trop de rtresD l fontion fgets nous protge ontre le dorE dement de mmoireD mis il reste toujours des tres du texte en trop dns le u'erF sl fut vider le u'erF yn v don mliorer notre petite fontion lire et ppeler " si esoin est " une sousEfontion viderBuffer pour fire en sorte que le u'er soit vid si on rentr trop de rtres X
1 2 3 4 5
PVT
a gethr @A Y
int lire @ hr B hine D int longueur A { hr B positionintree a xvv Y if @ fgets @ hine D longueur D stdin A 3a xvv A { positionintree a strhr @ hine D ' n ' A Y if @ positionintree 3a xvv A { B positionintree a ' H ' Y } else { viderfuffer @A Y } return I Y } else { viderfuffer @A Y return H Y }
gopier e ode gode we X RTVWTU v fontion lire ppelle viderBuffer dns deux s X ! si l hne tit trop longue @on le sit pre qu9on n9 ps trouv de rtre \n dns l hne opieA Y ! s9il y eu une erreur @peu importe lquelleAD il fut vider l ussi le u'er pr surit pour qu9il n9y it plus rienF v fontion viderBuffer est ourte mis denseF ille lit dns le u'er rtre pr rtre gre getcharF gette fontion renvoie un int F yn se ontente de ruprer e int dns l vrile temporire cF yn oule tnt qu9on n9 ps rupr le rtre \n ou le symole EOF @(n de (hierAD qui signi(ent tous deux vous tes rriv l (n du u'er F yn s9rrte don de ouler ds que l9on tome sur l9un de es deux rtresF g9est un peu ompliqu u premier ord et ssez tehniqueD mis fit son trE vilF x9hsitez ps relire es explitions plusieurs fois si nessire pour omprendre omment fontionneF
3
PVU
v fontion lit l hne de rtres que vous lui envoyez @startA et essie de l onvertir en long en utilisnt l base indique @gnrlementD on trville en se IH r on utilise IH hi'res di'rents de H WD don vous mettrez IHAF ille retourne le nomre qu9elle russi lireF unt u pointeur de pointeur endD l fontion s9en sert pour renvoyer l position du premier rtre qu9elle lu et qui n9tit ps un nomreF yn ne s9en servir psD on peut don lui envoyer NULL pour lui fire omprendre qu9on ne veut rien ruprerF v hne doit ommener pr un nomreD tout le reste est ignorF ille peut tre prde d9espesF uelques exemples d9utilistion pour ien omprendre le prinipe X
1 2 3 4 5 6 7 8
long i Y i i i i i i a a a a a a strtol @ 4 IRV 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV F PIS 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV F PIS 4 D xvv D IH AY GG i a IRV strtol @ 4 IRV C QR 4 D xvv D IH A Y GG i a IRV strtol @ 4 IRV feuilles mortes 4 D xvv D IH A Y GG i a IRV strtol @ 4 sl y IRV feuilles mortes 4 D xvv D IH A Y GG i a H @ erreur X l h ne ne ommene ps pr un nomre A
outes les hnes qui ommenent pr un nomre @ou ventuellement pr des espes suivis d9un nomreA seront onverties en long jusqu9 l premire lettre ou u premier rtre invlide @.D +D etFAF v dernire hne de l liste ne ommennt ps pr un nomreD elle ne peut ps tre onvertieF v fontion strtol renverr don HF yn peut rer une fontion lireLong qui v ppeler notre premire fontion lire @qui lit du texteA et ensuite onvertir le texte sisi en nomre X
1 2 3 4
PVV
8 9 10 11 12 13 14 15
if @ lire @ nomreexte D IHH A A { GG i leture du texte ok D onvertir le nomre en long et le retourner return strtol @ nomreexte D xvv D IH A Y } else { GG i prol me de leture D renvoyer H return H Y }
gopier e ode gode we X PPHVHW ous pouvez tester dns un main trs simple X
1 2 3 4 5 6 7 8 9 10
int min @ int rg D hr B rgv A { long ge a H Y printf @ 4 uel est votre ge c 4 A Y ge a lirevong @A Y printf @ 4 eh 3 ous vez don 7 d ns 3 n n 4 D ge A Y } return H Y
strtod
v fontion strtod est identique strtolD l di'rene prs qu9elle essie de lire un nomre diml et renvoie un double X
1
ous noterez que le troisime prmtre base dispru iiD mis il y toujours le pointeur de pointeur end qui ne nous sert rienF gontrirement strtolD l fontion prend ette fois en ompte le point dimlF ettentionD en revnhe X elle ne onnt ps l virgule F vous de jouer 3 rivez l fontion lireDoubleF ous ne devriez voir uun ml le fireD 9est extement omme lireLong prt que ette foisD on ppelle strtod et on retourne un doubleF
4
PVW
issyez ensuite de modi(er votre fontion lireDouble pour qu9elle epte ussi le symole virgule omme sprteur dimlF v tehnique est simple X remplez l virgule pr un point dns l hne de texte lue @gre l fontion de reherhe strchrAD puis envoyez l hne modi(e strtodF
En rsum
! v fontion scanfD ien qu9en pprene simple d9utilistionD est en fit trs omplexe et nous oppose ertines limitesF yn ne peut psD pr exempleD rire plusieurs mots l fois filementF ! n buer overow survient lorsqu9on dpsse l9espe rserv en mmoireD pr exemple si l9utilisteur entre IH rtres lors qu9on n9vit rserv que S ses en mmoireF ! v9idl est de fire ppel l fontion fgets pour ruprer du texte sisi pr l9utilisteurF ! sl fut en revnhe viter tout prix d9utiliser l fontion gets qui n9o're ps de protetion ontre le u'er over)owF ! ous pouvez rire votre propre fontion de sisie du texte qui fit ppel fgets omme on l9 fit (n d9mliorer son fontionnementF
PWH
Troisime partie
Cration de jeux 2D en SDL
PWI
Chapitre
20
Dicult :
Installation de la SDL
partir de maintenant, ni la thorie : nous allons enn passer au concret ! Dans cette nouvelle et importante partie, nous allons nous faire plaisir et pratiquer grce une bibliothque que l'on appelle la SDL. Vous avez dj dcouvert la plupart des fonctionnalits du langage C, bien qu'il y ait toujours des petits dtails complexes et croustillants dcouvrir. Ce livre pourrait donc s'arrter l en annonant rement : C'est bon, vous avez appris programmer en C ! . Pourtant, quand on dbute, on n'a en gnral pas le sentiment de savoir programmer tant qu'on n'est pas sorti de la console. La SDL est une bibliothque particulirement utilise pour crer des jeux en 2D. Nous allons dans ce premier chapitre en apprendre plus sur cette bibliothque et dcouvrir comment l'installer.
PWQ
yn dit que l hv est une iliothque tiere F sl fut svoir qu9il existe deux types de iliothquesF ! La bibliothque standard X 9est l iliothque de se qui fontionne sur tous les y @d9o le mot stndrd A et qui permet de fire des hoses trs siques omme des printfF ille t utomtiquement instlle lorsque vous vez tlhrg votre shi et votre ompilteurF eu long des prties s et ssD nous vons uniquement utilis l iliothque stndrd @stdlib.hD stdio.hD string.hD time.hF F FAF ! Les bibliothques tierces X e sont des iliothques qui ne sont ps instlles pr dfutF ous devez les tlhrger sur snternet et les instller sur votre ordinE teurF gontrirement l iliothque stndrdD qui est reltivement simple et qui ontient ssez peu de fontionsD il existe des milliers de iliothques tieres rites pr d9utres progrmmeursF gertines sont onnesD d9utres moinsD ertines sont pyntesD d9utres grtuitesD etF l9idl tnt de trouver des iliothques de onne qulit et grtuites l fois 3 te ne peux ps fire un ours pour toutes les iliothques tieres qui existentF wme en y pssnt toute m vie PRh G PRD je ne pourris ps 3 t9i don fit le hoix de vous prsenter une et une seule iliothque rite en g et don utilisle pr des progrmmeurs en lngge g tels que vousF gette iliothque pour nom SDLF ourquoi iEje hoisi ette iliothque plutt qu9une utre c ue permetEelle de fire c eutnt de questions uxquelles je vis omE mener pr rpondreF
1
1. Nous n'avons pas tudi la bibliothque standard dans son intgralit mais nous en avons vu un assez gros morceau. Si vous voulez tout savoir sur la bibliothque standard, faites une recherche sur Google, par exemple, en tapant C standard library , et vous aurez la liste des prototypes ainsi qu'une brve explication de chacune des fonctions. 2. Enn, si vous aimez la console on peut continuer longtemps, si vous voulez. . . Non ? Ah bon, tiens c'est curieux !
PWR
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.
PWS
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
PWT
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 PWU
sl m9est impossile de fire une liste omplteD l seule limite ii tnt l9imgintionF t9i d9illeurs vu un des leteurs de e ours rliser un roisement os entre un sseE riques et un etrisF edesendons sur erre et reprenons le (l de e oursF xous llons mintennt instller l hv sur notre ordinteur vnt d9ller plus loinF
Tlchargement de la SDL
ve site de l hv @www.libsdl.orgA devrit ientt devenir inontournle pour vousF vEsD vous trouverez tout e dont vous vez esoinD en prtiulier l iliothque elleEmme tlhrger insi que s doumenttionF ite de l hv gode we X RVHUPR ur le site de l hvD rendezEvous dns le menu guheD setion DownloadF lhrgez l version de l hv l plus rente que vous voyez F v pge de tlhrgement est spre en plusieurs prtiesF ! Source code X vous pouvez tlhrger le ode soure de l hvF gomme je vous l9i ditD le ode soure ne nous intresse psF te sis que vous tes urieux et que vous voudriez svoir omment 9est fit l9intrieurD mis tuellement ne vous pporter rienF ireD vous emrouiller et e n9est ps le utF ! Runtime libraries X e sont les (hiers que vous urez esoin de distriuer en mme temps que votre exutle lorsque vous donnerez votre progrmme d9utres personnesF ous indowsD il s9git tout simplement d9un (hier hvFdllF geluiEi devr se trouver X ! soit dns le mme dossier que l9exutle @e que je reommnde A Y ! soit dns le dossier c:\WindowsF ! Development libraries X e sont les (hiers .a @ou .lib sous isulA et .h vous permettnt de rer des progrmmes hvF ges (hiers ne sont nessires que pour vousD le progrmmeurF ous n9urez don ps les distriuer ve votre progrmme une fois qu9il ser (niF i vous tes sous indowsD on vous propose trois versions dpendnt de votre ompilteur X ! gT X pour eux qui utilisent isul tudio pynt dns une vieille version @e qui peu de hnes de vous onernerA Y vous y trouverez des (hiers .lib Y ! gV X pour eux qui utilisent isul tudio PHHS ixpress ou ultrieur Y vous y trouverez des (hiers Fli Y ! mingwQP X pour eux qui utilisent gode: :floks @il y ur don des (hiers .aAF v prtiulritD 9est que les hevelopment lirries ontiennent tout e qu9il fut X
7 8
7. SDL 1.2 au moment o j'cris ces lignes. 8. L'idal est de toujours donner la DLL avec votre excutable et de la laisser dans le mme dossier. Si vous placez la DLL dans le dossier de Windows, vous n'aurez plus besoin de joindre une DLL dans chaque dossier contenant un programme SDL. Toutefois, cela peut poser des problmes de conits de version si vous crasez une DLL plus rcente.
PWV
les .h et .a @ou .libA ien srD mis ussi l SDL.dll distriuer ve votre pplition insi que l doumenttion de l hv 3 frefD tout e que vous vez fire u (nl est de tlhrger les hevelopment lirries F out e dont vous vez esoin s9y trouveF
Ne vous trompez pas de lien ! Prenez bien la SDL dans la section Development libraries et non le code source de la section Source code ! Qu'est-ce que la documentation ?
ne doumenttionD 9est l liste omplte des fontions d9une iliothqueF outes les doumenttions sont rites en nglis @ouiD mme les iliothques rites pr des prnis ont leur doumenttion en nglisAF oil une rison de plus pour progresser dns l lngue de hkespere 3 v doumenttion n9est ps un oursD elle est en gnrl ssez ustreF v9vntge pr rpport un oursD 9est qu9elle est omplteF ille ontient l liste de toutes les fontionsD 9est don ve rfrene du progrmmeurF fien souventD vous renontrerez des iliothques pour lesquelles il n9y ps de oursF ous urez uniquement l do9 omme on l9ppelleD et vous devrez tre ples de vous drouiller ve seulement @mme si prfois 9est un peu dur de dmrrer sns ideAF n vri on progrmmeur peut don douvrir le fontionnement d9une iliothque uniquement en lisnt s do9F e prioriD vous n9urez ps esoin de l do9 de l hv de suite r je vis moiEmme vous expliquer omment elle fontionneF outefoisD 9est omme pour l iliothque stndrd X je ne pourri ps vous prler de toutes les fontionsF ous urez don erE tinement esoin de lire l do9 plus trdF v doumenttion se trouve dj dns le pkge hevelopment lirries D mis si vous le voulez vous pouvez l tlhrger prt en vous rendnt dns le menu Documentation G DownloadableF te vous reommnde de pler les (hiers rwv de l doumenttion dns un dossier spil @intitul pr exemple Doc SDLA et de fire un rouri vers le sommire index.htmlF ve ut est que vous puissiez der rpideE ment l doumenttion lorsque vous en vez esoinF
in fitD le mot instller n9est peutEtre ps elui qui onvient le mieuxF xous n9llons rien instller du tout X nous voulons simplement rriver rer un nouveu projet de type hv ve notre shiF yrD selon l9shi que vous utilisez l mnipultion ser un peu di'renteF te vis prsenter l mnipultion pour hun des shi que je vous i prsents u dut du ours pour que tout le monde puisse suivreF te vis mintennt vous montrer omment rer un projet hv sous hun de es trois shiF
yuvrez le (hier ompress de hevelopment virries que vous vez tlhrgF ge (hier est un .zip pour isul et un .tar.gz pour mingwQP @il vous fudr un logiiel omme inrr ou UEip pour dompresser le .tar.gzAF ve (hier ompress ontient plusieurs sousEdossiersF geux qui nous intressent sont les suivnts X ! bin X ontient l .dll de l hv Y ! docs X ontient l doumenttion de l hv Y ! include X ontient les .h Y ! lib X ontient les .a @ou .lib pour isulAF ous devez extrire tous es (hiers et dossiers quelque prt sur votre disque durF ous pouvez pr exemple les pler dns le dossier de gode: :floksD dns un sousEdossier SDL @(gF PHFQAF hns mon sD l hv ser instlle dns le dossier X etenez ien le nom du dossier dns lequel vous l9vez instlleD vous llez en voir esoin pour on(gurer gode: :floksF wintenntD il v flloir fire une petite mnipultion pour simpli(er l suiteF ellez dns le sousEdossier include/SDL F ous devriez y voir de nomreux petits (hiers .hF gopiezEles dns le dossier prentD 9estEEdire dns X
9
C:\Program Files\CodeBlocks\SDL-1.2.13
C:\Program Files\CodeBlocks\SDL-1.2.13\include
yuvrez mintennt gode: :floks et demndez rer un nouveu projetF eu lieu de rer un projet Console Application omme vous viez l9hitude de fireD vous llez demnder rer un projet de type SDL projectF
9. Dans mon cas, il se trouve dans C:\Program Files\CodeBlocks\SDL-1.2.13\include\SDL.
QHH
v premire fentre de l9ssistnt qui pprt ne sert rienD liquez sur NextF yn vous demnde ensuite le nom de votre projet et le dossier dns lequel il doit tre plD omme vous l9vez toujours fit @(gF PHFRAF ient ensuite l prtie o vous devez indiquer o se trouve instlle l hv @(gF PHFSAF gliquez sur le outon ... droiteF ne nouvelle fentre un peu omplexe s9ouvre @(gF PHFTAF ous devez simplement remplir le hmp nomm baseF sndiquez le dossier o vous vez dompress l hvF hns mon sD 9est X
C:\Program Files\CodeBlocks\SDL-1.2.13
gliquez sur CloseF ne nouvelle fentre pprtF g9est une fentreEpige @dont je n9i toujours ps sisi l9intrtAF ille vous demnde un dossierF gliquez sur Annuler pour ne rien fireF gliquez ensuite sur Next dns l9ssistntD puis hoisissez de ompiler en mode Release ou Debug @peu importeA et en(nD hoisissez FinishF gode: :floks v rer un petit projet hv de test omprennt un main.c et un (hier .bmpF evnt d9essyer de le ompilerD opiez l hvv de l hv dns le dossier de votre projetF issyez ensuite de ompiler X une fentre ve une imge devrit s90herF frvoD fontionne 3
10
QHI
QHP
ous pouvez supprimer le .bmp du progrmmeD on n9en ur ps esoinF unt u (hier main.cD il est un peu longD on ne v ps dmrrer ve F upprimez tout son ontenu et remplezEle pr X
1 2 3 4 5 6 7 8 9
5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { } return H Y
gopier e ode gode we X SUVWQH g9est en fit un ode de se trs similire eux que l9on onnt @un include de stdlibD un utre de stdioD un mainF F FAF v seule hose qui hngeD 9est le include d9un (hier SDL.hF g9est le (hier .h de se de l hv qui se hrger d9inlure tous QHQ
ur le site de l hvD tlhrgez l dernire version de l hvF hns l setion heE velopment virries D prenez l version pour isul gCC PHHS ervie k IF yuvrez le (hier zipF sl ontient l do9 @dossier docsAD les .h @dossier includeAD et les .lib @dossier libA qui sont l9quivlent des .a pour le ompilteur de isulF ous trouverez ussi le (hier SDL.dll dns e dossier libF ! gopiez SDL.dll dns le dossier de votre projetF ! gopiez les .lib dns le dossier lib de isul gCCF r exemple hez moi il s9git du dossier X C:\Program Files\Microsoft Visual Studio 8\VC\libF ! gopiez les .h dns le dossier includes de isul gCCF grez un dossier SDL dns e dossier includes pour regrouper les .h de l SDL entre euxF ghez moiD je mets don les .h dns X C:\Program Files\Microsoft Visual Studio 8\VC\include\SDLF
2/ Cration d'un nouveau projet SDL
ous isul gCCD rez un nouveu projet de type Application console Win32F eppelez votre projet testsdl pr exempleF gliquez sur yuF n ssistnt v s9ouvrirF ellez dns Paramtres de l'application et vri(ez que Projet vide est oh @(gF PHFUAF ve projet est lors rF sl est videF ejoutezEy un nouveu (hier en fisnt un li droit sur Fichiers sourcesD Ajouter G Nouvel lment @(gF PHFVAF hns l fentre qui s9ouvreD demndez rer un nouveu (hier de type Fichier C++ (.cpp) que vous ppellerez main.cF in utilisnt l9extension .c dns le nom du (hierD isul rer un (hier .c et non un (hier .cppF rivez @ou opiezEollezA le ode de se mentionn prdemment dns votre nouveu (hier videF
3/ Conguration du projet SDL sous Visual C++
v on(gurtion du projet est un peu plus dlite que pour gode: :floksD mis elle reste huminement fisleF ellez dns les proprits de votre projet X Projet G Proprits de testsdlF ! hns l setion C / C++ => Gnration de codeD mettez le hmp Bibliothque runtime DLL multithread (/MD)F ! hns l setion C/C++ => AvancD sletionnez Compilation sous et optez pour l vleur Compiler comme code C (/TC) @sinon isul vous ompiler votre projet omme tnt du gCCAF QHR
vide
QHS
! hns l setion diteur de liens => EntreD modi(ez l vleur de Dpendances supplmentaires pour y jouter SDL.lib SDLmain.libF ! hns l setion diteur de liens => SystmeD modi(ez l vleur de Sous-systme et mettezEl Windows @(gF PHFWAF
lidez ensuite vos modi(tions en liqunt sur OK et enregistrez le toutF ous pouvez mintennt ompiler en llnt dns le menu Gnrer / Gnrer la solutionF endezEvous dns le dossier de votre projet pour y trouver votre exutle @il ser peutEtre dns un sousEdossier DebugAF x9ouliez ps que le (hier SDL.dll doit se trouver dns le mme dossier que l9exutleF houleEliquez sur votre .exe X si tout v ienD il ne devrit rien se psserF inonD s9il y une erreur 9est prolement que le (hier SDL.dll ne se trouve ps dns le mme dossierF
soit owergF
ne fois le (hier tlhrgD montezEle @douleEliquez dessusA Y il devrit lors s9ouvrir tout seulF hns e dossierD vous trouverez un dossier SDL.frameworkF gopiezEle et ollezE le dns le dossier /Library/Frameworks @en frnis /Bibliothque/FrameworksAF y estD notre iliothque est instlle 3 ous trouverez un utre dossier qui se nomme devel-lite Y grdezEle ouvertD nous nous en servirons pr l suiteF wintenntD rez un nouveu projet goo epplitionD puis liquez sur NextF hns QHU
pr exempleA et dns Company IdentifierD mettez e que vous voulez @votre pseudo pr exempleAF vissez le reste tel quel puis liquez sur NextF ghoisissez o vous souhitez mettre votre projetF n dossier ser rD don ps esoin d9en rer un et d9y pler votre projetF ne fois votre projet rD vous pouvez supprimer tous les (hiers qui ne nous serviront ps X AppDelegate.hD AppDelegate.mD MainMenu.xibD InfoPlist.stringsD main.m et Credits.rtf @(gure PHFIPAF
letionnez votre projet dns l9roresene de guhe @Install SDL sur l (gure PHFIPAF hns l Pe roreseneD sletionnez le nom de votre projet sous PROJECT @et ps TARGETSA @(gure PHFIQAF
ous pouvez ventuellement hnger l lolistion de English FrenchF letionnez liquez sur le - pour le supprimer et liquez sur le + pour jouter French @si vous ne le fites psD n9ur uune inideneAF yn v mintennt on(gurer notre projet en QPits @l hv ne fontionnnt ps en TR itsA et jouter les hemins pour les frmeworks insi que les di'rents hedersF
EnglishD
QHV
gliquez sur l9onglet Build SettingsD puis AllF insuite dns ArchitecturesD liquez sur 64-bit Intel et sletionnez 32-bit IntelD omme l (gure PHFIRF
ellez dns le hmp de reherhe en hut droite et tpez serh pths Y vous devriez trouver les P lignes qui nous intressent X Header search paths et Framework search pathsF houle liquez sur l zone droite de l ligne Framework search pathsD liE quez sur le + et joutez le hemin /Library/FrameworksF our Header Search paths joutez le hemin /Library/Frameworks/SDL.framework/HeadersF ous devriez voir le mme rsultt qu9 l (gure PHFISF
letionnez mintennt votre ile @en dessous de TARGETS ette foisEiAD omme l (gure PHFITF
ellez dns l9onglet SummaryF hns Application CategoryD vous pouvez mettre e que vous voulezD mis n9pporte ps grnd hoseD 9est pour l9epptoreF wodi(ez l ligne Main Interface et mettez hvwin F ve dre App IconD omme son nom l9indiqueD est pour d(nir une ine votre progrmmeF sl su0t de fire glisser l9imge souhite dns le dre @ve un drag & drop AF hns l prtie Linked Frameworks and LibrariesD on v jouter notre frmework X SDL.frameworkF gliquez sur le + et dns le hmp de reherheD tpez hv F und vous vez repr le frmeE work D liquez sur edd F i vous ne trouvez ps le frmework dns l liste drouE lnteD 9est que vous ne l9vez ps pl dns le on dossier @/Library/Frameworks ou /Bibliothque/Frameworks en frnisAF QHW
Les icnes sous Mac OS sont de type .icns. Si vous mettez un autre format, vous remarquerez que votre icne n'apparat pas. Il faut donc que vous utilisiez une icne au format .icns. Si vous voulez convertir une image en icne, vous pouvez utiliser le logiciel Icon Composer qui se situe dans le dossier /Developer/Applications/Utilities. Il vous sut simplement de glisser votre image dans le cadre souhait et d'enregistrer votre image.
hns l9onglet InfoD on peut indiquer euoup d9informtions onernnt le proE grmme Y je ne m9ttrderi ps dessusD si vous voulez des informtionsD je vous onseille de lire l do d9epple e sujetF ves deux seules hoses que vous pouvez ventuellement modi(er sont l LocalizationD de en en frD insi que le Copyright pour y mettre e que vous voulez @le __MyCompanyName__ n9est ps gnilAF ellez ensuite dns l9onglet Build Phases et liquez sur Add Build Phase > Copy Files en s droite de l fentreF houle liquez sur le nom Copy Files et renomE mez le en gopy frmeworks into pp F hns DestinationD sletionnez FrameworksF our jouter vos frmeworksD glissezEles de l9roresene de guhe dns votre Build phaseD omme l (gure PHFIUF
phase
te vous onseille de rnger tous vos frmeworks dns le dossier FrameworkF gel vous permettr de vous y retrouver plus filementF he mme pour les (hiers souresD je vous onseille de rer des dossiers pour les rnger orretementF our rer un dossierD il fut fire un li droit et New GroupD ensuite vous glissez vos (hiers dednsF xous llons mintennt jouter les (hiers SDLMain.h et SDLMain.mF ellez dns le dossier devel-lite ouvert prdemment et joutez les P (hiers u projetF i une fentre vous demndnt de hoisir des options pour l opie s90heD ohez l se Copy items into destination group's folder (if needed)F hernire ligne droite X rez un (hier main.cF ellez dns le menu File > New > New FileD puis dns C and C++F letionnez C File puis NextF xommez votre (hier et QIH
Et sous Linux ?
i vous ompilez sous vinux ve un shiD il fudr modi(er les proprits du projet @l mnipultion ser qusiment l mmeAF i vous utilisez gode: :floks @qui existe ussi en version vinuxA vous pouvez suivre l mme produre que elle que j9i drite plus hutF
Et pour ceux qui compilent la main ?
sl y en peutEtre prmi vous qui ont pris l9hitude de ompiler l min sous vinux l9ide d9un Makele @(hier ommndnt l ompiltionAF i 9est votre sD je vous invite tlhrger un Makele que vous pouvez utiliser pour ompiler des projets hvF lhrger le Makele gode we X TIWSPS v seule hose un peu prtiulireD 9est l9jout de l iliothque hv pour le linker @LDFLAGSAF sl fudr que vous yez tlhrg l hv version vinux et que vous l9yez instlle dns le dossier de votre ompilteurD de l mme mnire qu9on le fit sous indows @dossiers include/SDL et libA insuiteD vous pourrez utiliser les ommndes suivntes dns l onsole X
mke 5 our ompiler le projet mke len 5 our effer les fihiers de ompiltion @F o inutiles A mke mrproper 5 our tout supprimer suf les fihiers soure
En rsum
! v hv est une iliothque de s niveu qui permet d9ouvrir des fentres et d9y fire des mnipultions grphiques en PhF ! ille n9est ps instlle pr dfutD il fut l tlhrger et on(gurer votre shi pour l9utiliserF ! ille est lire et grtuiteD e qui vous permet de l9utiliser rpidement et vous grntit s prennitF ! sl existe des milliers d9utres iliothques dont euoup sont de trs onne qulitF g9est l hv qui t sletionne pour l suite de e ours pour son spet ludiqueF i vous souhitez dvelopper des interfes ompltes ve menus et outons pr l suiteD je vous invite vous penher sur l iliothque quC pr exempleF QII
QIP
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 !
QIQ
SDL_Init
: chargement de la SDL
v fontion SDL_Init prend un prmtreF ous devez indiquer quelles prties de l hv vous souhitez hrgerF
Ah bon, la SDL est compose de plusieurs parties ?
ih oui 3 sl y une prtie de l hv qui gre l90hge l9rnD une utre qui gre le sonD etF v hv met votre disposition plusieurs onstntes pour que vous puissiez indiquer quelle prtie vous vez esoin d9utiliser dns votre progrmme @tF PIFIAF i vous ppelez l fontion omme ei X
1
hvsnit @ hvsxsshiy A Y
F F F lors le systme vido ser hrg et vous pourrez ouvrir une fentreD y dessinerD etF in fitD tout e que vous fites 9est envoyer un nomre SDL_Init l9ide d9une onstnteF ous ne svez ps de quel nomre il s9gitD et justement 9est qui est ienF ous vez juste esoin d9rire l onstnteD 9est plus file lire et retenirF v fontion SDL_Init regrder le nomre qu9elle reoit et en fontion de elD elle sur quels systmes elle doit hrgerF wintenntD si vous fites X
1. Imaginez que vous fassiez une boucle innie de malloc sans le faire exprs : en quelques secondes, vous saturerez toute votre mmoire !
QIR
Constante
ghrge le systme d90hge @vidoAF g9est l prtie que nous hrgerons le plus souventF SDL_INIT_AUDIO ghrge le systme de sonF ous permettr don pr exemple de jouer de l musiqueF SDL_INIT_CDROM ghrge le systme de ghEywF ous permettr de mniE puler votre leteur de ghEyw SDL_INIT_JOYSTICK ghrge le systme de gestion du joystikF SDL_INIT_TIMER ghrge le systme de timerF gel vous permet de grer le temps dns votre progrmme @trs prtiqueAF SDL_INIT_EVERYTHING ghrge tous les systmes lists iEdessus l foisF Table PIFI ! viste des onstntes de hrgement de l hv
SDL_INIT_VIDEO
1
Description
hvsnit @ hvsxsiirsxq A Y
F F F vous hrgez tous les sytmes de l hvF xe fites el que si vous vez vriment esoin de toutD il est inutile de surhrger votre ordinteur en hrgent des modules dont vous ne vous servirez psF
Supposons que je veuille charger l'audio et la vido seulement. Dois-je utiliser SDL_INIT_EVERYTHING ?
ous n9llez ps utiliser SDL_INIT_EVERYTHING juste pre que vous vez esoin de deux modulesD puvres fous 3 reureusementD on peut ominer les options l9ide du symole | @l rre vertileAF
1 2
Ces options que l'on envoie SDL_Init sont aussi appeles ags . C'est quelque chose que vous rencontrerez assez souvent. Retenez bien qu'on utilise la barre verticale | pour combiner les options. a agit un peu comme une addition.
SDL_Quit
: arrt de la SDL
hvuit @A Y
QIS
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
5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y GG h mrrge de l hv @ ii X hrgement du syst me vid o A GB v hv est hrg e F ous pouvez mettre ii le ontenu de votre progrmme BG hvuit @A Y GG err t de l hv @ li rtion de l m moire A F } return H Y
8 9 10 11 12 13 14 15 16 17
gopier e ode gode we X QSUHWT fien entenduD uun progrmme srieux ne tiendr dns le mainF ge que je fis l est shmtiqueF hns l rlitD votre main ontiendr ertinement de nomreux ppels des fontions qui feront elles ussi plusieurs ppels d9utres fontionsF ge qui ompte u (nlD 9est que l hv soit hrge u dut et qu9elle soit ferme l (n qund vous n9en vez plus esoinF
ixellente question 3 yn n9 plus de onsole mintenntD don omment fire pour stoker et 0her des messges d9erreurs c heux possiilits X ! soit on modi(e les options du projet pour qu9il 0he nouveu l onsoleF yn pourr lors fire des printf Y ! soit on rit dns un (hier les erreursF yn utiliser fprintfF t9i hoisi d9rire dns un (hierF gependntD rire dns un (hier implique de fire un fopenD un fcloseF F F refD 9est un peu moins file qu9un printfF reureusementD il y une solution plus simple X utiliser l sortie d9erreur stndrdF sl y une vrile stderr qui est d(nie pr stdio.h et qui pointe vers un endroit o l9erreur peut tre rite F gette vrile est utomtiquement re u dut du progrmme et supprime l (nF ous n9vez don ps esoin de fire de fopen ou de fcloseF ous pouvez don fire un fprintf sur stderr sns utiliser fopen ou fclose X
2 1 2 3 4 5 6 7
5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { if @ hvsnit @ hvsxsshiy A aa EI A GG h mrrge de l hv F i erreur X { fprintf @ stderr D 4 irreur d ' initilistion de l hv X 7 s n 4 D hvqetirror @A A Y GG riture de l ' erreur exit @ ispesvi A Y GG yn quitte le progrmme } hvuit @A Y } return isggi Y
8 9
10 11 12 13 14 15 16 17
gopier e ode gode we X UIPTWH uoi de neuf dns e ode c ! yn rit dns stderr notre erreurF ve %s permet de lisser l hv indiquer les dtils de l9erreur X l fontion SDL_GetError() renvoie en e'et l dernire erreur de l hvF
2. Gnralement sous Windows, ce sera un chier stderr.txt tandis que sous Linux, l'erreur apparatra le plus souvent dans la console.
QIU
! yn quitte en utilisnt exit()F tusqueElD rien de nouveuF outefoisD vous urez remrqu que j9utilise une onstnte @EXIT_FAILUREA pour indiquer l vleur que renvoie le progrmmeF he plusD l (n j9utilise EXIT_SUCCESS u lieu de HF u9estE e que j9i hng c in fit j9mliore petit petit nos odes soureF in e'etD le nomre qui signi(e erreur pr exemple peut tre di'rent selon les ordinteurs 3 gel dpend l enore de l9yF our pllier e prolmeD stdlib.h nous fournit deux onstntes @des defineA X ! EXIT_FAILURE X vleur renvoyer en s d9he du progrmme Y ! EXIT_SUCCESS X vleur renvoyer en s de russite du progrmmeF in utilisnt es onstntes u lieu de nomresD vous tes ertins de renvoyer une vleur orrete quel que soit l9yF ourquoi c re que le (hier stdlib.h hnge selon l9y sur lequel vous tesD don les vleurs des onstntes sont dptesF otre ode soureD luiD n9 ps esoin d9tre modi( 3 g9est e qui rend le lngge g omE ptile ve tous les y F
3
Cela n'a pas de grandes consquences pour nous pour le moment, mais c'est plus srieux d'utiliser ces constantes. C'est donc ce que nous ferons partir de maintenant.
int min @ int rg D hr B rgv A { if @ hvsnit @ hvsxsshiy A aa EI A { fprintf @ stderr D 4 irreur d ' initilistion de l hv 4 A Y exit @ ispesvi A Y } hvuit @A Y } return isggi Y
gel devrit tre le s si vous vez ien suivi le dut du hpitreF our le moment donD on initilise juste l vido @SDL_INIT_VIDEOAD 9est tout e qui nous intresseF
3. Pour peu que vous programmiez correctement en utilisant les outils fournis, comme ici.
QIV
F F F el ouvre une fentre de tille TRH x RVH en QP its G pixel @millirds de ouleursA qui ser hrge en mmoire vido @9est l plus rpideD on prfrer utiliser elleElAF
4. Sachez aussi que vous pouvez mettre des valeurs plus faibles comme 16 bits / pixel (65536 couleurs), ou 8 bits / pixel (256 couleurs). Cela peut tre utile surtout si vous faites un programme pour un petit appareil genre PDA ou tlphone portable.
QIW
F F F el ouvre une fentre redimensionnle de tille initile RHH x QHH @QP its G pixelA en mmoire vidoD ve le doule u'ering tivF oii un premier ode soure trs simple que vous pouvez essyer X
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14
5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvuit @A Y } return isggi Y
gopier e ode gode we X IWRHRW estezF ue se psseEtEil c v fentre pprt et disprt l vitesse de l lumireF in e'etD l fontion SDL_SetVideoMode est immditement suivie de SDL_QuitD don tout s9rrte immditementF
sl fut fire omme le font tous les progrmmesD que e soit des jeux vido ou utre X une oule in(nieF in e'etD l9ide d9une te oule in(nie on emphe notre progrmme de s9rrterF ve prolme est que ette solution est trop e0e r du oupD il n9y ps de moyen d9rrter le progrmme F oii un ode qui fontionne mis ne pas testerD je vous le donne juste titre explitif X
6
5. J'ai volontairement retir la gestion d'erreur pour rendre le code plus lisible et plus court, mais vous devriez dans un vrai programme prendre toutes les prcautions ncessaires et grer les erreurs. 6. part un bon vieux CTRL + ALT + SUPPR la rigueur mais c'est. . . brutal.
QPH
int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y while @ I A Y hvuit @A Y } return isggi Y
ous reonnissez le while(1); X 9est l oule in(nieF gomme I signi(e vri @rppelezEvous les oolensAD l oule est toujours vrie et tourne en rond ind(niment sns qu9il y it moyen de l9rrterF ge n9est don ps une trs onne solutionF our mettre en puse notre progrmme (n de pouvoir dmirer notre elle fentre sns fire de oule interminleD on v utiliser une petite fontion moiD l fontion pause() X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void puse @A { int ontinuer a I Y hvivent event Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y } }
gopier e ode gode we X ISUUPP te ne vous explique ps le dtil de ette fontion pour le momentF g9est volontireD r el fit ppel l gestion des vnements que je vous expliqueri seulement dns un prohin hpitreF i je vous explique tout l fois mintenntD vous risquez de tout mlnger 3 pites don pour l9instnt on(ne m fontion de puseD nous ne trderons ps l9expliquerF oii un ode soure omplet et orret que vous pouvez @en(n 3A tester X
1 2 3
QPI
void puse @A Y int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y GG snitilistion de l hv hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG yuverture de l fen tre puse @A Y GG wise en puse du progrmme hvuit @A Y GG err t de l hv } return isggi Y GG permeture du progrmme
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
void puse @A { int ontinuer a I Y hvivent event Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y } }
gopier e ode gode we X WIVTUI ous remrquerez que j9i mis le prototype de m fontion pause() en hut pour tout vous prsenter sur un seul (hierF te fis ppel l fontion pause() qui fit une oule in(nie un peu plus intelligente que tout l9heureF gette oule s9rrter en e'et si vous liquez sur l roix pour fermer l fentre 3 v (gF PIFI vous donne une ide de e quoi devrit ressemler l fentre que vous vez sous les yeux @iiD une fentre TRH x RVHAF (ou 3 xous y sommes en(n rrivs 3 i vous voulezD vous pouvez mettre le )g redimensionnle pour utoriser le rediE mensionnement de votre fentreF outefoisD dns l pluprt des jeux on prfre voir une fentre de tille (xe @9est plus simple grer 3AD nous grderons don notre fentre (xe pour le momentF QPP
QPQ
int min @ int rg D hr B rgv A { hvsnit @ hvsxsshiy A Y hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y puse @A Y hvuit @A Y } return isggi Y
Vous aurez remarqu que j'ai mis NULL pour le fameux second paramtre peu utile. En C, il est obligatoire de renseigner tous les paramtres mme si certains ne vous intressent pas, quitte envoyer NULL comme je l'ai fait ici. Le C++ permet, lui, de ne pas renseigner certains paramtres facultatifs lors des appels de fonctions.
QPR
ous remrquerez que je re un pointeurF ourquoi je fis c re que 9est l hv qui v llouer de l9espe en mmoire pour notre surfeF ne surfe n9 en e'et ps toujours l mme tille et l hv est olige de fire une llotion dynmique pour nous @iiD dpendr de l tille de l fentre que vous vez ouverteAF te ne vous l9i ps dit tout l9heureD mis l fontion SDL_SetVideoMode renvoie une vleur 3 ille renvoie un pointeur sur l surfe de l9rn qu9elle re en mmoire pour nousF rfitD on v don pouvoir ruprer e pointeur dns ecran X
1
xotre pointeur peut mintennt vloir X ! NULL X ecran vut NULL si l SDL_SetVideoMode n9 ps russi hrger le mode vido demndF gel rrive si vous demndez une trop grnde rsolution ou un trop grnd nomre de ouleurs que ne supporte ps votre ordinteur Y ! une utre vleur X si l vleur est di'rente de NULLD 9est que l hv pu llouer l surfe en mmoireD don que tout est on 3 QPS
sl serit ien ii de grer les erreursD omme on ppris le fire tout l9heure pour l9initilistion de l hvF oii don notre main ve l gestion de l9erreur pour SDL_SetVideoMode X
1 2 3
int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y GG ve pointeur qui v stoker l surfe de l ' rn hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG yn tente d ' ouvrir une fen tre if @ ern aa xvv A GG i l ' ouverture hou D on le note et on rr te { fprintf @ stderr D 4 smpossile de hrger le mode vid o X 7 s n 4 D hvqetirror @A A Y exit @ ispesvi A Y } hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y puse @A Y hvuit @A Y } return isggi Y
4 5 6 7
9 10
11 12 13 14 15 16 17 18 19 20 21
gopier e ode gode we X UVVIQR ve messge que nous lisser SDL_GetError() nous ser trs utile pour svoir e qui n9 ps mrhF
Petite anecdote : une fois, je me suis tromp en voulant faire du plein cran. Au lieu de demander une rsolution de 1024 * 768, j'ai crit 10244 * 768. Je ne comprenais pas au dpart pourquoi a ne voulait pas charger, car je ne voyais pas le double 4 dans mon code (oui, je devais tre un peu fatigu). Un petit coup d'il au chier stderr.txt qui contenait l'erreur et j'ai tout de suite compris que c'tait ma rsolution qui avait t rejete (tiens, comme c'est curieux !).
! soit vous remplissez l surfe ve une ouleur unie Y ! soit vous remplissez l surfe en hrgent une imgeF
Il est aussi possible de dessiner pixel par pixel dans la surface mais c'est assez compliqu, nous ne le verrons pas ici.
xous llons dns un premier temps voir omment remplir une surfe ve une ouleur unieF hns le hpitre suivntD nous pprendrons hrger une imgeF v fontion qui permet de olorer une surfe ve une ouleur unie s9ppelle SDL_FillRect @FillRect a remplir retngle en nglisAF ille prend trois prmtresD dns l9ordre X ! un pointeur sur l surfe dns lquelle on doit dessiner @pr exemple ecranA Y ! l prtie de l surfe qui doit tre remplieF i vous voulez remplir toute l surfe @et 9est e qu9on veut fireAD envoyez NULL Y ! l ouleur utiliser pour remplir l surfeF in rsum X
1
Si c'est un nombre, pourquoi ne pas avoir utilis le type de variable int ou tout simplement ?
v hv est une iliothque multiEpltesEformesF yrD omme vous le svez mintenntD l tille oupe pr un int ou un long peut vrier selon votre yF our s9ssurer que le nomre ouper toujours l mme tille en mmoireD l hv don invent des types pour stoker des entiers qui ont l mme tille sur tous les systmesF sl y pr exemple X ! Uint32 X un entier de longueur QP its @soit R otets A Y ! Uint16 X un entier od sur IT its @P otetsA Y ! Uint8 X un entier od sur V its @I otetAF v hv ne fit qu9un simple typedef qui hnger selon l9y que vous utilisezF eE grdez de plus prs le (hier SDL_types.h si vous tes urieuxF yn ne v ps s9ttrder lEdessus plus longtemps r les dtils de tout el ne sont ps importntsF ous vez juste esoin de retenir que Uint32 est un type qui stoke un entierD omme un intF
8
QPU
D'accord, mais comment je sais quel nombre je dois mettre pour utiliser la couleur verte, azur, gris fonc ou encore jaune ple points roses avec des petites eurs violettes ?
9
sl existe une fontion qui sert X SDL_MapRGBF ille prend qutre prmtres X ! le formt des ouleursF ge formt dpend du nomre de its G pixel que vous vez demnd ve SDL_SetVideoModeF ous pouvez le ruprerD il est stok dns l sousEvrile ecran->format Y ! l quntit de rouge de l ouleur Y ! l quntit de vert de l ouleur Y ! l quntit de leu de l ouleurF gertins d9entre vous ne le svent peutEtre psD mis toute ouleur sur un ordinteur est onstruite prtir de trois ouleurs de se X le rougeD le vert et le leuF ghque quntit peut vrier de H @ps de ouleurA PSS @toute l ouleurAF honD si on rit X
1
F F F lD il s9git d9une ouleur lnhe @toutes les ouleurs s9dditionnentAF i vous voulez du noirD il fut don rire 0, 0, 0F
On ne peut que mettre du rouge, du vert, du bleu, du noir et du blanc ?
xonD 9est vous de ominer intelligemment les quntits de ouleursF our vous iderD ouvrez pr exemple le logiiel PaintF ellez dns le menu Couleurs / Modifier les couleursF gliquez sur le outon Dfinir les couleurs personnalisesF vD hoisissez l ouleur qui vous intresse @(gF PIFQAF ves omposntes de l ouleur sont 0hes en s droiteF siD j9i sletionn un leuEvertF gomme l9indique l fentreD il se re l9ide de IU de rougeD PHT de vert et IIP de leuF
Coloration de l'cran
v fontion SDL_MapRGB renvoie un Uint32 qui orrespond l ouleur demndeF yn peut don rer une vrile bleuVert qui ontiendr le ode de l ouleur leuEvert X
9. Bien entendu, cette dernire couleur n'existe pas.
QPV
outefoisD e n9est ps toujours l peine de psser pr une vrile pour stoker l ouleur @ moins que vous en yez esoin trs souvent dns votre progrmmeAF ous pouvez tout simplement envoyer diretement l ouleur donne pr SDL_MapRGB SDL_FillRectF i on veut remplir notre rn de leuEvertD on peut don rire X
1
yn omine ii deux fontionsD mis omme vous devriez mintennt le svoirD ne pose uun prolme u lngge gF
Mise jour de l'cran
xous y sommes presqueF outefois il mnque enore une petite hose X demnder l mise jour de l9rnF in e'etD l9instrution SDL_FillRect olorie ien l9rn mis el ne se fit que dns l mmoireF sl fut ensuite demnder l9ordinteur de mettre jour l9rn ve les nouvelles donnesF our elD on v utiliser l fontion SDL_FlipD dont nous reprlerons plus longuement plus loin dns le oursF gette fontion prend un prmtre X l9rnF
1
On rsume !
oii une fontion main() qui re une fentre ve un fond leuEvert X QPW
int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y GG golortion de l surfe ern en leu E vert hvpillet @ ern D xvv D hvwpqf @ ern E b formt D IU D PHT D IIP A A Y hvplip @ ern A Y GB wise jour de l ' rn ve s nouvelle ouleur BG puse @A Y hvuit @A Y } return isggi Y
12 13
14 15 16 17 18 19 20
gopier e ode gode we X PTTVRI ve rsultt est prsent sur l (gF PIFRF
QQH
xous devons ensuite demnder l hv de nous llouer de l9espe en mmoire pour ette nouvelle surfeF our l9rnD nous vons utilis SDL_SetVideoModeF outefoisD ette fontion ne mrhe que pour l9rn @l surfe gloleAD on ne v ps rer une fentre di'rente pour hque retngle que l9on veut dessiner 3 sl existe don une utre fontion pour rer une surfe X SDL_CreateRGBSurfaceF g9est elle que nous utiliserons hque fois que nous voudrons rer une surfe unie omme iiF gette fontion prendF F F euoup de prmtres @huit 3AF h9illeursD peu d9entre eux nous intressent pour l9instntD je vis don viter de vous dtiller eux qui ne nous serviront ps de suiteF gomme en g nous sommes oligs d9indiquer tous les prmtresD nous enverrons l vleur H qund le prmtre ne nous intresse psF egrdons de plus prs les qutre premiers prmtresD les plus intressnts @ils deE vrient vous rppeler l rtion de l9rnAF ! ne liste de )gs @des optionsAF ous vez le hoix entre X ! SDL_HWSURFACE X l surfe ser hrge en mmoire vidoF sl y moins d9espe dns ette mmoire que dns l mmoire systme D mis ette mmoire est plus optimise et lre Y ! SDL_SWSURFACE X l surfe ser hrge en mmoire systme o il y euoup de pleD mis el oliger votre proesseur fire plus de lulsF i vous viez hrg l surfe en mmoire vidoD 9est l rte Qh qui urit fit l pluprt des lulsF ! v lrgeur de l surfe @en pixelsAF ! v huteur de l surfe @en pixelsAF ! ve nomre de ouleurs @en its G pixelAF oii don omment on lloue notre nouvelle surfe en mmoire X
10 1
ves qutre derniers prmtres sont mis HD omme je vous l9i ditD r ils ne nous intressent psF gomme notre surfe t lloue mnuellementD il fudr penser l lirer de l mmoire ve l fontion SDL_FreeSurface()D utiliser juste vnt SDL_Quit() X
1
hvpreeurfe @ retngle A Y
10. Quoique, avec les cartes 3D qu'on sort de nos jours, il y a de quoi se poser des questions. . .
QQI
hvuit @A Y
La surface ecran n'a pas besoin d'tre libre avec cela est fait automatiquement lors de SDL_Quit().
SDL_FreeSurface(),
ellezD 9est presque (niD ourge 3 xotre surfe est prteD mis si vous testez le proE grmme vous verrez qu9elle ne s90her ps 3 in e'etD l hv n90he l9rn que l surfe ecranF our que l9on puisse voir notre nouvelle surfeD il v flloir blitter la surfaceD 9estEEdire l oller sur l9rnF yn utiliser pour el l fontion SDL_BlitSurfaceF gette fontion ttend X ! l surfe oller @iiD e ser rectangleA Y ! une informtion sur l prtie de l surfe oller @fulttiveAF ne nous intresse ps r on veut oller toute l surfeD don on enverr NULL Y ! l surfe sur lquelle on doit ollerD 9estEEdire ecran dns notre s Y ! un pointeur sur une vrile ontennt des oordonnesF ges oordonnes indiquent o devr tre olle notre surfe sur l9rnD 9estEEdire s positionF our indiquer les oordonnesD on doit utiliser une vrile de type SDL_RectF g9est une struture qui ontient plusieurs sousEvrilesD dont deux qui nous intressent ii X ! x X l9sisse Y ! y X l9ordonneF sl fut svoir que le point de oordonnes @HD HA est situ tout en hut guheF in s droiteD le point les oordonnes @TRHD RVHA si vous vez ouvert une fentre de tille TRH x RVH omme moiF eidezEvous du shm de l (gF PIFS pour vous situerF i vous vez dj fit des mths une fois dns votre vieD vous ne devriez ps tre trop pertursF grons don une vrile positionF yn v mettre x et y H pour oller l surfe en hut guhe de l9rn X
1 2 3 4
wintennt qu9on notre vrile positionD on peut litter notre retngle sur l9rn X QQP
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B retngle a xvv Y hvet position Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y GG ellotion de l surfe retngle a hvgreteqfurfe @ hvrpegi D PPH D IVH D QP D H D H D H D H A Y hvwetgption @ 4 w super fen tre hv 3 4 D xvv A Y hvpillet @ ern D xvv D hvwpqf @ ern E b formt D IU D PHT D IIP A A Y position F x a H Y GG ves oordonn es de l surfe seront @H D HA position F y a H Y GG emplissge de l surfe ve du ln
11 12 13
14 15
16 17
QQQ
19
hvpillet @ retngle D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ retngle D xvv D ern D 8 position A Y GG gollge de l surfe sur l ' rn hvplip @ ern A Y GG wise jour de l ' rn puse @A Y hvpreeurfe @ retngle A Y GG vi rtion de l surfe hvuit @A Y } return isggi Y
20 21 22 23 24 25 26 27 28 29
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
QQS
@H D H D HA GG xoir @I D I D IA GG qris tr s tr s prohe du noir @P D P D PA GG qris tr s prohe du noir FFF @ IPV D IPV D IPV A GG qris moyen @ SH 7A FFF @ PSQ D PSQ D PSQ A GG qris tr s prohe du ln @ PSR D PSR D PSR A GG qris tr s tr s prohe du ln @ PSS D PSS D PSS A GG fln
out le monde devrit voir vu venir une oule pour fire @on ne v ps fire PST opierEoller 3AF ous llez devoir rer un tleu de type SDL_Surface* de PST ses pour stoker hune des lignesF ellez u oulotD je vous donne S minutes 3
Correction !
h9ordD il fllit rer notre tleu de PST SDL_Surface*F yn l9initilise NULL X
1
yn re ussi une vrile i dont on ur esoin pour nos forF yn hnge ussi l huteur de l fentre pour qu9elle soit plus dpte dns notre sF yn lui donne don PST pixels de huteurD pour hune des PST lignes 0herF insuiteD on fit un for pour llouer une une hune des PST surfesF ve tleu reevr PST pointeurs vers hune des surfes res X
1 2
for @ i a H Y i `a PSS Y i CCA { position F x a H Y GG ves lignes sont guhe @ sisse de H A position F y a i Y GG v position vertile d pend du num ro de l ligne hvpillet @ lignes i D xvv D hvwpqf @ ern E b formt D i D i D i A A Y GG hessin hvfliturfe @ lignes i D xvv D ern D 8 position AY GG gollge
5 6
xotez que j9utilise l mme vrile position tout le tempsF s esoin d9en rer PST en e'etD r l vrile ne sert que pour tre envoye SDL_BlitSurfaceF yn peut don l rutiliser sns prolmeF ghque foisD je mets jour l9ordonne @yA pour litter l ligne l onne huteurF v ouleur hque pssge dns l oule dpend de i @e ser HD HD H l premire foisD et PSSD PSSD PSS l dernire foisAF
Mais pourquoi x est toujours 0 ? Comment se fait-il que toute la ligne soit remplie si x est tout le temps 0 ?
xotre vrile position indique quel endroit est pl le oin en hut guhe de notre surfe @iiD notre ligneAF ille n9indique ps l lrgeur de l surfeD juste s position sur l9rnF gomme toutes nos lignes ommenent guhe de l fentre @le plus guhe possileAD on met une sisse de HF issyez de mettre une sisse de SH pour voir e que fit X toutes les lignes seront dles vers l droiteF gomme l surfe fit TRH pixels de lrgeurD l hv dessine TRH pixels vers l droite @de l mme ouleurA en prtnt des oordonnes indiques dns l vrile positionF ur le shm de l (gF PIFWD je vous montre les oordonnes du point en hut guhe de l9rn @position de l premire ligneA et elui du point en s droite de l9rn @position de l dernire ligneAF
QQU
gomme vous le voyezD de hut en s l9sisse ne hnge ps @x reste gl H tout le longAF g9est seulement y qui hnge pour hque nouvelle ligneD d9o le position.y = i;F in(nD il ne fut ps oulier de lirer l mmoire pour hune des PST surfes resD le tout l9ide d9une petite oule ien entenduF
1 2
for @ i a H Y i `a PSS Y i CCA GG x ' ouliez ps de li rer les PST surfes hvpreeurfe @ lignes i A Y
Rsum du main
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B lignes PST a { xvv }Y hvet position Y int i a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D PST D QP D hvrpegi A Y for @ i a H Y i `a PSS Y i CCA lignes i a hvgreteqfurfe @ hvrpegi D TRH D I D QP D H D H D H D H A Y hvwetgption @ 4 won d grd en hv 3 4 D xvv A Y hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D H D H AAY for @ i a H Y i `a PSS Y i CCA { position F x a H Y GG ves lignes sont guhe @ sisse de H A position F y a i Y GG v position vertile d pend du num ro de l ligne hvpillet @ lignes i D xvv D hvwpqf @ ern E b formt D iD iD iAAY hvfliturfe @ lignes i D xvv D ern D 8 position A Y } hvplip @ ern A Y puse @A Y for @ i a H Y i `a PSS Y i CCA GG x ' ouliez ps de li rer les PST surfes
13 14 15 16
17 18 19 20
21
22
23 24 25 26 27 28 29
QQV
En rsum
! v hv doit tre hrge ve SDL_Init u dut du progrmme et dhrge ve SDL_Quit l (nF ! ves )gs sont des onstntes que l9on peut dditionner entre elles ve le symole | F illes jouent le rle d9optionsF ! v hv vous fit mnipuler des surfes qui ont l forme de retngles ve le type SDL_SurfaceF ve dessin sur l fentre se fit l9ide de es surfesF ! sl y toujours u moins une surfe qui prend toute l fentreD que l9on ppelle en gnrl ecranF ! ve remplissge d9une surfe se fit ve SDL_FillRect et le ollge sur l9rn l9ide de SDL_BlitSurfaceF ! ves ouleurs sont d(nies l9ide d9un mlnge de rougeD de vert et de leuF
QQW
QRH
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.
QRI
Le format BMP
n fw @rvition de fitmp A est un formt d9imgeF ves imges que vous voyez sur votre ordinteur sont stokes dns des (hiersF sl existe plusieurs formts d9imgesD 9estEEdire plusieurs fons de oder l9imge dns un (hierF elon le formtD l9imge prend plus ou moins d9espe disque et se trouve tre de plus ou moins onne qulitF ve fitmp est un formt non ompress @ontrirement ux tqD xqD qspD etFAF gonrtementD el signi(e les hoses suivntes X ! le (hier est trs rpide lireD ontrirement ux formts ompresss qui doivent tre dompresssD e qui prend un peu plus de temps Y ! l qulit de l9imge est prfiteF gertins formts ompresss dtriorent l qulit de l9imgeD e n9est ps le s du fw Y ! mis le (hier est ussi ien plus gros puisqu9il n9est ps ompress 3 sl don des qulits et des dfutsF our l hvD l9vntge 9est que e type de (hier est simple et rpide lireF i vous vez souvent esoin de hrger des imges u ours de l9exution de votre progrmmeD il vut mieux utiliser des fw X ertes le (hier est plus grosD mis il se hrger plus vite qu9un qsp pr exempleF gel peut se rvler utile si votre progrmme doit hrger de trs nomreuses imges en peu de tempsF
1
Charger un Bitmap
Tlchargement du pack d'images
xous llons trviller ve plusieurs imges dns e hpitreF i vous voulez fire les tests en mme temps que vous lisez @et vous devriez 3AD je vous reommnde de tlE hrger un pk qui ontient toutes les imges dont on v voir esoinF lhrger les imges gode we X VTRIUS fien entenduD vous pouvez utiliser vos propres imgesF sl fudr en revnhe dpter l tille de votre fentre ellesEiF
1. Je pense au JPG plus particulirement, car les PNG et GIF n'altrent pas l'image.
QRP
lez toutes les imges dns le dossier de votre projetF xous llons ommener pr trviller ve le (hier lac_en_montagne.bmp F
2
xous llons utiliser une fontion qui v hrger l9imge fw et l mettre dns une surfeF gette fontion pour nom SDL_LoadBMPF ous llez voir quel point 9est simple X
1
v fontion SDL_LoadBMP remple deux fontions que vous onnissez X ! SDL_CreateRGBSurface X elle se hrgeit d9llouer de l mmoire pour stoker une surfe de l tille demnde @quivlent u mallocA Y ! SDL_FillRect X elle remplissit l struture d9une ouleur unieF ourquoi estEe que remple es deux fontions c g9est trs simple X ! l tille llouer en mmoire pour l surfe dpend de l tille de l9imge X si l9imge une tille de PSH x QHHD lors votre surfe ur une tille de PSH x QHH Y ! d9utre prtD votre surfe ser remplie pixel pr pixel pr le ontenu de votre imge fwF godons sns plus trder X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv Y hvet positionpond Y positionpond F x a H Y positionpond F y a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y GB ghrgement d ' une imge fitmp dns une surfe BG imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y GB yn litte pr E dessus l ' rn BG hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y hvplip @ ern AY puse @A Y hvpreeurfe @ imgehepond A Y GB yn li re l surfe BG
2. C'est une scne 3D d'exemple tire de l'excellent logiciel de modlisation de paysages Vue d'Esprit 4, qui n'est aujourd'hui plus commercialis. Depuis, le logiciel a t renomm en Vue et a beaucoup volu. Si vous voulez en savoir plus, rendez-vous sur e-onsoftware.com.
QRQ
gopier e ode gode we X QIPUUS t9i don r un pointeur vers une surfe @imageDeFondA insi que les oordonnes orrespondntes @positionFondAF v surfe est re en mmoire et remplie pr l fontion SDL_LoadBMPF yn l litte ensuite sur l surfe ecran et 9est tout 3 edmirez le rsultt sur l (gF PPFIF
Mais, les icnes des programmes ne sont-elles pas des .ico, normalement ?
xonD ps forment 3 h9illeurs les .ico n9existent que sous indowsF v hv ronilie tout le monde en utilisnt un systme ien elle X une surfe 3 ih ouiD l9ine d9un progrmme hv n9est rien d9utre qu9une simple surfeF
Votre icne doit normalement tre de taille 16 x 16 pixels. Toutefois, sous Windows il faut que l'icne soit de taille 32 x 32 pixels, sinon elle sera dforme. Ne vous en faites pas, la SDL rduira les dimensions de l'image pour qu'elle rentre dans 16 x 16 pixels.
our jouter l9ine l fentreD on utilise l fontion SDL_WM_SetIconF gette fontion prend deux prmtres X l surfe qui ontient l9imge 0her insi que des inforE mtions sur l trnsprene @NULL si on ne veut ps de trnspreneAF v gestion de l trnsprene d9une ine est un peu omplique @il fut priser un un quels sont les pixels trnsprentsAD nous ne l9tudierons don psF yn v ominer deux fontions en une X
1
v9imge est hrge en mmoire pr SDL_LoadBMP et l9dresse de l surfe est direE tement envoye SDL_WM_SetIconF
La fonction SDL_WM_SetIcon doit tre appele avant que la fentre ne soit ouverte, c'est--dire qu'elle doit se trouver avant SDL_SetVideoMode dans votre code source.
oii le ode soure ompletF ous noterez que j9i simplement jout le SDL_WM_SetIcon pr rpport u ode prdent X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv Y hvet positionpond Y positionpond F x a H Y positionpond F y a H Y hvsnit @ hvsxsshiy A Y GB ghrgement de l ' i ne eex hvetideowode BG hvwetson @ hvvodfw @ 4 sdlione F mp 4 A D xvv A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y
QRS
imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y hvplip @ ern A Y puse @A Y hvpreeurfe @ imgehepond A Y hvuit @A Y } return isggi Y
Gestion de la transparence
Le problme de la transparence
xous vons tout l9heure hrg une imge itmp dns notre fentreF upposons que l9on veuille litter une imge prEdessusF vous rriver trs frquemment r dns un jeuD en gnrlD le personnge que l9on dple est un fitmp et il se dple sur une imge de fondF yn v litter l9imge de ozor sur l sne X
3 1 2 3
4 5 6 7 8 9 10 11 12 13 14 15 16
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv D B zozor a xvv Y hvet positionpond D positionozor Y positionpond F x a H Y positionpond F y a H Y positionozor F x a SHH Y positionozor F y a PTH Y hvsnit @ hvsxsshiy A Y hvwetson @ hvvodfw @ 4 sdlione F mp 4 A D xvv A Y ern a hvetideowode @ VHH D THH D QP D hvrpegi A Y hvwetgption @ 4 ghrgement d ' imges en hv 4 D xvv A Y
3. Il s'agit de la bonne vieille mascotte du Site du Zro pour ceux qui ne le connatraient pas.
QRT
GESTION DE LA TRANSPARENCE
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
imgehepond a hvvodfw @ 4 lenmontgne F mp 4 A Y hvfliturfe @ imgehepond D xvv D ern D 8 positionpond A Y GB ghrgement et littge de ozor sur l s ne BG zozor a hvvodfw @ 4 zozor F mp 4 A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y hvplip @ ern AY puse @A Y hvpreeurfe @ imgehepond A Y hvpreeurfe @ zozor A Y hvuit @A Y } return isggi Y
yn juste rjout une surfe pour y stoker ozorD que l9on litte ensuite un endroit sur l sne @(gF PPFQAF
Je sais pourquoi, c'est parce que tu as mis un fond bleu tout moche sur l'image de Zozor !
re que vous royez qu9ve un fond noir ou un fond mrron derrire ozorD urit t plus joli c ih ien nonD le prolme ii 9est que notre imge est forment retngulireD don si on l olle sur l sne on voit son fondD e qui ne rend ps trs ienF reureusementD l hv gre l trnsprene 3
our ommenerD il fut prprer l9imge que vous voulez litter sur l sneF ve formt fw ne gre ps l trnspreneD ontrirement ux qsp et xqF sl v don flloir utiliser une stueF sl fut mettre l mme ouleur de fond sur toute l9imgeF gelleEi ser rendue trnsE prente pr l hv u moment du litF yservez quoi ressemle mon zozor.bmp de plus prs @(gF PPFRAF
ve fond leu derrire est don volontireF xotez que j9i hoisi le leu u hsrdD j9uris trs ien pu mettre un fond vert ou rouge pr exempleF ge qui ompteD 9est que ette ouleur soit unique et unieF t9i hoisi le leu pre qu9il n9y en vit ps dns l9imge de ozorF i j9vis hoisi le vertD j9uris pris le risque que l9here que mhouille ozor @en s guhe de l9imgeA soit rendue trnsprenteF vous don de vous drouiller ve votre logiiel de dessin @intD hotoshopD he qimpD hun ses gotsA pour donner un fond uni votre imgeF
tape 2 : indiquer la couleur transparente
our indiquer l hv l ouleur qui doit tre rendue trnsprenteD vous devez utiliser l fontion SDL_SetColorKeyF gette fontion doit tre ppele vnt de litter l9imgeF oii omment je m9en sers pour rendre le leu derrire ozor trnsprent X
1
GESTION DE LA TRANSPARENCE
! l surfe qui doit tre rendue trnsprente @iiD 9est zozorA Y ! une liste de )gs X utilisez SDL_SRCCOLORKEY pour tiver l trnspreneD H pour l dstiver Y ! indiquez ensuite l ouleur qui doit tre rendue trnsprenteF t9i utilis SDL_MapRGB pour rer l ouleur u formt nomre @Uint32A omme on l9 dj fit pr le pssF gomme vous le voyezD 9est le leu pur @HD HD PSSA que je rends trnsprentF in rsumD on hrge d9ord l9imge ve SDL_LoadBMPD on indique l ouleur trnsE prente ve SDL_SetColorKeyD puis on peut litter ve SDL_BlitSurface X
1 2 3 4
5 6
GB yn hrge l ' imge X BG zozor a hvvodfw @ 4 zozor F mp 4 A Y GB yn rend le leu derri re ozor trnsprent X BG hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB yn litte l ' imge mintennt trnsprente sur le fond X BG hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y
oil ve tehnique de se que vous rutiliserez tout le temps dns vos futurs proE grmmesF epprenez ien mnier l trnsprene r 9est fondmentl pour rliser un jeu un minimum rlisteF QRW
La transparence Alpha
g9est un utre type de trnspreneF tusqu9iiD on se ontentit de d(nir xi ouleur de trnsprene @pr exemple le leuAF gette ouleur n9pprissit ps une fois l9imge litteF v trnsprene elph orrespond tout utre hoseF ille permet de rliser un mE lnge entre une imge et le fondF g9est une sorte de fonduF v trnsprene elph d9une surfe peut tre tive pr l fontion SDL_SetAlpha X
1
sl y l enore trois prmtres X ! l surfe en question @zozorA Y ! une liste de )gs X mettez SDL_SRCALPHA pour tiver l trnspreneD H pour l dstiver Y ! trs importnt X l vleur Alpha de l trnspreneF g9est un nomre ompris entre H @imge totlement trnsprenteD don invisileA et PSS @imge totlement opqueD omme s9il n9y vit ps de trnsprene elphAF lus le nomre Alpha est petitD plus l9imge est trnsprente et fondueF oii pr exemple un ode qui pplique une trnsprene elph de IPV notre ozor X
1 2
3 4 5
zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB rnsprene elph moyenne @ IPV A X BG hvetelph @ zozor D hvgevre D IPV A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor AY
ous noterez que j9i onserv l trnsprene de SDL_SetColorKeyF ves deux types de trnsprene sont en e'et ominlesF v (gF PPFT vous montre quoi ressemle ozor selon l vleur AlphaF
La transparence Alpha 128 (transparence moyenne) est une valeur spciale qui est optimise par la SDL. Ce type de transparence est plus rapide calculer pour votre ordinateur que les autres. C'est peut tre bon savoir si vous utilisez beaucoup de transparence Alpha dans votre programme.
QSI
le qsp et le tiqF tome ienD il existe justement une iliothque SDL_Image qui gre tous les formts suivnts X ! qe Y ! fw Y ! xw Y ! w Y ! gp Y ! g Y ! qsp Y ! tq Y ! sp Y ! vfw Y ! xqF sl est en fit possile de rjouter des extensions l hvF ge sont des iliothques qui ont esoin de l hv pour fontionnerF yn peut voir omme des add-ons F SDL_Image est l9une d9entre ellesF
4
ne pge spile du site de l hv rfrene les iliothques utilisnt l hvF gette pge s9intitule LibrariesD vous trouverez un lien dns le menu de guheF ous pourrez voir qu9il y euoup de iliothques disponilesF gellesEi ne proviennent gnrleE ment ps des uteurs de l hvD e sont plutt des utilisteurs de l hv qui proposent leurs iliothques pour mliorer l hvF gertines sont trs onnes et mritent le dtourD d9utres sont moins onnes et enore oguesF sl fut rriver fire le triF gherhez SDL_Image dns l listeF F F vous rriverez sur l pge ddie SDL_ImageF lhrger SDL_Image gode we X RQRTUP lhrgez l version de SDL_Image qui vous orrespond dns l setion Binary @ne prenez e l soureD on n9en ps esoin 3AF i vous tes sous indowsD tlhrgez SDL_image-devel-1.2.10-VC.zipD et e mme si vous n9utilisez ps isul gCC 3
Installation
hns e FzipD vous trouverez X ! SDL_image.h X le seul heder dont esoin l iliothque SDL_ImageF lezEle dns C:\Program Files\CodeBlocks\SDL-1.2.13\includeD 9estEEdire t des utres heders de l hv Y
4. On emploie aussi parfois le mot greon , plus franais.
QSP
! !
donAF insuiteD vous devez modi(er les options de votre projet pour linker ve le (hier SDL_image.libF i vous tes sous gode: :floks pr exempleD llez dns le menu Projects / Build optionsF hns l9onglet LinkerD liquez sur le outon Add et indiquez o se trouve le (hier SDL_image.lib @(gF PPFUAF
SDL_image.lib X opiez dns C:\Program Files\CodeBlocks\SDL-1.2.13\libF yuiD je sisD je vous i dit que normlement les .lib tient des (hiers rservs isulD mis ii exeptionnellement le .lib fontionner mme ve le ompilteur mingw Y plusieurs hvv X plezEles toutes dns le dossier de votre projet @ t de SDL.dllD
i on vous demnde Keep as a relative path ?D rpondez e que vous voulezD ne hnger rien dns l9immditF te reommnde de rpondre pr l ngtiveD personnelE lementF insuiteD vous n9vez plus qu9 inlure le heder SDL_image.h dns votre ode soureF elon l9endroit o vous vez pl le (hier SDL_image.hD vous devrez soit utiliser e ode X
1
5 inlude ` hv G hvimge Fh b
QSQ
F F F soit eluiEi X
1
5 inlude ` hvimge Fh b
search paths
du projet
F F F u lieu d9utiliser des hevrons < >F emplez don l ligne d9include de SDL_image dns le ode qui v suivre pr elle que je viens de vous donnerF QSR
eutre on point X si l9imge que vous hrgez gre l trnsprene @omme 9est le s des xq et des qspAD lors SDL_image tiver utomtiquement l trnsprene pour ette imge 3 gel vous vite don d9voir ppeler SDL_SetColorKeyF te vis vous prsenter le ode soure qui hrge sapin.png et l90he F xotez ien que j9inlue SDL/SDL_image.h et que je ne fis ps ppel SDL_SetColorKey r mon xq est nturellement trnsprentF ous llez voir que j9utilise IMG_Load prtout dns e ode en remplement de SDL_LoadBMPF
5 1 2 3 4
5 inlude ` stdli Fh b 5 inlude ` stdio Fh b 5 inlude ` hv G hv Fh b 5 inlude ` hv G hvimge Fh b GB snlusion du heder de hvimge @ dpter le dossier u esoin A BG int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B imgehepond a xvv D B spin a xvv Y hvet positionpond D positionpin Y GB FFF ghrgement de l hv et d ' une imge de fond BG GB ghrgement d ' un xq ve swqvod gelui E i est utomtiquement rendu trnsprent r les informtions de trnsprene sont od es l ' int rieur du fihier xq BG spin a swqvod @ 4 spin F png 4A Y hvfliturfe @ spin D xvv D ern D 8 positionpin A Y hvplip @ ern AY
5 6 7 8
9 10 11 12 13 14
15 16 17 18 19
5. Je l'ai un peu raccourci pour ne pas encombrer le livre de codes source rptitifs que vous avez dj vus plusieurs fois. Si vous voulez obtenir le code source complet, n'hsitez pas vous rendre au code web indiqu.
QSS
gopier e ode gode we X SPVSRV gomme on peut le voir sur l (gF PPFWD l9imge xq t insre ve l trnsprene sur l9imge de fond 3
En rsum
! v hv permet de hrger des imges dns des surfesF r dfutD elle ne gre que les fw ve SDL_LoadBMPF ! yn peut d(nir une ouleur trnsprente ve SDL_SetColorKeyF ! yn peut rendre l9ensemle de l9imge plus ou moins trnsprent ve l fontion SDL_SetAlpha F QST
! v iliothque SDL_image permet d9insrer n9importe quel type d9imge @xqD tiqF F FA ve IMG_LoadF sl fut ependnt l9instller en plus de l hvF
QSU
QSV
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 !
QSW
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 pause() 3 in e'etD le rle de l fontion pause tit d9ttendre que l9utilisteur demnde fermer le progrmmeF i on n9vit ps r ette fontionD l fentre se serit 0he et ferme en un lir 3
partir de maintenant, vous pouvez oublier la fonction pause. Supprimez-la de votre code source, car nous allons apprendre la reproduire.
La variable d'vnement
our triter des vnementsD vous urez esoin de dlrer une vrile @juste une seuleD rssurezEvousA de type SDL_EventF eppelezEl omme vous voulez X moiD je vis l9ppeler eventD e qui signi(e vnement en nglisF
1
hvivent event Y
QTH
our nos tests nous llons nous ontenter d9un main trs sique qui 0he juste une fentreD omme on l9 vu quelques hpitres plus ttF oii quoi doit ressemler votre main X
1 2 3 4
int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y GG gette vrile servir plus trd g rer les v nements hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y hvuit @A Y } return isggi Y
5 6 7 8 9 10 11 12 13 14
gopier e ode gode we X VRPPTS g9est don un ode trs siqueD il ne ontient qu9une nouveut X l dlrtion de l vrile event dont nous llons ientt nous servirF estez e ode X omme prvuD l fentre v s90her et se fermer immditement prsF
int ontinuer a I Y
ge oolen est mis I u dprt r on veut que l oule se rpte ex i l vrile continuer vut I @vriAF hs qu9elle vudr H @fuxAD lors on sortir de l oule et le progrmme s9rrterF oii l oule rer X
1 2 3 4
oil X on pour le moment une oule in(nie qui ne s9rrter que si on met l vrile continuer HF g9est e que nous llons rire l9intrieur de ette oule qui est le plus intressntF QTI
Rcupration de l'vnement
wintenntD fisons ppel une fontion de l hv pour demnder si un vnement s9est produitF yn dispose de deux fontions qui font elD mis d9une mnire di'rente X ! SDL_WaitEvent X elle ttend qu9un vnement se produiseF gette fontion est dite loqunte r elle suspend l9exution du progrmme tnt qu9uun vnement ne s9est produit Y ! SDL_PollEvent X ette fontion fit l mme hose mis n9est ps loqunteF ille vous dit si un vnement s9est produit ou nonF wme si uun vnement ne s9est produitD elle rend l min votre progrmme de suiteF ges deux fontions sont utilesD mis dns des s di'rentsF our fire simpleD si vous utilisez SDL_WaitEvent votre progrmme utiliser trs peu de proesseur r il ttenE dr qu9un vnement se produiseF in revnheD si vous utilisez SDL_PollEventD votre progrmme v prourir votre oule while et rppeler SDL_PollEvent ind(niment jusqu9 e qu9un vnement se soit produitF tous les oupsD vous utiliserez IHH 7 du proesseurF
Mais alors, il faut tout le temps utiliser utilise moins le processeur, non ?
SDL_WaitEvent
si cette fonction
xonD r il y des s o SDL_PollEvent se rvle indispensleF g9est le s des jeux dns lesquels l9rn se met jour mme qund il n9y ps d9vnementF renons pr exemple etris X les los desendent tout seulsD il n9y ps esoin que l9utilisteur re d9vnement pour 3 i on vit utilis SDL_WaitEventD le progrmme serit rest loqu dns ette fontion et vous n9uriez ps pu mettre jour l9rn pour fire desendre les los 3
Comment fait SDL_WaitEvent pour ne pas consommer de processeur ? Aprs tout, la fonction est bien oblige de faire une boucle innie pour tester tout le temps s'il y a un vnement ou non, n'est-ce pas ?
g9est une question que je me posis il y enore peu de tempsF v rponse est un petit peu omplique r onerne l fon dont l9y gre les proessus @les progrmmesAF i vous voulez ! mis je vous en prle rpidement !D ve SDL_WaitEventD le proessus de votre progrmme est mis en puse F otre progrmme n9est don plus trit pr le proesseurF sl ser rveill pr l9y u moment o il y ur un vnementF hu oupD le proesseur se remettr trviller sur votre progrmme e momentElF gel explique pourquoi votre progrmme ne onsomme ps de proesseur pendnt qu9il ttend l9vnementF te omprends que e soit un peu strit pour vous pour le momentF it dire vriD vous n9vez ps esoin de omprendre mintenntF ous ssimilerez mieux toutes les di'renes plus loin en prtiquntF our le momentD nous llons utiliser SDL_WaitEvent r notre progrmme reste trs simpleF ges deux fontions s9utilisent de toute fon de l mme mnireF QTP
ous devez envoyer l fontion l9dresse de votre vrile event qui stoke l9vneE mentF gomme ette vrile n9est ps un pointeur @regrdez l dlrtion nouveuAD nous llons mettre le symole & devnt le nom de l vrile (n de donner l9dresse X
1
hvitivent @8 event A Y
Analyse de l'vnement
wintenntD nous disposons d9une vrile event qui ontient des informtions sur l9vnement qui s9est produitF sl fut regrder l sousEvrile event.type et fire un test sur s vleurF qnrlement on utilise un switch pour tester l9vnementF
Mais comment sait-on quelle valeur correspond l'vnement Quitter , par exemple ?
v hv nous fournit des onstntesD e qui simpli(e grndement l9riture du proE grmmeF sl en existe euoup @utnt qu9il y d9vnements possilesAF xous les verrons u fur et mesure tout u long de e hpitreF
1 2 3
4 5 6
7 8 9 10
while @ ontinuer A { hvitivent @8 event A Y GB up rtion de l ' v nement dns event BG swith @ event F type A GB est du type d ' v nement BG { se hvs X GB i ' est un v nement de type 4 uitter 4 BG ontinuer a H Y rek Y } }
oii omment fontionneF IF hs qu9il y un vnementD l fontion SDL_WaitEvent renvoie et vnement dns eventF PF yn nlyse le type d9vnement gre un switchF ve type de l9vnement se trouve dns event.type QF yn teste l9ide de case dns le switch le type de l9vnementF our le momentD on ne teste que l9vnement SDL_QUIT @demnde de fermeture du progrmmeAD r 9est le seul qui nous intresseF QTQ
! i 9est un vnement SDL_QUITD 9est que l9utilisteur demnd quitter le progrmmeF hns e s on met le oolen continuer HF eu prohin tour de ouleD l ondition ser fusse et don l oule s9rrterF ve progrmme s9rrter ensuiteF ! i e n9est ps un vnement SDL_QUITD 9est qu9il s9est pss utre hose X l9utilisteur ppuy sur une touheD liqu ou tout simplement oug l souris dns l fentreF gomme es utres vnements ne nous intressent psD on ne les trite psF yn ne fit don rien X l oule reommene et on ttend nouveu un vnement @on reprt l9tpe IAF ge que je viens de vous expliquer ii est extrmement importntF i vous vez ompris e odeD vous vez tout ompris et le reste du hpitre ser trs file pour vousF
Le code complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y GB v vrile ontennt l ' v nement BG int ontinuer a I Y GB xotre ool en pour l oule BG hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y while @ ontinuer A GB ex i l vrile ne vut ps H BG { hvitivent @8 event A Y GB yn ttend un v nement qu ' on r up re dns event BG swith @ event F type A GB yn teste le type d ' v nement BG { se hvs X GB i ' est un v nement si BG ontinuer a H Y GB yn met le ool en H D don l oule v s ' rr ter BG rek Y } } hvuit @A Y } return isggi Y
15 16 17 18
19 20 21 22 23 24 25 26
gopier e ode gode we X VSWVPQ oil le ode ompletF sl n9y rien de ien di0ile X si vous vez suivi jusqu9iiD ne QTR
LE CLAVIER
devrit ps vous surprendreF h9illeursD vous remrquerez qu9on n9 fit que reproduire e que fisit l fontion pause F
1
Le clavier
xous llons mintennt tudier les vnements produits pr le lvierF i vous vez ompris le dut du hpitreD vous n9urez uun prolme pour triter les utres types d9vnementsF sl n9y rien de plus fileF ourquoi estEe si simple c re que mintennt que vous vez ompris le fontionneE ment de l oule in(nieD tout e que vous llez voir fireD 9est d9jouter d9utres case dns le switch pour triter d9utres types d9vnementsF ne devrit ps tre trop durF
while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X GB i ppui sur une touhe BG ontinuer a H Y rek Y } }
QTS
Rcuprer la touche
voir qu9une touhe t enfone 9est ienD mis svoir lquelleD 9est qund mme mieux 3 yn peut otenir l nture de l touhe enfone gre une sousEsousEsousEvrile @oufA qui s9ppelle event.key.keysym.symF gette vrile ontient l vleur de l touhe qui t enfone F
2
L'avantage, c'est que la SDL permet de rcuprer la valeur de toutes les touches du clavier. Il y a les lettres et les chires, bien sr (ABCDE0123. . .), mais aussi la touche Echap, ou encore Impr. Ecran, Suppr, Entre, etc.
sl y une onstnte pour hune des touhes du lvierF ous trouverez ette liste dns l doumenttion de l hvD que vous vez trs prolement tlhrge ve l iliothque qund vous vez d l9instllerF i tel n9est ps le sD je vous reommnde fortement de retourner sur le site de l hv et d9y tlhrger l doumenttionD r elle est trs utileF ous trouverez l liste des touhes du lvier dns l setion Keysym definitionsF gette liste est trop longue pour tre prsente ii @voir un peru (gF PQFPAD ussi je vous propose pour el de onsulter l doumenttion sur le we diretementF gonsulter l doumenttion gode we X PQSSPW
fien entenduD l doumenttion est en nglis et donF F F l liste ussiF i vous voulez vriment progrmmerD il est importnt d9tre ple de lire l9nglis r toutes les doumenttions sont dns ette lngueD et vous ne pouvez ps vous en psser 3 sl y deux tleux dns ette liste X un grnd @u dutA et un petit @ l (nAF xous nous intresserons u grnd tleuF hns l premire olonne vous vez l onstnteD dns l seonde l reprsenttion quivlente en egss et en(nD dns l troisime olonneD vous vez une desription de l touheF renons pr exemple l touhe Echap @ ispe en nglisAF yn peut vri(er si l
3
2. Elle fonctionne aussi lors d'un relchement de la touche SDL_KEYUP. 3. Notez que certaines touches comme Maj (ou Shift) n'ont pas de valeur ASCII correspondante.
QTT
LE CLAVIER
4 5 6
swith @ event F key F keysym F sym A { se hvuigei X GB eppui sur l touhe ihp D on rr te le progrmme BG ontinuer a H Y rek Y }
J'utilise un switch pour faire mon test mais j'aurais aussi bien pu utiliser un if. Toutefois, j'ai plutt tendance me servir des switch quand je traite les vnements car je teste beaucoup de valeurs direntes (en pratique, j'ai beaucoup de case dans un switch, contrairement ici).
13 14 15 16 17 18
while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X GB eppui sur l touhe ihp D on rr te le progrmme BG ontinuer a H Y rek Y } rek Y } }
gette foisD le progrmme s9rrte si on ppuie sur Echap ou si on lique sur l roix de l fentreF
Maintenant que vous savez comment arrter le programme en appuyant sur une touche, vous tes autoriss faire du plein cran si a vous amuse . Auparavant, je vous avais demand d'viter de le faire car on ne savait pas comment arrter un programme en plein cran (il n'y a pas de croix sur laquelle cliquer pour arrter !).
4
QTU
Charger l'image
our ommenerD nous llons hrger une imgeF yn v fire simple X on v reprendre l9imge de ozor utilise dns le hpitre prdentF grez don l surfe zozorD hrgez l9imge et rendezEl trnsprente @9tit un fwD je vous le rppelleAF
1 2
zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y
insuiteD et 9est ertinement le plus importntD vous devez rer une vrile de type SDL_Rect pour retenir les oordonnes de ozor X
1
hvet positionozor Y
te vous reommnde d9initiliser les oordonnesD en mettnt soit x a H et y a H @position en hut guhe de l fentreAD soit en entrnt ozor dns l fentre omme vous vez ppris le fire il n9y ps si longtempsF
1 2 3
Vous devez initialiser positionZozor aprs avoir charg les surfaces ecran et zozor. En eet, j'utilise la largeur (w) et la hauteur (h) de ces deux surfaces pour calculer la position centre de Zozor l'cran, il faut donc que ces surfaces aient t initialises auparavant.
i vous vous tes ien drouillsD vous devriez voir russi 0her ozor u entre de l9rn @(gF PSFIAF t9i hoisi de mettre le fond en ln ette fois @en fisnt un SDL_FillRect sur ecranAD mis e n9est ps une oligtionF
8 9 10 11
while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvg X GB qestion des v nements de type g BG se hvfshvi X GB qestion des v nements de type fshvi BG } GB yn effe l ' rn @ ii fond ln A X BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GB yn fit tous les hvfliturfe n essires pour oller les surfes l ' rn BG GB yn met jour l ' ffihge X BG hvplip @ ern AY
12 13
14 15 16 17
oil dns les grndes lignes l forme de l oule priniple d9un progrmme hvF yn oule tnt qu9on n9 ps demnd rrter le progrmmeF QTW
IF On attend un vnement @SDL_WaitEventA ou ien on vri(e s9il y un vnement mis on n9ttend ps qu9il y en it un @SDL_PollEventAF our le moment on se ontente de SDL_WaitEventF PF yn fit un @grndA switch pour svoir de quel type d9vnement il s9git @vE nement de type TRUCD de type BIDULED omme vous hnte 3AF On traite l'vnement qu'on a reu X on e'etue ertines tionsD ertins lulsF QF ne fois sorti du switchD on prpre un nouvel 0hge X @A premire hose fire X on eace l'cran ve un SDL_FillRectF i on ne le fisit psD on urit des tres de l9nien rn qui susisterientD et formentD e ne serit ps trs joli Y @A ensuiteD on fit tous les blits nessires pour oller les surfes sur l9rn Y @A en(nD une fois que 9est fitD on met jour l'achage ux yeux de l9utiE listeurD en ppelnt l fontion SDL_Flip(ecran)F
swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvu X GG pl he hut positionozor Fy E EY rek Y se hvuhyx X GG pl he s positionozor F y CCY rek Y se hvusqr X GG pl he droite positionozor F x CCY rek Y se hvuvip X GG pl he guhe positionozor Fx E EY rek Y } rek Y }
gomment j9i trouv es onstntes c hns l do9 3 te vous i donn tout l9heure un lien vers l pge de l do9 qui liste toutes les touhes du lvier X 9est l que je me suis serviF QUH
gonsulter l doumenttion gode we X PQSSPW ge qu9on fit l est trs simple X ! si on ppuie sur l )he hut D on diminue l9ordonne @yA de l position de ozor d9un pixel pour le fire monter Y ! si on v vers le sD on doit u ontrire ugmenter @inrmenterA l9ordonne de ozor @yA Y ! si on v vers l droiteD on ugmente l vleur de l9sisse @xA Y ! si on v vers l guheD on doit diminuer l9sisse @xAF it mintennt c in vous idnt du shm de ode donn prdemmentD vous devriez tre ples de diriger ozor u lvier 3
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B zozor a xvv Y hvet positionozor Y hvivent event Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi A Y hvwetgption @ 4 qestion des v nements en hv 4 D xvv A Y GB ghrgement de ozor BG zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y GB yn entre ozor l ' rn BG positionozor F x a ern E b w G P E zozor E b w G P Y positionozor F y a ern E b h G P E zozor E b h G P Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvu X GG pl he hut positionozor Fy E EY
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
5. Notez que nous ne sommes pas obligs de le dplacer d'un pixel, on pourrait trs bien le dplacer de 10 pixels en 10 pixels.
QUI
} rek Y
rek Y se hvuhyx X GG pl he s positionozor F y CCY rek Y se hvusqr X GG pl he droite positionozor F x CCY rek Y se hvuvip X GG pl he guhe positionozor Fx E EY rek Y
50 51 52 53 54 55 56 57 58 59 60
GB yn effe l ' rn BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GB yn ple ozor s nouvelle position BG hvfliturfe @ zozor D xvv D ern D 8 positionozor AY GB yn met jour l ' ffihge BG hvplip @ ern A Y
gopier e ode gode we X PSPIVV sl est primordil de ien omprendre omment est ompose l oule priniple du progrmmeF sl fut tre ple de l refire de tteF elisez le shm de ode que vous vez vu plus hutD u esoinF hon en rsumD on une grosse oule ppele foule priniple du progrmme F ille ne s9rrter que si on le demnde en mettnt le oolen continuer HF hns ette ouleD on rupre d9ord un vnement triterF yn fit un switch pour dterminer de quel type d9vnement il s9gitF in fontion de l9vnementD on e'etue di'rentes tionsF siD je mets jour les oordonnes de ozor pour donner l9impression qu9on le dpleF insuiteD prs le switch vous devez mettre jour votre rn omme suitF IF remirementD vous e'ez l9rn vi un SDL_FillRect @de l ouleur de fond que vous voulezAF PF insuiteD vous littez vos surfes sur l9rnF siD je n9i eu esoin de litter que ozor r il n9y que luiF ous noterezD et 9est trs importntD que je litte ozor positionZozor 3 g9est l que l di'rene se fit X si j9i mis jour QUP
Quelques optimisations
Rptition des touches
our l9instntD notre progrmme fontionne mis on ne peut se dpler que d9un pixel l foisF xous sommes oligs d9ppuyer nouveu sur les )hes du lvier si on veut enore se dpler d9un pixelF te ne sis ps vousD mis moi m9muse moyennement de m9exiter frntiquement sur l mme touhe du lvier juste pour dpler le personnge de PHH pixelsF reureusementD il y SDL_EnableKeyRepeat 3 gette fontion permet d9tiver l rE ptition des touhesF ille fit en sorte que l hv rgnre un vnement de type SDL_KEYDOWN si une touhe est mintenue enfone un ertin tempsF gette fontion peut tre ppele qund vous voulezD mis je vous onseille de l9ppeler de prfrene vnt l oule priniple du progrmmeF ille prend deux prmtres X QUQ
! l dure @en milliseondesA pendnt lquelle une touhe doit rester enfone vnt d9tiver l rptition des touhes Y ! le dli @en milliseondesA entre hque gnrtion d9un vnement SDL_KEYDOWN une fois que l rptition t tiveF ve premier prmtre indique u out de omien de temps on gnre une rptition l premire foisD et le seond indique le temps qu9il fut ensuite pour que l9vnement se rpteF ersonnellementD pour des risons de )uiditD je mets l mme vleur es deux prmtresD le plus souventF issyez ve une rptition de IH ms X
1
hvinleueyepet @ IH D IH A Y
wintenntD vous pouvez lisser une touhe du lvier enfoneF ous llez voirD 9est qund mme mieux 3
Travailler avec le double buer
prtir de mintenntD il serit on d9tiver l9option de double buering de l hvF ve doule u'ering est une tehnique ourmment utilise dns les jeuxF ille permet d9viter un sintillement de l9imgeF ourquoi l9imge sintilleritEelle c re que qund vous dessinez l9rnD l9utilisteur voit qund vous dessinez et don qund l9rn s9e'eF wme si v trs viteD notre erveu peroit un lignotement et 9est trs dsgrleF v tehnique du doule u'ering onsiste utiliser deux rns X l9un est rel @elui que l9utilisteur est en trin de voir sur son moniteurAD l9utre est virtuel @9est une imge que l9ordinteur est en trin de onstruire en mmoireAF ges deux rns lternent X l9rn e est 0h pendnt que l9utre @l9rn fA en rrireEpln prpre l9imge suivnte @(gF PQFSAF
Figure PQFS ! in doule u'eringD l9imge suivnte est prpre en the de fond
ne fois que l9imge en rrireEpln @l9rn fA t dessineD on intervertit les deux QUR
Figure PQFT ! SDL_Flip intervertit les rns pour 0her l nouvelle imge
v9rn e prt en rrireEpln prprer l9imge suivnteD tndis que l9imge de l9rn f s90he diretement et instntnment ux yeux de l9utilisteurF sultt X uun sintillement 3 our rliser elD tout e que vous vez fire est de hrger le mode vido en joutnt le )g SDL_DOUBLEBUF X
1
ous vous demndez peutEtre pourquoi on dj utilis SDL_Flip uprvnt sns le doule u'ering c in fitD ette fontion deux utilits X ! si le doule u'ering est tivD elle sert ommnder l9hnge des rns qu9on vient de voir Y ! si le doule u'ering n9est ps tivD elle ommnde un rfrhissement mnuel de l fentreF gette tehnique est vlle dns le s d9un progrmme qui ne ouge ps euoupD mis pour l pluprt des jeuxD je reommnde de l9tiverF hornvntD j9uri toujours le doule u'ering tiv dns mes odes soure F i vous le souhitezD vous pouvez ruprer le ode soure omplet qui fit usge du doule u'ering et de l rptition des touhesF sl est trs similire elui que l9on vu prdemmentD on y seulement jout les nouvelles instrutions qu9on vient d9pprendreF
6
QUS
La souris
ous vous dites peutEtre que grer l souris est plus ompliqu que le lvier c ue nenni 3 g9est mme plus simpleD vous llez voir 3 v souris peut gnrer trois types d9vnements di'rentsF ! SDL_MOUSEBUTTONDOWN X lorsqu9on lique ve l sourisF gel orrespond u moment o le outon de l souris est enfonF ! SDL_MOUSEBUTTONUP X lorsqu9on relhe le outon de l sourisF out el fontionne extement sur le mme prinipe que les touhes du lvier X il y d9ord un ppuiD puis un relhement du outonF ! SDL_MOUSEMOTION X lorsqu9on dple l sourisF hque fois que l souris ouge dns l fentre @ne seritEe que d9un pixel 3AD un vnement SDL_MOUSEMOTION est gnr 3 xous llons d9ord trviller ve les lis de l souris et plus prtiulirement ve SDL_MOUSEBUTTONUPF yn ne trviller ps ve SDL_MOUSEBUTTONDOWN iiD mis vous svez de toute mnire que 9est extement preil suf que el se produit plus ttD u moment de l9enfonement du outon de l sourisF xous verrons un peu plus loin omment triter l9vnement SDL_MOUSEMOTIONF
swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X GB gli de l souris BG rek Y }
tusqueElD ps de di0ult mjeureF uelles informtions peutEon ruprer lors d9un li de l souris c sl y en deux X ! le bouton de la souris ve lequel on liqu @li guhe c li droit c li outon du milieu cA Y ! les coordonnes de la souris u moment du li @x et yAF QUT
LA SOURIS
yn v d9ord voir ve quel outon de l souris on liquF our elD il fut nlyser l sousEvrile event.button.button @nonD je ne gie psA et omprer s vleur ve l9une des S onstntes suivntes X ! SDL_BUTTON_LEFT X li ve le outon guhe de l souris Y ! SDL_BUTTON_MIDDLE X li ve le outon du milieu de l souris Y ! SDL_BUTTON_RIGHT X li ve le outon droit de l souris Y ! SDL_BUTTON_WHEELUP X molette de l souris vers le hut Y ! SDL_BUTTON_WHEELDOWN X molette de l souris vers le sF
7
Les deux dernires constantes correspondent au mouvement vers le haut ou vers le bas auquel on procde avec la molette de la souris. Elles ne correspondent pas un clic sur la molette comme on pourrait le penser tort.
yn v fire un test simple pour vri(er si on fit un li droit ve l sourisF i on fit un li droitD on rrte le progrmme @ouiD je sisD e n9est ps trs originl pour le moment mis permet de testerA X
1 2 3 4 5 6 7
8 9 10
swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X if @ event F utton F utton aa hvfyxsqr A GB yn rr te le progrmme si on fit un li droit BG ontinuer a H Y rek Y }
ous pouvez testerD vous verrez que le progrmme s9rrte si on fit un li droitF
Rcuprer les coordonnes de la souris
oil une informtion trs intressnte X les oordonnes de l souris u moment du li 3 yn les rupre l9ide de deux vriles @pour l9sisse et l9ordonneA X event.button.x et event.button.yF emusonsEnous un petit peu X on v litter ozor l9endroit du li de l sourisF gomE pliqu c s du tout 3 issyez de le fireD 9est un jeu d9enfnt 3 oii l orretion X
1 2 3
QUU
swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyx X positionozor F x a event F utton F x Y positionozor F y a event F utton F y Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor AY GB yn ple ozor s nouvelle position BG hvplip @ ern A Y
16
17 18
ressemle s9y mprendre e que je fisis ve les touhes du lvierF vD 9est mme enore plus simple X on met diretement l vleur de x de l souris dns positionZozor.xD et de mme pour yF insuite on litte ozor es oordonnesElD et voil le trvil @(gF PQFUA 3
etit exerie trs simple X pour le momentD on dple ozor quel que soit le outon de QUV
LA SOURIS
l souris utilis pour le liF issyez de ne dpler ozor que si on fit un li guhe ve l sourisF i on fit un li droitD rrtez le progrmmeF
s du tout X rssurezEvousD il en vu d9utres 3 fonD que peutEon ruprer d9intressnt ii c ves oordonnes de l sourisD ien sr 3 yn les trouve dns event.motion.x et event.motion.yF
Faites attention : on n'utilise pas les mmes variables que pour le clic de souris de tout l'heure (avant, c'tait event.button.x). Les variables utilises sont direntes en SDL en fonction de l'vnement.
yn v pler ozor ux mmes oordonnes que l sourisD l enoreF ous llez voirD 9est rudement e0e et toujours ussi simple 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyiwysyx X positionozor F x a event F motion F x Y positionozor F y a event F motion F y Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y GB yn ple ozor s nouvelle position BG hvplip @ ern AY
16
17 18
fougez votre ozor l9rnF ue voyezEvous c sl suit nturellement l souris o que QUW
vous lliezF g9est euD 9est rpideD 9est )uide @vive le doule u'eringAF
yn peut msquer le urseur de l souris trs filementF sl su0t d9ppeler l fontion SDL_ShowCursor et de lui envoyer un )g X ! SDL_DISABLE X msque le urseur de l souris Y ! SDL_ENABLE X r0he le urseur de l sourisF r exemple X
1
hvhowgursor @ hvhsefvi A Y
ve urseur de l souris rester msqu tnt qu9il ser l9intrieur de l fentreF wsquez de prfrene le urseur vnt l oule priniple du progrmmeF s l peine en e'et de le msquer hque tour de ouleD une seule fois su0tF
Placer la souris un endroit prcis
yn peut pler mnuellement le urseur de l souris ux oordonnes que l9on veut dns l fentreF yn utilise pour el SDL_WarpMouse qui prend pour prmtres les oordonnes x et y o le urseur doit tre plF r exempleD le ode suivnt ple l souris u entre de l9rn X
1
Lorsque vous faites un WarpMouse, un vnement de type SDL_MOUSEMOTION sera gnr. Eh oui, la souris a boug ! Mme si ce n'est pas l'utilisateur qui l'a fait, il y a quand mme eu un dplacement.
gommenons pr tudier le premier d9entre eux X l9vnement gnr lors du redimenE sionnement de l fentreF
Redimensionnement de la fentre
r dfutD une fentre hv ne peut ps tre redimensionne pr l9utilisteurF te vous rppelle que pour hnger D il fut jouter le )g SDL_RESIZABLE dns l fontion SDL_SetVideoMode X
1
ne fois que vous vez jout e )gD vous pouvez redimensionner l fentreF vorsque vous fites elD un vnement de type SDL_VIDEORESIZE est gnrF ous pouvez ruprer X ! l nouvelle lrgeur dns event.resize.w Y ! l nouvelle huteur dns event.resize.hF yn peut utiliser es informtions pour fire en sorte que notre ozor soit toujours entr dns l fentre X
1 2 3 4
se hvshiyisi X positionozor F x a event F resize F w G P E zozor E b w G P Y positionozor F y a event F resize F h G P E zozor E b h G P Y rek Y
Visibilit de la fentre
v9vnement SDL_ACTIVEEVENT est gnr lorsque l visiilit de l fentre hngeF gel peut tre d de nomreuses hoses X ! l fentre est rduite en rre des thes ou resture Y ! le urseur de l souris se trouve l9intrieur de l fentre ou en sort Y ! l fentre est tive @u premier plnA ou n9est plus tiveF
En programmation, on parle de focus . Lorsqu'on dit qu'une application a le focus, c'est que le clavier ou la souris de l'utilisateur s'y trouve. Tous les clics sur la souris ou appuis sur les touches du clavier que vous ferez seront envoys la fentre qui a le focus et non aux autres. Une seule fentre peut avoir le focus un instant donn (vous ne pouvez pas avoir deux fentres au premier plan en mme temps !).
tnt donn le nomre de risons qui peuvent voir provoqu et vnementD il fut imprtivement regrder dns des vriles pour en svoir plusF ! event.active.gain X indique si l9vnement est un gin @IA ou une perte @HAF r exempleD si l fentre est psse en rrireEpln 9est une perte @HAD si elle est remise u premier pln 9est un gin @IAF QVI
qui s9est produitF oii l liste des )gs possiles X ! SDL_APPMOUSEFOCUS X le urseur de l souris vient de rentrer ou de sortir de l fentreF sl fut regrder l vleur de event.active.gain pour svoir si elle est rentre @gin a IA ou sortie @gin a HA de l fentre Y ! SDL_APPINPUTFOCUS X l9pplition vient de reevoir le fous du lvier ou de le perdreF gel signi(e en fit que votre fentre vient d9tre mise u premier pln ou en rrireEplnF inore une foisD il fut regrder l vleur de event.active.gain pour svoir si l fentre t mise u premier pln @gin a IA ou en rrireEpln @gin a HA Y ! SDL_APPACTIVE X l9ppliton t icnieD 9estEEdire rduite dns l rre des thes @gin a HAD ou remise dns son tt norml @gin a IAF ous suivez toujours c sl fut ien omprer les vleurs des deux sousEvriles gain et state pour svoir extement e qui s9est produitF
Tester la valeur d'une combinaison de ags
event.active.state est une ominison de )gsF gel signi(e que dns un vneE mentD il peut se produire deux hoses l fois @pr exempleD si on rduit l fentre dns l rre des thesD on perd ussi le fous du lvier et de l sourisAF sl v don flloir fire un test un peu plus ompliqu qu9un simpleF F F
1
re que 9est une ominison de itsF te ne vis ps vous fire un ours sur les oprtions logiques it it iiD serit un peu trop pour e ours et vous n9vez ps nessirement esoin d9en onntre dvntgeF te vis vous proposer un ode prt l9emploi qu9il fut utiliser pour tester si un )g est prsent dns une vrile sns rentrer dns les dtilsF our tester pr exemple s9il y eu un hngement de fous de l sourisD on doit rire X
1
sl n9y ps d9erreurF ettentionD 9est pris X il fut un seul & et deux =D et il fut ien utiliser les prenthses omme je l9i fitF gel fontionne de l mme mnire pour les utres vnementsF r exemple X
1
QVP
hns l prtiqueD vous voudrez srement tester l9tt et le gin l foisF ous pourrez insi svoir extement e qui s9est pssF upposons que vous yez un jeu qui fit fire euoup de luls l9ordinteurF ous voulez que le jeu se mette en puse utomtiquement lorsque l fentre est rduiteD et qu9il se relne lorsque l fentre est restureF gel vite que le jeu ontinue pendnt que le joueur n9est plus tif et el vite ussi u proesseur de fire trop de luls pr l mme osionF ve ode iEdessous met en puse le jeu en tivnt un oolen pause IF sl remet en mrhe le jeu en dstivnt le oolen HF
1 2 3 4 5
6 7
if @@ event F tive F stte 8 hveegsi A aa hveegsi A { if @ event F tive F gin aa H A GB v fen tre t r duite BG puse a I Y else if @ event F tive F gin aa I A GB v fen tre t restur e BG puse a H Y }
Bien entendu, ce code n'est pas complet. Ce sera vous de tester l'tat de la variable pause pour savoir s'il faut ou non eectuer les calculs de votre jeu.
te vous lisse fire d9utres tests pour les utres s @pr exempleD vri(er si le urseur de l souris est l9intrieur ou l9extrieur de l fentreAF ous pouvez " pour vous entrner " fire ouger ozor vers l droite lorsque l souris rentre dns l fentreD et le fire ouger vers l guhe lorsqu9elle en sortF
En rsum
! ves vnements sont des signux que vous envoie l hv pour vous informer d9une tion de l prt de l9utilisteur X ppui sur une touheD mouvement ou li de l sourisD fermeture de l fentreD etF ! ves vnements sont ruprs dns une vrile de type SDL_Event ve l fonE tion SDL_WaitEvent @fontion loqunte mis file grerA ou ve l fontion SDL_PollEvent @fontion non loqunte mis plus omplexe mnipulerAF ! sl fut nlyser l sousEvrile event.type pour onntre le type d9vnement qui s9est produitF yn le fit en gnrl dns un switchF ! ne fois le type d9vnement dterminD il est le plus souvent nessire d9nlyser l9vnement dns le dtilF r exempleD lorsqu9une touhe du lvier t enfone @SDL_KEYDOWNA il fut nlyser event.key.keysym.sym pour onntre l touhe en questionF ! ve doule u'ering est une tehnique qui onsiste hrger l9imge suivnte en the QVQ
de fond et l90her seulement une fois qu9elle est prteF gel permet d9viter des sintillements dsgrles l9rnF
QVR
Chapitre
24
Dicult :
TP : Mario Sokoban
a bibliothque SDL fournit, comme vous l'avez vu, un grand nombre de fonctions prtes l'emploi. Il est facile de s'y perdre les premiers temps, surtout si on ne pratique pas. Ce premier TP de la section SDL est justement l pour vous faire dcouvrir un cas pratique et surtout vous inviter manipuler. Cette fois, vous l'aurez compris je crois, notre programme ne sera pas une console mais bel et bien une fentre ! Quel va tre le sujet de ce TP ? Il va s'agir d'un jeu de Sokoban ! Peut-tre que ce nom ne vous dit rien, mais le jeu est pourtant un grand classique des casse-ttes. Il consiste pousser des caisses pour les amener des points prcis dans un labyrinthe.
QVS
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 QVT
l9orgnistionF sl v en e'et flloir douper notre progrmme en plusieurs (hiers .c intelligemment et essyer de rer les onnes fontionsF g9est ussi pour ette rison que j9i did ette fois de ne ps onstruire le omme les prdents X je ne vis ps vous donner des indies suivis d9une orretion l (nF eu ontrireD je vis vous montrer omment je rlise tout le projet de e F
Et si je veux m'entraner tout seul ?
s de prolme 3 ellezEy lnezEvousD 9est mme trs ien 3 sl vous fudr ertinement un peu de temps X personnellement m9 pris une onne petite journeD et enore 9est pre que j9i un peu l9hitude de progrmmer et que j9vite ertins piges ournts F hez qu9un tel jeu peut tre rlis de nomreuses fons di'rentesF te vis vous montrer m fon de fire X e n9est ps l meilleureD mis e n9est ps l plus muvise non plusF ve se terminer pr une srie de suggestions d9mliortions et je vous proposeri de tlhrger le ode soure omplet ien entenduF inore une fois X je vous onseille d9essyer de vous y lner pr vousEmmesF ssezEy deux ou trois jours et fites de votre mieuxF sl est importnt que vous prtiquiezF
1
1. Cela ne m'a pas empch de me prendre la tte plusieurs reprises quand mme. ;-) 2. Ce n'est pas indispensable mais a ajoutera du piment !
QVU
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
3. Je vais pas tout vous servir sur un plateau d'argent non plus ! ;-)
QVV
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 SDL_ImageF ensez on(gurer votre projet pour qu9il gre l hv et SDL_ImageF i vous vez ouli omment fireD revoyez les hpitres prdentsF i vous ne on(gurez ps votre projet orretementD on vous dir que les fontions que vous utilisez @omme IMG_LoadA n9existent ps 3
GB onstntes F h EEEEEEEEEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X d finit des onstntes pour tout le progrmme @ tille de l fen tre FFFA BG 5 ifndef hipgyxexi 5 define hipgyxexi 5 define esvvifvyg en pixels 5 define xffvygveqi 5 define xffvygrei 5 define veqipixii 5 define reipixii QR GG ille d ' un lo @ rr A IP IP esvvifvyg B xffvygveqi esvvifvyg B xffvygrei
8 9 10 11 12 13
14 15 16 17 18 19 20 21 22
enum { re D fe D qegri D hysi }Y enum { shi D w D gesi D yftigsp D wesy D gesiyu }Y 5 endif
gopier e ode gode we X PSHTHW ous noterez plusieurs points intressnts dns e petit (hierF QWH
! ve (hier ommene pr un ommentire d9enEtteF te reommnde de mettre e type de ommentire u dut de hun de vos (hiers @que e soient des .h ou des .cAF qnrlementD un ommentire d9enEtte ontient X ! le nom du (hier Y ! l9uteur Y ! le rle du (hier @e quoi servent les fontions qu9il ontientA Y ! je ne l9i ps fit lD mis gnrlementD on met ussi l dte de rtion et l dte de dernire modi(tionF permet de s9y retrouverD surtout dns les gros projets plusieursF ! ve (hier est protg ontre les inlusions in(niesF sl utilise l tehnique que l9on pprise l (n du hpitre sur le prproesseurF si ette protetion ne sert ps vrimentD mis j9i pris l9hitude de fire pour hun de mes (hiers .h sns exeptionF ! in(nD le ur du (hierF ous vez une srie de defineF t9indique l tille d9un petit lo en pixels @tous mes sprites sont des rrs de QR pxAF t9indique que m fentre omporter IP x IP los de lrgeurF te lule omme les dimensions de l fentre pr une simple multiplition des onstntesF ge que je fis l n9est ps oligtoireD mis un norme vntge X si plus trd je veux hnger l tille du jeuD je n9uri qu9 diter e (hier @et reompilerA et tout mon ode soure s9dpter en onsqueneF ! in(nD j9i d(ni d9utres onstntes vi des numrations anonymesF g9est lgE rement di'rent de e qu9on ppris dns le hpitre sur les types de vriles personnlissF siD je ne re ps un type personnlisD je d(nis juste des onstntesF gel ressemle ux define une di'rene prs X 9est l9ordinteur qui ttriue uE tomtiquement un nomre hune des vleurs @en ommennt pr HAF einsiD on HAUT a HD BAS a ID GAUCHE a PD etF gel permettr de rendre notre ode soure euoup plus lir pr l suiteD vous verrez 3 in rsumD j9utilise X ! des define lorsque je veux ttriuer une vleur prise une onstnte @pr exemple QR pixels A Y ! des numrtions lorsque l vleur ttriue une onstnte ne m9importe psF siD je me moque ien de svoir que HAUT vut H @ pourrit ussi ien vloir ISHD ne hngerit rienA Y tout e qui ompte pour moiD 9est que ette onstnte it une vleur di'rente de BASD GAUCHE et DROITEF
Inclure les dnitions de constantes
ve prinipe ser d9inlure e (hier de onstntes dns hun de mes (hiers .cF einsiD prtout dns mon ode je pourri utiliser les onstntes que je viens de d(nirF sl fudr don tper l ligne suivnte u dut de hun des (hiers .c X
1
5 inlude 4 onstntes F h 4
QWI
Le main : main.c
v fontion main priniple est extrmement simpleF ille pour rle d90her l9rn d9ueil du jeu et de rediriger vers l onne setionF
1 2 3 4 5 6 7
GB min F EEEEEE r mteoPI D pour ve ite du ro @ www F siteduzero F om A le X menu du jeu F ermet de hoisir entre l ' diteur et le jeu lui E m me F BG 5 inlude 5 inlude 5 inlude 5 inlude ` stdli Fh b ` stdio Fh b ` hv G hv Fh b ` hv G hvimge Fh b
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
5 inlude 4 onstntes F h 4 5 inlude 4 jeu F h 4 5 inlude 4 editeur F h 4 int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B menu a xvv Y hvet positionwenu Y hvivent event Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y hvwetson @ swqvod @4 isse F jpg 4 A D xvv AY GG v ' i ne doit tre hrg e vnt hvetideowode ern a hvetideowode @ veqipixii D reipixii D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 wrio okon 4 D xvv A Y menu a swqvod @ 4 menu F jpg 4 A Y positionwenu F x a H Y positionwenu F y a H Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y
30
31 32 33 34 35 36 37 38 39 40 41 42 43
QWP
55 56 57 58 59 60 61 62
rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X GG eut rr ter le jeu ontinuer a H Y rek Y se hvuuI X GG hemnde jouer jouer @ ern A Y rek Y se hvuuP X GG hemnde l ' diteur de niveux editeur @ ern A Y rek Y } rek Y
63 64 65 66 67 68 69 70 71
GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ menu D xvv D ern D 8 positionwenu A Y hvplip @ ern AY
gopier e ode gode we X UQQQTW v fontion main se hrge d9e'etuer les initilistions de l hvD de donner un titre l fentre insi qu9une ineF l (n de l fontionD SDL_Quit() est ppele pour rrter l hv proprementF v fontion 0he un menuF ve menu est hrg en utilisnt l fontion IMG_Load de SDL_Image X
1
Vous remarquerez que, pour donner les dimensions de la fentre, j'utilise les constantes LARGEUR_FENETRE et HAUTEUR_FENETRE qu'on a dnies dans constantes.h.
QWQ
v oule in(nie gre les vnements suivnts X ! arrt du programme @SDL_QUITA X si on demnde fermer le progrmme @li sur l roix en hut droite de l fentreAD lors on psse le oolen continuer HD et l oule s9rrterF frefD lssique Y ! appui sur la touche Echap X rrt du progrmme @omme SDL_QUITA Y ! appui sur la touche 1 du pav numrique X lnement du jeu @ppel de l fontion jouerA Y ! appui sur la touche 2 du pav numrique X lnement de l9diteur @ppel de l fontion editeurAF gomme vous le voyezD 9est vriment trs simpleF i on ppuie sur ID le jeu est lnF ne fois que le jeu est terminD l fontion jouer s9rrte et on retourne dns le main dns lequel on refit un tour de ouleF ve main oule l9in(ni tnt qu9on ne demnde ps rrter le jeuF qre ette petite orgnistion trs simpleD on peut don grer le menu dns le main et lisser des fontions spiles @omme jouerD ou editeurA grer les di'rentes prties du progrmmeF
Le jeu
ettquons mintennt le gros du sujet X l fontion jouer 3 gette fontion est l plus importnte du progrmmeD ussi soyez ttentifs r 9est vriment l qu9il fut omE prendreF ous verrez prs que rer l9diteur de niveux n9est ps si ompliqu que en l9irF
jouer @ ern AY
ve prototype de l fontionD que vous pouvez mettre dns jeu.hD est don le suivnt X
1
La fonction ne renvoie aucune valeur (d'o le void), mais on pourrait en renvoyer une, si on voulait. On pourrait par exemple renvoyer un boolen pour dire si oui ou non on a gagn.
QWR
LE JEU
oii pour ommener toutes les vriles de types d(nis pr l hv dont j9i esoin X
1 2
3 4
hvurfe B mrio R a { xvv }Y GG R surfes pour R diretions de mrio hvurfe B mur a xvv D B isse a xvv D B isseyu a xvv D B ojetif a xvv D B mrioetuel a xvv Y hvet position D positiontoueur Y hvivent event Y
t9i r un tleu de SDL_Surface ppel marioF g9est un tleu de qutre ses qui stoker wrio dns hune des diretions @un vers le sD un utre vers l guheD vers le hut et vers l droiteAF sl y ensuite plusieurs surfes orrespondnt hun des sprites que je vous i fit tlhrger plus hut X murD caisseD caisseOK @une isse sur un ojetifA et objectifF
quoi sert marioActuel ?
g9est un pointeur vers une surfeF sl pointe sur l surfe orrespondnt u wrio orient dns l diretion tuelleF g9est don marioActuel que l9on litter l9rnF i vous regrdez tout en s de l fontion jouerD vous verrez justement X
1
yn ne litte don ps un lment du tleu marioD mis le pointeur marioActuelF einsiD en littnt marioActuelD on litte soit le wrio vers le sD soit elui vers le hutD etF ve pointeur marioActuel pointe vers une des ses du tleu marioF uoi d9utre prt c ne vrile position de type SDL_Rect dont on se servir pour d(nir l position des lments litter @on s9en servir pour tous les spritesD inutile de rer un SDL_Rect pour hque surfe 3AF positionJoueur est en revnhe un peu di'rente X elle indique quelle se sur l rte se trouve tuellement le joueurF in(nD l vrile event triter les vnementsF
Variables plus classiques
t9i ussi esoin de me rer des vriles un peu plus lssiques de type int @entierAF
1 2
QWS
in fitD il s9git d9un tleu d9int @entiersA qui l prtiulrit d9voir deux pires de rohets [ ]F i vous vous souvenez ien de constantes.hD NB_BLOCS_LARGEUR et NB_BLOCS_HAUTEUR sont des onstntes qui vlent toutes les deux IPF ge tleu ser don l ompiltion r omme ei X
1
int rte IP IP a {H }Y
veut dire que pour hque se de carteD il y IP sousEsesF sl y ur don les vriles suivntes X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
rte H H rte H I rte H P rte H Q rte H R rte H S rte H T rte H U rte H V rte H W rte H IH rte H II rte I H rte I I rte I P rte I Q rte I R rte I S rte I T rte I U rte I V rte I W
4. Je n'ai pas eu l'occasion d'en parler auparavant ; de plus, ajouter ces explications dans le chapitre sur les tableaux l'aurait rendu un peu indigeste.
QWT
LE JEU
23 24 25 26 27 28 29 30 31 32 33 34
rte I IH FFF rte II P rte II Q rte II R rte II S rte II T rte II U rte II V rte II W rte II IH rte II II
g9est don un tleu de IP B IP a IRR ses 3 ghune des es ses reprsente une se de l rteF v (gF PRFQ vous donne une ide de l fon dont l rte est reprsenteF
einsiD l se en hut guhe est stoke dns carte[0][0]F v se en hut droite est stoke dns carte[0][11]F v se en s droite @l toute dernireA est stoke dns carte[11][11]F elon l vleur de l se @qui est un nomre entierAD on sit si l se ontient un murD une isseD un ojetifD etFAF g9est justement l que v servir notre numrtion de tout l9heure 3 QWU
i l se vut VIDE @HA on sit que ette prtie de l9rn devr rester lnheF i elle vut MUR @IAD on sit qu9il fudr litter une imge de murD etF
Initialisations
Chargement des surfaces
wintennt qu9on pss en revue toutes les vriles de l fontion jouerD on peut ommener fire quelques initilistions X
1 2 3 4 5 6 7 8 9
GG ghrgement des sprites @ d ors D personnge FFFA mur a swqvod @ 4 mur F jpg 4 A Y isse a swqvod @ 4 isse F jpg 4 A Y isseyu a swqvod @ 4 isseok F jpg 4 A Y ojetif a swqvod @ 4 ojetif F png 4 A Y mrio fe a swqvod @ 4 mrios F gif 4 A Y mrio qegri a swqvod @ 4 mrioguhe F gif 4 A Y mrio re a swqvod @ 4 mriohut F gif 4 A Y mrio hysi a swqvod @ 4 mriodroite F gif 4 A Y
ien de sorier lEdedns X on hrge tout gre IMG_LoadF 9il y une petite prE tiulritD 9est le hrgement de marioF yn hrge en e'et wrio dns hune des diretions dns le tleu mario en utilisnt les onstntes HAUTD BASD GAUCHED DROITEF ve fit d9utiliser les onstntes rend ii " omme vous le voyez " le ode plus lirF yn urit trs ien pu rire mario[0]D mis 9est qund mme plus lisile d9voir mario[HAUT] pr exemple 3
Orientation initiale du Mario (marioActuel)
t9i trouv plus logique de ommener l prtie ve un wrio qui regrde vers le s @9estEEdire vers nousAF i vous voulezD vous pouvez hnger ette ligne et mettre X
1
ous verrez que wrio ser lors orient vers l droite u dut du jeuF
Chargement de la carte
wintenntD il v flloir remplir notre tleu deux dimensions carteF our l9instntD e tleu ne ontient que des HF sl fut lire le niveu qui est stok dns le (hier niveaux.lvlF QWV
LE JEU
1 2 3
GG ghrgement du niveu if @3 hrgerxiveu @ rte A A exit @ ispesvi A Y GG yn rr te le jeu si on n ' ps pu hrger le niveu
t9i hoisi de fire grer le hrgement @et l9enregistrementA de niveux pr des fontions situes dns fichiers.cF siD on ppelle don l fontion chargerNiveauF yn l9tudier plus en dtils plus loin @elle n9est ps trs ompliqueD de toute mnireAF out e qui nous intresse ii 9est de svoir que notre niveu t hrg dns le tleu carteF
Si le niveau n'a pas pu tre charg (parce que niveaux.lvl n'existe pas), la fonction renverra faux . Sinon, elle renverra vrai .
yn teste don le rsultt du hrgement dns une onditionF i le rsultt est ngtif @d9o le point d9exlmtion qui sert exprimer l ngtionAD on rrte tout X on ppelle exitF inonD 9est que tout v ien et on peut ontinuerF xous possdons mintennt un tleu carte qui drit le ontenu de hque se X MURD VIDED CAISSEF F F
Recherche de la position de dpart de Mario
sl fut mintennt initiliser l vrile positionJoueurF gette vrileD de type SDL_RectD est un peu prtiulireF yn ne s9en sert ps pour stoker des oordonnes en pixelsF yn s9en sert pour stoker des oordonnes en ses sur l rteF einsiD si on X F F F 9est que le joueur se trouve dns l toute dernire se en s droite de l rteF eportezEvous u shm de l rte de l (gF PRFQ pour ien voir quoi orrespond si vous vez @djA ouliF yn doit prourir notre tleu carte deux dimensions l9ide d9une doule ouleF yn utilise l petite vrile i pour prourir le tleu vertilement et l vrile j pour le prourir horizontlement X
1 2 3 4 5 6
positionJoueur.x == 11 positionJoueur.y == 11
7 8 9 10 11
GG eherhe de l position de wrio u d prt for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { if @ rte i j aa wesy A GG i wrio se trouve ette position { positiontoueur F x a i Y positiontoueur F y a j Y rte i j a shi Y }
QWW
hque seD on teste si elle ontient MARIO @9estEEdire le dprt du joueur sur l rteAF i 9est le sD on stoke les oordonnes tuelles @situes dns i et jA dns l vrile positionJoueurF yn e'e ussi l se en l mettnt VIDE pour qu9elle soit onsidre omme une se vide pr l suiteF
Activation de la rptition des touches
hernire hoseD trs simple X on tive l rptition des touhes pour qu9on puisse se dpler sur l rte en lissnt une touhe enfoneF
1 2
La boucle principale
(ou 3 xos initilistions sont fitesD on peut mintennt s9ouper de l oule prinE ipleF g9est une oule lssique qui fontionne sur le mme shm que elles qu9on vues jusqu9iiF ille est juste un peu plus grosse et un peu plus omplte @fut 9qui fut omme on dit 3AF egrdons de plus prs le switch qui teste l9vnement X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X ontinuer a H Y rek Y se hvu X mrioetuel a mrio re Y deplertoueur @ rte D 8 positiontoueur D re A Y rek Y se hvuhyx X mrioetuel a mrio fe Y deplertoueur @ rte D 8 positiontoueur D fe A Y rek Y se hvusqr X mrioetuel a mrio hysi Y deplertoueur @ rte D 8 positiontoueur D hysi A Y
RHH
LE JEU
23 24 25 26 27 28 29 30
} rek Y
rek Y se hvuvip X mrioetuel a mrio qegri Y deplertoueur @ rte D 8 positiontoueur D qegri A Y rek Y
i on ppuie sur l touhe EchapD le jeu s9rrter et on retourner u menu priniplF gomme vous le voyezD il n9y ps QT vnements di'rents grer X on teste juste si le joueur ppuie sur les touhes hut D s D guhe ou droite de son lvierF elon l touhe enfoneD on hnge l diretion de wrioF g9est l qu9intervient marioActuel 3 i on ppuie vers le hutD lors X
1
mrioetuel a mrio re Y
mrioetuel a mrio fe Y
marioActuel pointe don sur l surfe reprsentnt wrio dns l position tuelleF g9est insi qu9en littnt marioActuel tout l9heureD on ser ertin de litter wrio dns l onne diretionF wintenntD hose trs importnte X on ppelle une fontion deplacerJoueurF gette fontion v dpler le joueur sur l rte s9il le droit de le fireF ! r exempleD on ne peut ps fire monter wrio d9un rn vers le hut s9il se trouve dj tout en hut de l rteF ! yn ne peut ps non plus le fire monter s9il y un mur uEdessus de luiF ! yn ne peut ps le fire monter s9il y deux isses uEdessus de luiF ! r ontreD on peut le fire monter s9il y juste une isse uEdessus de luiF ! wis ttentionD on ne peut ps le fire monter s9il y une isse uEdessus de lui et que l isse se trouve u ord de l rte 3
g9est e qu9on ppelle la gestion des collisionsF i peut vous rssurerD ii 9est une gestion des ollisions extrmement simpleD vu que le joueur se dple pr ses et dns seulement qutre diretions possiles l foisF hns un jeu Ph o on peut se dpler dns toutes les diretions pixel pr pixelD l gestion des ollisions est ien plus omplexeF wis il y pire X l QhF v gestion des ollisions dns un jeu Qh est vriment l te noire des progrmmeursF reureusementD il existe des iliothques de gestion des ollisions en Qh qui font le gros du trvil notre pleF RHI
evenons l fontion deplacerJoueur et onentronsEnousF yn lui envoie trois prE mtres X ! l rte X pour qu9elle puisse l lire mis ussi l modi(erD si on dple une isse pr exemple Y ! l position du joueur X l ussiD l fontion devr lire et ventuellement modi(er l position du joueur Y ! l diretion dns lquelle on demnde ller X on utilise l enore les onstntes HAUTD BASD GAUCHED DROITE pour plus de lisiilitF xous tudierons l fontion deplacerJoueur plus loinF t9uris trs ien pu mettre tous les tests dns le switchD mis eluiEi serit devenu norme et illisileF g9est l que douper son progrmme en fontions prend tout son intrtF
Blittons, blittons, la queue du cochon
xotre switch est termin X e stde du progrmmeD l rte et le joueur ont proE lement hngF uoi qu9il en soitD 9est l9heure du lit 3 yn ommene pr e'er l9rn en lui donnnt une ouleur de fond lnhe X
1 2
GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y
it mintenntD on prourt tout notre tleu deux dimensions carte pour svoir quel lment litter quel endroit sur l9rnF yn e'etue une doule oule omme on l9 vu plus tt pour prourir toutes les IRR ses du tleu X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
GG lement des ojets l ' rn ojetifsestnts a H Y for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { position F x a i B esvvifvyg Y position F y a j B esvvifvyg Y swith @ rte i j A { se w X hvfliturfe @ mur D xvv D ern D 8 position A Y rek Y se gesi X hvfliturfe @ isse D xvv D ern D 8 position A Y rek Y se gesiyu X hvfliturfe @ isseyu D xvv D ern D 8 position A Y
18 19 20
RHP
LE JEU
21 22 23
24 25 26 27 28
our hune des sesD on prpre l vrile position @de type SDL_RectA pour pler l9lment tuel l onne position sur l9rnF ve lul est trs simple X
1 2
sl su0t de multiplier i pr TAILLE_BLOC pour voir position.xF einsiD si on se trouve l troisime seD 9est que i vut P @n9ouliez ps que i ommene H 3AF yn fit don le lul P B QR a TVF yn litter don l9imge TV pixels vers l droite sur ecranF yn fit l mme hose pour les ordonnes yF insuiteD on fit un switch sur l se de l rte qu9on est en trin d9nlyserF v enoreD voir d(ni des onstntes est vriment prtique et rend les hoses plus lisilesF yn teste don si l se vut MURD dns e s on litte un murF he mme pour les isses et les ojetifsF
Test de victoire
ous remrquerez qu9vnt l doule ouleD on initilise le oolen objectifsRestants HF ge oolen ser mis I ds qu9on ur dtet un ojetif sur l rteF 9il ne reste plus d9ojetifsD 9est que toutes les isses sont sur des ojetifs @il n9y plus que des CAISSE_OKAF sl su0t de tester si le oolen vut fux D 9estEEdire s9il ne reste plus d9ojetifsF hns e sD on met l vrile continuer H pour rrter l prtie X
1 2 3
GG i on n ' trouv uun ojetif sur l rte D ' est qu ' on ggn if @3 ojetifsestnts A ontinuer a H Y
Le joueur
GG yn ple le joueur l onne position position F x a positiontoueur F x B esvvifvyg Y position F y a positiontoueur F y B esvvifvyg Y hvfliturfe @ mrioetuel D xvv D ern D 8 position A Y
RHQ
yn lule s position @en pixels ette foisA en fisnt une simple multiplition entre positionJoueur et TAILLE_BLOCF yn litte ensuite le joueur l position indiqueF
Flip !
hvplip @ ern A Y
GG h stivtion de l r p tition des touhes @ remise H A hvinleueyepet @H D H A Y GG vi rtion des surfes hrg es hvpreeurfe @ mur A Y hvpreeurfe @ isse A Y hvpreeurfe @ isseyu A Y hvpreeurfe @ ojetif A Y for @ i a H Y i ` R Y i CCA hvpreeurfe @ mrio i A Y
La fonction deplacerJoueur
v fontion deplacerJoueur se trouve elle ussi dns jeu.cF g9est une fontionF F F ssez dlite rireF g9est peutEtre l priniple di0ult que l9on renontre lorsqu9on ode un jeu de okonF Rappel X l fontion deplacerJoueur vri(e si on le droit de dpler le joueur dns l diretion demndeF ille met jour l position du joueur @positionJoueurA et ussi l rte si une isse t dpleF oii le prototype de l fontion X
1
ge prototype est un peu prtiulierF ous voyez que j9envoie le tleu carte et que je prise l tille de l deuxime dimension @NB_BLOCS_HAUTEURAF ourquoi el c v rponse est un peu omplique pour que je l dveloppe u milieu de e oursF our fire simpleD le g ne devine ps qu9il s9git d9un tleu deux dimensions et il fut u moins donner l tille de l seonde dimension pour que fontionneF honD lorsque vous envoyez un tleu deux dimensions une fontionD vous devez indiquer l tille de l seonde dimension dns le prototypeF g9est omme D 9est oligtoireF RHR
LE JEU
eutre hose X vous noterez que positionJoueur s9ppelle en fit pos dns ette fonE tionF t9i hoisi de rourir le nom pre que 9est plus ourt rireD et vu qu9on v voir esoin de l9rire de nomreuses foisD utnt ne ps se ftiguerF gommenons pr tester l diretion dns lquelle on veut ller vi un grnd switch X
1 2 3 4
swith @ diretion A { se re X GB et F BG
sl fut mintennt rire tous les tests de tous les s possilesD en essynt de ne ps en oulier un seulF oii omment je prode X je teste toutes les possiilits de ollision s pr sD et ds que je dtete une ollision @qui fit que le joueur ne peut ps ougerAD je fis un break; pour sortir du switchD et don empher le dplementF oii pr exemple toutes les possiilits de ollision qui existent pour un joueur qui veut se dpler vers le hut X ! le joueur est dj tout en hut de l rte Y ! il y un mur uEdessus du joueur Y ! il y deux isses uEdessus du joueur @et il ne peut ps dpler deux isses l foisD rppelezEvousA Y ! il y une isse puis le ord de l rteF i tous es tests sont okD lors je me permets de dpler le joueurF te vis vous montrer les tests pour un dplement vers le hutF our les utres sensD il su0r d9dpter un petit peu le odeF
1 2
yn ommene pr vri(er si le joueur est dj tout en hut de l9rnF in e'etD si on essyit d9ppeler carte[5][-1] pr exempleD e serit le plntge du progrmme ssur 3 yn ommene don pr vri(er qu9on ne v ps dorder de l9rnF insuite X
1 2
v enore 9est simpleF yn vri(e s9il n9y ps un mur uEdessus du joueurF i tel est le sD on rrte @breakAF insuite @ttention les yeuxA X
1
GG i on veut pousser une isse D il fut v rifier qu ' il n ' y ps de mur derri re @ ou une utre isse D ou l limite du monde A
RHS
3 4
if @@ rte pos E b x pos E b y E I aa gesi || rte pos E b x pos E b y E I aa gesiyu A 88 @ pos E b y E P ` H || rte pos E b x pos E b y E P aa w || rte pos E b x pos E b y E P aa gesi || rte pos E b x pos E b y E P aa gesiyu A A rek Y
ge gros test peut se trduire omme ei X s uEdessus du joueur il y une caisse @ou une caisse_okD 9estEEdire une isse ien pleA i s uEdessus de ette isse il y soit le vide @on dorde du niveu r on est tout en hutAD soit une utre isseD soit une isseok X evy on ne peut ps se dpler X breakF i on rrive psser e testD on le droit de dpler le joueurF yuf 3 yn ppelle d9ord une fontion qui v dpler une isse si nessire X
1 2 3
GG i on rrive l D ' est qu ' on peut d pler le joueur 3 GG yn v rifie d ' ord s ' il y une isse d pler deplergisse @8 rte pos E b x pos E b y E I D 8 rte pos E b x pos Eb y E P A Y
t9i hoisi de grer le dplement de isse dns une utre fontion r 9est le mme ode pour les qutre diretionsF yn doit juste s9tre ssur vnt qu9on le droit de se dpler @e qu9on vient de fireAF yn envoie l fontion deux prmtres X le ontenu de l se dns lquelle on veut ller et le ontenu de l se d9prsF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void deplergisse @ int B premieregse D int B seondegse A { if @B premieregse aa gesi || B premieregse aa gesiyu A { if @B seondegse aa yftigsp A B seondegse a gesiyu Y else B seondegse a gesi Y if @B premieregse aa gesiyu A B premieregse a yftigsp Y else B premieregse a shi Y
gette fontion met jour l rte r elle prend en prmtres des pointeurs sur les ses onernesF te vous lisse l lireD 9est ssez simple omprendreF sl ne fut ps oulier que si on dple une CAISSE_OKD il fut rempler l se o elle se trouvit pr un OBJECTIFF inonD si 9est une simple CAISSED lors on remple l se en question pr du VIDEF RHT
LE JEU
Dplacer le joueur
yn retourne dns l fontion deplacerJoueurF gette fois 9est l onneD on peut dE pler le joueurF gomment fitEon c g9est trs trs simple X
1
5 6
7 8
10
11
12 13 14
swith @ diretion A { se re X if @ pos E b y E I ` H A GG i le joueur d psse l ' rn D on rr te rek Y if @ rte pos E b x pos E b y E I aa w A GG ' il y un mur D on rr te rek Y GG i on veut pousser une isse D il fut v rifier qu ' il n ' y ps de mur derri re @ ou une utre isse D ou l limite du monde A if @@ rte pos E b x pos E b y E I aa gesi || rte pos E b x pos E b y E I aa gesiyu A 88 @ pos E b y E P ` H || rte pos E b x pos E b y E P aa w || rte pos E bx pos E b y E P aa gesi || rte pos E b x pos E b y E P aa gesiyu A A rek Y GG i on rrive l D ' est qu ' on peut d pler le joueur 3 GG yn v rifie d ' ord s ' il y une isse d pler deplergisse @8 rte pos E b x pos E b y E I D 8 rte pos E b x pos E b y E P A Y pos E by E EY GG yn peut enfin fire monter le joueur @ oufff 3A rek Y
15 16
17 18
19
te vous lisse le soin de fire du opierEoller pour les utres s @ttentionD il fudr dpter le odeD e n9est ps extement preil hque fois 3AF it voilD on vient de (nir de oder le jeu 3 in(n presque X il nous reste voir l fontion de hrgement @et de suvegrdeA de niveuxF yn verr ensuite omment RHU
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
1
3 4 5 6 7
psvi B fihier a xvv Y hr lignepihier xffvygveqi B xffvygrei C I a { H }Y int i a H D j a H Y fihier a fopen @ 4 niveux F lvl 4 D 4 r 4 A Y if @ fihier aa xvv A return H Y
yn re un tleu de char pour stoker temporirement le rsultt du hrgement du niveuF yn ouvre le (hier en leture seule @"r"AF yn rrte l fontion en renvoynt H @ fux A si l9ouverture houF glssiqueF ve (hier niveaux.lvl ontient une ligne qui est une suite de nomresF ghque nomre reprsente une se du niveuF r exemple X
1
IIIIIHHIIIIIIIIIIRHHHHHIIIIIHHHIIHHIHQQIHIHIIHIIHHHHHPHHIPIIIH FFF
yn v nlyser le ontenu de ligneFichierF yn sit que les IP premiers rtres reprsentent l premire ligneD les IP suivnts l seonde ligneD etF
5. Rassurez-vous, a ira bien plus vite !
RHV
for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { swith @ lignepihier @ i B xffvygveqi A C j A { se ' H ' X niveu j i a H Y rek Y se ' I ' X niveu j i a I Y rek Y se ' P ' X niveu j i a P Y rek Y se ' Q ' X niveu j i a Q Y rek Y se ' R ' X niveu j i a R Y rek Y } } }
r un simple petit lulD on prend le rtre qui nous intresse dns ligneFichier et on nlyse s vleurF
Ce sont des lettres qui sont stockes dans le chier. Je veux dire par l que '0' est stock comme le caractre ASCII '0', et sa valeur n'est pas 0 ! Pour analyser le chier, il faut tester avec case '0' et non avec case 0 ! Attention ne pas mlanger les chires et les lettres !
ve switch fit l onversion '0' ab HD '1' ab ID etF sl ple tout dns le tleu carte F ne fois que 9est fitD on peut fermer le (hier et renvoyer I pour dire que tout s9est ien pss X
6 1 2
pinlementD le hrgement du niveu dns le (hier n9tit ps ien ompliquF ve seul pige viter 9tit de ien penser onvertir l vleur egss '0' en un nomre H @et de mme pour ID PD QD RF F FAF
6. La carte s'appelle niveau dans cette fonction d'ailleurs, mais a ne change rien.
RHW
sauvegarderNiveau
int suvegrderxiveu @ int niveu xffvygrei A { psvi B fihier a xvv Y int i a H D j a H Y fihier a fopen @ 4 niveux F lvl 4 D 4 w 4 A Y if @ fihier aa xvv A return H Y for @ i a H Y i ` xffvygveqi Y i CCA { for @ j a H Y j ` xffvygrei Y j CCA { fprintf @ fihier D 4 7 d 4 D niveu j i A Y } } flose @ fihier A Y return I Y
t9utilise fprintf pour trduire les nomres du tleu niveau en rtres egssF g9tit l enore l seule di0ult @mis l9enversA X il ne fut ps rire H mis '0'F
L'diteur de niveaux
v9diteur de niveux est plus file rer qu9on ne pourrit l9imginerF in plus 9est une fontionnlit qui v onsidrlement llonger l dure de vie de notre jeuD lors pourquoi s9en priver c oil omment l9diteur v fontionnerF ! yn utilise l souris pour pler les los qu9on veut sur l9rnF ! n li droit e'e le lo sur lequel se trouve l sourisF ! n li guhe ple un ojetF get ojet est mmoris X pr dfutD on pose des murs ve le li guheF yn peut hnger l9ojet en ours en ppuynt sur les touhes du pv numrique X ! I X murD ! P X isseD ! Q X ojetifD ! R X dprt du joueur wrioF ! in ppuynt sur D le niveu ser suvegrdF ! yn peut revenir u menu prinipl en ppuynt sur EchapF RIH
L'DITEUR DE NIVEAUX
Initialisations
qlolementD l fontion ressemle elle du jeuF t9i d9illeurs ommen l rer en fisnt un simple opierEoller de l fontion de jeuD puis en enlevnt e qui ne servit plus et en joutnt de nouvelles fontionnlitsF ve dut y ressemle dj ps ml X
1 2 3
4 5 6 7
void editeur @ hvurfe B ern A { hvurfe B mur a xvv D B isse a xvv D B ojetif a xvv D B mrio a xvv Y hvet position Y hvivent event Y int ontinuer a I D liquheingours a H D lihroitingours a HY int ojetetuel a w D i a H D j a H Y int rte xffvygveqi xffvygrei a { H }Y GG ghrgement des ojets et du niveu mur a swqvod @ 4 mur F jpg 4A Y isse a swqvod @4 isse F jpg 4 A Y ojetif a swqvod @ 4 ojetif F png 4 A Y mrio a swqvod @ 4 mrios F gif 4 A Y if @3 hrgerxiveu @ rte A A exit @ ispesvi A Y
8 9 10 11 12 13 14 15 16 17 18
RII
vD vous vez les d(nitions de vriles et les initilistionsF ous remrquerez que je ne hrge qu9un wrio @elui dirig vers le sAF in e'etD on ne v ps diriger wrio u lvier lD on juste esoin d9un sprite reprsentnt l position de dprt de wrioF v vrile objetActuel retient l9ojet tuellement sletionn pr l9utilisteurF r dfutD 9est un MURF ve li guhe rer don un mur u dprtD mis el pourr tre hng pr l9utilisteur en ppuynt sur ID PD Q ou RF ves oolens clicGaucheEnCours et clicDroitEnCoursD omme leurs noms l9indiquentD permettent de mmoriser si un li est en ours @si le outon de l souris est enfonAF gel nous permettr de poser des ojets l9rn en lissnt le outon de l souris enfon F te vous expliqueri le prinipe un peu plus loinF in(nD l rte tuellement suvegrde dns niveaux.lvl est hrgeF ge ser notre point de dprtF
7
7 8
se hvwyifyxhyx X if @ event F utton F utton aa hvfyxvip A { GG yn met l ' ojet tuellement hoisi @ mur D isse FFFA l ' endroit du li rte event F utton F x G esvvifvyg event F utton F y G esvvifvyg a ojetetuel Y liquheingours a I Y GG yn retient qu ' un outon est enfon } else if @ event F utton F utton aa hvfyxsqr A GG gli droit pour effer {
7. Sinon on est oblig de cliquer frntiquement avec la souris pour placer plusieurs fois le mme objet dirents endroits, ce qui est un peu fatigant. 8. Notez que ce n'est pas ce qu'il y a de plus ergonomique pour l'utilisateur : celui-ci s'attend plutt ce que le programme s'arrte quand on clique sur la croix, or ce n'est pas ce qu'il se passe ici car on ne fait que revenir au menu. Il faudrait peut-tre trouver un moyen d'arrter le programme en renvoyant une valeur spciale la fonction main par exemple. Je vous laisse rchir une solution.
RIP
L'DITEUR DE NIVEAUX
10
11 12 13
} rek Y
yn ommene pr tester le outon qui est enfon @on vri(e si 9est le li guhe ou le li droitA X ! si 9est un li guheD on ple l9objetActuel sur l rte l position de l souris Y ! si 9est un li droitD on e'e e qu9il y et endroit sur l rte @on met VIDE omme je vous vis ditAF
Comment sait-on sur quelle case de la carte on se trouve ?
yn le retrouve gre un petit lulF sl su0t de prendre les oordonnes de l souE ris @event.button.x pr exempleA et de diviser ette vleur pr l tille d9un lo @TAILLE_BLOCAF g9est une division de nomres entiersF gomme en g une division de nomres entiers donne un nomre entierD on est sr d9voir une vleur qui orresponde une des ses de l rteF r exempleD si je suis u USe pixel sur l rte @sur l9xe des sisses xAD je divise e nomre pr TAILLE_BLOC qui vut ii QRF
75 / 34 = 2
x9ouliez ps que le reste est ignorF yn ne grde que l prtie entire de l division en g r il s9git d9une divison de nomres entiersF yn sit don qu9on se trouve sur l se no P @9estEEdire l troisime seD r un tleu ommene HD souvenezEvousAF eutre exemple X si je suis u IHe pixel @9estEEdire trs prohe du ordAD v donner le lul suivnt X
10 / 34 = 0
yn est don l se no H 3 g9est omme qu9un simple petit lul nous permet de svoir sur quelle se de l rte on se situeF
1
rte event F utton F x G esvvi fvyg event F utton Fy G esvvi fvyg a ojetetuel Y
eutre hose trs importnte X on met un oolen clicGaucheEnCours @ou clicDroit selon le sA IF gel nous permettr de svoir lors d9un vnement MOUSEMOTION si un outon de l souris est enfon pendnt le dplementF
SDL_MOUSEBUTTONUP
1
RIQ
if @ event F utton F utton aa hvfyxvip A liquheingours a H Y else if @ event F utton F utton aa hvfyxsqr A lihroitingours a H Y rek Y
v9vnement MOUSEBUTTONUP sert simplement remettre le oolen HF yn sit que le li est termin et don qu9il n9y plus de li en ours F
SDL_MOUSEMOTION
se hvwyiwysyx X if @ liquheingours A GG i on d ple l souris et que le outon guhe de l souris est enfon { rte event F motion F x G esvvifvyg event F motion F y G esvvifvyg a ojetetuel Y } else if @ lihroitingours A GG reil pour le outon droit de l souris { rte event F motion F x G esvvifvyg event F motion F y G esvvifvyg a shi Y } rek Y
1 2
3 4
5 6
7 8
9 10
g9est l que nos oolens prennent toute leur importneF yn vri(e qund on ouge l souris si un li est en oursF i tel est le sD on ple sur l rte un ojet @ou du vide si 9est un li droitAF gel nous permet don de pler d90le plusieurs ojets du mme type sns voir liquer plusieurs foisF yn juste dpler l souris en mintennt son outon enfon 3 in lir X hque fois qu9on ouge l souris @ne seritEe que d9un pixelAD on vri(e si un des oolens est tivF i tel est le sD lors on pose un ojet sur l rteF inonD on ne fit rienF Rsum X je rsume l tehniqueD r vous vous en servirez ertinement dns d9utres progrmmesF gette tehnique permet de svoir si un outon de l souris est enfon lorsqu9on l dpleF yn peut s9en servir pour oder un glisserEdplerF IF vors d9un MOUSEBUTTONDOWN X on met un oolen clicEnCours IF PF vors d9un MOUSEMOTION X on teste si le oolen clicEnCours vut vri F 9il vut vri D on sit qu9on est en trin de fire une sorte de glisserEdpler ve l sourisF QF vors d9un MOUSEBUTTONUP X on remet le oolen clicEnCours HD r le li est termin @relhement du outon de l sourisAF RIR
L'DITEUR DE NIVEAUX
SDL_KEYDOWN
ves touhes du lvier permettent de hrger et de suvegrder le niveu insi que de hnger l9ojet tuellement sletionn pour le li guhe de l sourisF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
se hvuihyx X swith @ event F key F keysym F sym A { se hvuigei X ontinuer a H Y rek Y se hvus X suvegrderxiveu @ rte A Y rek Y se hvu X hrgerxiveu @ rte A Y rek Y se hvuuI X ojetetuel a w Y rek Y se hvuuP X ojetetuel a gesi Y rek Y se hvuuQ X ojetetuel a yftigsp Y rek Y se hvuuR X ojetetuel a wesy Y rek Y } rek Y
ge ode est trs simpleF yn hnge l9ojet tuel si on ppuie sur une des touhes numriquesD on enregistre le niveu si on ppuie sur D ou on hrge le dernier niveu enregistr si on ppuie sur gF
Blit time !
oil X on pss en revue tous les vnementsF wintenntD on n9 plus qu9 litter hun des lments de l rte l9ide d9une doule ouleF g9est peu de hoses prs le mme ode que elui de l fontion de jeuF te vous le redonneD mis ps l peine de vous le rexpliquer iiF
1 2
GG iffement de l ' rn hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y GG lement des ojets l ' rn for @ i a H Y i ` xffvygveqi Y i CCA {
3 4 5 6
RIS
for @ j a H Y j ` xffvygrei Y j CCA { position F x a i B esvvifvyg Y position F y a j B esvvifvyg Y swith @ rte i j A { se w X hvfliturfe @ mur D xvv D ern D 8 position A Y rek Y se gesi X hvfliturfe @ isse D xvv D ern D 8 position A Y rek Y se yftigsp X hvfliturfe @ ojetif D xvv D ern D 8 position A Y rek Y se wesy X hvfliturfe @ mrio D xvv D ern D 8 position A Y rek Y }
19 20 21
22 23 24 25 26 27 28 29 30 31
SDL_FreeSurface
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 our viter de vous proposer des dizines de pges de ode qui rptent tout e qu9on RIT
RSUM ET AMLIORATIONS
vient de voirD je vous propose plutt de tlhrger le ode soure omplet du proE grmme insi que l9exutle F lhrger le progrmme gode we X UVWHQW ge (hier Fzip ontient X ! l9exutle pour indows @si vous tes sous un utre yD il su0r de reompilerA Y ! les hvv de l hv et de SDL_Image Y ! toutes les imges dont esoin le progrmme @je vous les i fit tlhrger plus tt dns le pk sprites A Y ! les soures ompltes du progrmme Y ! le (hier .cbp de projet gode: :floksF i vous voulez ouvrir le projet sous un utre shiD rez un nouveu projet de type hv @on(gurezEle orretement pour l hvA et joutezEy mnuellement tous les (hiers .c et .hF ge n9est ps ien ompliquD vous verrezF ous noterez que le projet ontientD en plus des .c et des .hD un (hier ressources.rcF g9est un (hier qui peut tre jout u projet @uniquement sous indowsA et qui permet d9intgrer des (hiers dns l9exutleF siD je me sers du (hier de ressoures pour intgrer une ine dns l9exutleF gel ur pour e'et de donner une ine l9exutleD visile dns l9explorteur indows @(gF PRFSAF
9
evouez que 9est qund mme plus symp que d9voir l9ine pr dfut de indows pour les exutles 3 ous trouverez plus d9informtions sur ette tehnique sur le ite du roF
9. Compil pour Windows.
RIU
Amliorez !
ge progrmme n9est ps prfitD loin de l 3 ous voulez des ides pour l9mliorer c ! sl mnque un mode d'emploiF e0hez un rn d9explitions juste vnt le lnE ement d9une prtie et vnt le lnement de l9diteurF sndiquez en prtiulier les touhes utiliserF ! hns l9diteur de niveuxD on ne sit ps quel est l9ojet tuellement sletionnF ge qui serit ienD 9est que l'objet actuellement slectionn suive le urseur de l sourisF gomme D l9utilisteur verrit e qu9il s9pprte mettre sur l rteF g9est file fire X on dj fit un ozor qui suit le urseur de l souris dns le hpitre prdent 3 ! hns l9diteur de niveuxD on pprierit de pouvoir hoisir une CAISSE_OK @une isse ien ple sur un ojetif ds le dprtAF in e'etD je me suis rendu ompte pr l suite qu9il y de nomreux niveux qui ommenent ve des isses ien ples ds le dprt @ ne veut ps dire que le niveu est plus fileD loin de lAF ! hns l9diteur toujoursD il fudrit empcher que l'on puisse placer plus d'un dpart de joueur sur une mme carte 3 ! vorsqu9on russit un niveuD on retourne immditement u menuF g9est un peu rutF ue diriezEvous d9acher un message Bravo u entre de l9rn qund on ggne c ! in(nD il serit ien que le progrmme puisse grer plus d9un niveu l foisF sl fudrit que l9on puisse rer une vritable petite aventure d'une vingtaine de niveaux pr exempleF g9est un petit peu plus ompliqu oder mis fisleF sl fudr dpter le jeu et l9diteur de niveux en onsquene F gomme promisD pour vous prouver que 9est fisleF F F je l9i fit 3 te ne vous donne ps le ode soureD en revnhe @je rois que je vous en i dj ssez donn jusqu9ii 3AD mis je vous donne le progrmme omplet ompil pour indows et vinuxF ve progrmme omporte une venture de PH niveux @de trs trs file F F F super di0ileAF our rliser ertins de es niveuxD je me suis s sur le site d9un pssionn de okon @sokoban.online.frAF our tlhrger le wrio okon mlior pour indows X wrio okon pour inE dows gode we X RHITQT
10 11
10. Je vous suggre de mettre un niveau par ligne dans niveaux.lvl. 11. Le programme d'installation a t cr l'aide d'Inno Setup. Pour plus d'informations, voir l'annexe du Site du Zro (code web : 851504)
RIV
RSUM ET AMLIORATIONS
it pour tlhrger l version vinux X wrio okon pour vinux gode we X TQHUIS
RIW
RPH
Chapitre
25
Dicult :
Matrisez le temps !
e chapitre est d'une importance capitale : il va vous apprendre contrler le temps en SDL. Il est rare que l'on cre un programme SDL sans faire appel aux fonctions de gestion du temps, bien que le TP Mario Sokoban constitue un contre-exemple. Il n'en reste pas moins que pour la majorit des jeux, la gestion du temps est fondamentale. Par exemple, comment vous y prendriez-vous pour raliser un Tetris ou un Snake (jeu du serpent) ? Il faut bien que les blocs bougent toutes les X secondes, ce que vous ne savez pas faire. Du moins, pas avant d'avoir lu ce chapitre. ;-)
RPI
gette fontion e'etue une puse sur le progrmme durnt un ertin tempsF endnt que le progrmme est en puseD on dit qu9il dort @ sleep en nglisA X il n9utilise ps le proesseurF SDL_Delay peut don tre utilise pour rduire l9utilistion du proesseur F qre SDL_DelayD vous pourrez rendre votre progrmme moins gourmnd en ressoures proE esseurF sl fer don moins rmer votre g si SDL_Delay est utilise intelligemmentF
1
Tout dpend du programme que vous crez : parfois, on aimerait bien que notre programme utilise le moins de CPU possible pour que l'utilisateur puisse faire autre chose en mme temps, comme c'est le cas pour un lecteur MP3 qui tourne en fond pendant que vous naviguez sur Internet. Mais. . . d'autres fois, on se moque compltement que notre programme utilise tout le temps 100 % de CPU. C'est le cas de la quasi-totalit des jeux.
evenons l fontion qui nous intresseF on prototype est d9une simpliit dsolnte X
1
in lirD vous envoyez l fontion le nomre de milliseondes pendnt lesquelles votre progrmme doit dormir F g9est une simple mise en puseF r exempleD si vous voulez que votre progrmme se mette en puse I seondeD vous devrez rire X
1
hvhely @ IHHH A Y
x9ouliez ps que e sont des milliseondes X ! IHHH milliseondes a I seonde Y ! SHH milliseondes a IGP seonde Y ! PSH milliseondes a IGR seondeF
cessing Unit,
1. Notez que j'abrgerai CPU , dsormais. C'est une abrviation courante qui signie Central soit Unit centrale de calcul .
Pro-
RPP
Vous ne pouvez rien faire dans votre programme pendant qu'il est en pause ! Un programme qui dort ne peut rien faire puisqu'il n'est pas actif pour l'ordinateur.
Le problme de la granularit du temps
xonD rssurezEvousD je ne vis ps vous fire un trit de physique quntique u eu milieu d9un hpitre hv 3 outefoisD j9estime qu9il y quelque hose que vous devez svoir X SDL_Delay n9est ps une fontion prfite F it e n9est ps de s futeD 9est l fute de votre y @indowsD vinuxD w y F F FAF ourquoi l9y intervientEil lEdedns c out simplement pre que 9est lui qui ontrle les progrmmes qui tournent 3 otre progrmme v don dire l9y X te dorsD rveilleE moi dns I seonde F wis l9y ne v ps forment le rveiller extement u out d9une seondeF in e'etD il ur peutEtre un peu de retrd @un retrd de IH ms en moyenne environD dpend des gAF ourquoi c re que votre g ne peut trviller que sur un progrmme l foisF ve rle de l9y est de dire u g e sur quoi il doit trviller X elorsD pendnt RH ms tu vs trviller sur firefox.exeD puis pendnt IIH ms sur explorer.exe Y ensuiteD pendnt VH ms tu vs trviller sur programme_sdl.exeD puis retrviller sur firefox.exe pendnt TS ms D etF v9y est le vritle hef d9orhestre de l9ordinteur 3 wintenntD imginez qu9u out d9une seonde un utre progrmme soit enore en trin de trviller X il fudr qu9il it (ni pour que votre progrmme puisse reprendre l min omme on ditD 9estEEdire tre trit nouveu pr le gF u9estEe qu9il fut retenir c ue votre g ne peut ps grer plus d9un progrmme l fois F our donner l9impression que l9on peut fire tourner plusieurs progrmmes en mme temps sur un ordinteurD l9y doupe le temps et utorise les progrmmes trviller tour tourF yrD ette gestion des progrmmes est trs omplexe et on ne peut don ps voir l grntie que notre progrmme ser rveill u out d9une seonde extementF outefoisD el dpend des g omme je vous l9i dit plus hutF ghez moiD j9i pu onstter que l fontion SDL_Delay tit ssez priseF
2
cause de ce problme de granularit du temps, vous ne pouvez donc pas mettre en pause votre programme pendant un temps trop court. Par exemple, si vous faites SDL_Delay(1);, vous pouvez tre certains que votre programme ne sera pas mis en pause 1 ms mais un peu plus (peut-tre 9-10 ms).
SDL_Delay est don ien prtiqueD mis ne lui fites ps trop on(neF ille ne mettr
ps en puse votre progrmme pendnt le temps exact que vous indiquezF ge n9est ps
2. C'est toutefois de moins en moins vrai. Les CPU double cur ont en eet la capacit de travailler sur deux programmes la fois, maintenant.
RPQ
pre que l fontion est ml odeD 9est pre que le fontionnement d9un ordinteur est trs omplexe et ne permet ps d9tre trs pris e niveuF
SDL_GetTicks
gette fontion renvoie le nomre de milliseondes oules depuis le lnement du progrmmeF g9est un inditeur de temps indispensleF gel vous permet de vous reprer dns le tempsD vous llez voir 3 oii le prototype X
1
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
wintenntD dns notre oule in(nieD nous llons jouter le ode suivnt X RPR
3 4 5
tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A GB i QH ms se sont oul es BG { positionozor F x CCY GB yn ouge ozor BG tempsreedent a tempsetuel Y GB ve temps 4 tuel 4 devient le temps 4 preedent 4 pour nos futurs luls BG }
gomprenez ien e qui se psseF IF yn prend le temps tuel gre SDL_GetTicksF PF yn ompre u temps prdemment enregistrF 9il y un rt de QH ms u moinsD lorsF F F QF F F F on ouge ozorD r on veut qu9il se dple toutes les QH msF siD on le dle juste vers l droite toutes les QH ms F RF uisD et 9est vriment e qu9il ne fut ps oulierD on ple le temps tuel dns le temps prdent F in e'etD imginez le prohin tour de oule X le temps tuel ur hngD et on pourr le omprer u temps prdentF nouveuD on pourr vri(er si QH ms se seront oules et ouger ozorF
3
3. Il faut vrier si le temps est suprieur 30 ms, et non gal 30 ms ! En eet, il faut vrier si au moins 30 ms se sont coules. Rien ne vous garantit que l'instruction sera excute pile poil toutes les 30 ms.
RPS
visez mon ode X il ne se psse rien 3 yn ne rentre ps dns le ifD on ne fit don rienF yn ttend le prohin tour de oule o on vri(er nouveu si QH ms se seront oules depuis l dernire fois qu9on fit ouger ozorF ge ode est ourtD mis il fut le omprendre 3 elisez mes explitions utnt de fois que nessireD pre que 9tit prolement le pssge le plus importnt du hpitreF
Un changement dans la gestion des vnements
xotre ode est prfit un dtil prs X l fontion SDL_WaitEventF ille tit trs prtique jusqu9iiD puisqu9on n9vit ps grer le tempsF gette fontion mettit en puse le progrmme @un peu l mnire de SDL_DelayA tnt qu9il n9y vit ps d9vnementF yr iiD on n9 ps esoin d9ttendre un vnement pour fire ouger ozor 3 sl doit ouger tout seulF ous n9llez qund mme ps ouger l souris juste pour gnrer des vnements et don fire sortir le progrmme de l fontion SDL_WaitEvent 3 v solution c SDL_PollEventF te vous vis dj prsent ette fontion X ontrirement SDL_WaitEventD elle renvoie une vleurD qu9il y it eu un vnement ou nonF yn dit que l fontion n9est ps bloquante X elle ne met ps en puse le progrmmeD l oule in(nie v don tourner tout le tempsF
Code complet
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B zozor a xvv Y hvet positionozor Y hvivent event Y int ontinuer a I Y int tempsreedent a H D tempsetuel a H Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du temps en hv 4 D xvv A Y zozor a hvvodfw @ 4 zozor F mp 4 A Y hvetgoloruey @ zozor D hvggyvyui D hvwpqf @ zozor E b formt D H D H D PSS A A Y
12 13 14 15
16
RPT
positionozor F x a ern E b w G P E zozor E b w G P Y positionozor F y a ern E b h G P E zozor E b h G P Y hvinleueyepet @ IH D IH AY while @ ontinuer A { hvollivent @8 event A Y GB yn utilise ollivent et non itivent pour ne ps loquer le progrmme BG swith @ event F type A { se hvs X ontinuer a H Y rek Y } tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A GB i QH ms se sont oul es depuis le dernier tour de oule BG { positionozor F x CCY GB yn ouge ozor BG tempsreedent a tempsetuel Y GB ve temps 4 tuel 4 devient le temps 4 preedent 4 pour nos futurs luls BG } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y hvfliturfe @ zozor D xvv D ern D 8 positionozor A Y hvplip @ ern AY
25 26 27 28 29 30 31 32 33
34 35 36
37 38 39
40 41 42 43 44 45 46 47 48
gopier e ode gode we X VVUTRP ous devriez voir ozor ouger tout seul sur l9rnF sl se dle vers l droiteF issyez pr exemple de hnger le temps de QH ms en IS ms X ozor devrit se dpler deux fois plus vite 3 in e'etD il se dpler une fois toutes les IS ms u lieu d9une fois toutes les QH ms uprvntF RPU
etuellementD notre progrmme tourne en oule ind(niment l vitesse de l lumire @en(nD presqueAF sl onsomme don IHH 7 du gF our voir elD il vous su0t pr exemple de fire gv C ev C @onglet ProcessusA sous indows @(gF PSFPAF
gomme vous pouvez le voirD notre g est utilis IHH 7 pr notre progrmme testsdl.exeF te vous l9i dit plus tt X si vous odez un jeu @surtout un jeu plein rnAD e n9est ps grve si vous utilisez IHH 7 du gF wis si 9est un jeu dns une fentre pr exempleD il vut mieux qu9il utilise le moins de g possile pour que l9utilisteur puisse fire utre hose sns que son g ne rme F v solution c yn v reprendre extement le mme ode que iEdessusD mis on v lui jouter en plus un SDL_Delay pour ptienter le temps qu9il fut (n que fsse QH msF yn v juste jouter un SDL_Delay dns un else X
1 2 3 4 5 6 7
8 9 10
tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent b QH A { positionozor F x CCY tempsreedent a tempsetuel Y } else GB i fit moins de QH ms depuis le dernier tour de oule D on endort le progrmme le temps qu ' il fut BG { hvhely @ QH E @ tempsetuel E tempsreedent A A Y }
gomment el fontionneEtEilD ette fois c g9est simpleD il y deux possiilits @d9prs le ifA X ! soit fit plus de QH ms qu9on n9 ps oug ozorD dns e s on le ouge Y ! soit fit moins de QH msD dns e s on fit dormir le progrmme ve SDL_Delay le temps qu9il fut pour tteindre les QH ms environF h9o mon petit lul 30 (tempsActuel - tempsPrecedent)F i l di'rene entre le temps tuel et le temps prdent est pr exemple de PH msD lors on endormir le progrmme @QH E PHA a IH ms (n d9tteindre les QH msF
Rappelez-vous que plus que prvu. . .
SDL_Delay
RPV
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 versLaDroite qui vut vri si ozor se dple vers l droite @et fux s9il v vers l guheAF i le oolen vut vriD vous dlez don ozor vers l droiteD sinon vous le dlez vers l guheF urtoutD n9ouliez ps de hnger l vleur du oolen lorsque ozor tteint le ord droit ou le ord guheF ih ouiD il fut ien qu9il reprte dns l9utre sens 3 ! lutt que de fire reondir ozor de droite guheD fites le reondir en digoE nle sur l9rn 3 sl vous su0r de modi(er positionZozor.x et positionZozor.y simultnmentF ous pouvez essyer de voir e que fit si on ugmente x et si on diminue y en mme tempsD ou ien si on ugmente les deux en mme tempsD etF
4. Couramment abrg FPS pour Frames per second .
RPW
! pites en sorte qu9un ppui sur l touhe emphe ozor de se dplerD et qu9un nouvel ppui sur l touhe relne le dplement de ozorF g9est un te oolen tiver et dstiverF
Les timers
L'utilisation des timers est un peu complexe. Elle fait intervenir une notion qu'on n'a pas vue jusqu'ici : les pointeurs de fonctions. Il n'est pas indispensable d'utiliser les timers : si vous les trouvez trop dlicats utiliser, vous pouvez passer votre chemin sans problme.
ves timers onstituent une utre fon de rliser e qu9on vient de fire ve l fonE tion SDL_GetTicksF g9est une tehnique un peu prtiulireF gertins l trouveront prtiqueD d9utres nonF gel dpend don des gots du progrmmeurF u9estEe qu9un timer c g9est un systme qui permet de demnder l hv d9pE peler une fontion toutes les milliseondesF ous pourriez insi rer une fontion bougerEnnemi() que l hv ppellerit utomtiquement toutes les SH ms (n que l9ennemi se dple intervlles rguliersF
Comme je viens de vous le dire, cela est aussi faisable avec SDL_GetTicks en utilisant la technique qu'on a vue plus haut. Quel avantage, alors ? Eh bien disons que les timers nous obligent mieux structurer notre programme en fonctions.
Ajouter un timer
our jouter un timerD on fit ppel l fontion SDL_AddTimer dont voii le protoE type X
5
5. Il existe en fait deux fonctions permettant d'ajouter un timer en SDL : SDL_AddTimer et SDL_SetTimer. Elles sont quasiment identiques. Cependant, SDL_SetTimer est une fonction ancienne qui existe toujours pour des raisons de compatibilit. Aujourd'hui, si on veut bien faire les choses, on nous recommande donc d'utiliser SDL_AddTimer.
RQH
LES TIMERS
1
yn envoie trois prmtres l fontion X ! l'intervalle de temps @en msA entre hque ppel de l fontion Y ! le nom de la fonction appelerF yn ppelle el un callback X le progrmme se hrge de rppeler ette fontion de llk rgulirement Y ! les paramtres envoyer votre fontion de llkF
Comment ? Un nom de fonction peut servir de paramtre ? Je croyais qu'on ne pouvait envoyer que des variables !
in fitD les fontions sont ussi stokes en mmoire u hrgement du progrmmeF illes ont don elles ussi une dresseF hu oupD on peut rer desF F F pointeurs de fonctions 3 sl su0t d9rire le nom de l fontion ppeler pour indiquer l9dresse de l fontionF einsiD l hv sur quelle dresse en mmoire elle doit se rendre pour ppeler votre fontion de llkF SDL_AddTimer renvoie un numro de timer @un sh AF ous devez stoker e rsultt dns une vrile de type SDL_TimerIDF gel vous permettr pr l suite de dstiver le timer X il vous su0r d9indiquer l9sh du timer rrterF v hv vous permet d9tiver plusieurs timers en mme tempsF gel explique l9intrt de stoker un sh de timer pour pouvoir les di'renierF yn v don rer un sh de timer X
6 1
siD je re un timer qui les proprits suivntes X ! il ser ppel toutes les QH ms Y ! il ppeller l fontion de llk bougerZozor Y ! il lui enverr omme prmtre un pointeur sur l position de ozor pour qu9il puisse l modi(erF ous l9urez ompris X le rle de l fontion bougerZozor ser de hnger l position de ozor toutes les QH msF
6. Si vous souhaitez en savoir plus sur les pointeurs de fonctions, je vous invite lire le tutoriel rdig par mleg sur le Site du Zro qui traite de ce sujet (code web : 199183).
RQI
ettention X il fut tre prtiulirement vigilnt iiF otre fontion de llk doit obligatoirement voir le prototype suivnt X
1
oii mintennt le ontenu de m fontion bougerZozorD qui est plus dlite qu9il n9y prt X
1 2 3 4
5 6 7 8
GB pontion de llk @ ser ppel e toutes les QH ms A BG intQP ougerozor @ intQP intervlle D void B prmetre A { hvet B positionozor a prmetre Y GB gonversion de void B en hvet B BG positionozor E b x CCY } return intervlle Y
v fontion bougerZozor ser don utomtiquement ppele toutes les QH ms pr l hvF v hv lui enverr toujours deux prmtres @ni plusD ni moinsA X ! l'intervalle de temps qui spre deux ppels de l fontion @iiD ser QH msA Y ! le paramtre personnalis que vous vez demnd envoyer l fontionF emrquezD et 9est trs importntD que e prmtre est un pointeur sur voidF gel signi(e que 9est un pointeur qui peut pointer sur n9importe quoi X un intD une struture personnliseD ou omme ii un SDL_Rect @positionZozorAF ve prolmeD 9est que e prmtre est un pointeur de type inonnu @voidA pour l fontionF sl v don flloir dire l9ordinteur que e prmtre est un SDL_Rect* @un pointeur sur SDL_RectAF our fire D je re un pointeur sur SDL_Rect dns m fontion qui prend omme vleurF F F le pointeur parametreF
7
v9intrtD 9est que positionZozor est de type SDL_Rect* ontrirement l vrile parametre qui tit de type void*F ous pourrez don der positionZozor->x et positionZozor->yF i vous viez fit parametre->x ou parametre->yD le ompilteur urit tout rejet en lo pre
7. Il n'est pas possible d'envoyer plus d'un paramtre personnalis la fonction de callback. Heureusement, vous pouvez toujours crer un type personnalis (ou un tableau) qui sera un assemblage des variables que vous voulez transmettre.
RQP
LES TIMERS
que le type void ne ontient ps de sousEvrile x et yF eprsD l ligne suivnte est simple X on modi(e l vleur de positionZozor->x pour dler ozor vers l droiteF hernire hoseD trs importnte X vous devez retourner l vrile intervalleF gel indiquer l hv qu9on veut ontinuer fire en sorte que l fontion soit ppele toutes les QH msF i vous voulez hnger l9intervlle d9ppelD il su0t de renvoyer une utre vleur @mis ien souventD on ne hnge ps et intervlleAF
Arrter le timer
sl su0t d9ppeler SDL_RemoveTimer en indiqunt l9sh du timer rrterF siD j9rrte le timer juste prs l oule in(nieD u mme endroit que les SDL_FreeSurfaceF
En rsum
! v fontion SDL_Delay permet de mettre en puse le progrmme un ertin nomre de milliseondesF gel permet de rduire l9utilistion du g qui n9est lors plus monopolis pr votre progrmmeF ! yn peut onntre le nomre de milliseondes oules depuis le lnement du proE grmme ve SDL_GetTicksF eve quelques petits lulsD on peut s9en servir pour e'etuer une gestion des vnements non loqunte ve SDL_PollEventF ! ves timers onstituent un systme qui permet de rppeler une de vos fontions @dite de callback A intervlles rguliersF ve mme rsultt peut tre otenu ve SDL_GetTicks mis les timers ident rendre le progrmme plus lisile et mieux struturF
RQQ
RQR
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 SDL_Surface partir du texte que vous lui envoyez.
RQS
Installer SDL_ttf
sl fut svoir queD omme SDL_imageD SDL_ttf est une iliothque qui nessite que l hv soit instlle F out omme SDL_imageD SDL_ttf est une des iliothques lies l hv les plus popuE lires @9estEEdire qu9elle est trs tlhrgeAF gomme vous llez pouvoir le onstterD ette iliothque est e'etivement ien fiteF ne fois que vous urez ppris l9utiliserD vous ne pourrez plus vous en psser 3
1
une mthode en e'et ssez lourde mettre en ple et on n9urit pu utiliser qu9une seule polieF in fitD SDL_ttf fit ppel une utre iliothque X FreeTypeF g9est une iliothque ple de lire les (hiers de polie @.ttfA et d9en sortir l9imgeF SDL_ttf rupre don ette imge et l onvertit pour l hv en rnt une SDL_SurfaceF SDL_ttf don esoin de l iliothque preeype pour fontionnerD sinon elle ne ser ps ple de lire les (hiers .ttfF i vous tes sous Windows et que vous prenezD omme je le fisD l version ompile de l iliothqueD vous n9urez ps esoin de tlhrger quoi que e soit de plus r preeype ser inluse dns l hvv SDL_ttf.dllF ous n9vez don rien fireF i vous tes sous Linux ou Mac OS et que vous devez reompiler l iliothqueD il vous fudr en revnhe preeype pour ompilerF endezEvous sur l pge de tlhrE gement de preeype pour ruprer les (hiers pour dveloppeursF lhrger preeype gode we X PHSVVI
Installer SDL_ttf
endezEvous sur l pge de tlhrgement de SDL_ttfF lhrger SDL_ttf gode we X IVUUPU vD hoisissez le (hier qu9il vous fut dns l setion Binary F
2
1. Bon : si ce stade du cours vous n'avez toujours pas install la SDL, c'est grave, donc je vais supposer que c'est dj fait ! 2. Sous Windows, vous remarquerez qu'il n'y a que deux chiers .zip ayant le suxe win32 et VC6. Le premier (win32) contient la DLL que vous aurez besoin de livrer avec votre excutable. Vous aurez aussi besoin de mettre cette DLL dans le dossier de votre projet pour pouvoir tester votre programme, videmment. Le second (VC6) contient les .h et .lib dont vous allez avoir besoin pour programmer. On pourrait penser d'aprs le nom que a n'est fait que pour Visual C++, mais en fait, exceptionnellement, le chier .lib livr ici marche aussi avec mingw32, il fonctionnera donc sous Code: :Blocks.
RQT
INSTALLER SDL_TTF
ve (hier s ontient omme d9hitude un dossier include et un dossier libF lez le ontenu du dossier include dns mingw32/include/SDL et le ontenu du dossier lib dns mingw32/libF
Vous
mingw32/include/SDL
devez
copier
le chier SDL_ttf.h dans le dossier et non pas dans mingw32/include tout court.
xonD r omme je vous l9i dit preeype est inluse dns l hvv de SDL_ttfF ous n9vez ps vous prouper de preeypeD 9est SDL_ttf qui gre D mintenntF
La documentation
wintennt que vous ommenez devenir des progrmmeurs guerrisD vous devriez vous demnder immditement X wis o est l do9 c F sl y ertes des ours qui dtillent le fontionnement des iliothquesD omme e livreF outefoisF F F ! te ne vis ps fire un hpitre pour toutes les iliothques qui existent @mme en y pssnt m vieD je n9uris ps le tempsAF sl v don flloir tt ou trd lire une
4
3. Chez moi, c'est dans C:\Program Files\CodeBlocks\mingw32\lib. 4. Si vous ne vous tes pas encore pos cette question, c'est que vous n'tes pas encore des programmeurs aguerris. ;-)
RQU
do9D et mieux vut ommener pprendre le fire mintennt 3 ! h9utre prtD une iliothque est en gnrl ssez omplexe et ontient euoup de fontionsF te ne peux ps prsenter toutes es fontions dns un hpitreD e serit ien trop long 3 in lir X les doumenttions ont l9vntge d9tre ompltes et on ne peut prfois ps y ouperF te vous onseille don de mettre ds prsent dns vos fvoris l9dresse de l do9 de hvttfF houmenttion de SDL_ttf gode we X PURHSH v do9 est disponile en plusieurs formts X rwv en ligneD rwv zippD hpD etF renez l version qui vous rrnge le plusF ous verrez que SDL_ttf est une iliothque trs simple X il y peu de fontions @environ RHESHA F gel devrit tre signe @pour les progrmmeurs guerris que vous tes YEA A que ette iliothque est simple et que vous surez l mnier ssez viteF ellezD il est temps d9pprendre utiliser SDL_ttfD mintennt 3
5
Chargement de SDL_ttf
L'include
evnt toute hoseD il fut jouter l9include suivnt en hut de votre (hier .c X
1
5 inlude ` hv G hvttf Fh b
i vous vez des erreurs de ompiltion e stdeD vri(ez si vous vez ien pl le (hier SDL_ttf.h dns le dossier mingw32/include/SDL et non dns mingw32/include tout ourtF
Dmarrage de SDL_ttf
out omme l hvD SDL_ttf esoin d9tre dmrre et rrteF sl y don des fontions trs similires elles de l hv X ! TTF_Init X dmrre SDL_ttf Y ! TTF_Quit X rrte SDL_ttfF
Il n'est pas ncessaire que la SDL soit dmarre avant SDL_ttf.
our dmrrer SDL_ttf @on dit ussi initiliser AD on doit don ppeler l fontion TTF_Init()F euun prmtre n9est nessireF v fontion renvoie EI s9il y eu une
5. Oui, c'est peu !
RQV
CHARGEMENT DE SDL_TTF
psnit @A Y
i vous voulez vri(er s9il y une erreur et tre insi plus rigoureuxD utilisez plutt e ode X
1 2 3
4 5
if @ psnit @A aa EI A { fprintf @ stderr D 4 irreur d ' initilistion de psnit X 7 s n 4 D pqetirror @A A Y exit @ ispesvi A Y }
9il y eu une erreur u dmrrge de SDL_ttfD un (hier stderr.txt ser r @sous indowsD du moinsA ontennt un messge explitif de l9erreurF our eux qui se poserient l question X l fontion TTF_GetError() renvoie le dernier messge d9erreur de SDL_ttfF g9est pour el qu9on l9utilise dns le fprintfF
Arrt de SDL_ttf
our rrter SDL_ttfD on ppelle TTF_Quit()F v enoreD ps de prmtreD ps de prise de tteF ous pouvez ppeler TTF_Quit vnt ou prs SDL_QuitD peu importeF
1
puit @A Y
ve pointeur police ontiendr don les informtions sur l polie une fois qu9on l9ur ouverteF v fontion TTF_OpenFont prend deux prmtres X ! le nom du (hier de polie @u formt .ttfA ouvrirF v9idl 9est de mettre le (hier de polie dns le rpertoire de votre projetF ixemple de (hier X arial.ttf @pour l polie erilA Y RQW
! l tille de l polie utiliserF ous pouvez pr exemple utiliser une tille de PPF ge sont les mmes tilles que elles que vous utilisez dns un logiiel de tritement de texte tel que ordF sl nous reste trouver es fmeuses polies .ttfF ous en vez dj un ertin nomre sur votre ordinteurD mis vous pouvez en tlhrger sur snternet omme on v le voirF
Sur votre ordinateur
ous en vez dj sur votre ordinteur 3 i vous tes sous indowsD vous en trouverez euoup dns le dossier C:\Windows\FontsF ous n9vez qu9 opier le (hier de polie qui vous plt dns le dossier de votre projetF i le nom ontient des rtres izrres omme des espesD des ents ou mme des mjusulesD je vous onseille de le renommerF our tre sr de n9voir uun proE lmeD n9utilisez que des minusules et vitez les espesF ! ixemple de nom inorret X TIMES NEW ROMAN.TTF Y ! ixemple de nom orret X times.ttfF
Sur Internet
eutre possiilit X ruprer une polie sur snternetF ous trouverez plusieurs sites proposnt des polies grtuites et originles tlhrgerF te vous reommnde personnellement dafont.comD qui est ien lssD trs ien fourni et vriF
dafont.com gode we X UUIITP
ves (gF PTFID PTFP et PTFQ vous donnent un peru de polies que vous pourrez y trouver trs filementF
RRH
te vous propose d9utiliser l polie engelin pour l suite des exemplesF ous pouvez l tlhrger en ligneF lhrger le polie engeE lin gode we X QIPSPR yn ouvrir l polie omme ei X
1
v polie utilise ser angelina.ttfF t9i ien pris soin de mettre le (hier dns le dossier de mon projet et de le renommer pour qu9il soit tout en minusulesF v polie ser de tille TSF prt gros mis visilementD 9est une polie qu9il fut rire en gros pour qu9on puisse l voirF ge qui est trs importntD 9est que TTF_OpenFont stoke le rsultt dns l vrile policeF ous llez rutiliser ette vrile tout l9heure en rivnt du texteF ille permettr d9indiquer l polie que vous voulez utiliser pour rire votre texteF
Vous n'avez pas besoin d'ouvrir la police chaque fois que vous crivez du texte : ouvrez-la une fois au dbut du programme et fermez-la la n.
Fermer la police
sl fut penser fermer hque polie ouverte vnt l9ppel TTF_Quit()F hns mon sD donner don le ode suivnt X
1 2
it voil le trvil 3
fien X rire du texte 9est ienD mis ve quelle fontion c h9prs l do9D ps moins de IP fontions sont disponiles 3 in fitD il y trois fons di'rentes pour SDL_ttf de dessiner du texteF ! Solid @(gF PTFRA X 9est l tehnique l plus rpideF ve texte ser rpidement rit dns une SDL_SurfaceF v surfe ser trnsprente mis n9utiliser qu9un niveu de trnsprene @on ppris il y quelques hpitresAF g9est prtiqueD mis le texte ne ser ps trs joliD ps trs rrondi D surtout s9il est rit grosF tilisez ette tehnique lorsque vous devez souvent hnger le texteD pr exemple pour 0her le temps qui s9oule ou le nomre de p d9un jeuF ! Shaded @(gF PTFSA X ette foisD le texte ser joliF ves lettres seront ntilises D le texte pprtr plus lisseF sl y un dfutD en revnhe X le fond doit tre d9une ouleur unieF sl est impossile de rendre le fond de l SDL_Surface trnsprente en ShadedF ! Blended @(gF PTFTA X 9est l tehnique l plus puissnteD mis elle est lenteF in fitD elle met utnt de temps que Shaded rer l SDL_SurfaceF v seule di'rene ve ShadedD 9est que vous pouvez litter le texte sur une imge et l trnsprene ser respete @ontrirement Shaded qui imposit un fond uniAF ettention X le lul du lit ser plus lent que pour ShadedF
6
Figure PTFR ! olid X mode d9riture trs rpide mis peu esthtique @texte non lissA
in rsum X ! si vous vez un texte qui hnge souventD omme un ompte reoursD utilisez Solid Y ! si votre texte ne hnge ps trs souvent et que vous voulez litter votre texte sur un fond uniD utilisez Shaded Y ! si votre texte ne hnge ps trs souvent mis que vous voulez litter sur un fond non uni @omme une imgeAD utilisez BlendedF oilD vous devriez dj tre un peu plus fmiliers ve es trois types d9riture de SDL_ttfF te vous vis dit qu9il y vit IP fontions en toutF in e'etD pour hun de es trois types d9ritureD il y qutre fontionsF ghque fontion rit le texte l9ide d9un charset di'rentD 9estEEdire d9une plette de rtres di'renteF ges qutre fontions
6. Cela signie que leurs contours seront adoucis, ce qui est plus agrable l'il.
RRP
Figure PTFS ! hded X mode d9riture lent mis plus joli r ntilis " fond oliE
gtoirement uni
Figure PTFT ! flended X mode d9riture lent @et lit lentA mis ien plus eu r ntilis et fontionne sur un fond non uni
RRQ
sont X ! vtinI Y ! pV Y ! niode Y ! niode qlyphF v9idl est d9utiliser l9niode r 9est un hrset grnt l qusiEtotlit des rtres existnt sur erreF outefoisD utiliser l9niode n9est ps toujours forment simple @un rtre prend plus que l tille d9un char en mmoireAD nous ne verrons don ps omment l9utiliser iiF e prioriD si votre progrmme est rit en frnis le mode vtinI su0t mplementD vous pouvez vous ontenter de eluiElF ves trois fontions utilisnt le hrset vtinI sont X ! TTF_RenderText_Solid Y ! TTF_RenderText_Shaded Y ! TTF_RenderText_BlendedF
hvgolor ouleurxoire a {H D H D H }Y
Attention ne pas confondre avec les couleurs qu'utilise habituellement la SDL ! La SDL utilise des Uint32 crs l'aide de SDL_MapRGB. SDL_ttf utilise des SDL_Color.
ous voyez dns l9ordre les prmtres envoyer X l polie @de type TTF_FontAD le texte rireD et en(n l ouleur @de type SDL_ColorAF ve rsultt est stok dns une SDL_SurfaceF SDL_ttf lule utomtiquement l tille nessire donner l surfe en fontion de l tille du texte et du nomre de rtres que vous vez voulu rireF gomme toute SDL_SurfaceD notre pointeur texte ontient les sousEvriles w et h indiE qunt respetivement s lrgeur et s huteurF g9est don un on moyen de onntre les dimensions du texte une fois que eluiEi t rit dns l SDL_SurfaceF ous n9urez qu9 rire X RRR
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B texte a xvv D B fond a xvv Y hvet position Y hvivent event Y ppont B polie a xvv Y hvgolor ouleurxoire a {H D H D H }Y int ontinuer a I Y hvsnit @ hvsxsshiy A Y psnit @A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du texte ve hvttf 4 D xvv A Y fond a swqvod @ 4 morir F jpg 4 A Y GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB riture du texte dns l hvurfe texte en mode flended @ optiml A BG texte a penderextflended @ polie D 4 lut les rHs 3 4 D ouleurxoire A Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y }
20 21 22 23 24 25 26
27
28 29 30 31 32 33 34 35 36 37 38
RRS
hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y position F x a H Y position F y a H Y hvfliturfe @ fond D xvv D ern D 8 position A Y GB flit du fond BG position F x a TH Y position F y a QUH Y hvfliturfe @ texte D xvv D ern D 8 position A Y GB flit du texte BG hvplip @ ern A Y
40 41 42 43
44 45 46 47
48 49 50 51 52 53 54 55 56 57 58
gopier e ode gode we X PVSRWR ve rsultt vous est prsent sur l (gF PTFUF i vous voulez hnger de mode d9riture pour testerD il n9y qu9une ligne modi(er X elle rnt l surfe @ve l9ppel l fontion TTF_RenderText_BlendedAF
La fonction TTF_RenderText_Shaded prend un quatrime paramtre, contrairement aux deux autres. Ce dernier paramtre est la couleur de fond utiliser. Vous devrez donc crer une autre variable de type SDL_Color pour indiquer une couleur de fond (par exemple le blanc).
our les )gsD vous devez utiliser es onstntes X ! TTF_STYLE_NORMAL X norml Y ! TTF_STYLE_BOLD X grs Y ! TTF_STYLE_ITALIC X itlique Y ! TTF_STYLE_UNDERLINE X soulignF gomme 9est une liste de )gsD vous pouvez les ominer l9ide du symole | omme on ppris le fireF estons X
1 2 3 4
5 6
GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB ve texte ser rit en itlique et soulign BG petponttyle @ polie D pvisevsg | pvixhivsxi AY GB riture du texte en itlique et soulign BG texte a penderextflended @ polie D 4 lut les rHs 3 4 D ouleurxoire A Y
sulttD le texte est rit en itlique et soulign @(gF PTFVAF our resturer une polie son tt normlD il su0t de refire ppel l fontion TTF_SetFontStyle en utilisnt ette fois le )g TTF_STYLE_NORMALF RRU
Exercice : le compteur
get exerie v umuler e que vous vez ppris dns e hpitre et dns le hpitre sur l gestion du tempsF otre missionD si vous l9eptezD onsister rer un ompteur qui s9inrmenter tous les diximes de seondeF ge ompteur v don progressivement 0her X HD IHHD PHHD QHHD RHHD etF eu out d9une seonde le nomre IHHH devrit don s90herF
Astuce pour crire dans une chane
our rliser et exerieD vous urez esoin de svoir omment rire dns une hne de rtres en mmoireF in e'etD vous devez donner un char* TTF_RenderText mis vousD e que vous urezD 9est un nomre @un int pr exempleAF gomment onvertir un nomre en hne de rtres c yn peut utiliser pour el l fontion sprintfF ille mrhe de l mme mnire que fprintfD suf qu9u lieu d9rire dns un (hier elle rit dns une hne F ve premier prmtre que vous lui donnerez ser don un pointeur sur un tleu de charF
7
Veillez rserver susamment d'espace pour le tableau de char si vous ne voulez pas dborder en mmoire !
7. Le s de sprintf signie string , c'est--dire chane en anglais.
RRV
ixemple X
1
siD temps est un tleu de char @PH rtresAD et compteur est un int qui ontient le tempsF eprs ette instrutionD l hne temps ontiendr pr exemple "Temps : 500"F vous de jouer 3
Correction
8 9 10
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B texte a xvv Y hvet position Y hvivent event Y ppont B polie a xvv Y hvgolor ouleurxoire a {H D H D H } D ouleurflnhe a { PSS D PSS D PSS }Y int ontinuer a I Y int tempsetuel a H D tempsreedent a H D ompteur a H Y hr temps PH a 4 4 Y GB leu de hr suffismment grnd BG hvsnit @ hvsxsshiy A Y psnit @A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du texte ve hvttf 4 D xvv A Y GB ghrgement de l polie BG polie a pypenpont @ 4 ngelin F ttf 4 D TS A Y GB snitilistion du temps et du texte BG tempsetuel a hvqetiks @A Y sprintf @ temps D 4 emps X 7 d 4 D ompteur AY texte a penderexthded @ polie D temps D ouleurxoire D ouleurflnhe A Y while @ ontinuer A { hvollivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y
11 12 13 14 15
16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33
RRW
} hvpillet @ ern D xvv D hvwpqf @ ern E b formt D PSS D PSS D PSS A A Y tempsetuel a hvqetiks @A Y if @ tempsetuel E tempsreedent ba IHH A GB i IHH ms u moins se sont oul es BG { ompteur Ca IHH Y GB yn rjoute IHH ms u ompteur BG sprintf @ temps D 4 emps X 7 d 4 D ompteur A Y GB yn rit dns l h ne 4 temps 4 le nouveu temps BG hvpreeurfe @ texte A Y GB yn supprime l surfe pr dente BG texte a penderexthded @ polie D temps D ouleurxoire D ouleurflnhe A Y GB yn rit l h ne temps dns l hvurfe BG tempsreedent a tempsetuel Y GB yn met jour le tempsreedent BG } position F x a IVH Y position F y a PIH Y hvfliturfe @ texte D xvv D ern D 8 position A Y GB flit du texte BG hvplip @ ern A Y } pglosepont @ polie A Y puit @A Y hvpreeurfe @ texte A Y hvuit @A Y } return isggi Y
37 38 39
40 41
42
43
44
45
46 47 48 49 50
51 52 53 54 55 56 57 58 59 60 61 62
gopier e ode gode we X WIQIHU v (gF PTFW vous prsente le rsultt u out de IQDW seondes trs extementF x9hsitez ps tlhrger e projet si vous souhitez l9tudier en dtil et l9mliorerF sl n9est ps enore prfit X on pourrit pr exemple utiliser SDL_Delay pour viter d9utiliser IHH 7 du gF lhrger le projet gode we X UTSTPW RSH
i vous voulez mliorer e petit out de progrmmeD vous pouvez essyer d9en fire un jeu o il fut liquer le plus de fois possile dns l fentre ve l souris dns un temps imprtiF n ompteur s9inrmenter hque li de l sourisF n ompte reours doit s90herF vorsqu9il tteint HD on rpitule le nomre de lis e'etus et on demnde si on veut fire une nouvelle prtieF ous pouvez ussi grer les meilleurs sores en les enregistrnt dns un (hierF gel vous fer trviller nouveu l gestion des (hiers en gF fon ourge 3
En rsum
! yn ne peut ps rire de texte en hvD moins d9utiliser une extension omme l iliothque SDL_ttfF ! gette iliothque permet de hrger un (hier de polie u formt .ttf l9ide de l fontion TTF_OpenFontF ! sl y trois modes d9riture du texteD du plus simple u plus sophistiqu X SolidD Shaded et BlendedF ! yn rit dns une SDL_Surface vi des fontions omme TTF_RenderText_BlendedF RSI
RSP
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.
RSQ
Installer FMOD
Pourquoi FMOD ?
ous le svez mintennt X l hv n9est ps seulement une iliothque grphiqueF ille permet ussi de grer le son vi un module ppel SDL_audioF elors que vient fire dns e hpitre une iliothque externe qui n9 rien voir omme pwyh c g9est en fit un hoix que j9i fit prs de nomreux testsF t9uris pu vous expliquer omment grer le son en hv mis j9i prfr ne ps le fireF te m9expliqueF
Pourquoi j'ai vit SDL_audio
v gestion du son en hv est s niveu F rop mon gotF sl fut e'etuer plusieurs mnipultions trs prises pour jouer du sonF g9est don omplexe et je ne trouve ps musntF sl y ien d9utres iliothques qui proposent de jouer du son simplementF
Petit rappel : une bibliothque bas niveau est une bibliothque proche de l'ordinateur. On doit donc connatre un peu le fonctionnement interne de l'ordinateur pour s'en servir et il faut gnralement plus de temps pour arriver faire la mme chose qu'avec une bibliothque haut niveau . N'oubliez pas que tout est relatif : il n'y a pas les bibliothques bas niveau d'un ct et les bibliothques haut niveau de l'autre. Certaines sont juste plus ou moins haut niveau que d'autres. Par exemple FMOD est plus haut niveau que le module SDL_audio de la SDL.
eutre dtil importntD l hv ne permet de jouer que des sons u formt eF ve formt e est un formt de son non ompressF ne musique de Q minutes dns e formt prend plusieurs dizines de woD ontrirement un formt ompress omme wQ ou ygg qui oupe euoup moins d9espe @P Q woAF in fitD si on y r)hit ienD 9tit un peu preil ve les imgesF v hv ne gre que les fw @imges non ompressesA l seF yn d instller une iliothque supplmentire @SDL_imageA pour pouvoir lire d9utres imges omme les tiqD xqD qspD etF ih ien (gurezEvous qu9il y une iliothque quivlente pour le son X SDL_mixerF ille est ple de lire un grnd nomre de formts udioD prmi lesquels les wQD les yggD les widiF F F it pourtntD l enore j9i vit de vous prler de ette iliothqueF ourquoi c
Pourquoi j'ai vit SDL_mixer
SDL_mixer est une SDL_imageF ille est
iliothque qu9on joute en plus de l hvD l mnire de simple utiliser et lit euoup de formts udio di'rentsF ouE tefoisD prs mes testsD il s9est vr que l iliothque omportit des ugs gnnts en plus d9tre reltivement limite en fontionnlitsF RSR
INSTALLER FMOD
g9est don pour el que je me suis ensuite penh sur pwyhD une iliothque qui n9 ertes rien voir ve l hvD mis qui l9vntge d9tre puissnte et rputeF
Tlcharger FMOD
i je vous ronte tout D 9est pour vous expliquer que le hoix de pwyh n9est ps nodinF g9est tout simplement pre que 9est l meilleure iliothque grtuite que j9i pu trouverF ille est ussi simple utiliser que SDL_mixerD ve un vntge non ngligele X elle n9est ps uggeF pwyh permet en outre de rliser plusieurs e'ets intressnts que SDL_mixer ne proE pose psD omme des e'ets sonores QhF
FMOD est une bibliothque gratuite mais pas sous license LGPL, contrairement la SDL. Cela signie que vous pouvez l'utiliser gratuitement tant que vous ne ralisez pas de programme payant avec. Si vous voulez faire payer votre programme, il faudra payer une redevance l'auteur (je vous laisse consulter les prix sur le site de FMOD). De nombreux jeux commerciaux utilisent FMOD ; parmi les plus connus : Starcraft II, World of Warcraft : Cataclysm, Crysis 2, etc.
sl existe plusieurs versions de pwyhD en prtiulier elle destine une utilistion sous des y dits hituels @vinuxD indowsD wF F FAD elle s9ppelle pwyh ix rogrmmers esF lhrgez don l version de pwyh ix orrespondnt votre yF renez l version dite stle F ri(ez en prtiulier si vous vez un y QP its ou TR its @sous indowsD fites un li droit sur yrdinteur D puis roprits pour le svoirAF lhrger pwyh gode we X QHIWQR
Installer FMOD
v9instlltion fontionne sur le mme prinipe que les utres iliothquesD omme l hvF ve (hier que vous vez tlhrg est normlement un exutle @sous indowsAD ou une rhive @Fdmg sous wD FtrFgz sous vinuxAF te vis dtiller ii l produre sous indowsD mis el fontionne sur le mme prinipe sous w y et vinuxF IF snstllez pwyh ix sur votre disqueF ves (hiers dont nous vons esoin seE ront pls dns un rpertoire similire eluiEi X C:\Program Files\FMOD SoundSystem\FMOD Programmers API Win32\apiF PF hns e dossierD vous trouverez l hvv de pwyh ix @fmodex.dllA pler dns le rpertoire de votre projetF v9utre hvvD fmodexL.dllD sert e'etuer du RSS
doggeF xous n9en ferons ps iiF etenez surtout que 9est le (hier fmodex.dll que vous devrez livrer ve votre progrmmeF QF hns le dossier api/incD vous trouverez les .hF lezEles t des utres .h dns le dossier de votre shiF r exemple Code Blocks/mingw32/include/fmodex @j9i r un dossier spil pour pwyh omme pour hvAF RF hns le dossier api/libD ruprez le (hier qui orrespond votre ompilteurF n (hier texte doit vous indiquer quel (hier vous devez prendre X ! i vous utilisez gode floksD don le ompilteur mingwD opiez libfmodex.a dns le dossier lib de votre shiF hns le s de gode floksD 9est le dossier CodeBlocks/mingw32/lib Y ! i vous utilisez isul gCCD ruprez le (hier fmodex_vc.libF SF in(nD et 9est peutEtre le plus importntD il y un dossier documentation dns le rpertoire de pwyh ixF xormlementD des rouris ont t rs dns le menu Dmarrer vers ette doumenttionF qrdez un il dessusD r nous ne pourrons ps douvrir toutes les fontionnlits de pwyh ix dns e oursF ous en urez trs ertinement esoin dns peu de tempsF sl reste on(gurer notre projetF v enoreD 9est omme les utres fois X vous ouvrez votre projet ve votre shi fvori et vous joutez le (hier .a @ou .libA l liste des (hiers que le linker doit ruprerF ous gode floks @j9i l9impression de me rpterAD menu Project > Build OptionsD onglet LinkerD liquez sur Add et indiquez o se trouve le (hier .aF i on vous demnde ueep s reltive pth c D je vous onseille de rpondre nonD mis de toute mnire el devrit fontionner dns les deux sF pwyh ix est instllD voyons rpidement de quoi il est onstituF
Inclure le header
evnt toute hoseD vous vez d le fire instintivement mintennt mis ne ote rien de le priserD il fut inlure le (hier .h de pwyhF
1
t9i pl e (hier dns un sousEdossier fmodexF edptez ette ligne en fontion de l position du (hier si 9est di'rent hez vousF i vous tes sous vinuxD l9instlltion se fit utomtiquement dns le dossier fmodexF RST
pwyhiw B system Y
our llouer dns l mmoire et ojet systmeD on utilise l fontion FMOD_System_Create dont voii le prototype X
1 2 3
emrquons que ette fontion prend en prmtre un pointeur sur un pointeur de FMOD_SYSTEMF ves plus giles d9entre vous uront remrqu que lors de l dlrtion du pointeur sur FMOD_SYSTEMD il n9 ps t llou ve malloc() ou une utre fontionF g9est justement l rison pour lquelle l fontion FMOD_System_Create prend un tel prmtre pourD entre utresD llouer le pointeur systemF gonrtementD prs voir dlr notre ojet systmeD il su0t de fire X
1 2
oilD mintennt on dispose d9un ojet systme llouD il ne reste plus qu9 l9initiliserF our e fireD on utilise l fontion FMOD_System_Init dont le prototype est X
1 2 3 4 5 6
pwyhiv pwyhystemsnit @ pwyhiw B system D int mxhnnels D pwyhsxspveq flgs D void B extrdriverdt AY
! ve prmtre system est le prmtre qui nous intresse le plusD r 9est le pointeur qu9on veut initiliserF ! ve prmtre maxchannels est le nomre mximum de nux que devr grer pwyhF in d9utres termesD 9est le nomre mximl de sons qui pourront tre jous en mme tempsF out dpend de l puissne de votre rte son Y on onseille gnrlement une vleur de QP @e ser su0snt pour l pluprt des petits jeuxAF our infoD pwyh peut thoriquement grer jusqu9 IHPR nux di'rentsD mis e niveu risque de euoup fire trviller votre ordinteur 3 ! ve prmtre flag ne nous intresser ps normment dns e ours Y on se ontenE ter de lui donner l vleur FMOD_INIT_NORMALF RSU
! ve prmtre extradriverdata ne nous intresser ps non plusD et on lui donner omme vleur NULLF r exempleD pour dlrerD llouer et initiliser un ojet systmeD on fer omme suit X
1 2 3
ien qu9ve les sites de l premire pgeD vous devriez trouver votre onheurF ersonE nellementD j9i retenu FindSounds.comD un moteur de reherhe pour sonsF te ne sis ps si 9est le meilleurD mis en tout s il est ien ompletF pindoundsFom gode we X VUTVUH
Si vous ne savez pas quels mots-cls taper pour votre recherche, rendez-vous sur la page des exemples de recherche. Certes, il faut connatre quelques mots d'anglais (mais de toute faon, si vous voulez programmer, comment voulez-vous faire sans tre au moins capables de lire l'anglais ?).
in reherhnt gun D on trouve des tonnes de sons de tir de fusil Y en tpnt door on trouve des ruits de porte @(gure PUFIAD etF
remire tpe X rer un pointeur de type FMOD_SOUND qui reprsenter notre sonF
1
Charger le son
heuxime tpe X hrger le son ve l fontion FMOD_System_CreateSoundF ille prendF F F S prmtres X ! n objet systme dont on prl prdemmentF fien sr et ojet doit tre prt l9emploi @dlrD llou et initilisAF ! ve nom du chier son hrgerF sl peut tre de formt eD wQD yqqD etF outefoisD il vut mieux hrger des sons ourts @quelques seondes mximumA plutt que des sons longsF in e'etD l fontion hrger et doder tout le son en mmoireD e qui peut prendre de l ple si le son est une musique 3 ! ve troisime prmtre est un prmtre flagF sl nous intresse prtiulirement iiD r 9est gre lui qu9on pourr dire pwyh que le son qu9on veut jouer est un son ourtF our eiD on utiliser l vleur FMOD_CREATESAMPLEF ! ve qutrime prmtre ne nous intresse psD et on mettr NULL omme vleurF ! ve dernier prmtre est du type FMOD_SOUND ** soundD et 9est e pointeurEl qu9on utiliser pr l suite pour jouer notre sonF in quelque sorteD on peut onsidrer que e pointeur pointer l9venir vers notre sonF RSW
RTH
siD je hrge le son pan.wavF ve pointeur tir fer rfrene e son pr l suiteF
Si vous voulez faire les tests en mme temps que moi, je vous propose de tlcharger le son pan.wav, que j'utiliserai galement par la suite.
lhrger le son gode we X UUPTIS i tout se psse ienD l fontion renvoie l vleur FMOD_OKF inonD 9est qu9il y eu un prolme lors de l9ouverture du (hier udio @(hier orrompu ou inexistnt pr exempleAF
Jouer le son
ous voulez jouer le son c s de prolme ve l fontion FMOD_System_PlaySound 3 sl su0t de lui donner un ojet systme prt l9emploiD un numro de nl sur lequel jouer insi que le pointeur sur le sonD et d9utres prmtres qui ne nous intressent ps et qu9on mettr NULL ou 0F our le numro de nlD ne vous prenez ps l tte et envoyez FMOD_CHANNEL_FREE pour lisser pwyh grer F
1
vorsque vous n9vez plus esoin du sonD vous devez le lirer de l mmoireF sl n9y rien de plus simpleD il su0t d9indiquer le pointeur lirer ve l fontion FMOD_Sound_Release
1
pwyhoundelese @ tir A Y
otre mission est simple X rer un jeu de tirF fonD on ne v ps rliser un jeu omplet iiD mis juste l gestion du viseurF te vous i justement fit un petit viseur sous int @(gure PUFPAF RTI
frefD voil les ojetifs X ! pond de fentre X noirF ! ointeur de l souris X invisileF ! v9imge du viseur est litte l position de l souris lorsqu9on l dpleF ettention X il fut que le gixi de l9imge soit pl u niveu du pointeur de l sourisF ! und on liqueD le son pan.wav doit tre jouF peut tre le dut d9un jeu de tirF rop file c ykD lors vous de jouer 3
La correction
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B viseur a xvv Y hvivent event Y hvet position Y int ontinuer a I Y pwyhiw B system Y pwyhyxh B tir Y pwyhiv resultt Y GB gr tion et initilistion d ' un ojet syst me BG pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB ghrgement du son et v rifition du hrgement BG resultt a pwyhystemgreteound @ system D 4 pn F wv 4 D pwyhgieiewvi D H D 8 tir A Y if @ resultt 3a pwyhyu A { fprintf @ stderr D 4 smpossile de lire pn F wv n 4 A Y exit @ ispesvi A Y }
26 27 28 29 30
RTP
GB snitilistion de l hv BG hvsnit @ hvsxsshiy A Y hvhowgursor @ hvhsefvi A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y hvwetgption @ 4 qestion du son ve pwyh 4 D xvv A Y viseur a swqvod @4 viseur F png 4 A Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvwyifyxhyx X GB vorqu ' on lique D on joue le son BG pwyhystemlyound @ system D pwyhgrexxivpii D tir D H D xvv A Y rek Y se hvwyiwysyx X GB vorsqu ' on d ple l souris D on ple le entre du viseur l position de l souris FFF h ' o notmment le 4 viseur E b w G P 4 pour r ussir fire el BG position F x a event F motion F x E @ viseur E b w G P A Y position F y a event F motion F y E @ viseur E b h G P A Y rek Y } hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ viseur D xvv D ern D 8 position A Y hvplip @ ern AY
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
53 54 55
56
57 58 59 60 61 62
63 64 65 66 67 68 69 70 71
GB yn ferme l hv BG hvpreeurfe @ viseur A Y hvuit @A Y GB yn li re le son et on ferme et li re l ' ojet syst me BG pwyhoundelese @ tir A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y
72 73 74
RTQ
return isggi Y
gopier e ode gode we X SRRWRQ v (gure PUFQ vous donne un peru du miniEjeuD mis le mieux est enore de voir le rsultt en vido ve le son sur le we 3
oir l vido gode we X QIUVUP siD j9i hrg pwyh vnt l hv et je l9i lir prs l hvF sl n9y ps de rgles u niveu de l9ordre @j9uris tout ussi ien pu fire l9inverseAF t9i hoisi de hrger l hv et d9ouvrir l fentre prs le hrgement de pwyh pour que le jeu soit prt tre utilis ds que l fentre s9ouvre @sinon il urit peutEtre fllu ttendre quelques milliseondes le temps que pwyh se hrgeAF gei tntD lire vous de hoisir l9ordre que vous voulez Y 9est un dtilF ve ode estD je penseD su0smment ommentF sl n9y ps de pige prtiulierD ps de nouveut frssnteF yn noter l petite di0ult qui onsistit litter le entre du viseur u niveu du pointeur de l sourisF ve lul de l position de l9imge est fit en fontionF RTR
our eux qui n9urient ps enore ompris l di'reneD voii de quoi il retourneF our l9osionD j9i rtiv l90hge du pointeur de l souris pour qu9on voie omment est pl le viseur pr rpport u pointeurF !
1 2
!
1 2
Ides d'amlioration
ge ode est l se d9un jeu de shootF ous vez le viseurD le ruit de tirD il ne vous reste plus qu9 fire pprtre ou d(ler des ennemis et mrquer le sore du joueurF gomme d9hitudeD 9est vous de jouerF ous vouliez fire un jeu c u9 el ne tienneD vous vez le niveu mintenntD et mme un ode de se pour dmrrer un jeu de tir 3 u9estEe que vous ttendezD frnhement c
Bien sr, les forums du Site du Zro sont toujours l pour vous aider si vous tes bloqus un moment de la cration de votre jeu. Il est normal de rencontrer des dicults, quel que soit le niveau que l'on ait.
fonD l question mintennt est X o trouver des musiques lires de droit c F yn pourrit fire une reherhe de pree wusi sur qoogleD mis l pour le oup il n9est ps notre miF in e'etD llez svoir pourquoiD on eu tper le mot pree D on tome qund mme sur des sites qui nous proposent d9heter des musiques 3 sl existe heureusement des sites qui sont ddis l musique lire de droitF vD je vous reommnde tmendo qui est un trs on siteD mis e n9est ps le seul qui existe dns le domineF tmendoFom gode we X PTPUWV ves hnsons sont lsses pr styleF ous vez euoup de hoixF yn y trouve du onD du moins onD du trs trs onD du trs trs nulF F F in fitD tout dpend de vos gots et de votre reptivit ux di'rents styles de musiqueF he prfreneD prenez une hnson qui peut servir de musique de fond et qui orrespond ien l9univers de votre jeuF our informtionD ette hnson provient de l9lum vies nd peehes du groupe frnis rype F our en svoir plus sur rype D vous pouvez visiter leur pge wypeF wype de rype gode we X VQWPSH
Je suis parfaitement conscient que les gots et les couleurs ne se discutent pas. N'ayez donc pas peur de prendre une autre musique si celle-ci ne vous plaisait pas.
t9i don tlhrg l9lum et je vis utiliser l hnson rome u formt wQF ous pouvez l tlhrger diretement depuis le ite du ro si vous voulez fire des tests en mme temps que moiF g9est un des vntges de l musique lire X on peut l RTT
opier G distriuer lirementD don ne nous gnons psF lhrger rome gode we X WPTPHV
it voil le trvil 3 wis e n9est ps toutF hns le s d9une musiqueD il peut tre ien de svoir modi(er le volumeD grer les rptitions de l hnsonD l mettre en puse ou mme l9rrterF g9est e genre de hoses que nous llons voir mintenntF wis vnt D nous urons esoin de trviller sur les nux diretementF
Rcuprer un canal ou un groupe de canaux
hns des versions prdentes de l liririe pwyhD le simple numro d9identi(tion d9un nl su0sit pour pouvoir modi(er le volume ou ien mettre en puse une hnsonF hepuis pwyh ixD il y eu un petit hngement X prtir du numro de nlD on utilise une fontion qui fournit un pointeur vers e nlF v9ide est reste l mmeD seule l9implmenttion hngF n nl est d(ni omme tnt du type FMOD_CHANNELD et l fontion qui permet de ruprer un nl prtir d9un numro id est FMOD_System_GetChannelF r exempleD si j9i un ojet systme system et que je veux ruprer le nl nWD il fut fire X
1 2
ien de plus simple 3 ! ve premier prmtre est l9ojet systmeF ! ve deuxime est le numro id du nlF ! ve troisime est l9dresse du pointeur o l9on veut stoker l9informtion voulueF ne fois qu9on ur notre pointeur de nlD on pourr filement mnipuler l musique @modi(er le volumeD mettre en puseF F FAF xotez qu9on peut ussi ruprer tout un groupe de nux en un seul pointeur Y vite de refire l mme mnipultion pour hque nl distintF ve type d9un groupe RTU
de nux est FMOD_CHANNELGROUPD et une des fontions qui nous intresse le plus est FMOD_System_GetMasterChannelGroupD r elle permet d9otenir un pointeur vers l totlit des nux utiliss pr un ojet systmeF ve mode de fontionnement de ette fontion est identique l prdenteF
Modier le volume
our modi(er le volumeD on peut le fire soit pour un nl prisD soit pour tous les E nuxF r exempleD pour le fire pour tous les nuxD il fut d9ord ruprer un poinE teur vers le groupe de nuxD puis utiliser l fontion FMOD_ChannelGroup_SetVolume dont le prototype est X
1 2 3 4
ve prmtre channelgroup est elui qu9on vient de ruprerF ve prmtre volume est du type floatD tel que HFH orrespond u sileneD et IFH orrespond une leture pleine puissne @9est ette vleur qui est pr dfutAF
Rptition de la chanson
yn souvent esoin de rpter l musique de fondF g9est justement e que propose l fontion FMOD_Sound_SetLoopCountF ille prend P prmtres X ! ve pointeur vers l hnsonF ! ve nomre de fois qu9elle doit tre rpteF i vous mettez ID l hnson ser don lue deux foisF i vous mettez un nomre ngtif @omme EIAD l hnson ser rpte l9in(niF eve e ode soureD notre musique ser don rpte l9in(ni X
1
pwyhoundetvoopgount @ musique D EI A Y
Pour que la rptition fonctionne, il faut envoyer FMOD_LOOP_NORMAL en troisime paramtre de la fonction FMOD_System_CreateSound.
Mettre en pause la chanson
sl y ii P fontions onntre X ! FMOD_Channel_GetPaused(canal, &etat) X indique si l hnson joue sur le nl indiqu est en puse ou psF ille met vri dns etat si l hnson est en puseD fux si elle est en trin d9tre joueF RTV
hnson sur le nl indiquF invoyez I @vriA pour mettre en puseD H @fuxA pour rtiver l letureF ge out de ode de fentre hv met en puse l hnson si on ppuie sur l touhe P du lvierD et l rtive si on ppuie nouveu sur PF
1 2 3 4 5 6 7 8
se hvuihyx X if @ event F key F keysym F sym aa hvup A GG i on ppuie sur { pwyhfyyv ett Y pwyhghnnelqetused @ nl D 8 ett A Y if @ ett aa I A GG i l hnson est en puse pwyhghnneletused @ nl D H AY GG yn enl ve l puse else GG inon D elle est en ours de leture pwyhghnneletused @ nl D I A Y GG yn met en puse
9 10
11 12
} rek Y
i on veut ppliquer le mme tritement tous les nux runisD on utiliser les fonE tions FMOD_ChannelGroup_GetPaused et FMOD_ChannelGroup_SetPausedD l seule di'rene qu9il fut fire psser omme prmtre un FMOD_CHANNELGROUP u lieu d9un FMOD_CHANNELF
Stopper la lecture
sl su0t d9ppeler FMOD_Channel_Stop pour stopper une musique sur un nlD ou ien FMOD_ChannelGroup_Stop pour un ensemle de nuxF yn leur envoie respetivement le pointeur vers le nl ou ien le pointeur vers le groupe de nuxF
Et bien d'autres choses
yn peut fire euoup d9utres hosesD mis je ne vis ps vous les numrer toutes iiD utnt lire l do 3 te vous invite don y jeter un il si vous herhez des fontions supplmentiresF
Librer la mmoire
pwyhoundelese @ musique A Y
RTW
int min @ int rg D hr B rgv A { hvurfe B ern a xvv D B pohette a xvv Y hvivent event Y hvet position Y int ontinuer a I Y pwyhiw B system Y pwyhyxh B musique Y pwyhiv resultt Y pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB yn ouvre l musique BG resultt a pwyhystemgreteound @ system D 4 hypehome F mpQ 4 D pwyhypei | pwyhPh | pwyhgieiiew D H D 8 musique A Y GB yn v rifie si elle ien t ouverte @ swyex A BG if @ resultt 3a pwyhyu A { fprintf @ stderr D 4 smpossile de lire le fihier mpQ n 4 A Y exit @ ispesvi A Y } GB yn tive l r p tition de l musique l ' infini BG pwyhoundetvoopgount @ musique D EI A Y GB yn joue l musique BG pwyhystemlyound @ system D pwyhgrexxivpii D musique D H D xvv A Y hvsnit @ hvsxsshiy A Y ern a hvetideowode @ TRH D RVH D QP D hvrpegi | hvhyfvifp A Y
24 25 26 27 28 29 30 31 32 33 34 35 36
37 38 39 40
RUH
hvwetgption @ 4 qestion du son ve pwyh 4 D xvv A Y pohette a swqvod @ 4 hypeliesndspeehes F jpg 4 A Y position F x a H Y position F y a H Y while @ ontinuer A { hvitivent @8 event A Y swith @ event F type A { se hvs X ontinuer a H Y rek Y se hvuihyx X if @ event F key F keysym F sym aa hvup A GG i on ppuie sur { pwyhgrexxivqy B nl Y pwyhfyyv ett Y pwyhystemqetwsterghnnelqroup @ system D 8 nl A Y pwyhghnnelqroupqetused @ nl D 8 ett A Y if @ ett A GG i l hnson est en puse pwyhghnnelqroupetused @ nl D HA Y GG yn enl ve l puse else GG inon D elle est en ours de leture pwyhghnnelqroupetused @ nl D IA Y GG yn tive l puse
56 57 58 59
60 61 62 63
64 65
66 67 68 69 70
} rek Y
71 72 73 74 75 76 77 78 79 80 81 82 83
hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY hvfliturfe @ pohette D xvv D ern D 8 position A Y hvplip @ ern AY
pwyhoundelese @ musique A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y hvpreeurfe @ pohette A Y hvuit @A Y } return isggi Y
RUI
gopier e ode gode we X TWUSST ristoire d9voir utre hose qu9une fentre noireD j9i mis l pohette de l9lum en imge de fondF our pprier pleinement le rsulttD je vous invite regrder l vido du progrmme en ours d9exutionF oir l vido gode we X SIUSPT
En rsum
! v hv possde des fontionnlits udio limites et il est plutt onseill de se penher sur une iliothque ddie u sonD omme pwyhF ! yn distingue P types de sons ve pwyh X des sons ourts @un ruit de ps pr exempleA et des sons longs @une musique pr exempleAF ! ghun de es types se lit ve l mme fontion mis ve des )gs di'rents en optionF ! pwyh permet de jouer simultnment plusieurs sons di'rents l9ide de plusieurs nuxF
RUP
Chapitre
28
Dicult :
e chapitre de travaux pratiques va vous proposer de manipuler la SDL et FMOD simultanment. Cette fois, nous n'allons pas travailler sur un jeu. Certes, la SDL est tout particulirement adapte cela, mais on peut l'utiliser dans d'autres domaines. Ce chapitre va justement vous prouver qu'elle peut servir autre chose. Nous allons raliser ici une visualisation du spectre sonore en SDL. Cela consiste acher la composition du son que l'on joue, par exemple une musique. On retrouve cela dans de nombreux lecteurs audio. C'est amusant et ce n'est pas si compliqu que a en a l'air !
RUQ
ge hpitre v nous permettre de trviller utour de notions que nous vons douE vertes remment X ! l gestion du temps Y ! l iliothque pwyhF xous douvrirons en outre omment modi(er une surfe pixel pr pixelF v (gure PVFI vous donne un peru du progrmme que nous llons rer dns e hpitreF
g9est le genre de visulistion qu9on peut retrouver dns des leteurs udio tels que inmpD indows wedi lyer ou enore emrouF it pour ne rien gherD omme je vous l9i dit e n9est ps ien di0ile fireF h9illeursD ontrirement u wrio okonD ette fois 9est vous qui llez trvillerF vous fer un trs on exerieF
Les consignes
ves onsignes sont simplesF uivezEles ps ps dns l9ordreD et vous n9urez ps d9enE nuisF
1/ Lire un MP3
our ommenerD vous devez rer un progrmme qui lit un (hier wQF ous n9vez qu9 reprendre l hnson rome du groupe rype que nous vons utilise dns le hpitre sur pwyh pour illustrer le fontionnement de l leture d9une musiqueF RUR
LES CONSIGNES
lhrger l hnson gode we X WPTPHV i vous vez ien suivi le hpitre sur pwyhD il ne vous fudr ps plus de quelques minutes pour rriver le fireF te vous onseille u pssge de pler le wQ dns le dossier de votre projetF
ur l guhe de l fentreD nous fisons don pprtre les sses frquenesD et sur l droite les hutes frquenesF
Mais comment rcuprer les quantits de chaque frquence ?
pwyh nous mhe le trvilF yn peut fire ppel l fontion FMOD_Channel_GetSpectrumF RUS
pwyhiv pwyhghnnelqetpetrum @ pwyhgrexxiv B hnnel D flot B spetrumrry D int numvlues D int hnneloffset D pwyhhppsxhy windowtype AY
it voii ses prmtres X ! ve nl sur lequel l musique est joueF hon a priori il fut ruprer un pointeur vers e nlF ! n tleu de floatF sl fut que e tleu soit dj llouD sttiquement ou dynE miquementD pour permettre pwyh de le remplir orretementF ! v tille du tleuF gette tille doit oligtoirement tre une puissne de PD pr exemple SIPF ! ge prmtre sert d(nir quelle sortie on s9intresseF r exemple si vous tes en stroD H veut dire guheD et I veut dire droiteF ! ge prmtre est un peu plus omplexeD et ne nous intresse ps vriment dns e oursF yn se ontenter de lui donner l vleur FMOD_DSP_FFT_WINDOW_RECTF
Rappel : le type float est un type dcimal, au mme titre que double. La dirence entre les deux vient du fait que double est plus prcis que float, mais dans notre cas, le type float est susant. C'est celui utilis par FMOD ici, donc c'est celui que nous devrons utiliser nous aussi.
insuiteD lorsque l musique est en trin d9tre joueD on demnde pwyh de remplir le tleu du spetre en fisnt pr exemple X
1
yn peut ensuite prourir e tleu pour otenir les vleurs de hune des frquenes X
1 2 3 4 5 6 7
spetre H GG pr quene l plus sse @ guhe A spetre I spetre P FFF spetre SHW spetre SIH spetre SII GG pr quene l plus hute @ droite A
ghque frquene est un nomre diml ompris entre H @rienA et I @mximumAF otre trvil v onsister 0her une rre plus ou moins grnde en fontion de l vleur que ontient hque se du tleuF RUT
LES CONSIGNES
r exempleD si l vleur est HFSD vous devrez trer une rre dont l huteur orresE pondr l moiti de l fentreF i l vleur est ID elle devr fire toute l huteur de l fentreF qnrlementD les vleurs sont ssez files @plutt prohes de H que de IAF te reomE mnde de multiplier pr PH toutes les vleurs pour mieux voir le spetreF ettention X si vous fites D vri(ez que vous ne dpssez ps I @rrondissez I s9il le futAF i vous vous retrouvez ve des vleurs suprieures ID vous risquez d9voir des prolmes pour trer les rres vertiles pr l suite 3
Mais les barres doivent bouger au fur et mesure du temps non ? Comme le son change tout le temps, il faut mettre jour le graphique. Comment faire ?
fonne questionF in e'etD le tleu de SIP float que vous renvoie pwyh change toutes les 25 ms @pour tre jour pr rpport u son tuelAF sl v don flE loir dns votre ode que vous relisiez le tleu de SIP )ots @en refisnt ppel FMOD_Channel_GetSpectrum toutes les PS msAD puis que vous mettiez jour votre grphique en rresF elisez le hpitre sur l gestion du temps en hv pour vous rppeler omment fireF ous vez le hoix entre une solution se de qetiks ou se de llksF pites e qui vous prt le plus fileF
4/ Raliser le dgrad
hns un premier tempsD vous pouvez rliser des rres de ouleur unieF ous pourrez don rer des surfesF sl devr y voir SIP surfes X une pour hque rreF ghque surfe fer don I pixel de lrge et l huteur des surfes vrier en fontion de l9intensit de hque frqueneF outefoisD je vous propose ensuite d9e'etuer une mliortion X l rre doit tendre vers le rouge lorsque le son devient de plus en plus intenseF in lirD l rre doit tre verte en s et rouge en hutF
Mais. . . une surface ne peut avoir qu'une seule couleur si on utilise SDL_FillRect(). On ne peut pas faire de dgrad !
in e'etF yn pourrit ertes rer des surfes de I pixel de lrge et I pixel de hut pour hque ouleur du dgrdD mis ferit vriment euoup de surfes grer et e ne serit ps trs optimis 3 gomment fitEon pour dessiner pixel pr pixel c te ne vous l9i ps ppris uprvntD r ette tehnique ne mritit ps un hpitre entierF ous llez voir en e'et que e n9est ps ien ompliquF in fitD l hv ne propose uune fontion pour dessiner pixel pr pixelF wis on le RUU
droit de l9rire nousEmmesF our e fireD il fut suivre es tpes mthodiquement dns l9ordre X IF pites ppel l fontion SDL_LockSurface pour nnoner l hv que vous llez modi(er l surfe mnuellementF gel loque l surfe pour l hv et vous tes le seul y voir s tnt que l surfe est loqueF siD je vous onseille de ne trviller qu9ve une seule surfe X l9rnF i vous voulez dessiner un pixel un endroit pris de l9rnD vous devrez don loquer l surfe ecran X
hvvokurfe@ernAY
PF ous pouvez ensuite modi(er le ontenu de hque pixel de l surfeF gomme l hv ne propose uune fontion pour fire D il v flloir l9rire nousEmme dns notre progrmmeF gette fontionD je vous l donneF te l tire de l doumenttion de l hvF ille est un peu omplique r elle trville sur l surfe diretement et gre toutes les profondeurs de ouleurs @its pr pixelA possilesF s esoin de l retenir ou de l omprendreD opiezEl simplement dns votre progrmme pour pouvoir l9utiliser X
1 2 3 4 5
void setixel @ hvurfe B surfe D int x D int y D intQP pixel A { int pp a surfe E b formt E b fyteserixel Y intV B p a @ intV BA surfe E b pixels C y B surfe E b pith C x B pp Y swith @ pp A { se I X B p a pixel Y rek Y se P X B@ intIT BA p a pixel Y rek Y se Q X if @ hvfiyhi aa hvfsqixhsex A { p H a @ pixel bb IT A 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a pixel 8 Hxff Y } else { p H a pixel 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a @ pixel bb IT A 8 Hxff Y } rek Y se R X B@ intQP BA p a pixel Y
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
RUV
LA SOLUTION
30 31 32
rek Y
gopier e ode gode we X QIHUQR ille est simple utiliserF invoyez les prmtres suivnts X ! le pointeur vers l surfe modi(er @ette surfe doit prllement voir t loque ve SDL_LockSurfaceA Y ! l position en sisse du pixel modi(er dns l surfe @xA Y ! l position en ordonne du pixel modi(er dns l surfe @yA Y ! l nouvelle ouleur donner e pixelF gette ouleur doit tre u formt Uint32 Y vous pouvez don l gnrer l9ide de l fontion SDL_MapRGB() que vous onnissez ien mintenntF QF in(nD lorsque vous vez (ni de trviller sur l surfeD il ne fut ps oulier de l dloquer en ppelnt SDL_UnlockSurfaceF
1
hvnlokurfe @ ern A Y
i on rsumeD vous llez voir que 9est tout simpleF ge ode dessine un pixel rouge u milieu de l surfe ecran @don u milieu de l fentreAF
1 2
hvvokurfe @ ern A Y GB yn loque l surfe BG setixel @ ern D ern E b w G P D ern E b h G P D hvwpqf @ ern E b formt D PSS D H D H A A Y GB yn dessine un pixel rouge u milieu de l ' rn BG hvnlokurfe @ ern A Y GB yn d loque l surfe BG
1
eve ette se vous devriez pouvoir rliser des dgrds du vert u rouge F
La solution
elorsD omment vezEvous trouv le sujet c sl n9est ps ien di0ile pprhenderD il fut juste fire quelques lulsD surtout pour l rlistion du dgrdF g9est du niveu de tout le mondeD il fut juste r)hir un petit peuF gertins mettent plus de temps que d9utres pour trouver l solutionF i vous vez du mlD e n9est ps ien grveF ge qui ompteD 9est de (nir pr y rriverF uel que soit le projet dns lequel vous vous lnerezD vous urez forment des moments o il ne su0t ps de svoir progrmmer Y il fut ussi tre logique et ien r)hirF te vous donne le ode omplet iEdessousF sl est su0smment ommentF
1. Un indice : il faut utiliser des boucles. :-p
RUW
8 9
10 11 12
5 define veqipixii SIP GB hys rester SIP imp rtivement r il y SIP rres @ orrespondnt ux SIP flots A BG 5 define reipixii RHH GB ous pouvez l fire vrier elle E l pr ontre BG 5 define esy @ reipixii G PSS F H A 5 define hivesepesgrsiwix PS GB emps en ms entre hque mise jour du grphe F PS ms est l vleur minimle F BG 5 define esvviigi SIP void setixel @ hvurfe B surfe D int x D int y D intQP pixel A Y int min @ int rg D hr B rgv A { hvurfe B ern a xvv Y hvivent event Y int ontinuer a I D huteurfrre a H D tempsetuel a H D tempsreedent a H D i a H D j a H Y flot spetre esvviigi Y GB snitilistion de pwyh EEEEEEEEEEEEEEEEEEEEEE yn hrge pwyh D l musique on lne l leture de l musique F BG pwyhiw B system Y pwyhyxh B musique Y pwyhgrexxiv B nl Y pwyhiv resultt Y pwyhystemgrete @8 system A Y pwyhystemsnit @ system D I D pwyhsxsxywev D xvv A Y GB yn ouvre l musique BG resultt a pwyhystemgreteound @ system D 4 hypehome F mpQ 4 D pwyhypei | pwyhPh | pwyhgieiiew D H D 8 musique A Y GB yn v rifie si elle ien t ouverte @ swyex A BG if @ resultt 3a pwyhyu A
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30 31 32 33 34 35 36 37 38
39 40 41
RVH
LA SOLUTION
42 43 44 45 46 47 48
{ }
GB yn joue l musique BG pwyhystemlyound @ system D pwyhgrexxivpii D musique D H D xvv A Y GB yn r up re le pointeur du nl BG pwyhystemqetghnnel @ system D H D 8 nl A Y GB snitilistion de l hv EEEEEEEEEEEEEEEEEEEEEEEE yn hrge l hv D on ouvre l fen tre et on rit dns s rre de titre yn r up re u pssge un pointeur vers l surfe ern ui ser l seule surfe utilis e dns e progrmme BG hvsnit @ hvsxsshiy A Y ern a hvetideowode @ veqipixii D reipixii D QP D hvpegi | hvhyfvifp A Y hvwetgption @ 4 isulistion spetrle du son 4 D xvv A Y GB foule priniple BG while @ ontinuer A { hvollivent @8 event A Y GG yn doit utiliser ollivent r il ne fut ps ttendre d ' v nement de l ' utilisteur pour mettre jour l fen tre swith @ event F type A { se hvs X ontinuer a H Y rek Y } GB yn effe l ' rn hque fois vnt de dessiner le grphe @ fond noir A BG hvpillet @ ern D xvv D hvwpqf @ ern E b formt D H D HD HAAY GB qestion du temps EEEEEEEEEEEEEEEEE yn ompre le temps tuel pr rpport u temps pr dent @ dernier pssge dns l oule A i fit moins de PS ms @ hivesepesgrsiwix A elors on ttend le temps qu ' il fut pour qu ' u moins
49 50 51 52 53 54 55 56
57 58 59 60 61
62 63 64 65 66 67 68
69 70 71 72 73 74 75 76
77
78 79 80 81
82 83
RVI
84
85 86 87
88 89
90 91 92 93 94 95 96
97 98
99
100
101
BG
105
GB yn remplit le tleu de SIP flots F t ' i hoisi de m ' int resser l sortie guhe BG pwyhghnnelqetpetrum @ nl D spetre D esvviigi D H D pwyhhppsxhyig A Y hvvokurfe @ ern A Y GB yn loque l surfe ern r on v diretement modifier ses pixels BG GB fygvi I X on prourt l fen tre en lrgeur @ pour hque rre vertile A BG for @ i a H Y i ` veqipixii Y i CCA { GB yn lule l huteur de l rre vertile qu ' on v dessiner F spetre i nous renvoie un nomre entre H et I qu ' on multiplie pr PH pour zoomer fin de voir un peu mieux @ omme je vous vis dit A F yn multiplie ensuite pr reipixii pour que l rre soit grndie pr rpport l tille de l fen tre F BG
106 107
108 109
113
114
RVP
LA SOLUTION
115 116 117
huteurfrre a spetre i B PH B reipixii Y GB yn v rifie que l rre ne d psse ps l huteur de l fen tre i tel est le s on oupe l rre u niveu de l huteur de l fen tre F BG if @ huteurfrre b reipixii A huteurfrre a reipixii Y GB fygvi P X on prourt en huteur l rre vertile pour l dessiner BG for @ j a reipixii E huteurfrre Y j ` reipixii Y j CCA { GB yn dessine hque pixel de l rre l onne ouleur F yn fit simplement vrier le rouge et le vert D hun dns un sens diff rent F j ne vrie ps entre H et PSS mis entre H et reipixii F i on veut l ' dpter proportionnellement l huteur de l fen tre D il suffit de fire le lul j G esy D o esy vut @ reipixii G PSS F H A F t ' i d r fl hir P E Q minutes pour trouver le on lul fire D mis ' est du niveu de tout le monde F sl suffit de r fl hir un tout petit peu BG setixel @ ern D i D j D hvwpqf @ ern E b formt D PSS E @ j G esy A D j G esy D H AA Y
118
123
124 125
126
127 128
129
130
131
hvnlokurfe @ ern A Y GB yn fini de trviller sur l ' rn D on d loque l surfe BG } hvplip @ ern AY
136 137 138 139 140 141 142 143 144 145 146 147 148 149
GB ve progrmme se termine F yn li re l musique de l m moire et on ferme pwyh et hv BG pwyhoundelese @ musique A Y pwyhystemglose @ system A Y pwyhystemelese @ system A Y hvuit @A Y
RVQ
return isggi Y
GB v fontion setixel permet de dessiner pixel pr pixel dns une surfe BG void setixel @ hvurfe B surfe D int x D int y D intQP pixel A { int pp a surfe E b formt E b fyteserixel Y intV B p a @ intV BA surfe E b pixels C y B surfe E b pith C x B pp Y swith @ pp A { se I X B p a pixel Y rek Y se P X B@ intIT BA p a pixel Y rek Y se Q X if @ hvfiyhi aa hvfsqixhsex A { p H a @ pixel bb IT A 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a pixel 8 Hxff Y } else { p H a pixel 8 Hxff Y p I a @ pixel bb V A 8 Hxff Y p P a @ pixel bb IT A 8 Hxff Y } rek Y se R X B@ intQP BA p a pixel Y rek Y }
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
gopier e ode gode we X VWPPIT ous devriez otenir un rsultt orrespondnt l (gure PVFQF fien entenduD il vut mieux une nimtion pour pprier e rsulttF g9est don e que je vous propose de visuliserF oir l9nimtion du rsultt gode we X PHSRHR xotez que l ompression rduit l qulit du son et le nomre d9imges pr seondeF RVR
IDES D'AMLIORATION
ve mieux est enore de tlhrger le progrmme omplet @ve son ode soureA pour tester hez soiF ous pourrez insi pprier le progrmme dns les meilleures onditions lhrger le progrmme gode we X VIUHSW
Il faut imprativement que le chier Hype_Home.mp3 soit plac dans le dossier du programme pour qu'il fonctionne (sinon il s'arrtera tout de suite).
Ides d'amlioration
sl est toujours possile d9mliorer un progrmmeF siD j9i pr exemple des tonnes d9ides d9extensions qui pourrient outir l rtion d9un vritle petit leteur wQF ! sl serit ien qu9on puisse hoisir le wQ qu9on veut lireF sl fudrit pr exemple lister tous les .mp3 prsents dns le dossier du progrmmeF xous n9vons ps vu omment fire D mis vous pouvez le douvrir pr vousEmmes F ! i votre progrmme tit ple de lire et grer les plylistsD serit enore mieuxF sl existe plusieurs formts de plylistD le plus onnu est le formt wQF
2
2. Indice : utilisez la librairie dirent (il faudra inclure dirent.h). vous de chercher des informations sur le web pour savoir comment l'utiliser.
RVS
! ous pourriez 0her le nom du wQ en ours de leture dns l fentre @il fudr utiliser SDL_ttfAF ! ous pourriez 0her un inditeur pour qu9on she o en est l leture du moreuD omme el se fit sur l pluprt des leteurs wQF ! ous pourriez ussi proposer de modi(er le volume de letureF ! etF frefD il y euoup fireF ous vez l possiilit de rer de eux leteursD il ne tient plus qu9 vous de les oder 3
RVT
Quatrime partie
Les structures de donnes
RVU
Chapitre
29
Dicult :
our stocker des donnes en mmoire, nous avons utilis des variables simples (type int, double. . .), des tableaux et des structures personnalises. Si vous souhaitez stocker une srie de donnes, le plus simple est en gnral d'utiliser des tableaux. Toutefois, les tableaux se rvlent parfois assez limits. Par exemple, si vous crez un tableau de 10 cases et que vous vous rendez compte plus tard dans votre programme que vous avez besoin de plus d'espace, il sera impossible d'agrandir ce tableau. De mme, il n'est pas possible d'insrer une case au milieu du tableau. Les listes chanes reprsentent une faon d'organiser les donnes en mmoire de manire beaucoup plus exible. Comme la base le langage C ne propose pas ce systme de stockage, nous allons devoir le crer nous-mmes de toutes pices. C'est un excellent exercice qui vous aidera tre plus l'aise avec le langage.
RVW
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 doubleF F F in plus de elD hque lment possde un pointeur vers l9lment suivnt @(gF PWFRAF te reonnis que tout el est enore trs thorique et doit vous prtre un peu )ou pour le momentF etenez simplement omment les lments sont gens entre eux X ils forment une chane de pointeursD d9o le nom de liste hne F
Contrairement aux tableaux, les lments d'une liste chane ne sont pas placs cte cte dans la mmoire. Chaque case pointe vers une autre case en mmoire qui n'est pas ncessairement stocke juste ct.
1. J'ai choisi ici de reprsenter le tableau horizontalement, mais il serait aussi possible de le prsenter verticalement, peu importe.
RWH
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 1 2 3 4 5 6
typedef strut ilement ilement Y strut ilement { int nomre Y ilement B suivnt Y }Y
xous vons r ii un lment d9une liste hneD orrespondnt l (gF PWFR que nous vons vue plus ttF ue ontient ette struture c ! ne donneD ii un nomre de type int X on pourrit rempler el pr n9importe quelle utre donne @un doubleD un tleuF F FAF gel orrespond e que vous voulez stokerD 9est vous de l9dpter en fontion des esoins de votre progrmme F ! n pointeur vers un lment du mme type ppel suivantF g9est e qui permet de lier les lments les uns ux utres X hque lment sit o se trouve l9lment
4
2. Je rappelle que tout ce que nous allons faire ici fait appel des techniques du langage C que vous connaissez dj. Il n'y a aucun lment nouveau, nous allons nous contenter de crer nos propres structures et fonctions et les transformer en un systme logique, capable de se rguler tout seul. 3. On pourrait aussi bien crer une liste chane contenant des nombres dcimaux ou mme des tableaux et des structures. Le principe des listes chanes s'adapte n'importe quel type de donnes, mais ici, je propose de faire simple pour que vous compreniez bien le principe. ;-) 4. Si on veut travailler de manire gnrique, l'idal est de faire un pointeur sur void : void*. Cela permet de faire pointer vers n'importe quel type de donnes.
RWI
suivnt en mmoire F gomme je vous le disis plus ttD les ses ne sont ps te te en mmoireF g9est l grosse di'rene pr rpport ux tleuxF gel o're dvntge de souplesse r on peut plus filement jouter de nouvelles ses pr l suite u esoinF
5
La structure de contrle
in plus de l struture qu9on vient de rer @que l9on dupliquer utnt de fois qu9il y d9lmentsAD nous llons voir esoin d9une utre struture pour ontrler l9ensemle de l liste hneF ille ur l forme suivnte X
1 2 3 4 5
gette struture Liste ontient un pointeur vers le premier lment de l listeF in e'etD il fut onserver l9dresse du premier lment pour svoir o ommene l listeF i on onnt le premier lmentD on peut retrouver tous les utres en sutnt d9lment en lment l9ide des pointeurs suivantF
Une structure compose d'une seule sous-variable n'est en gnral pas trs utile. Nanmoins, je pense que l'on aura besoin d'y ajouter des sous-variables plus tard, je prfre donc prendre les devants en crant ici une structure. On pourrait par exemple y stocker en plus la taille de la liste, c'est--dire le nombre d'lments qu'elle contient.
xous n9urons esoin de rer qu9un seul exemplire de l struture ListeF ille permet de ontrler toute l liste @(gF PWFSAF
RWP
Figure PWFS ! v struture Liste nous donne des informtions sur l9ensemle de l
liste hne
Figure PWFT ! ve dernier lment de l liste pointe vers NULL pour indiquer l (n de
liste
RWQ
Initialiser la liste
v fontion d9initilistion est l toute premire que l9on doit ppelerF ille re l struture de ontrle et le premier lment de l listeF te vous propose l fontion iEdessousD que nous ommenterons juste prsD ien enE tendu X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
viste B initilistion @A { viste B liste a mllo @ sizeof @B liste A A Y ilement B element a mllo @ sizeof @B element AA Y if @ liste aa xvv || element aa xvv A { exit @ ispesvi A Y } element Eb nomre a H Y element Eb suivnt a xvv Y liste E b premier a element Y return liste Y
RWR
}
6
yn ommene pr rer l struture de ontrle liste F yn l9lloue dynmiquement ve un mallocF v tille llouer est lule utomtiquement ve sizeof(*liste)F v9ordinteur sur qu9il doit llouer l9espe nessire u stokge de l struture Liste F yn lloue ensuite de l mme mnire l mmoire nessire u stokge du premier lmentF yn vri(e si les llotions dynmiques ont fontionnF in s d9erreurD on rrte immditement le progrmme en fisnt ppel exit()F i tout s9est ien pssD on d(nit les vleurs de notre premier lment X ! l donne nombre est mise H pr dfut Y ! le pointeur suivant pointe vers NULL r le premier lment de notre liste est ussi le dernier pour le momentF gomme on l9 vu plus ttD le dernier lment doit pointer vers NULL pour signler qu9il est en (n de listeF xous vons don mintennt russi rer en mmoire une liste ompose d9un seul lment et ynt une forme semlle l (gF PWFUF
7
Ajouter un lment
siD les hoses se ompliquent un peuF y vEtEon jouter un nouvel lment c eu dut de l listeD l (nD u milieu c v rponse est qu9on le hoixF vire nous de dider e que nous fisonsF our e hpitreD je propose que l9on voie ensemle l9jout d9un lment en dut de listeF h9une prtD 9est simple omprendreD et d9utre prt el me donner une osion l (n de e hpitre de vous proposer de r)hir l rtion d9une fontion qui joute un lment un endroit pris de l listeF xous devons rer une fontion ple d9insrer un nouvel lment en dut de listeF our nous mettre en situtionD imginons un s semlle l (gF PWFV X l liste est ompose de trois lments et on souhite en jouter un nouveu u dutF
6. Notez que le type de donnes est Liste et que la variable s'appelle liste. La majuscule permet de les direncier. 7. On aurait aussi pu crire sizeof(Liste), mais si plus tard on dcide de modier le type du pointeur liste, on devra aussi adapter le sizeof.
RWS
sl v flloir dpter le pointeur premier de l liste insi que le pointeur suivant de notre nouvel lment pour insrer orretement eluiEi dns l listeF te vous propose pour el e ode soure que nous nlyserons juste prs X
1 2 3 4 5 6 7 8 9 10 11 12 13 14
void insertion @ viste B liste D int nvxomre A { GB gr tion du nouvel l ment BG ilement B nouveu a mllo @ sizeof @B nouveu AA Y if @ liste aa xvv || nouveu aa xvv A { exit @ is pesvi A Y } nouveu Eb nomre a nvxomre Y GB snsertion de l ' l ment u d ut de l liste BG nouveu Eb suivnt a liste Eb premier Y liste E b premier a nouveu Y
v fontion insertion() prend en prmtre l9lment de ontrle liste @qui ontient l9dresse du premier lmentA et le nomre stoker dns le nouvel lment que l9on v rerF hns un premier tempsD on lloue l9espe nessire u stokge du nouvel lment et on y ple le nouveu nomre nvNombreF sl reste lors une tpe dlite X l9insertion du nouvel lment dns l liste hneF xous vons ii hoisi pour simpli(er d9insrer l9lment en dut de listeF our mettre jour orretement les pointeursD nous devons proder dns et ordre pris X IF fire pointer notre nouvel lment vers son futur suesseurD qui est l9tuel preE mier lment de l liste Y PF fire pointer le pointeur premier vers notre nouvel lmentF RWT
On ne peut pas suivre ces tapes dans l'ordre inverse ! En eet, si vous faites d'abord pointer premier vers notre nouvel lment, vous perdez l'adresse du premier lment de la liste ! Faites le test, vous comprendrez de suite pourquoi l'inverse est impossible.
gel ur pour e'et d9insrer orretement notre nouvel lment dns l liste hne @(gF PWFWA 3
Supprimer un lment
he mme que pour l9insertionD nous llons ii nous onentrer sur l suppression du premier lment de l listeF sl est tehniquement possile de supprimer un lment pris u milieu de l listeD e ser d9illeurs un des exeries que je vous proposeri l (nF v suppression ne pose ps de di0ult supplmentireF sl fut ependnt ien dpter les pointeurs de l liste dns le on ordre pour ne perdre uune informtionF
1 2 3 4 5 6 7 8 9 10 11 12 13 14
void suppression @ viste B liste A { if @ liste aa xvv A { exit @ ispesvi A Y } if @ liste E b premier 3a xvv A { ilement B upprimer a liste E b premier Y liste E b premier a liste E b premier E b suivnt Y free @ upprimer A Y }
yn ommene pr vri(er que le pointeur qu9on nous envoie n9est ps NULLD sinon on ne peut ps trvillerF yn vri(e ensuite qu9il y u moins un lment dns l listeD sinon il n9y rien fireF RWU
ges vri(tions e'etuesD on peut suvegrder l9dresse de l9lment supprimer dns un pointeur aSupprimerF yn dpte ensuite le pointeur premier vers le nouveu premier lmentD qui est tuellement en seonde position de l liste hneF sl ne reste plus qu9 supprimer l9lment orrespondnt notre pointeur aSupprimer ve un free @(gF PWFIHAF
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
void ffiherviste @ viste B liste A { if @ liste aa xvv A { exit @ ispesvi A Y } ilement B tuel a liste E b premier Y while @ tuel 3a xvv A { printf @ 4 7 d Eb 4 D tuel E b nomre A Y tuel a tuel E b suivnt Y } printf @ 4 xvv n 4 A Y
RWV
gette fontion est simple X on prt du premier lment et on 0he le ontenu de hque lment de l liste @un nomreAF yn se sert du pointeur suivant pour psser l9lment qui suit hque foisF yn peut s9muser tester l rtion de notre liste hne et son 0hge ve un main X
1 2 3 4 5 6 7 8 9 10 11 12 13
int min @A { viste B mviste a initilistion @A Y insertion @ mviste D R A Y insertion @ mviste D V A Y insertion @ mviste D IS A Y suppression @ mviste A Y ffiherviste @ mviste A Y } return H Y
in plus du premier lment @que l9on liss ii HAD on en joute trois nouveux ette listeF uis on en supprime unF eu (nlD le ontenu de l liste hne ser don X
V Eb R Eb H Eb xvv
te vous onseille de regrouper toutes les fontions de gestion de l liste hne dns des (hiers liste_chainee.c et liste_chainee.h pr exempleF ge ser votre premire iliothque 3 ous pourrez l rutiliser dns tous les progrmmes dns lesquels vous vez esoin de listes hnesF ous pouvez tlhrger le projet des listes hnes omprennt les fontions que nous vons douvertes ensemleF gel vous fer une onne se de dprtF lhrger le projet gode we X THQUIT
En rsum
! ves listes hnes onstituent un nouveu moyen de stoker des donnes en mmoireF illes sont plus )exiles que les tleux r on peut jouter et supprimer des ses n9importe quel momentF ! sl n9existe ps en lngge g de systme de gestion de listes hnesD il fut l9rire nousEmmes 3 g9est un exellent moyen de progresser en lgorithmique et en proE grmmtion en gnrlF ! hns une liste hneD hque lment est une struture qui ontient l9dresse de l9lment suivntF ! sl est onseill de rer une struture de ontrle @du type Liste dns notre sA qui retient l9dresse du premier lmentF ! sl existe une version mliore " mis plus omplexe " des listes hnes ppeE le listes doulement hnes D dns lesquelles hque lment possde en plus l9dresse de elui qui le prdeF
SHH
Chapitre
30
Dicult :
ous avons dcouvert avec les listes chanes un nouveau moyen plus souple que les tableaux pour stocker des donnes. Ces listes sont particulirement exibles car on peut insrer et supprimer des donnes n'importe quel endroit, n'importe quel moment. Les piles et les les que nous allons dcouvrir ici sont deux variantes un peu particulires des listes chanes. Elles permettent de contrler la manire dont sont ajouts les nouveaux lments. Cette fois, on ne va plus insrer de nouveaux lments au milieu de la liste mais seulement au dbut ou la n. Les piles et les les sont trs utiles pour des programmes qui doivent traiter des donnes qui arrivent au fur et mesure. Nous allons voir en dtails leur fonctionnement dans ce chapitre.
SHI
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. ;-)
SHP
LES PILES
SHQ
Figure QHFS ! ves lments sont relis entre eux et le dernier pointe vers NULL
SHR
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 main @omme toujoursA Y vous y ppelez l fontion jouer Y ette fontion jouer fit ppel son tour l fontion charger Y une fois que l fontion charger est termineD on retourne l fontion jouer Y une fois que l fontion jouer est termineD on retourne u main Y en(nD une fois le main terminD il n9y plus de fontion ppelerD le progrmme s9hveF
our retenir l9ordre dns lequel les fontions ont t ppelesD votre ordinteur re une pile de es fontions u fur et mesure @(gF QHFTAF
oil un exemple onret d9utilistion des pilesF qre ette tehniqueD votre ordinE teur sit quelle fontion il doit retournerF sl peut empiler IHH fontions d90le s9il le futD il retrouver toujours le main en s 3 SHS
typedef strut ilement ilement Y strut ilement { int nomre Y ilement B suivnt Y }Y
v struture de ontrle ontiendr l9dresse du premier lment de l pileD elui qui se trouve tout en hut X
1 2 3 4 5
xous urons esoin en tout et pour tout des fontions suivntes X ! empilge d9un lment Y ! dpilge d9un lmentF ous noterez queD ontrirement ux listes hnesD on ne prle ps d9jout ni de suppressionF yn prle d9empilge et de dpilge r es oprtions sont limites un lment prisD omme on l9 vuF einsiD on ne peut jouter et retirer un lment qu9en hut de l pileF yn pourr ussi rire une fontion d90hge de l pileD prtique pour vri(er si notre progrmme se omporte orretementF ellonsEy 3
Empilage
xotre fontion empiler doit prendre en prmtre l struture de ontrle de l pile @de type PileA insi que le nouveu nomre stoker F
3 1 2 3 4 5
void empiler @ ile B pile D int nvxomre A { ilement B nouveu a mllo @ sizeof @B nouveu AA Y if @ pile aa xvv || nouveu aa xvv A {
3. Je vous rappelle que nous stockons ici des int, mais rien ne vous empche d'adapter ces exemples avec un autre type de donnes. On peut stocker n'importe quoi : des double, des char, des chanes, des tableaux ou mme d'autres structures !
SHT
LES PILES
6 7 8 9 10 11 12
exit @ ispesvi A Y
nouveu E b nomre a nvxomre Y nouveu E b suivnt a pile E b premier Y pile E b premier a nouveu Y
v9jout se fit en dut de pile rD omme on l9 vuD il est impossile de le fire u milieu d9une pileF g9est le prinipe mme de son fontionnementD on joute toujours pr le hut F
4
Dpilage
ve rle de l fontion de dpilge est de supprimer l9lment tout en hut de l pileD D vous vous en doutiezF wis elle doit ussi retourner l9lment qu9elle dpileD 9estEEdire dns notre s le nomre qui tit stok en hut de l pileF g9est omme el que l9on de ux lments d9une pile X en les enlevnt un unF yn ne prourt ps l pile pour ller y herher le seond ou le troisime lmentF yn demnde toujours ruprer le premierF xotre fontion depiler v don retourner un int orrespondnt u nomre qui se trouvit en tte de pile X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int depiler @ ile B pile A { if @ pile aa xvv A { exit @ ispesvi A Y } int nomrehepile a H Y ilement B elementhepile a pile E b premier Y if @ pile 3a xvv 88 pile E b premier 3a xvv A { nomrehepile a elementhepile E b nomre Y pile E b premier a elementhepile E b suivnt Y free @ elementhepile A Y } } return nomrehepile Y
yn rupre le nomre en tte de pile pour le renvoyer l (n de l fontionF yn modi(e l9dresse du premier lment de l pileD puisque eluiEi hngeF in(nD ien entenduD on supprime l9nienne tte de pile gre freeF
4. De ce fait, contrairement aux listes chanes, on ne doit pas crer de fonction pour insrer un lment au milieu de la pile. Seule la fonction empiler permet d'ajouter un lment.
SHU
Achage de la pile
fien que ette fontion ne soit ps indispensle D elle v nous tre utile pour tester le fontionnement de notre pile et surtout pour visuliser le rsulttF
5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
void ffiherile @ ile B pile A { if @ pile aa xvv A { exit @ ispesvi A Y } ilement B tuel a pile E b premier Y while @ tuel 3a xvv A { printf @ 4 7 d n 4 D tuel E b nomre A Y tuel a tuel E b suivnt Y } } printf @ 4 n 4 A Y
6
gette fontion tnt ridiulement simpleD elle ne nessite uune explition F in revnheD 9est le moment de fire un main pour tester le omportement de notre pile X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
int min @A { ile B mile a initiliser @A Y empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D empiler @ mile D RAY VAY IS A Y IT A Y PQ A Y RP A Y
printf @ 4 nitt de l pile X n 4 A Y ffiherile @ mile A Y printf @ 4 te depile 7 d n 4 D depiler @ mile A A Y printf @ 4 te depile 7 d n 4 D depiler @ mile A A Y printf @ 4 nitt de l pile X n 4 A Y ffiherile @ mile A Y } return H Y
SHV
LES FILES
yn 0he l9tt de l pile prs plusieurs empilges et une utre fois prs quelques dpilgesF yn 0he ussi le nomre qui est dpil hque fois que l9on dpileF ve rsultt dns l onsole est le suivnt X
itt de l pile X RP PQ IT IS V R te depile RP te depile PQ itt de l pile X IT IS V R
ri(ez que vous voyez ien e qui se psse dns e progrmmeF i vous omprenez elD vous vez ompris le fontionnement des piles 3 ous pouvez tlhrger le projet omplet des piles si vous le dsirezF lhrger le projet gode we X WQSHTS
Les les
ves (les ressemlent ssez ux pilesD si e n9est qu9elles fontionnent dns le sens inverse 3
premier messge rriv pour l90her l9rnD puis vous pssez u seondD et insi de suiteF ves vnements que vous envoie l iliothque hv que nous vons tudie sont eux ussi stoks dns une (leF i vous ougez l sourisD un vnement ser gnr pour hque pixel dont s9est dpl le urseur de l sourisF v hv les stoke dns une (le puis vous les envoie un un hque fois que vous fites ppel SDL_PollEvent F in gD une (le est une liste hne o hque lment pointe vers le suivntD tout omme les pilesF ve dernier lment de l (le pointe vers NULL @(gF QHFVAF
7
SIH
LES FILES
5 6 7 8 9 10 11 12
}Y
ilement B suivnt Y
gomme pour les pilesD hque lment de l (le ser de type ElementF l9ide du pointeur premierD nous disposerons toujours du premier lment et nous pourrons remonter jusqu9u dernierF
Enlage
v fontion qui joute un lment l (le est ppele fontion d9en(lge F sl y deux s grer X ! soit l (le est videD dns e s on doit juste rer l (le en fisnt pointer premier vers le nouvel lment r Y ! soit l (le n9est ps videD dns e s il fut prourir toute l (le en prtnt du premier lment jusqu9 rriver u dernierF yn rjouter notre nouvel lment prs le dernierF oii omment on peut fire dns l prtique X
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
void enfiler @ pile B file D int nvxomre A { ilement B nouveu a mllo @ sizeof @B nouveu A A Y if @ file aa xvv || nouveu aa xvv A { exit @ ispesvi A Y } nouveu E b nomre a nvxomre Y nouveu E b suivnt a xvv Y if @ file E b premier 3a xvv A GB v file n ' est ps vide BG { GB yn se positionne l fin de l file BG ilement B elementetuel a file E b premier Y while @ elementetuel E b suivnt 3a xvv A { elementetuel a elementetuel E b suivnt Y } elementetuel E b suivnt a nouveu Y } else GB v file est vide D notre l ment est le premier BG { file E b premier a nouveu Y
SII
ous voyez dns e ode le tritement des deux s possilesD hun devnt tre gr prtF v di'rene pr rpport ux pilesD qui rjoute une petite touhe de di0ultD est qu9il fut se pler l (n de l (le pour jouter le nouvel lmentF wis onD un petit while et le tour est jouD omme vous pouvez le onstterF XEA
Dlage
ve d(lge ressemle trngement u dpilgeF tnt donn qu9on possde un pointeur vers le premier lment de l (leD il nous su0t de l9enlever et de renvoyer s vleurF
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
int defiler @ pile B file A { if @ file aa xvv A { exit @ ispesvi A Y } int nomrehefile a H Y GB yn v rifie s ' il y quelque hose d filer BG if @ file E b premier 3a xvv A { ilement B elementhefile a file E b premier Y nomrehefile a elementhefile E b nomre Y file E b premier a elementhefile E b suivnt Y free @ elementhefile A Y
} }
return nomrehefile Y
vous de jouer !
sl resterit rire une fontion afficherFileD omme on l9vit fit pour les pilesF gel vous permettrit de vri(er si votre (le se omporte orretementF lisez ensuite un main pour fire tourner votre progrmmeF ous devriez pouvoir otenir un rendu similire ei X
itt de l file X R V IS IT PQ RP te defile R te defile V
SIP
LES FILES
itt de l file X IS IT PQ RP
termeD vous devriez pouvoir rer votre propre iliothque de (lesD ve des (hiers file.h et file.c pr exempleF te vous propose de tlhrger le projet omplet de gestion des (lesD si vous le dsirezF sl inlut l fontion afficherFile F lhrger le projet omplet gode we X RTUVUW
En rsum
! ves piles et les (les permettent d9orgniser en mmoire des donnes qui rrivent u fur et mesureF ! illes utilisent un systme de liste hne pour ssemler les lmentsF ! hns le s des pilesD les donnes s9joutent les unes uEdessus des utresF vorsqu9on extrit une donneD on rupre l dernire qui vient d9tre joute @l plus renteAF yn prle d9lgorithme vspy @Last In First Out AF ! hns les s des (lesD les donnes s9joutent les unes l suite des utresF yn extrit l premire donne voir t joute dns l (le @l plus nienneAF yn prle d9lgorithme pspy @First In First Out AF
SIQ
SIR
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 !
SIS
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
SIT
i on lui donne tableau[2]D l9ordinteur v diretement l se mmoire o se trouve stok le nomre IRF sl ne prourt ps les ses du tleu une uneF
Tu es en train de dire que les tableaux ne sont pas si mauvais , en fait ? Mais dans ce cas, on perd l'avantage des listes chanes qui nous permettaient d'ajouter et de retirer des cases tout moment !
in e'etD les listes hnes sont plus )exilesF ves tleuxD euxD permettent un s plus rpideF ves tables de hachage onstituent quelque prt un ompromis entre les deuxF sl y un dfut importnt ve les tleux dont on n9 ps euoup prl jusqu9ii X les ses sont identi(es pr des numros qu9on ppelle des indicesF sl n9est ps possile de demnder l9ordinteur X hisEmoi quelles sont les donnes qui se trouvent l se 4vu honieux4 F our retrouver l9ge et l moyenne de vu honieuxD on ne peut don ps rire X
1
tleu 4 vu honieux 4 Y
ge serit pourtnt prtique de pouvoir der une se du tleu rien qu9ve le nom 3 ih ien ve les tles de hhge D 9est possileF
3
Puisque notre tableau doit forcment tre numrot par des indices, comment fait-on pour retrouver le bon numro de case si on connat seulement le nom Luc Doncieux ?
fonne remrqueF in e'etD un tleu reste un tleu et eluiEi ne fontionne qu9ve des indies numrotsF smginez un tleu orrespondnt l (gF QIFP X hque se un indie et possde un pointeur vers une struture de type EleveF gelD vous svez dj le fireF i on veut retrouver l se orrespondnt vu honieuxD il fut pouvoir trnsformer son nom en indie du tleuF einsiD il fut pouvoir fire l9ssoition entre hque nom et un numro de se de tleu X ! tulien vefevre a H Y ! eurlie fssoli a I Y ! nn wrtinez a P Y ! vu honieux a QF yn ne peut rire tableau["Luc Doncieux"] omme je l9i fit prdemmentF ge n9est ps vlide en gF
3. Comme tout ce que nous venons de voir rcemment, les tables de hachage ne font pas partie du langage C. Il s'agit simplement d'un concept. On va rutiliser les briques de base du C que l'on connat dj pour crer un nouveau systme intelligent. Comme quoi, en C, avec peu d'outils la base, on peut crer beaucoup de choses !
SIU
Figure QIFP ! n simple tleu ontennt des pointeurs vers des strutures Eleve
v question est X omment trnsformer une hne de rtres en numro c g9est toute l mgie du hhgeF sl fut rire une fontion qui prend en entre une hne de rtresD fit des luls veD puis retourne en sortie un numro orrespondnt ette hneF ge numro ser l9indie de l se dns notre tleu @(gF QIFQAF
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 EleveF
4 1
xous devons rire une fontion quiD prtir d9un nomD gnre un nomre ompris entre H et WW @les indies du tleuAF g9est l qu9il fut tre inventifF sl existe des mthodes mthmtiques trs omplexes pour hher des donnesD 9estEEdire les trnsformer en nomresF ous pouvez inventer votre propre fontion de hhgeF siD pour fire simpleD je vous propose tout simplement d9dditionner les vleurs egss de hque lettre du nomD 9estEEdire pour vu honieux fire l somme suivnte X
5 1
'v ' C 'u ' C ' ' C ' ' C 'h ' C 'o ' C 'n ' C ' ' C 'i ' C 'e ' C 'u ' C 'x '
6
yn v toutefois voir un prolme X ette somme dpsse IHH 3 gomme notre tleu ne fit que IHH sesD si on s9en tient D on risque de sortir des limites du tleuF our rgler le prolmeD on peut utiliser l9oprteur modulo %F ous vous souvenez de lui c sl donne le reste de l division 3 i on fit le lul X
1
sommevettres 7 IHH
F F F on otiendr forment un nomre ompris entre H et WWF r exempleD si l somme fit RQISD le reste de l division pr IHH est ISF v fontion de hhge retourner don ISF oii quoi pourrit ressemler ette fmeuse fontion X
1 2 3 4 5 6 7 8 9 10 11 12
int hhge @ hr B hine A { int i a H D nomrerhe a H Y for @ i a H Y hine i 3a ' H ' Y i CCA { nomrerhe Ca hine i Y } nomrerhe 7a IHH Y } return nomrerhe Y
4. On dit que c'est une complexit en O(1) car on trouve directement l'lment que l'on recherche. En eet, la fonction de hachage nous retourne un indice : il sut de sauter directement la case correspondante du tableau. Plus besoin de parcourir toutes les cases ! 5. Les algorithmes MD5 et SHA1 sont des fonctions de hachage clbres, mais elles sont trop pousses pour nous ici. 6. Je vous rappelle que chaque lettre dans la table ASCII peut tre numrote jusqu' 255. On a donc vite fait de dpasser 100.
SIW
gopier e ode gode we X SUVRUW i on lui envoie hachage("Luc Doncieux")D elle renvoie SSF eve hachage("Yann Martinez")D on otient VHF qre ette fontion de hhgeD vous svez don dns quelle se de votre tleu vous devez pler vos donnes 3 vorsque vous voudrez y der plus trd pour en ruprer les donnesD il su0r de hher nouveu le nom de l personne pour retrouver l9indie de l se du tleu o sont stokes les informtions 3
7
L'adressage ouvert
9il reste de l ple dns votre tleuD vous pouvez utiliser l tehnique dite du hachage linaireF ve prinipe est simpleF v se est oupe c s de prolmeD llez l se suivnteF ehD elle est oupe ussi c ellez l suivnte 3 einsi de suiteD ontinuez jusqu9 trouver l prohine se lire dns le tleuF i vous rrivez l (n du tleuD retournez l premire se et ontinuezF gette mthode est trs simple mettre en pleD mis si vous vez euoup de olliE sionsD vous llez psser euoup de temps herher l prohine se lireF sl existe des vrintes @hhge douleD hhge qudrtiqueF F FA qui onsistent hher
7. Je vous recommande de crer une fonction de recherche qui se chargera de hacher la cl (le nom) et de vous renvoyer un pointeur vers les donnes que vous recherchiez. Cela donnerait par exemple :
infosSurLuc = rechercheTableHachage(tableau, "Luc Doncieux");
8. Les fonctions MD5 et SHA1 mentionnes plus tt sont de bonne qualit car elles produisent trs peu de collisions. Notez que SHA1 est aujourd'hui prfre MD5 car c'est celle des deux qui en produit le moins.
SPH
nouveu selon une utre fontion en s de ollisionF illes sont plus e0es mis plus omplexes mettre en pleF
Le chanage
ne utre solution onsiste rer une liste chane l9emplement de l ollisionF ous vez deux donnes @ou plusA stoker dns l mme se c tilisez une liste hne et rez un pointeur vers ette liste depuis le tleu @(gF QIFRAF
Figure QIFR ! i deux lments doivent tre stoks u mme endroitD rez une liste
hne 3 fien entenduD on en revient u dfut des listes hnes X s9il y QHH lments et emplement du tleuD il v flloir prourir l liste hne jusqu9 trouver le onF siD omme vous le voyezD tout est 'ire de ompromisF ves listes hnes ne sont ps toujours idlesD mis les tles de hhge ont ussi leurs limitesF yn peut ominer les deux pour tenter de tirer le meilleur de hune de es strutures de donnesF uoi qu9il en soitD le point ritique dns une tle de hhge est l fontion de hhgeF woins elle produit de ollisionsD mieux 9estF vous de trouver l fontion de hhge qui onvient le mieux votre s 3
En rsum
! ves listes hnes sont )exilesD mis il peut tre long de retrouver un lment pris l9intrieur r il fut les prourir se pr seF ! ves tles de hhge sont des tleuxF yn y stoke des donnes un emplement dtermin pr une fontion de hhgeF ! v fontion de hhge prend en entre une l @exF X une hne de rtresA et retourne en sortie un nomreF ! ge nomre est utilis pour dterminer quel indie du tleu sont stokes les donnesF SPI
! ne onne fontion de hhge doit produire peu de ollisionsD 9estEEdire qu9elle doit viter de renvoyer le mme nomre pour deux ls di'rentesF ! in s de ollisionD on peut utiliser l9dressge ouvert @reherhe d9une utre se lire dns le tleuA ou ien le hnge @ominison ve une liste hneAF
SPP
Index
dressge ouvert F F F F F F F F F F F F F F F F F F F F F SPP dresseF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSI ltoire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ llotion dynmique F F F F F F F F F F F F F F F F PQW de tleuF F F F F F F F F F F F F F F F F F F F F F FPRW ntilising F F F F F F F F F F F F F F F F F F F F F F F F F F RRR egss F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUP ssemleur F F F F F F F F F F F F F F F F F F F F F F F F F F F F RW iliothqueF F F F F F F F F F F F F F F F F F F F F F F F F F FQT hne de rtres F F F F F F F F F F F F F IUV mthmtique F F F F F F F F F F F F F F F F F F F F UP hvF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPWU stndrdF F F F F F F F F F F F F F FIQSD PPHD PWT tiereF F F F F F F F F F F F F F F F F F F F F F F F F F F FPWT inire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F S itmpF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQRR lit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQR fw F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRR oolen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VR oule F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WR in(nie F F F F F F F F F F F F F F F F F F F F F F F F F F F F WU rek F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VW u'er F F F F F F F F F F F F F F F F F F F F F F PSUD PVID QUH vidgeF F F F F F F F F F F F F F F F F F F F F F F F F F FPVT u'er over)ow F F F F F F F F F F F F F F F F F F F F F F F PVP g FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF V gCC F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VD UI gVWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITR gWWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITR
C B
llkF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRQQ rr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR eil F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UQ hnge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SPQ hne de rtresF F F F F F F F F F F F F F F F F FIUR initilistionF F F F F F F F F F F F F F F F F F F F FIUS hrF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSRD IUP tleu deF Fvoir hne de rtres ode soure F F F F F F F F F F F F F F F F F F F F F F F F F F F F T gode: :floksF F F F F F F F F F F F F F F F F F F F F F F F F FIQ ollision F F F F F F F F F F F F F F F F F F F F RHQD RHUD SPP ommentire F F F F F F F F F F F F F F F F F F F F F F F F F F RQ ompilteurF F F F F F F F F F F F F F F F F F F F F F F F FUD IP ompiltionF F F F F F F F F F F F F F F F F F F F F F F FUD IQT omplexit F F F F F F F F F F F F F F F F F F F F F F SIVD SPI ontntion F F F F F F F F F F F F F F F F F F F F F F F F IVP onditionF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUV onsoleF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQ onstnte F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SV osF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUR g F F F F F F F F F F F F F F F F F F F F F voir proesseur dogueur F F F F F F F F F F F F F F F F F F F F F F F F F F F F IP drmenttionF F F F F F F F F F F F F F F F F F F F F F F FUI d(lge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SIR de(ne F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IWQ dpssement de mmoire F F F F F F F F F F F F F PVI dpilgeF F F F F F F F F F F F F F F F F F F F F F F F FSHRD SHW diretive de prproesseur F F F F F F F F QTD IWP disque dur F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV division F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TU resteF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FTV do while F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WU
D
SPQ
INDEX
doule F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR fputF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPU doule u'eringF F F F F F F F F F F F F F F F F F F F F FQUH fputsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPV free F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRT preeype F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV E diteur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IP fsnf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQR diteur de liens F F F F F F F F F F F F F F F F F F F F F F IQU fseek F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQT else F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VH ftellF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPQS else if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VI fuite mmoire F F F F F F F F F F F F F F F F F F F F F F F F PPT empilge F F F F F F F F F F F F F F F F F F F F F F F F SHRD SHV G en(lge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SIQ gnrtion ltoire F F F F F F F F F F F F F F F F F F IHQ numrtion F F F F F F F F F F F F F F F F F F F F F F F F F PIS getsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVQ environnement de dveloppementF F F F F FIP qv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWU iyp F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQID PVW vnement F F F F F F F F F F F F F F F F F F F F F F F F F F F QTP H exit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRT hhgeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSPH ispesvi F F F F F F F F F F F F F F F F F F F F QPH hhge @tle deA F F F F F F F F F F F F F F F F F F F SIV isggi F F F F F F F F F F F F F F F F F F F F QPH hhge linireF F F F FSPP exp F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US heder F F F F F F F F F F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FIQHD IWP fsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUQ flose F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPS fget F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQH fgets F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQPD PVQ (hierF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPIW renommer F F F F F F F F F F F F F F F F F F F F F F F PQU supprimer F F F F F F F F F F F F F F F F F F F F F F F PQV pspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SII (leF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSII )gF F F F F F F F F F F F F F F F F F F F F F F F FQIUD QPID QVR testerF F F F F F F F F F F F F F F F F F F F F F F F F F F FQVR )ot F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR )oor F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR pwyhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRST fousF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQVQ fontionF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIIH loqunte F F F F F F F F F F F F F F F F F F F F F F F RPV lole F F F F F F F F F F F F F F F F F F F F F F F F F F F IRI pointeur deF F F F F F F F F F F F F F F F F F F F F FRQQ porte F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV sttique F F F F F F F F F F F F F F F F F F F F F F F F F IRI fonte F F F F F F F F F F F F F F F F F F F F F F F F F F voir polie fopen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPI for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WV fprintf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPW p F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQI SPR
F
shiF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIP if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UV ifdef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHH ifndef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHH imges pr seondeF F F F F F F F F F F F F F F F F F FRQI inlude F F F F F F F F F F F F F F F F F F F F F F F F F F F QTD IWP inlusion in(nie F F F F F F F F F F F F F F F F F F F F F F PHI inrmenttion F F F F F F F F F F F F F F F F F F F F UHD WW indie F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITQ instrution F F F F F F F F F F F F F F F F F F F F F F F F F F F F QU int F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR keysym F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QTV lngge inire F F F F F F F F F F F F F F F F F F F F F F F F F S lngge g F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F V lngge gCCF F F F F F F F F F F F F F F F F F F F F F F F F F FV lngge de progrmmtion F F F F F F F F F F F F F T vqvF F F F F F F F F F F F F F F F F F F F F F F F F F FPWUD RSU liririeF F F F F F F F F F F F F F F F Fvoir iliothque vspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR linkerF F F F F F F F F F F F F F F Fvoir diteur de liens liste hneF F F F F F F F F F F F F F F F F F F F F F F F F FRWP log F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US
L K
INDEX
longF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSR mroF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIWU min @fontionA F F F F F F F F F F F F F F F F F F F F F F F QU mllo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRR mthFhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUQ whSF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSPI mmoire dresse F F F F F F F F F F F F F F F F F F F F F F SID IRT he F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV dpssementF F F F F F F F F F F F F F F F F F F F FPVI vleur F F F F F F F F F F F F F F F F F F F F F F F F F F F F SI vive F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV modulo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TV multithe F F F F F F F F F F F F F F F F F F F F F F F F F F F RPS xvv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRW prmtreF F F F F F F F F F F F F F F F F F F F F F FIIPD IIQ pile F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHR pointeur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRW de fontion F F F F F F F F F F F F F F F F F F F F F F RQQ de struture F F F F F F F F F F F F F F F F F F F F F PIP polie F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RRP porte F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV powF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUR prproesseur F F F F F F F F F F F F F F F F F F F IQTD IWI ondition F F F F F F F F F F F F F F F F F F F F F F F F PHH onstnte deF F F F F F F F F F F F F F F F F F F F FIWR printfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQWD SW proesseur onsommtion F F F F F F F F F F F F F F RPRD RQH progrmmtionF F F F F F F F F F F F F F F F F F F F F F F F FR projetF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIQH prototype F F F F F F F F F F F F F F F F F F F F F F F F F F F F IPV puissne F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR
R P N M
rine rre F F F F F F F F F F F F F F F F F F F F F F F F F F UR ew F F F F F F F F F F F F F F F F F F voir mmoire vive rnd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ T registre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV returnF F F F F F F F F F F F F F F F F F F F F F F F F F F FQUD IIQ tle de hhge F F F F F F F F F F F F F F F F F F F F F SIV qfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQH tleu F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITP SPS
sisieF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FTI snf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TID PVH hv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWU ouleur F F F F F F F F F F F F F F F F F F F F F F F F F F QPW instlltion F F F F F F F F F F F F F F F F F F F F F F QHI surfe F F F F F F F F F F F F F F F F F F F F F F F F F F QPU tlhrgement F F F F F F F F F F F F F F F F F F QHH hvfliturfe F F F F F F F F F F F F F F F F F F F F QQR hvhelyF F F F F F F F F F F F F F F F F F F F F F F F F FRPR hvplip F F F F F F F F F F F F F F F F F F F F F F F F F F F QUS hvqetiks F F F F F F F F F F F F F F F F F F F F F F RPT hvsmgeF F F F F F F F F F F F F F F F F F F F FQSPD QSR hvttf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQV setixel F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RVH reI F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SPI sin F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR sizeof F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRH sokonF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQVV sprintf F F F F F F F F F F F F F F F F F F F F F F F F F F IVVD RSH sprite F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QWH sqrt F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR srnd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ stderrF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQIW stdinF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVT strt F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVP strhr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVS strmpF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIVQ strpyF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIVI streming F F F F F F F F F F F F F F F F F F F F F F F F F F F F RTU string F F F F F F F F F F F voir hne de rtres stringFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUV strlen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUV strprk F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVT strstr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVU strtodF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPWI strtol F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWH strutureF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPHT initilistionF F F F F F F F F F F F F F F F F F F F FPII pointeur deF F F F F F F F F F F F F F F F F F F F F FPIP surfeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQPU swithF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FVU
INDEX
tille dynmiqueF F F F F F F F F F F F F F FITR idimensionnel F F F F F F F F F F F F F F F F F F QWV indie F F F F F F F F F F F F F F F F F F F F F F F F F F F ITQ initilistionF F F F F F F F F F F F F F F F F F F F FITT tn F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR ternire F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WI tik F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPT timer F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQP type personnlis F F F F F F F F F F F F F F F F F F F F PHT typedef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHV unsigned F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SS vleurF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSI vrile F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SP 'ettion F F F F F F F F F F F F F F F F F F F F F F F F SU dlrtion F F F F F F F F F F F F F F F F F F F F F F F SS glole F F F F F F F F F F F F F F F F F F F F F F F F F F IQW porte F F F F F F F F F F F F F F F F F F F F F F F F F F F IQV sttique F F F F F F F F F F F F F F F F F F F F F F F F F IRH type F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SQ isul gCC ixpress F F F F F F F F F F F F F F F F F F IW void F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIP voidB F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRS whileF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FWR odeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPS
X W V U
SPT
Dpt lgal : mars 2012 ISBN : 979-10-90085-00-8 Code diteur : 979-10-90085 Imprim en France Achev d'imprimer le 05 mars 2012 (2 Numro imprimeur : 144043
dition)
Conception couverture : Fan Jiyong Illustrations chapitres : Fan Jiyong Mario est une marque dpose de Nintendo Corporation Visual Studio est une marque dpose de Microsoft Corporation Google est une marque dpose de Google Corporation Vue et Vue d'Esprit sont des marques dposes de e-on Software