Sauf mention contraire, le contenu de cet ouvrage est publié sous la licence : Creative Commons BY-NC-SA 2.0 La copie de cet ouvrage est autorisée sous réserve du respect des conditions de la licence Texte complet de la licence disponible sur :

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

Simple IT 2010 - ISBN : 978-2-9535278-0-3

Avant-propos

L

e livre que vous tenez d—ns vos m—ins — une longue histoire derrière luiF it pour ™—use X il — mis plus de dix —ns à mûrir —v—nt de voir le jourF gomment peutEon en —rriver à prép—rer un livre pend—nt dix longues —nnées c …n petit retour en —rrière s9imposeF te suis un p—ssionné de nouvelles te™hnologies p—rmi t—nt d9—utresF t9—i eu mon premier ordin—teur entre les m—ins juste —v—nt de rentrer —u ™ollègeF g9ét—it à ™e moment le l—n™ement en gr—ndes pompes de ‡indows WSF t9—i immédi—tement voulu —ller plus loinD s—voir  ™omment ç— fon™tionne à l9intérieur F won premier ré)exe — été d9é™umer les li˜r—iries de qu—rtier et plus p—rti™ulièrement leur se™tion mi™roEinform—tique déjà ˜ien développéeF „out @ou presqueA me f—is—it envie X  gréez votre site we˜ en r„wv en SH minutes D  héveloppez vos propres progr—mmes f—™ilement —ve™ †isu—l f—si™ D et™F hes promesses quiD à elles seulesD —ur—ient pu —voir r—ison de mon —rgent de po™heF g9est en lis—nt l— qu—trième de ™ouverture que les ™hoses ont ™ommen™é à ™oin™er X  Ce livre est destiné aux personnes ayant déjà une bonne expérience en programmation F €—s de p—niqueF sl su0t de trouver ™elui qui s9—dresse —ux dé˜ut—nts ™omme moiF te repose le livre sur les ét—l—ges et je tente d9en sortir un —utreF €uis un —utreF €uis en™ore un —utreF tusqu9à me rendre à l9éviden™e X pour —pprendre à progr—mmerD il f—ut déjà s—voir progr—mmerF ristoire de ne p—s —voir f—it le tr—jet pour rienD je rep—rtir—i qu—nd même —ve™ un livre ou deux sous les ˜r—sD ™eux qui sem˜l—ient les plus ™orre™ts du lotF te leur rends homm—ge i™i X ™9est —ve™ eux que j9—i dém—rré et j9—i ˜e—u™oup —ppris à leur le™tureF w—is en les relis—nt —ve™ un peu de re™ul quelques mois plus t—rdD j9—i (ni p—r m9—per™evoir de ™ert—ines in™ohéren™es X un ™h—pitre simple sur l9inst—ll—tion d9un logi™iel qui —ur—it dû être pl—™é tout —u dé˜utD des ™odes sour™e s—ns expli™—tionsD qu—nd ™e n9ét—it p—s ™—rrément un mot import—nt utilisé tout —u long du livre et dé(ni vers l— (n 3 v— ™ritique ét—it f—™ileD m—is il me f—ll—it prouver que l9on pouv—it f—ire plus clair et plus simpleF t9—i don™ entrepris de reformuler mon premier livre tel que j'aurais souhaité le lire en ™ré—nt mon premier site we˜F g9ét—it il y — dix —ns presque jour pour jour à l— sortie de ™e livreF i

CHAPITRE 0. AVANT-PROPOS

Qu'est-ce que ce livre vous propose ?
fien des —nnées se sont é™oulées depuis l— réd—™tion des premiers ™oursF h—ns ™et interE v—lle de tempsD j9—i suivi des études d9ingénieur en inform—tique puis j9—i été professeur de l—ng—ge g d—ns l9enseignement supérieurF „out ™e™i m9— —mené à ™onstruire un pl—n de ™ours —d—pté —ux dé˜ut—ntsD progressif et ™on™retF geluiE™i est ™onstitué de qu—tre p—rties que vous retrouverez d—ns ™et ouvr—ge X IF Les bases de la programmation en C X nous dém—rrerons en dou™eur en dé™ouvr—nt ™e qu9est l— progr—mm—tion et à quoi sert le l—ng—ge g qui f—it l9o˜jet de ™e livreF xous inst—llerons les outils né™ess—ires —u progr—mmeur —d—ptés à votre système d9exploit—tion X ‡indowsD w—™ yƒ ˆ ou vinuxF xous ré—liserons nos premiers progr—mmes simples et pourrons pr—tiquer en ré—lis—nt un petit jeu dès l— (n de ™ette p—rtieF PF Techniques  avancées  du langage C X nous étudierons des ™on™epts plus —v—n™és et plus ™omplexes du gF geuxE™iD ˜ien que d9un nive—u plus élevéD sont indispens—˜les à l— ˜onne ™ompréhension du l—ng—ge X pointeursD t—˜le—uxD stru™E turesD ™h—înes de ™—r—™tèresD et™F ve nive—u reste progressif m—is le ™ours dem—nE der— plus d9—ttention de votre p—rt à p—rtir de ™ette se™onde p—rtieD soyezEen simplement prévenusF QF Création de jeux 2D en SDL X —près —voir —™quis l9essentiel des ™onn—iss—n™es né™ess—ires pour progr—mmer en gD il nous ser— possi˜le de nous —muser en ™ré—nt nousEmêmes des progr—mmes ™omplets tels que des jeux et des le™teurs —udioF €our y p—rvenirD nous utiliserons une  extension du l—ng—ge g que l9on —ppelle l— ƒhvF RF Les structures de données X pour —ller plus loinD nous dé™ouvrirons des méE thodes de progr—mm—tion spé™i(ques d—ns ™ette dernière p—rtieF xous m—nipuleE rons des données en mémoire à l9—ide de stru™tures personn—lisées et intelligentesD ™e qui vous permettr— d9—ugmenter en e0™—™ité lorsque vous ré—liserez vos futurs progr—mmesF

Comment lire ce livre ?
Suivez l'ordre des chapitres
visez ™e livre ™omme on lit un rom—nF sl — été ™onçu de ™ette f—çonF gontr—irement à ˜e—u™oup de livres te™hniques où il est ™our—nt de lire en di—gon—le et de s—uter ™ert—ins ™h—pitresD i™i il est très fortement re™omm—ndé de suivre l9ordre du ™oursD à moins que vous ne soyez déjà un peu expérimentéF ii

COMMENT LIRE CE LIVRE ?

Pratiquez en même temps
€r—tiquez régulièrementF x9—ttendez p—s d9—voir (ni l— le™ture de ™e livre pour —llumer votre ordin—teur et f—ire vos propres ess—isF ve livre ™omporte plusieurs „F€F qui vous invitent à ™réer votre propre progr—mme en suiv—nt une série de ™onsignesF g9est ˜ienD m—is ne vous en ™ontentez p—sF iss—yez les ™odes sour™e que je vous propose tout —u long du ™oursF wodi(ezEles un tout petit peuD puis de plus en plus jusqu9à vous sentir à l9—iseF …ne fois les „F€F terminésD ess—yez de ré—liser les —mélior—tions suggérées —insi que ™elles qui vous p—ssent p—r l— têteF †ous progresserez —insi ˜e—u™oup plus vite que vous ne l9im—giniezF
1

Utilisez les codes web !
e(n de tirer p—rti du ƒite du éro dont est issu ™e livreD ™eluiE™i vous propose ™e qu9on —ppelle des  ™odes we˜ F ge sont des ™odes à T ™hi'res à rentrer sur une p—ge du ƒite du éro pour être —utom—tiquement redirigé vers un site we˜ s—ns —voir à en re™opier l9—dresseF €our utiliser les ™odes we˜D rendezEvous sur l— p—ge suiv—nte X
2

…n formul—ire vous invite à rentrer votre ™ode we˜F p—ites un premier ess—i —ve™ le ™ode ™iEdessous X   £ ¢gode we˜ X IPQRST ¡ ges ™odes we˜ ont deux intérêts X ! vous f—ire télé™h—rger les ™odes sour™e in™lus d—ns ™e livreD ™e qui vous éviter— d9—voir à re™opier ™ert—ins ™odes un peu longs Y ! vous rediriger vers les sites we˜ présentés tout —u long du ™oursF ge système de redire™tion nous permet de tenir à jour le livre que vous —vez entre les m—ins s—ns que vous —yez ˜esoin d9—™heter systém—tiquement ™h—que nouvelle éditionF ƒi un site we˜ ™h—nge d9—dresseD nous modi(erons l— redire™tion m—is le ™ode we˜ à utiliser rester— le mêmeF ƒi un site we˜ disp—r—îtD nous vous redirigerons vers une p—ge du ƒite du éro expliqu—nt ™e qui s9est p—ssé et vous propos—nt une —ltern—tiveF in ™l—irD ™9est un moyen de nous —ssurer de l— pérennité de ™et ouvr—ge s—ns que vous —yez à f—ire quoi que ™e soit 3

http:GGwwwFsiteduzeroF™omG™odewe˜Fhtml

1. Travaux Pratiques 2. Je vous suggère d'ailleurs de l'ajouter à vos favoris.

iii

CHAPITRE 0. AVANT-PROPOS

Du Site du Zéro au Livre du Zéro
À l9époque où j9—i souh—ité rédiger mes premiers ™ours pour dé˜ut—ntsD mon premier ré)exe — été de ™réer un site we˜ ™—r ™9ét—it pour moi le moyen le plus simple de pu˜lier mes é™rits F sl fut dé™idé que le site s9—ppeller—it le  ƒite du éro F F F p—r™e qu9on y —pprendr—it tout à p—rtir de zéroF ƒ—ns moyens pu˜li™it—ires —utres que le ˜ou™he à oreilleD m—is —ve™ ˜e—u™oup de motiE v—tion et de p—ssionD wwwFsiteduzeroF™om s9est f—it —u (l des —nnées un vérit—˜le nom sur le ‡e˜F À tel point que j9—i (ni p—r dé™ouvrir qu9il ét—it ™onnu et re™omm—ndé p—r des professeurs en inform—tiqueD m—is —ussi utilisé ™omme support de ™ours p—r leurs élèves 3 ve site s9est fortement développé et est devenu plus qu9un site de ™ours en ligne pour dé˜ut—ntsF sl regroupe —ujourd9hui plus de IUH HHH mem˜res formid—˜les qui é™h—ngent et s9entr—ident sur les forums m—is prennent —ussi p—rt à l— réd—™tion des ™ours de f—çon désintéresséeF v— seule ™onsigne en vigueur sur le site est l— seule que j9—ie j—m—is suivie X se mettre à l— pl—™e du le™teur dé˜ut—nt que nous —vons tous étéF gel— f—it longtemps que je souh—ite un retour —ux sour™esD d—ns ™es li˜r—iries où j9—i moiEmême été perduF ve vivre du éro est le moyen idé—l de ˜ou™ler l— ˜ou™leF
3

À l'attention de ceux qui ne connaissent pas le Site du Zéro
ƒi vous ne f—ites p—s p—rtie des visiteurs du ƒite du éro D vous vous dem—ndez à juste titre si ™e livre est f—it pour vousF gomme vous l9—urez s—ns doute ™omprisD ™e livre est —v—nt tout destiné —ux dé˜ut—ntsF †ous y trouverez né—nmoins —ussi votre ™ompte si vous —vez déjà de l9expérien™e en progr—mm—tion d—ns d9—utres l—ng—ges et que vous souh—itez dé™ouvrir le gF „outes les notions à ™onn—ître pour dém—rrer d—ns l— progr—mm—tion seront dét—illéesD en privilégi—nt les exemples —ux dé(nitions théoriquesF ve ™ours est d9—illeurs p—rti™uE lièrement fourni en s™hém—s ™omme vous pourrez le ™onst—terF visez le premier ™h—pitre pour dé™ider si vous —™™ro™hez et ™omprenez ™e qui s9y ditF v— seule ™ompéten™e réellement requise est de s—voir —llumer un ordin—teur F te me ™h—rge de vous expliquer tout le reste X de l9inst—ll—tion des logi™iels né™ess—ires pour progr—mmer à l9expli™—tion des ™omm—ndes qui permettent de ™réer des progr—mmesD en p—ss—nt p—r les ™onseils et les ˜onnes pr—tiques qui vous feront g—gner du tempsF †ous noterez que je m9exprime toujours à l— première personneF g9est m— f—çon de f—ireF sm—ginez d9une ™ert—ine m—nière que nous sommes vous et moi d—ns l— même s—lle et que je suis votre professeurF te vous p—rle dire™tement et je réponds à vos questions en
4 5

3. Et ça l'est d'ailleurs toujours, c'est amusant de voir que cela n'a pas changé. Le Web est plus que jamais un formidable espace d'expression et doit le rester. 4. Que l'on appelle d'ailleurs les  Zéros , 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 Zéro .

iv

REMERCIEMENTS

ess—y—nt d—ns l— mesure du possi˜le de les —nti™iperF

À l'attention des visiteurs du Site du Zéro
ge livre ne rempl—™e p—s le ƒite du éroF sl le complèteF in f—itD il répond à une question que l9on m9— souvent posée X  €ourquoi ne voitEon p—s ™es ™ours en li˜r—irie c F yui ™9est vr—iD pourquoi c €—r™e que rédiger et pu˜lier un livre ne s9improvise p—sF e(n d9—voir le m—ximum de li˜erté et d9indépend—n™eD je souh—it—is être l9éditeur de ™es livresF sl —ur— f—llu du temps pour y p—rvenir m—is ™9est —ujourd9hui ™hose f—iteF ge livre s9—dresse à vous si vous —vez —imé les ™ours du ƒite du éro m—is que X ! l— le™ture sur é™r—n vous f—tigue Y ! vous —vez ˜esoin d9un support hors ligne que vous pouvez emporter où vous voulez Y ! vous —uriez ˜ien imprimé les ™ent—ines de p—ges du ™ours vousEmême m—is votre imprim—nte risquer—it de f—ire un peu l— tête Y ! vous souh—itez tout simplement —pporter votre ™ontri˜ution —u siteD —(n de nous —ider à (n—n™er son développement et l— réd—™tion de nouve—ux ™oursF †ous y retrouverez le ™ours de progr—mm—tion en g d—ns une édition revue et ™orrigéeD —ve™ de nouvelles rem—rques et —ne™dotesF ve livre ™omporte une série de ™h—pitres inédits qui vous permettront d9—ller en™ore plus loin et d9explorer de nouvelles voies d—ns votre dé™ouverte de l— progr—mm—tionF

Remerciements
ge livre n9est p—s le fruit d9une seule et même personneF sl n9—ur—it en f—it j—m—is vu le jour s—ns de nom˜reuses personnes qui m9ont —pporté leur soutien ou leur —ideF ! wes p—rents tout d9—˜ordD qui m9ont toujours en™our—gé et ™onseillé qu—nd j9en —v—is le plus ˜esoinF ! ÉlodieD qui p—rt—ge m— vie depuis plusieurs —nnées et qui s—it toujours trouver les mots justes pour m9—ider à —v—n™erF ! €ierre hu˜u™D mon —sso™iéD à qui l9on doit les fond—tions te™hniques du ƒite du éro que l9on ™onn—ît —ujourd9hui —insi que le ré™ent développement de notre stru™tureF v— dévotion qu9il — portée à l— n—iss—n™e de ™e livre ne s—ur—it être su0s—mment s—luéeF ! xh—t winh vê @rzHA —ve™ qui j9—i eu de longues et intéress—ntes ™onvers—tions sur v „iˆD le l—ng—ge d—ns lequel est é™rit ™e livre D —insi que sur le l—ng—ge gD son dom—ine de prédile™tionF ! xos infogr—phistesD p—n tiyong @™ouverture de ™e livreA et ‰—nni™k €i—ult @illustr—E tions des ™h—pitresA qui ont tr—v—illé d9—rr—™heEpied pend—nt plusieurs sem—ines pour livrer le meilleur tr—v—il possi˜leF
A 6

6. Eh oui, même ce livre est compilé, on ne se refait pas. :-)

v

CHAPITRE 0. AVANT-PROPOS ! v9équipe des zgorre™teursD des p—ssionnés de l—ngue fr—nç—ise et de typogr—phie qui ™orrigent depuis longtemps les ™ours du ƒite du éro et qui ont f—it un tr—v—il formid—˜le de rigueur et d9e0™—™ité pour relire ™e livre @triple rele™ture pour ™h—que ™h—pitre 3AF te tiens à remer™ier en p—rti™ulier les ™inq ™orre™teurs qui se sont ™h—rgés de l— rele™ture de ™e livre X €hilippe vutun @ptipilouAD voï™ ve freton @pihldAD w—rtin ‡etterw—ld @ht poxAD quill—ume q—ullier @quill—wmeA et véo ‚oux @xeltyAF ! v9équipe du ƒite du éroD p—sséeD présente et futureF veur —ide pour f—ire tourner le site est inestim—˜leF ‚édiger une liste ™omplète des mem˜res de l9équipe ser—it ˜ien trop long i™iD m—is ils s—uront se re™onn—ître tous —ut—nt qu9ils sontF YEA ! in(n et surtoutD tous ™eux qui nous ont f—it ™on(—n™e et nous ont en™our—gés à ™ontinuer X les visiteurs du ƒite du éro F iux —ussi sont un peu trop nom˜reux pour être listés i™iD m—is qu9ils s—™hent à quel point leurs en™our—gements ont été le moteur de l— ™ré—tion de ™e livreF wer™i à vous en(nD qui vous —pprêtez à nous f—ire ™on(—n™e en lis—nt ™e livreF te vous souh—ite une ˜onne et —gr闘le le™tureD et surtout n9ou˜liez p—s d9y prendre du pl—isir 3 7 7. Il est intéressant de noter que toutes les personnes listées précédemment en font partie ! vi .

Sommaire Avant-propos u9estE™e 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 ‚emer™iements F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ii F ii F iv F v i I Les bases de la programmation en C 1 Vous avez dit programmer ? 1 3 €rogr—mmerD ™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 €rogr—mmerD d—ns quel l—ng—ge 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 €rogr—mmerD ™9est dur c F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F R S W 2 Ayez les bons outils ! ves outils né™ess—ires —u progr—mmeur F F gode: :flo™ks @‡indowsD w—™ yƒD vinuxA †isu—l gCC @‡indows seulementA F F F F ˆ™ode @w—™ yƒ seulementA F F F F F F F F 11 IP IQ IW PS 3 Votre premier programme gonsole ou fenêtre c F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QP …n minimum de ™ode F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QR ərire un mess—ge à l9é™r—n F F F F F F F F F F F F F F F F F F F F F F F F F F F F QW vii 31 .

votre premier jeu €rép—r—tifs 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 gorre™tion 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 sdées d9—mélior—tion F F F F F F F F 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 gréer et —ppeler une fon™tion F F F 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 ves ™omment—iresD ™9est très utile 3 F F F F F F F F F F F F F F F F F F F F F F F F RQ 4 Un monde de variables …ne —'—ire de mémoire F F F F F F hé™l—rer une v—ri—˜le F F F F F F F F e0™her le ™ontenu d9une v—ri—˜le F ‚é™upérer une s—isie F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 47 RV SP SW TI 5 Une bête de calcul ves ™—l™uls 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 r—™™our™is F F F F F F F F F F F F 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— ˜i˜liothèque m—thém—tique F F F F F F F F F F F F F F F F F F F F F F F F F F UP v— ™ondition ifFFF else F F F F F F F F F ves ˜ooléensD le ™oeur des ™onditions F F F v— ™ondition swit™h F F F F F F F F F F F F ves tern—ires X des ™onditions ™ondensées F u9estE™e qu9une ˜ou™le c v— ˜ou™le while F F F F F v— ˜ou™le doFFF while F v— ˜ou™le for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 77 65 6 Les conditions UV VR VU WI WR WR WU WV 7 Les boucles 93 8 TP : Plus ou Moins.

SOMMAIRE II Techniques  avancées  du langage C 10 La programmation modulaire 125 F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 127 ves prototypes F F F F F F F F F F F F F F ves he—ders F F F F F F F F F F F F F F F F v— ™ompil—tion sép—rée F F F F F F F F F F v— portée des fon™tions et des v—ri—˜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 F F F F F F F F F F F F F F F F F F F F F F F F F IPV IQH IQS IQV 11 À l'assaut des pointeurs …n pro˜lème ˜ien ennuyeux F F F F F F F F v— mémoireD une question d9—dresse F F F …tiliser des pointeurs F F F F F F F F F F F F invoyer un pointeur à une fon™tion F F F F ui — dit X  …n pro˜lème ˜ien ennuyeux ves t—˜le—ux d—ns l— mémoire F F F hé(nir un t—˜le—u F F F F F F F F F €—r™ourir un t—˜le—u F F F F F F F F €—ss—ge de t—˜le—ux à une fon™tion F F F F F F F F F F F F F F F F FF FF FF FF c F F F F F F F F 143 IRR IRT IRW ISR ISU 12 Les tableaux 159 ITH ITH ITQ ITS 13 Les chaînes de caractères ve type ™h—r F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUH ves ™h—înes sont des t—˜le—ux de ™h—r F F F F F F F F F F F F F F F F F F F F F F IUP pon™tions de m—nipul—tion des ™h—înes F F F F F F F F F F F F F F F F F F F F F F IUT F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 187 169 14 Le préprocesseur ves in™lude F F ves define F F ves m—™ros F F ves ™onditions F IVV IWH IWQ IWT 15 Créez vos propres types de variables hé(nir une stru™ture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHP …tilis—tion d9une stru™ture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHR €ointeur de stru™ture F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHV 201 ix .

SOMMAIRE ves énumér—tions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PII 16 Lire et écrire dans des chiers yuvrir et fermer un (™hier F F F F F F F F F hi'érentes méthodes de le™ture G é™riture ƒe dépl—™er d—ns un (™hier F F F F F F F F F ‚enommer et supprimer un (™hier F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 215 PIT PPQ PQI PQQ 17 L'allocation dynamique v— t—ille des v—ri—˜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 PQT ello™—tion de mémoire dyn—mique 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 ello™—tion dyn—mique d9un t—˜le—u F F F F F F F F F F F F F F F F F F F F F F F F PRS ves ™onsignes F F F F F F F F F F F F F F F F F v— solution @I X le ™ode du jeuA F F F F F F F v— solution @P X l— gestion du di™tionn—ireA F sdées d9—mélior—tion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 249 235 18 TP : réalisation d'un Pendu PSH PST PTI PUI 19 La saisie de texte sécurisée ves limites de l— fon™tion s™—nf F F F F F F F F F F F F F F F F F F F F F F F F F F PUR ‚é™upérer une ™h—îne de ™—r—™tères F F F F F F F F F F F F F F F F F F F F F F F F PUT gonvertir l— ™h—îne en nom˜re F F F F F F F F F F F F F F F F F F F F F F F F F F F PVQ 273 III Création de jeux 2D en SDL 20 Installation de la SDL 287 289 €ourquoi —voir ™hoisi l— ƒhv c F F F F F F F F F F F F F F F F F F F F F F F F F F F PWH „élé™h—rgement de l— ƒhv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWR gréer un projet ƒhv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWS gh—rger et —rrêter l— ƒhv F yuverture d9une fenêtre F F w—nipul—tion des surf—™es F ixer™i™e X ™réer un dégr—dé F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F 305 21 Création d'une fenêtre et de surfaces QHT QIH QIU QPU x .

SOMMAIRE

22 Acher des images

gh—rger une im—ge fw€ F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQR qestion de l— tr—nsp—ren™e F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQV gh—rger plus de form—ts d9im—ge —ve™ ƒhv•sm—ge F F F F F F F F F F F F F F F F QRP ve prin™ipe des événements F F F F ve ™l—vier F F F F F F F F F F F F F F ixer™i™e X diriger ozor —u ™l—vier F v— souris F F F F F F F F F F F F F F ves événements de l— fenêtre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
351

333

23 La gestion des événements

QSP QSU QTH QTV QUP

24 TP : Mario Sokoban

g—hier des ™h—rges du ƒoko˜—n F F F F F F ve m—in et les ™onst—ntes 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 gh—rgement et enregistrement de nive—ux v9éditeur de nive—ux F F F F F F F F F F F F ‚ésumé et —mélior—tions F F F F F F F F F F

377

QUV QVI QVT RHH RHP RHV

25 Maîtrisez le temps !

ve Delay et les ticks F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RIP ves timers F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPH
425

411

26 Écrire du texte avec ƒhv•ttf

snst—ller ƒhv•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 RPT gh—rgement de ƒhv•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 RPV ves di'érentes méthodes d9é™riture 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 snst—ller pwyh F F F F F F F F F F F F F sniti—liser et li˜érer pwyh F F F F F F ves sons ™ourts F F F F F F F F F F F F F ves musiques @w€QD yqqD ‡weF F FA ves musiques @wshsA F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
443

27 Jouer du son avec FMOD

RRR RRT RRU RSP RSU xi

SOMMAIRE

28 TP : visualisation spectrale du son

ves ™onsignes F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RTR v— solution F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RUH sdées d9—mélior—tion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RUR

463

IV Les structures de données
29 Les listes chaînées

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

‚eprésent—tion d9une liste ™h—înée gonstru™tion d9une liste ™h—înée F F ves fon™tions de gestion de l— liste eller plus loin F F F F F F F F F F F F

F F F F

F F F F

RUV RUW RVP RVU

30 Les piles et les les

ves piles F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWH ves (les F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWU €ourquoi utiliser une t—˜le de h—™h—ge c u9estE™e qu9une t—˜le de h—™h—ge c F F F ərire une fon™tion de h—™h—ge F F F F F qérer les ™ollisions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
503

489

31 Les tables de hachage

SHR SHR SHT SHV

xii

Première partie
Les bases de la programmation en C

I

Chapitre

1
Diculté :

Vous avez dit programmer ?

V

ous avez déjà 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 répondre à toutes ces questions apparemment bêtes et pourtant très importantes. Grâce à ces questions simples, vous saurez à la n de ce premier chapitre ce qui vous attend. C'est quand même mieux de savoir à quoi sert ce que vous allez apprendre, vous ne trouvez pas ?

Q

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

Programmer, c'est quoi ?
yn ™ommen™e p—r l— question l— plus simple qui soitD l— plus ˜—sique de toutes les questions ˜—siquesF ƒi vous —vez l9impression de déjà s—voir tout ç—D je vous ™onseille de lire qu—nd mêmeD ç— ne peut p—s vous f—ire de m—l 3 te p—rs de zéro pour ™e ™oursD don™ je v—is devoir répondre à l— question X
Que signie le mot  programmer  ?

€rogr—mmer signi(e ré—liser des  progr—mmes inform—tiques F ves progr—mmes deE m—ndent à l9ordin—teur d9e'e™tuer des —™tionsF †otre ordin—teur est rempli de progr—mmes en tous genres X ! l— ™—l™ul—tri™e est un progr—mme Y ! votre tr—itement de texte est un progr—mme Y ! votre logi™iel de  ™h—t est un progr—mme Y ! les jeux vidéo sont des progr—mmes @™fF (gF IFID le ™élè˜re jeu r—lfEvife PAF

Figure IFI ! ve jeu r—lfEvife P — été progr—mmé en gCCD un l—ng—ge voisin du g

in ˜refD les progr—mmes sont p—rtout et permettent de f—ire — priori tout et n9importe quoi sur un ordin—teurF †ous pouvez inventer un logi™iel de ™rypt—ge révolutionn—ire si ç— vous ™h—nteD ou ré—liser un jeu de ™om˜—t en Qh sur snternetD peu importeF †otre ordin—teur peut tout f—ire @s—uf le ™—féD m—is j9y tr—v—illeAF ettention 3 te n9—i p—s dit que ré—liser un jeu vidéo se f—is—it en ™l—qu—nt des doigtsF t9—i simplement dit que tout ™el— ét—it possi˜leD m—is soyez sûrs que ç— dem—nde ˜e—u™oup de tr—v—ilF R

PROGRAMMER, DANS QUEL LANGAGE ?

gomme vous dé˜utezD nous n9—llons p—s ™ommen™er en ré—lis—nt un jeu QhF ge ser—it sui™id—ireF xous —llons devoir p—sser p—r des progr—mmes très simplesF …ne des preE mières ™hoses que nous verrons est comment acher un message à l'écranF yuiD je s—isD ç— n9— rien de tr—ns™end—ntD m—is rien que ç— ™royezEmoiD ™e n9est p—s —ussi f—™ile que ç— en — l9—irF Ǘ impressionne moins les —misD m—is on v— ˜ien devoir p—sser p—r làF €etit à petitD vous —pprendrez su0s—mment de ™hoses pour ™ommen™er à ré—liser des progr—mmes de plus en plus ™omplexesF ve ˜ut de ™e ™ours est que vous soyez ™—p—˜les de vous en sortir d—ns n9importe quel progr—mme é™rit en gF w—is tenezD —u f—itD vous s—vez ™e que ™9est vousD ™e f—meux  l—ng—ge g c

Programmer, dans quel langage ?
†otre ordin—teur est une m—™hine ˜iz—rreD ™9est le moins que l9on puisse direF yn ne peut s9—dresser à lui qu9en lui envoy—nt des H et des IF einsiD si je tr—duis  p—is le ™—l™ul Q C S en l—ng—ge inform—tiqueD ç— pourr—it donner quelque ™hose ™omme X
1

HHIHIIHIIHHIHHIIHIHHIIIIH

ge que vous voyez làD ™9est le l—ng—ge inform—tique de votre ordin—teurD —ppelé langage binaire @retenez ˜ien ™e mot 3AF †otre ordin—teur ne ™onn—ît que ™e l—ng—geElà etD ™omme vous pouvez le ™onst—terD ™9est —˜solument in™ompréhensi˜leF hon™ voilà notre premier vr—i pro˜lème X
Comment parler à l'ordinateur plus simplement qu'en binaire avec des 0 et des 1 ?

†otre ordin—teur ne p—rle p—s l9—ngl—is et en™ore moins le fr—nç—isF €ourt—ntD il est in™on™ev—˜le d9é™rire un progr—mme en l—ng—ge ˜in—ireF wême les inform—ti™iens les plus fous ne le font p—sD ™9est vous dire 3 ih ˜ien l9idée que les inform—ti™iens ont eueD ™9est d9inventer de nouve—ux l—ng—ges qui ser—ient ensuite tr—duits en ˜in—ire pour l9ordin—teurF ve plus dur à f—ireD ™9est de ré—liser le progr—mme qui f—it l—  tr—du™tion F reureusementD ™e progr—mme — déjà été é™rit p—r des inform—ti™iens et nous n9—urons p—s à le ref—ire @ouf 3AF yn v— —u ™ontr—ire s9en servir pour é™rire des phr—ses ™omme X  Fais le calcul 3 + 5 qui seront tr—duites p—r le progr—mme de  tr—du™tion en quelque ™hose ™omme X  HHIHIIHIIHHIHHIIHIHHIIIIH F ve s™hém— IFP résume ™e que je viens de vous expliquerF
1. J'invente, je ne connais quand même pas la traduction informatique par c÷ur.

S

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

Figure IFP ! ƒ™hém— @très simpli(éA de ré—lis—tion d9un progr—mme

Un peu de vocabulaire
và j9—i p—rlé —ve™ des mots simplesD m—is il f—ut s—voir qu9en inform—tique il existe un mot pour ™h—™une de ™es ™hosesElàF „out —u long de ™e ™oursD vous —llez d9—illeurs —pprendre à utiliser un vo™—˜ul—ire —ppropriéF xon seulement vous —urez l9—ir de s—voir de quoi vous p—rlezD m—is si un jour @et ç— —rriver—A vous devez p—rler à un —utre progr—mmeurD vous s—urez vous f—ire ™omprendre F ‚eprenons le s™hém— que l9on vient de voirF v— première ™—se est  †otre progr—mme est é™rit d—ns un l—ng—ge simpli(é F ge f—meux  l—ng—ge simpli(é est —ppelé en f—it langage de haut niveauF sl existe plusieurs nive—ux de l—ng—gesF €lus un l—ng—ge est h—ut nive—uD plus il est pro™he de votre vr—ie l—ngue @™omme le fr—nç—isAF …n l—ng—ge de h—ut nive—u est don™ f—™ile à utiliserD m—is ™el— — —ussi quelques petits déf—uts ™omme nous le verrons plus t—rdF sl existe de nom˜reux l—ng—ges de plus ou moins h—ut nive—u en inform—tique d—ns lesquels vous pouvez é™rire vos progr—mmesF in voi™i quelquesEuns p—r exemple X ! le g Y ! le gCC Y ! t—v— Y ! †isu—l f—si™ Y ! helphi Y ! et™F xotez que je ne les —i p—s ™l—ssés p—r  nive—u de l—ng—ge D n9—llez don™ p—s vous im—giner que le premier de l— liste est plus f—™ile que le dernier ou l9inverseF ge sont juste quelques exemples F gert—ins de ™es l—ng—ges sont plus h—ut nive—u que d9—utres @don™ en théorie un peu plus f—™iles à utiliserAF yn v— voir not—mment un peu plus loin ™e qui di'éren™ie le l—ng—ge g du l—ng—ge gCCF …n —utre mot de vo™—˜ul—ire à retenir est code sourceF ge qu9on —ppelle le ™ode sour™eD ™9est tout simplement le ™ode de votre progr—mme é™rit d—ns un l—ng—ge de h—ut nive—uF g9est don™ vous qui é™rivez le ™ode sour™eD qui ser— ensuite tr—duit 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 désolé pour tous les autres langages qui existent, mais faire une liste complète serait vraiment trop long !

T

PROGRAMMER, DANS QUEL LANGAGE ?

˜in—ireF †enonsEen justement —u  progr—mme de tr—du™tion qui tr—duit notre l—ng—ge de h—ut nive—u @™omme le g ou le gCCA en ˜in—ireF ge progr—mme — un nom X on l9—ppelle le compilateurF v— tr—du™tionD elleD s9—ppelle la compilationF „rès import—nt X il existe un ™ompil—teur di'érent pour ™h—que l—ng—ge de h—ut nive—uF g9est d9—illeurs tout à f—it logique X les l—ng—ges ét—nt di'érentsD on ne tr—duit p—s le gCC de l— même m—nière qu9on tr—duit le helphiF
Vous verrez par la suite que même pour le langage C il existe plusieurs compilateurs diérents ! 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 (même s'il y a parfois quelques  légères  diérences que nous apprendrons à reconnaître).

in(nD le progr—mme ˜in—ire ™réé p—r le ™ompil—teur est —ppelé l'exécutableF g9est d9—illeurs pour ™ette r—ison que les progr—mmes @tout du moins sous ‡indowsA ont l9extension  Fexe ™omme iˆi™ut—˜leF ‚eprenons notre s™hém— pré™édentD et utilisons ™ette fois des vr—is mots tordus d9inE form—ti™ien @(gF IFQAF

Figure IFQ ! ve même s™hém—D —ve™ le ˜on vo™—˜ul—ire

Pourquoi choisir d'apprendre le C ?
gomme je vous l9—i dit plus h—utD il existe de très nom˜reux l—ng—ges de h—ut nive—uF hoitEon ™ommen™er p—r l9un d9entre eux en p—rti™ulier c qr—nde questionF €ourt—ntD il f—ut ˜ien f—ire un ™hoixD ™ommen™er l— progr—mm—tion à un moment ou à un —utreF it làD vous —vez en f—it le ™hoix entre X ! un langage très haut niveau X ™9est f—™ile à utiliserD plutôt  gr—nd pu˜li™ F €—rmi euxD on ™ompte €ythonD ‚u˜yD †isu—l f—si™ et ˜ien d9—utresF ges l—ng—ges permettent d9é™rire des progr—mmes plus r—pidementD en règle génér—leF sls né™essitent toutefois d9être —™™omp—gnés de (™hiers pour qu9ils puissent s9exé™uter @™omme un interpréE teurA Y ! un langage un peu plus bas niveau @m—is p—s trop qu—nd même 3A X ils sont peutEêtre un peu plus di0™iles ™ertesD m—is —ve™ un l—ng—ge ™omme le gD vous —llez en —pprendre ˜e—u™oup plus sur l— progr—mm—tion et sur le fon™tionnement de votre U

CHAPITRE 1. VOUS AVEZ DIT PROGRAMMER ?

ordin—teurF †ous serez ensuite l—rgement ™—p—˜les d9—pprendre un —utre l—ng—ge de progr—mm—tion si vous le désirezF †ous serez don™ plus —utonomesF €—r —illeursD le g est un l—ng—ge très popul—ireF sl est utilisé pour progr—mmer une gr—nde p—rtie des logi™iels que vous ™onn—issezF in(nD le l—ng—ge g est un des l—ng—ges les plus ™onnus et les plus utilisés qui existentF sl est très fréquent qu9il soit enseigné lors d9études supérieures en inform—tiqueF †oilà les r—isons qui m9in™itent à vous —pprendre le l—ng—ge g plutôt qu9un —utre F te ne dis p—s qu9il faut ™ommen™er p—r ç—D m—is je vous dis plutôt que ™9est un ˜on ™hoix qui v— vous donner de solides ™onn—iss—n™esF te v—is supposer tout —u long de ™e ™ours que ™9est votre premier l—ng—ge de progr—mE m—tionD que vous n9—vez j—m—is f—it de progr—mm—tion —v—ntF ƒi p—r h—s—rdD vous —vez déjà un peu progr—mméD ç— ne pourr— p—s vous f—ire de m—l de reprendre à zéroF
4

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

ve l—ng—ge g et le l—ng—ge gCC sont très simil—iresF sls sont tous les deux toujours très utilisésF €our ˜ien ™omprendre ™omment ils sont nésD il f—ut f—ire un peu d9histoireF ! eu tout dé˜utD à l9époque où les ordin—teurs pes—ient des tonnes et f—is—ient l— t—ille de votre m—isonD on — ™ommen™é à inventer un l—ng—ge de progr—mm—tion —ppelé l'AlgolF ! ves ™hoses évolu—ntD on — ™réé un nouve—u l—ng—ge —ppelé le CPLD qui évolu— luiE même en BCPLD qui prit ensuite le nom de langage BF ! €uis un ˜e—u jourD on en est —rrivé à ™réer un —utre l—ng—ge en™oreD qu9on — —ppeléF F F le langage CF ge l—ng—geD s9il — su˜i quelques modi(™—tionsD reste en™ore un des plus utilisés —ujourd9huiF ! …n peu plus t—rdD on — proposé d9—jouter des ™hoses —u l—ng—ge gF …ne sorte d9—mélioE r—tion si vous voulezF ge nouve—u l—ng—geD que l9on — —ppelé  gCC D est entièrement ˜—sé sur le gF Le langage C++ n9est en f—it rien d9—utre que le l—ng—ge g —ve™ des —jouts permett—nt de progr—mmer d9une f—çon 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 diéremment. Disons aussi qu'il permet au nal de programmer un peu plus ecacement et de mieux hiérarchiser 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ƒ p—r™e que le gCC est une  évolution du g qu9il f—ut —˜solument f—ire du gCC pour ré—liser des progr—mmesF ve l—ng—ge g n9est p—s un  vieux l—ng—ge ou˜lié X —u ™ontr—ireD il est en™ore très utilisé —ujourd9huiF sl est à l— ˜—se des plus gr—nds systèmes d9exploit—tion tels …nix @et don™ vinux et w—™ yƒA ou ‡indowsF
4. On pourrait citer d'autres raisons : certains langages de programmation sont plus destinés au Web (comme PHP) qu'à la réalisation de programmes informatiques.

V

où est le piège ? Où est la diculté ? sl f—ut s—voir ™omment un ordin—teur fon™tionne pour ™omprendre ™e qu9on f—it en gF he ™e point de vueElàD r—ssurezEvousD je vous —pprendr—i tout —u fur et à mesureF xotez qu9un progr—mmeur — —ussi ™ert—ines qu—lités ™omme X ! la patience X un progr—mme ne m—r™he j—m—is du premier ™oupD il f—ut s—voir perE sévérer 3 ! le sens de la logique X p—s ˜esoin d9être forts en m—ths ™ertesD m—is ç— ne vous empê™her— p—s d9—voir à ré)é™hirF hésolé pour ™eux qui pens—ient que ç— —ll—it tom˜er tout ™uit s—ns e'ort 3 ! le calme X nonD on ne t—pe p—s sur son ordin—teur —ve™ un m—rte—uF ge n9est p—s ç— qui fer— m—r™her votre progr—mmeF in ˜refD et pour f—ire simpleD il n9y — p—s de vérit—˜les ™onn—iss—n™es requises pour progr—mmerF …n nul en m—ths peut s9en sortir s—ns pro˜lèmeD le tout est d9—voir l— p—tien™e de ré)é™hirF sl y en — d9—illeurs ˜e—u™oup qui dé™ouvrent qu9ils —dorent ç— 3 W . C'EST DUR ? Retenez donc X le g et le gCC ne sont p—s des l—ng—ges ™on™urrentsD on peut f—ire —ut—nt de ™hoses —ve™ l9un qu9—ve™ l9—utreF ge sont juste deux m—nières de progr—mmer —ssez di'érentesF Programmer.PROGRAMMER. c'est dur ? †oilà une question qui doit ˜ien vous torturer l9espritF elors X f—utEil être un superE m—thém—ti™ien qui — f—it IH —ns d9études supérieures pour pouvoir ™ommen™er l— proE gr—mm—tion c v— réponseD que je vous r—ssureD est nonF xonD un superEnive—u en m—ths n9est p—s néE ™ess—ireF in f—it tout ™e que vous —vez ˜esoin de ™onn—îtreD ™e sont les qu—tre opér—tions de ˜—se X ! l9—ddition Y ! l— soustr—™tion Y ! l— multipli™—tion Y ! l— divisionF ge n9est p—s trop intimid—ntD —vouez 3 te vous expliquer—i d—ns un pro™h—in ™h—pitre ™omment l9ordin—teur ré—lise ™es opér—tions de ˜—se d—ns vos progr—mmesF frefD nive—u m—thsD il n9y — p—s de di0™ulté insurmont—˜leF in f—itD tout dépend du progr—mme que vous —llez ré—liser X si vous devez f—ire un logi™iel de ™rypt—geD —lors ouiD il vous f—udr— ™onn—ître des ™hoses en m—thsF ƒi vous devez f—ire un progr—mme qui f—it de l— QhD ouiD il vous f—udr— quelques ™onn—iss—n™es en géométrie de l9esp—™eF gh—que ™—s est p—rti™ulierF w—is pour —pprendre le l—ng—ge g luiEmêmeD vous n9—vez p—s ˜esoin de ™onn—iss—n™es pointues en quoi que ™e soitF Mais alors.

Sauf dans quelques cas précis où votre application doit faire appel à des formules mathématiques.CHAPITRE 1. comme c'est le cas des logiciels de cryptage. VOUS AVEZ DIT PROGRAMMER ? En résumé ! €our ré—liser des progr—mmes inform—tiquesD on doit é™rire d—ns un langage que l9ordin—teur  ™omprend F ! sl existe de nom˜reux l—ng—ges inform—tiques que l9on peut ™l—sser p—r nive—uF ves l—ng—ges dits de  h—ut nive—u sont p—rfois plus f—™iles à m—îtriser —u détriment souvent d9une perte de perform—n™es d—ns le progr—mme (n—lF ! ve langage C que nous —llons étudier d—ns ™e livre est ™onsidéré ™omme ét—nt de ˜—s nive—uF g9est un des l—ng—ges de progr—mm—tion les plus ™élè˜res et les plus utilisés —u mondeF ! ve code source est une série d9instru™tions é™rites d—ns un l—ng—ge inform—tiqueF ! ve compilateur est un progr—mme qui tr—nsforme votre ™ode sour™e en code binaireD qui peut —lors être exé™uté p—r votre pro™esseurF ves Fexe que l9on ™onn—ît sont des progr—mmes ˜in—iresD il n9y — plus de ™ode sour™e à l9intérieurF ! v— progr—mm—tion ne requiert p—s en elleEmême de ™onn—iss—n™es m—thém—tiques poussées Y né—nmoinsD il est né™ess—ire d9—voir un ˜on sens de l— logique et d9être méthodiqueF 5 5. IH .

Nous allons répondre à la question suivante :  De quels logiciels a-t-on besoin pour programmer ? . on va prendre le temps de se familiariser avec de nouveaux logiciels.Chapitre 2 Diculté : Ayez les bons outils ! A près un premier chapitre plutôt introductif. nous commençons à entrer dans le vif du sujet. nous commencerons à vraiment programmer et il ne sera plus l'heure de faire la sieste ! II . Protez-en ! Dans le chapitre suivant. Il n'y aura rien de dicile à faire dans ce chapitre.

quand on sait bien se servir du débogueur. Integrated Development Environment IP . on peut facilement retrouver ses erreurs ! 2. Ceci dit. On n'a malheureusement pas encore inventé le  correcteur  qui corrigerait tout seul nos erreurs. AYEZ LES BONS OUTILS ! Les outils nécessaires au programmeur elors à votre —visD de quels outils un progr—mmeur —EtEil ˜esoin c ƒi vous —vez —ttentiE vement suivi le ™h—pitre pré™édentD vous devez en ™onn—ître —u moins un 3 †ous voyez de quoi je p—rle cF F F †r—iment p—s c ih ouiD il s9—git du compilateurD ™e f—meux progr—mme qui permet de tr—duire votre l—ng—ge g en l—ng—ge ˜in—ire 3 gomme je vous l9—v—is déjà un peu dit d—ns le premier ™h—pitreD il existe plusieurs ™ompil—teurs pour le l—ng—ge gF xous —llons voir que le ™hoix du ™ompil—teur ne ser— p—s très ™ompliqué d—ns notre ™—sF fonD de quoi d9—utre —EtEon ˜esoin c te ne v—is p—s vous l—isser deviner plus longtempsF †oi™i le stri™t minimum pour un progr—mmeur X ! un éditeur de texte pour é™rire le ™ode sour™e du progr—mmeF in théorie un logi™iel ™omme le flo™Enotes sous ‡indowsD ou  vi sous vinux f—it l9—'—ireF v9idé—lD ™9est d9—voir un éditeur de texte intelligent qui ™olore tout seul le ™odeD ™e qui vous permet de vous y repérer ˜ien plus f—™ilement Y ! un compilateur pour tr—nsformer @ ™ompiler A votre sour™e en ˜in—ire Y ! un débogueur pour vous —ider à tr—quer les erreurs d—ns votre progr—mme F e prioriD si vous êtes —venturiersD vous pouvez vous p—sser de dé˜ogueurF w—is ˜onD je s—is pertinemment que vous ne t—rderez p—s à en —voir ˜esoinF YEA À p—rtir de m—inten—nt on — deux possi˜ilités X ! soit on ré™upère ™h—™un de ™es trois progr—mmes séparémentF g9est l— méthode l— plus ™ompliquéeD m—is elle fon™tionneF ƒous vinux en p—rti™ulierD ˜on nom˜re de progr—mmeurs préfèrent utiliser ™es trois progr—mmes sép—rémentF te ne dét—iller—i p—s ™ette méthode i™iD je v—is plutôt vous p—rler de l— méthode simple Y ! soit on utilise un progr—mme  troisEenEun @™omme les liquides v—isselleD ouiD ouiA qui ™om˜ine éditeur de texteD ™ompil—teur et dé˜ogueurF ges progr—mmes  troisEenE un sont —ppelés IDE D ou en™ore  invironnements de développement F sl existe plusieurs environnements de développementF eu dé˜utD vous —urez peutEêtre un peu de m—l à ™hoisir ™elui qui vous pl—îtF …ne ™hose est sûre en tout ™—s X vous pouvez ré—liser n9importe quel type de progr—mmeD quel que soit l9shi que vous ™hoisissezF 1 2 Choisissez votre IDE sl m9— sem˜lé intéress—nt de vous montrer quelques shi p—rmi les plus ™onnusF „ous sont disponi˜les gr—tuitementF €ersonnellementD je n—vigue un peu entre tous ™euxElà et j9utilise l9shi qui me pl—ît selon le jourF ! …n des shi que je préfère s9—ppelle Code: :BlocksF sl est gr—tuit et fon™tionne sur l— plup—rt des systèmes d9exploit—tionF te ™onseille d9utiliser ™eluiE™i pour dé˜uter @et 1.CHAPITRE 2.

pour suivre mes explications. MAC OS. mais les programmeurs expérimentés préfèrent parfois se passer d'IDE et compiler  à la main . ce qui est un peu plus dicile. LINUX) même pour l— suite s9il vous pl—ît ˜ien 3AF pon™tionne sous ‡indowsD w—™ et vinuxF ! ve plus ™élè˜re shi sous ‡indowsD ™9est ™elui de wi™rosoft X Visual C++F sl existe à l— ˜—se en version p—y—nte @™hère 3AD m—is il existe heureusement une version gr—tuite intitulée Visual C++ Express qui est vr—iment très ˜ien @il y — peu de di'éE ren™es —ve™ l— version p—y—nteAF sl est très ™omplet et possède un puiss—nt module de ™orre™tion des erreurs @dé˜og—geAF pon™tionne sous ‡indows uniquementF ! ƒur w—™ yƒ ˆD vous pouvez utiliser ˆ™odeD génér—lement fourni sur le gh d9insE t—ll—tion de w—™ yƒ ˆF g9est un shi très —ppré™ié p—r tous ™eux qui font de l— progr—mm—tion sur w—™F pon™tionne sous w—™ yƒ ˆ uniquementF Note pour les utilisateurs de Linux : il existe de nombreux IDE sous Linux.CODE: :BLOCKS (WINDOWS. Mac et LinuxF gode: :flo™ks n9est disponi˜le pour le moment qu9en —ngl—isF gel— ne devr—it €eƒ vous repousser à l9utiliserF groyezEmoiD nous —urons quoi qu9il en soit peu —'—ire —ux menus X ™9est le l—ng—ge g qui nous intéresseF ƒ—™hez toutefois que qu—nd vous progr—mmerezD vous serez de toute f—çon ™onfrontés ˜ien souvent à des do™ument—tions en —ngl—isF †oilà don™ une r—ison de plus pour s9entr—îner à utiliser ™ette l—ngueF IQ . Mac OS. Je vous conseille d'installer Code: :Blocks si vous êtes sous Linux. Linux) gode: :flo™ks est un shi li˜re et gr—tuitD disponi˜le pour Windows. Quel est le meilleur de tous ces IDE ? „ous ™es shi vous permettront de progr—mmer et de suivre le reste de ™e ™ours s—ns pro˜lèmeF gert—ins sont plus ™omplets —u nive—u des optionsD d9—utres un peu plus intuitifs à utiliserD m—is d—ns tous les ™—s les progr—mmes que vous ™réerez seront les mêmes quel que soit l9shi que vous utilisezF ge ™hoix n9est don™ p—s si ™ru™i—l qu9on pourr—it le ™roireF „out —u long de tout ™e ™oursD j9utiliser—i gode: :flo™ksF ƒi vous voulez o˜tenir ex—™E tement les mêmes é™r—ns que moiD surtout pour ne p—s être perdus —u dé˜utD je vous re™omm—nde don™ de ™ommen™er p—r inst—ller gode: :flo™ksF Code: :Blocks (Windows. En ce qui nous concerne nous allons commencer par utiliser un IDE.

CHAPITRE 2. Ce qui a de fortes chances d'arriver tôt ou tard ! IR . 4. Voir l'avant-propos pour plus d'informations à ce sujet. J'en prote pour vous rappeler que les codes web peuvent être entrés dans le formulaire du Site du Zéro prévu à cet eet. Cela vous redirige automatiquement sur la page ou le chier qui vous intéresse. AYEZ LES BONS OUTILS ! Télécharger Code: :Blocks ‚endezEvous sur l— p—ge de télé™h—rgements de gode: :flo™ks F £   gode we˜ X VUHQQU ¡ ¢ ! ƒi vous êtes sous ‡indowsD repérez l— se™tion  ‡indows un peu plus ˜—s sur ™ette p—geF „élé™h—rgez le logi™iel en pren—nt le progr—mme qui ™ontient mingw d—ns le nom @exF X ™ode˜lo™ksEVFHPmingwEsetupFexeAF v9—utre version ét—nt s—ns ™ompil—teurD vous —uriez eu du m—l à ™ompiler vos progr—mmes 3 ! ƒi vous êtes sous vinuxD ™hoisissez le p—™k—ge qui ™orrespond à votre distri˜utionF ! in(nD sous w—™D ™hoisissez le (™hier le plus ré™ent de l— listeF ixF X ™ode˜lo™ksEVFHPEpPEm—™FzipF v9inst—ll—tion est très simple et r—pideF v—issez toutes les options p—r déf—ut et l—n™ez le progr—mmeF †ous devriez voir une fenêtre simil—ire à l— (gF PFIF yn distingue R gr—ndes se™tions d—ns l— fenêtreD numérotées sur l9im—ge X IF la barre d'outils X elle ™omprend de nom˜reux ˜outonsD m—is seuls quelquesEuns nous seront régulièrement utilesF t9y reviendr—i plus loin Y PF la liste des chiers du projet X ™9est à g—u™he que s9—0™he l— liste de tous les (™hiers sour™e de votre progr—mmeF xotez que sur ™ette ™—pture —u™un projet n9— été ™rééD on ne voit don™ p—s en™ore de (™hiers à l9intérieur de l— listeF †ous verrez ™ette se™tion se remplir d—ns ™inq minutes en lis—nt l— suite du ™ours Y QF la zone principale X ™9est là que vous pourrez é™rire votre ™ode en l—ng—ge g Y RF la zone de notication X —ussi —ppelée l—  zone de l— mort D ™9est i™i que vous verrez les erreurs de ™ompil—tion s9—0™her si votre ™ode ™omporte des erreursF gel— —rrive très régulièrement 3 sntéressonsEnous m—inten—nt à une se™tion p—rti™ulière de l— ˜—rre d9outils @(gF PFPAF †ous trouverez les ˜outons suiv—nts @d—ns l9ordreA X gompilerD ixé™uterD gompiler 8 ixé™uter et „out re™ompilerF ‚etenezElesD nous les utiliserons régulièrementF †oi™i l— signi(™—tion de ™h—™une des qu—tre i™ônes que vous voyez sur l— (gF PFPD d—ns l9ordre X ! compiler X tous les (™hiers sour™e de votre projet sont envoyés —u ™ompil—teur qui v— se ™h—rger de ™réer un exé™ut—˜leF ƒ9il y — des erreurs D l9exé™ut—˜le ne ser— p—s ™réé et on vous indiquer— les erreurs en ˜—s de gode: :flo™ks Y ! exécuter X ™ette i™ône l—n™e juste le dernier exé™ut—˜le que vous —vez ™ompiléF gel— vous permettr— don™ de tester votre progr—mme et de voir —insi ™e qu9il donneF h—ns l9ordreD si vous —vez ˜ien suiviD on doit d9—˜ord ™ompilerD puis exé™uter pour tester ™e que ç— donneF yn peut —ussi utiliser le troisième ˜outonF F F ! compiler & exécuter X p—s ˜esoin d9être un génie pour ™omprendre que ™9est l— ™om˜in—ison des deux ˜outons pré™édentsF g9est d9—illeurs ™e ˜outon que vous 3 4 3.

LINUX) Figure PFI ! gode: :flo™ks Figure PFP ! ves prin™ip—ux ˜outons de l— ˜—rre d9outils IS . MAC OS.CODE: :BLOCKS (WINDOWS.

Retenez en particulier qu'il faut taper sur pW pour faire gompiler 8 ixé™uter. parce que c'est quelque chose qu'on fait vraiment très très souvent.CHAPITRE 2. AYEZ LES BONS OUTILS ! utiliserez le plus souventF xotez que s9il y — des erreurs pend—nt l— ™ompil—tion @pend—nt l— génér—tion de l9exé™ut—˜leAD le progr—mme ne ser— p—s exé™utéF À l— pl—™eD vous —urez droit à une ˜eeelle liste d9erreurs à ™orriger 3 ! tout reconstruire X qu—nd vous f—ites ™ompilerD gode: :flo™ks ne re™ompile en f—it que les (™hiers que vous —vez modi(és et non les —utresF €—rfois E je dis ˜ien p—rfois E vous —urez ˜esoin de dem—nder à gode: :flo™ks de vous re™ompiler tous les (™hiersF yn verr— plus t—rd qu—nd on — ˜esoin de ™e ˜outonD et vous verrez plus en dét—ils le fon™tionnement de l— ™ompil—tion d—ns un ™h—pitre futurF €our l9inst—ntD on se ™ontente de s—voir le minimum né™ess—ire pour ne p—s tout mél—ngerF ge ˜outon ne nous ser— don™ p—s utile de suiteF Je vous conseille d'utiliser les raccourcis plutôt que de cliquer sur les boutons. Créer un nouveau projet €our ™réer un nouve—u projetD ™9est très simple X —llez d—ns le menu pile G xew €roje™tF h—ns l— fenêtre qui s9ouvre @(gF PFQAD ™hoisissez gonsole —ppli™—tionF G Figure PFQ ! xouve—u projet IT .

CODE: :BLOCKS (WINDOWS. etc. Code: :Blocks propose de réaliser pas mal de types de programmes diérents qui utilisent des bibliothèques connues comme la SDL (2D). vous ne pourrez donc pas les faire marcher. MAC OS. ces icônes servent plutôt à faire joli car les bibliothèques ne sont pas installées sur votre ordinateur. Pour l'instant. car vous n'avez pas encore le niveau nécessaire pour créer les autres types de programmes. En attendant il faudra vous contenter de  Console . Nous nous intéresserons à ces autres types de programmes bien plus tard. Qt et wxWidgets (fenêtres). gliquez sur qo pour ™réer le projetF …n —ssist—nt s9ouvreF p—ites xextD ™ette première p—ge ne serv—nt à rienF yn vous dem—nde ensuite si vous —llez f—ire du g ou du gCC @(gF PFRA X répondez g F Figure PFR ! ghoix du l—ng—ge yn vous dem—nde le nom de votre projet @(gF PFSA et d—ns quel dossier les (™hiers sour™e seront enregistrésF in(nD l— dernière p—ge @(gF PFTA vous permet de ™hoisir de quelle f—çon le progr—mme doit être ™ompiléF †ous pouvez l—isser les options p—r déf—utD ç— n9—ur— p—s d9in™iden™e sur ™e que nous —llons f—ire d—ns l9immédi—t @veillez à ™e que l— ™—se he˜ug ou ‚ele—se —u moins soit ™o™héeAF gliquez sur pinishD ™9est ˜on 3 gode: :flo™ks vous ™réer— un premier projet —ve™ déjà un tout petit peu de ™ode sour™e ded—nsF h—ns le ™—dre de g—u™he  €roje™ts D développez l9—r˜ores™en™e en ™liqu—nt sur le petit  C pour —0™her l— liste des (™hiers du projetF †ous devriez —voir —u moins un m—inF™ IU . OpenGL (3D). LINUX) Comme vous pouvez le voir.

CHAPITRE 2. AYEZ LES BONS OUTILS ! Figure PFS ! xom et empl—™ement du projet Figure PFT ! wode de ™ompil—tion IV .

il n'est compatible avec Windows 7 qu'à partir de la version 2010. Attention. IW .VISUAL C++ (WINDOWS SEULEMENT) que vous pourrez ouvrir en dou˜leE™liqu—nt dessusF †ous voilà p—rés 3 Visual C++ (Windows seulement) uelques petits r—ppels sur †isu—l gCC X ! ™9est l9shi de wi™rosoft Y ! il est à l— ˜—se p—y—ntD m—is wi™rosoft — sorti une version gr—tuite intitulée †isu—l gCC ixpress Y ! il permet de progr—mmer en g et en gCC @et non p—s seulement en gCC ™omme son nom le l—isse entendreAF xous —llons ˜ien entendu voir i™i l— version gr—tuiteD †isu—l gCC ixpress @(gF PFUAF 5 Figure PFU ! †isu—l gCC ixpress Quelles sont les diérences avec le  vrai  Visual ? 5.

Je sais. AYEZ LES BONS OUTILS ! sl n9y — p—s l9éditeur de ressour™es qui vous permet de dessiner des im—gesD des i™ônesD ou des fenêtresF w—is ˜onD ç—D entre nousD on s9en moque ˜ien p—r™e qu9on n9—ur— p—s ˜esoin de s9en servir d—ns ™e ™oursF ge ne sont p—s des fon™tionn—lités indispens—˜lesD ˜ien —u ™ontr—ireF €our télé™h—rger †isu—l gCC ixpressD rendezEvous sur le site we˜ de †isu—l gCCF   £ ¢gode we˜ X QQQUQQ ¡ ƒéle™tionnez ensuite †isu—l gCC ixpress pr—nç—is un peu plus ˜—s sur l— p—geF †isu—l gCC ixpress est en fr—nç—is et tot—lement gr—tuitF ge n9est don™ p—s une version d9ess—i limitée d—ns le tempsF g9est une ™h—n™e d9—voir un shi —ussi puiss—nt que ™elui de wi™rosoft disponi˜le gr—tuitementD ne l— l—issez don™ p—s p—sserF Installation v9inst—ll—tion devr—it norm—lement se p—sser s—ns en™om˜reF ve progr—mme d9inst—lE l—tion v— télé™h—rger l— dernière version de †isu—l sur snternetF te vous ™onseille de l—isser les options p—r déf—utF À l— (nD on vous dit qu9il f—ut vous enregistrer d—ns les QH joursF €—s de p—niqueD ™9est gr—tuit et r—pide m—is il f—ut le f—ireF gliquez sur le lien qui vous est donné X vous —rrivez sur le site de wi™rosoftF gonne™tezE vous —ve™ votre ™ompte ‡indows vive sh @équiv—lent du ™ompte rotm—il ou wƒxA ou ™réezEen un si vous n9en —vez p—sD puis répondez —u petit questionn—ireF yn vous donner— à l— (n une ™lé d9enregistrementF †ous devrez re™opier ™ette ™lé d—ns le menu c G sns™rire le produitF Créer un nouveau projet €our ™réer un nouve—u projet sous †isu—lD —llez d—ns le menu pi™hier G xouve—u G €rojetF ƒéle™tionnez ‡inQP d—ns l— ™olonne de g—u™heD puis eppli™—tion ™onsole ‡inQP à droite @(gF PFVAF intrez un nom pour votre projetD p—r exemple testF †—lidezF …ne nouvelle fenêtre s9ouvre @(gF PFWAF gette fenêtre ne sert p—s à gr—ndE™hoseF €—r ™ontreD ™liquez sur €—r—mètres de l9—ppli™—tion d—ns l— ™olonne de g—u™heF †eillez à ™e que €rojet vide soit ™o™hé ™omme sur l— (gF PFIHF gliquez en(n sur „erminerF Ajouter un nouveau chier source …ne fenêtre s9ouvreF ƒéle™tionnez pi™hier PH †otre projet est pour l9inst—nt ˜ien videF p—ites un ™li™ droit sur le dossier pi™hiers sour™e situé sur votre g—u™heD puis —llez d—ns ejouter G xouvel élément @(gF PFIIAF gCC @F™ppA 6 F 6.CHAPITRE 2. intrez un nom pour votre . on ne fait pas de C++ mais ça n'a pas d'importance ici.

VISUAL C++ (WINDOWS SEULEMENT) Figure PFV ! gré—tion de projet †isu—l gCC ixpress Figure PFW ! essist—nt ™ré—tion de projet †isu—l gCC ixpress PI .

CHAPITRE 2. AYEZ LES BONS OUTILS ! Figure PFIH ! gon(gur—tion du projet Figure PFII ! ejout d9un (™hier sour™e PP .

VISUAL C++ (WINDOWS SEULEMENT) (™hier X m—inF™D ™omme sur l— (gF PFIPF Figure PFIP ! ghoix du type et du nom du (™hier sour™e gliquez sur ejouterF g9est ˜onD vous —llez pouvoir ™ommen™er à é™rire du ™ode 3 La fenêtre principale de Visual †oyons ensem˜le le ™ontenu de l— fenêtre prin™ip—le de †isu—l gCC ixpress @(gF PFIQAF gette fenêtre ressem˜le en tous points à ™elle de gode: :flo™ksF yn v— r—pidement @reAvoir qu—nd même ™e que signi(ent ™h—™une des p—rtiesF IF v— ˜—rre d9outils X tout ™e qu9il y — de plus st—nd—rdF yuvrirD enregistrerD enreE gistrer toutD ™ouperD ™opierD ™ollerD et™F €—r déf—utD il sem˜le qu9il n9y —it p—s de ˜outon de ˜—rre d9outils pour ™ompilerF †ous pouvez les r—jouter en f—is—nt un ™li™ droit sur l— ˜—rre d9outilsD puis en ™hoisiss—nt hé˜oguer et qénérer d—ns l— listeF „outes ™es i™ônes de ™ompil—tion ont leur équiv—lent d—ns les menus qénérer et hé˜oguerF ƒi vous f—ites qénérerD ™el— ™réer— l9exé™ut—˜le @ç— signi(e  ™ompiler pour †isu—lAF ƒi vous f—ites hé˜oguer G ixé™uterD on devr—it vous proposer de ™ompiler —v—nt d9exé™uter le progr—mmeF pU permet de générer le projetD et pS de l9exé™uterF PF h—ns ™ette zone très import—nte vous voyez norm—lement l— liste des (™hiers de votre projetF gliquez sur l9onglet ixplor—teur de solutions en ˜—sD si ™e n9est déjà f—itF †ous devriez voir que †isu—l ™rée déjà des dossiers pour sép—rer les PQ .

AYEZ LES BONS OUTILS ! Figure PFIQ ! penêtre prin™ip—le de †isu—l gCC ixpress PR .CHAPITRE 2.

où es-tu ? „ous les utilis—teurs de w—™ yƒ ne sont p—s des progr—mmeursF epple l9— ˜ien ™ompris et n9inst—lle p—s p—r déf—ut d9shi —ve™ w—™ yƒF reureusementD pour ™eux qui voudr—ient progr—mmerD tout est prévuF in e'etD ˆ™ode est présent sur le gh d9inst—ll—tion de w—™ yƒ @logo (gF PFIRAF Figure PFIR ! vogo de ˆ™ode snsérez don™ le gh d—ns le le™teur et inst—llezEleF sl se trouve d—ns les  heveloper „ools F €—r —illeursD je vous ™onseille de mettre en f—voris l— p—ge dédiée —ux développeurs sur le site d9eppleF †ous y trouverez une foule d9inform—tions utiles pour le développement sous w—™F †ous pourrez not—mment y télé™h—rger plusieurs logi™iels pour développerF x9hésitez p—s à vous ins™rire à l9ehg @ epple hevelopment gonne™tion AD ™9est gr—tuit et vous serez —insi tenus —u ™our—nt des nouve—utésF £   ¢gode we˜ X PTRUHV ¡ PS .XCODE (MAC OS SEULEMENT) di'érents types de (™hiers de votre projet @sour™esD enEtête et ressour™esAF xous verrons un peu plus t—rd quels sont les di'érents types de (™hiers qui ™onstituent un projetF QF v— p—rtie prin™ip—leF g9est là qu9on modi(e les (™hiers sour™eF RF g9est là en™ore l—  zone de l— mort D ™elle où on voit —pp—r—ître toutes les erreurs de ™ompil—tionF g9est d—ns le ˜—s de l9é™r—n —ussi que †isu—l —0™he les inform—tions de dé˜og—ge qu—nd vous ess—yez de ™orriger un progr—mme ˜oguéF †oilàD on — f—it le tour de †isu—l gCCF †ous pouvez —ller jeter un ÷il d—ns les options @yutils G yptionsA si ç— vous ™h—nteD m—is n9y p—ssez p—s trois heuresF sl f—ut dire qu9il y — tellement de ™—ses à ™o™her de p—rtout qu9on ne s—it plus trop où donner de l— têteF Xcode (Mac OS seulement) sl existe plusieurs shi ™omp—ti˜les w—™F sl y — gode: :flo™ks ˜ien sûrD m—is ™e n9est p—s le seulF te v—is vous présenter i™i l9shi le plus ™élè˜re sous w—™ X ˆ™odeF gette se™tion dédiée à ˆ™ode est inspirée d9un tutoriel p—ru sur vogi™ielw—™F™omD —ve™ l9—im—˜le —utoris—tion de son —uteur €sy™horIQF £   ¢gode we˜ X TRVSVR ¡ Xcode.

créé par Apple lui-même. Les plus grands logiciels. Si vous avez une version plus ancienne du logiciel.CHAPITRE 2. ont été codés à l'aide de Xcode. AYEZ LES BONS OUTILS ! Lancement de Xcode vorsque vous l—n™ez ˆ™ode pour l— première foisD vous serez pro˜—˜lement surprisF it il y — de quoiF gontr—irement à l— plup—rt des logi™iels w—™D il n9y — p—s de fenêtre de ˜ienvenueF in f—itD l— première foisD on trouve ç— un peu videF F F et pourt—ntD ™9est un logi™iel très puiss—nt 3 Xcode est l'IDE le plus utilisé sous Mac. comme iPhoto et Keynote. il vous faudra probablement aller dans la section Command line utility et sélectionner Standard tool. PT . C'est réellement l'outil de développement de choix quand on a un Mac ! v— première ™hose à f—ire est de ™réer un nouve—u projetD —lors ™ommençons p—r ç—F ellez d—ns le menu pile G xew €roje™tF …ne fenêtre de séle™tion de projet s9ouvre @(gF PFISAF Figure PFIS ! e™™ueil de ˆ™ode ellez d—ns l— se™tion eppli™—tion et séle™tionnez gomm—nd vine „ool F gliquez ensuite sur xextF yn vous dem—nder— où vous voulez enregistrer votre projet @un projet doit toujours être enregistré dès le dé˜utA —insi que son nomF €l—™ezEle d—ns le dossier que vous voulezF 7 7.

XCODE (MAC OS SEULEMENT) …ne fois ™rééD votre projet se présenter— sous l— forme d9un dossier ™onten—nt de mulE tiples (™hiers d—ns le pinderF ve (™hier à l9extension Fx™odeproj ™orrespond —u (™hier du projetF g9est lui que vous devrez séle™tionner l— pro™h—ine fois si vous souh—itez réouvrir votre projetF La fenêtre de développement h—ns ˆ™odeD si vous séle™tionnez m—inF™D vous devriez —voir une fenêtre simil—ire à l— (gF PFITF Figure PFIT ! ˆ™ode en —™tion v— fenêtre est dé™oupée en qu—tre p—rtiesD i™i numérotées de I à RF IF v— première p—rtie est l— ˜—rre de ˜outons tout en h—utF †ous pouvez l— ™on(gurer ™omme ˜on vous sem˜leD ™h—nger les ˜outonsD et™F ves plus import—nts d9entre eux sont représentés sur les (gF PFIU et PFIVF ves trois premiers ˜outons vous permettent de n—viguer entreD d—ns l9ordre X ! €roje™t X là où vous voyez vos (™hiers et où vous les modi(ez Y ! fuild X vous y voyez le résult—t de l— ™ompil—tion de votre progr—mmeD et les erreurs s9il y en — eu Y ! he˜ug X l— fenêtre de dé˜og—geD où vous pouvez exé™uter votre progr—mme ligne p—r ligne pour trouver et ™omprendre ses erreursF PU .

AYEZ LES BONS OUTILS ! ves deux ˜outons de l— (gF PFIV signi(ent X ! fuild X ™ompile votre projetD don™ ™rée un exé™ut—˜le à p—rtir de vos sour™es Y ! fuild —nd qo @le ˜outon que vous utiliserez le plus souventA X ™ompile votre projet et le l—n™e pour le testerF PF v— p—rtie de g—u™he ™orrespond à l9—r˜ores™en™e de votre projetF gert—ines se™E tions regroupent les erreursD les —vertissementsD et™F ˆ™ode vous pl—™e —utom—tiE quement d—ns l— se™tion l— plus utileD ™elle qui porte le nom de votre projetF QF v— troisième p—rtie ™h—nge en fon™tion de ™e que vous —vez séle™tionné d—ns l— p—rtie de g—u™heF s™iD on — l— liste des (™hiers de notre projet X ! m—inF™ X ™9est le (™hier sour™e de votre progr—mme @il peut y en —voir plusieurs d—ns les gros progr—mmesA Y ! Mon_Premier_Programme X ™9est votre progr—mme une fois ™ompiléD don™ l9exé™ut—˜le que vous pouvez distri˜uerF ƒi le (™hier est en rougeD ™9est qu9il n9existe p—s en™ore @vous n9—vez don™ p—s en™ore ™ompilé votre progr—mmeD m—is ˆ™ode le référen™e qu—nd mêmeA Y ! Mon_Premier_Programme.l X ™9est votre progr—mme présenté en l—ng—ge —sE sem˜leurD un l—ng—ge très pro™he du pro™esseurF gel— ne nous intéresser— p—sD m—is si vous voulez prendre peur n9hésitez p—s à y jeter un ÷ilF RF in(nD l— qu—trième p—rtieD l— plus intéress—nte X ™9est ™elle d—ns l—quelle vous pourrez é™rire votre ™ode sour™e en l—ng—ge gF €—r déf—utD ˆ™ode met juste un petit ™ode d9exemple qui —0™he  relloD world 3 à l9é™r—nF Figure PFIU ! v— ˜—rre d9outils @n—vig—tionA Figure PFIV ! v— ˜—rre d9outils @™ompil—tionA Lancement du programme €our tester ™e premier progr—mmeD ™liquez sur le ˜outon fuild —nd qo de l— ˜—rre d9outilsF †otre é™r—n devr—it ™h—nger et ressem˜ler à l— (gF PFIWF IF ge sont les ˜outons qui permettent de ™h—nger de p—geD ™omme on l9— vu plus tôtF ƒéle™tionnez €roje™t si vous souh—itez revenir à l— fenêtre pré™édenteF PF g9est l— ™i˜leD le (™hier qui réunit les sour™es ™ompilées de votre progr—mmeF QF v9exé™ut—˜le de votre —ppli™—tionF RF ve mode de ™ompil—tionF sl peut être X PV .CHAPITRE 2.

XCODE (MAC OS SEULEMENT) Figure PFIW ! v—n™ement du progr—mme sous ˆ™ode he˜ug X l9exé™ut—˜le reste d—ns ˆ™ode et ™ontient des inform—tions de dé˜og—ge pour vous —ider à résoudre vos erreurs éventuellesF g9est ™e que vous utiliserez lorsque vous développerez votre —ppli™—tion Y ! ‚ele—se X à n9utiliser qu9à l— (nF ˆ™ode génère —lors l9—ppli™—tion dé(nitiveD f—ite pour être p—rt—gée et utilisée p—r d9—utres ordin—teursF ges deux ˜outons vous permettent de dém—rrer l9—ppli™—tion dire™tement @‚unA ou de l— dém—rrer en mode  he˜ug pour exé™uter le progr—mme instru™tion p—r instru™tionD —(n de résoudre les erreursF x9utilisez he˜ug que lorsque vous —vez des erreurs d—ns votre progr—mmeF v— liste des (™hiers de votre projetF v9éditeur du ™ode sour™eD ™omme tout à l9heureF v— ™onsole de ˆ™odeF g9est là que vous verrez votre progr—mme s9exé™uterF ves ˜outons fuild et ‚un vous permettent de p—sser du mode  gompil—tion —u mode  ixé™ution F in ™l—irD —ve™ le premier vous pouvez voir ™e qui s9est p—ssé pend—nt l— ™ompil—tionD t—ndis que d—ns le se™ond vous pouvez voir ™e que votre —ppli™—tion — —0™hé une fois qu9elle — été dém—rréeF ! SF TF UF VF WF Ajouter un nouveau chier eu dé˜utD vous n9—urez qu9un seul (™hier sour™e @m—inF™AF gepend—ntD plus loin d—ns le ™oursD je vous dem—nder—i de ™réer de nouve—ux (™hiers sour™e lorsque nos progr—mmes deviendront plus grosF PW .

CHAPITRE 2. AYEZ LES BONS OUTILS ! €our ™réer un nouve—u (™hier sour™e sous ˆ™odeD rendezEvous d—ns le menu pile G xew pileF …n —ssist—nt vous dem—nde quel type de (™hier vous voulez ™réerF ‚endezE vous d—ns l— se™tion fƒh et séle™tionnez g pile @pi™hier gAF †ous devriez —voir sous les yeux l— (gF PFPHF Figure PFPH ! ejouter un (™hier sous ˆ™ode †ous devrez donner un nom à votre nouve—u (™hier @™e que vous voulezAF v9extensionD elleD doit rester F™F €—rfois E nous le verrons plus loin ED il f—udr— —ussi ™réer des (™hiers Fh @m—is on en rep—rler—AF v— ™—se à ™o™her elso ™re—te fi™hierFh est là pour ç—F €our le momentD elle ne nous intéresse p—sF gliquez ensuite sur pinishF g9est f—it 3 †otre (™hier est ™réé et —jouté à votre projetD en plus de m—inF™F †ous êtes m—inten—nt prêts à progr—mmer sous w—™ 3 En résumé ! ves progr—mmeurs ont ˜esoin de trois outils X un éditeur de texteD un ™ompil—teur et un dé˜ogueurF ! sl est possi˜le d9inst—ller ™es outils sép—rémentD m—is il est ™our—nt —ujourd9hui d9—voir un p—™k—ge troisEenEun que l9on —ppelle IDED l9environnement de développementF ! gode: :flo™ksD †isu—l gCC et ˆ™ode ™omptent p—rmi les shi les plus ™élè˜resF QH .

ce programme sera en noir et blanc et ne saura que vous dire bonjour. QI . je peux vous assurer que vous en serez ers. il semblera donc complètement inutile mais ce sera votre premier . 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 réussi à créer votre premier programme ! Bon d'accord.Chapitre 3 Diculté : Votre premier programme O n a préparé le terrain jusqu'ici.

à quoi ça ressemble un programme en console ? QP . VOTRE PREMIER PROGRAMME Console ou fenêtre ? xous —vons r—pidement p—rlé de l— notion de  progr—mme ™onsole et de  proE gr—mme fenêtre d—ns le ™h—pitre pré™édentF xotre shi nous dem—nd—it quel type de progr—mme nous voulions ™réer et je vous —v—is dit de répondre ™onsoleF sl f—ut s—voir qu9en f—it il existe deux types de progr—mmesD p—s plus X ! les progr—mmes —ve™ fenêtres Y ! les progr—mmes en ™onsoleF Les programmes en fenêtres ge sont les progr—mmes que vous ™onn—issezF v— (gF QFI est un exemple de progr—mme en fenêtres que vous ™onn—issez sûrementF Figure QFI ! ve progr—mme €—int Ǘ don™D ™9est un progr—mme —ve™ des fenêtresF te suppose que vous —imeriez ˜ien ™réer ™e type de progr—mmesD hmm c ih ˜ienF F F vous n9—llez p—s pouvoir de suite 3 in e'etD ™réer des progr—mmes —ve™ des fenêtres en g ™9est possi˜leD m—isF F F qu—nd on dé˜uteD ™9est ˜ien trop ™ompliqué 3 €our dé˜uterD il v—ut mieux ™ommen™er p—r ™réer des progr—mmes en ™onsoleF Mais au fait.CHAPITRE 3.

je sais que vous vous demandez ce que c'est. QQ . ne regardez pas derrière vous. Oui vous là.CONSOLE OU FENÊTRE ? Les programmes en console ves progr—mmes ™onsole ont été les premiers à —pp—r—îtreF À ™ette époqueD l9ordin—teur ne gér—it que le noir et ˜l—n™ et il n9ét—it p—s —ssez puiss—nt pour ™réer des fenêtres ™omme on le f—it —ujourd9huiF fien entenduD le temps — p—ssé depuisF ‡indows — rendu l9ordin—teur  gr—nd pu˜li™ prin™ip—lement grâ™e à s— simpli™ité et —u f—it qu9il n9utilis—it que des fenêtresF ‡indows est devenu tellement popul—ire qu9—ujourd9hui ˜e—u™oup de monde — ou˜lié ™e qu9ét—it l— ™onsole 3 t9—i une gr—nde nouvelle 3 La console n'est pas morte 3 in e'etD vinux — remis —u goût du jour l9utilis—tion de l— ™onsoleF v— (gF QFP est une ™—pture d9é™r—n d9une ™onsole sous vinuxF 1 Figure QFP ! …n exemple de ™onsoleD i™i sous vinux frrrF F F „erri(—ntD hein c †oilàD vous —vez m—inten—nt une petite idée de ™e à quoi ressem˜le une ™onsoleF ge™i ditD plusieurs rem—rques X ! —ujourd9hui on s—it —0™her de l— ™ouleurD tout n9est don™ p—s en noir et ˜l—n™ ™omme on pourr—it le ™roire Y ! l— ™onsole est —ssez peu —™™ueill—nte pour un dé˜ut—nt Y ! ™9est pourt—nt un outil puiss—nt qu—nd on s—it le m—îtriserF gomme je vous l9—i dit plus h—utD ™réer des progr—mmes en mode  ™onsole ™omme i™iD ™9est très f—™ile et idé—l pour dé˜uter @™e qui n9est p—s le ™—s des progr—mmes en mode  fenêtre AF xotez que l— ™onsole — évolué X elle peut —0™her des ™ouleursD et rien ne vous empê™he de mettre une im—ge de fondF 1.

VOTRE PREMIER PROGRAMME Et sous Windows ? Il n'y a pas de console ? ƒiD m—is elle est un peuF F F  ™—™hée on v— direF †ous pouvez —voir une ™onsole en f—is—nt hém—rrer G e™™essoires G snvite de ™omm—ndesD ou ˜ien en™ore en f—is—nt hém—rrer G ixé™uterFFFD et en t—p—nt ensuite ™mdF v— (gF QFQ représente l— m———gni(que ™onsole de ‡indowsF Figure QFQ ! v— ™onsole de ‡indows ƒi vous êtes sous ‡indowsD s—™hez don™ que ™9est d—ns une fenêtre qui ressem˜le à ç— que nous ferons nos premiers progr—mmesF ƒi j9—i ™hoisi de ™ommen™er p—r des petits progr—mmes en ™onsoleD ™e n9est p—s pour vous ennuyerD ˜ien —u ™ontr—ire 3 in ™ommenç—nt p—r f—ire des progr—mmes en ™onsoleD vous —pprendrez les ˜—ses né™ess—ires pour pouvoir ensuite ™réer des fenêtresF Soyez donc rassurés X dès que nous —urons le nive—u pour ™réer des fenêtresD nous verrons ™omment en f—ireF Un minimum de code €our n9importe quel progr—mmeD il f—udr— t—per un minimum de ™odeF ge ™ode ne fer— rien de p—rti™ulier m—is il est indispens—˜leF g9est ™e  ™ode minimum que nous —llons dé™ouvrir m—inten—ntF sl devr—it servir de ˜—se pour l— plup—rt de vos progr—mmes en l—ng—ge gF QR .CHAPITRE 3.

ce n'est pas grave. xotez que l— ligne X int m—in@A F F F peut —ussi s9é™rire X int m—in@int —rg™D ™h—r B—rgv‘“A ves deux é™ritures sont possi˜lesD m—is l— se™onde @l— ™ompliquéeA est l— plus ™our—nteF t9—ur—i don™ tend—n™e à utiliser plutôt ™ette dernière d—ns les pro™h—ins ™h—pitresF in ™e qui nous ™on™erneD que l9on utilise l9une ou l9—utre des é™rituresD ç— ne ™h—nger— rien pour nousF snutile don™ de s9y —tt—rderD surtout que nous n9—vons p—s en™ore le nive—u pour —n—lyser ™e que ç— signi(eF ƒi vous êtes sous un —utre shiD ™opiez ™e ™ode sour™e d—ns votre (™hier m—inF™ pour que nous —yons le même ™ode vous et moiF inregistrez le toutF yui je s—isD on n9— en™ore rien f—itD m—is enregistrez qu—nd mêmeD ™9est une ˜onne h—˜itude à prendreF xorm—lementD vous n9—vez qu9un seul (™hier sour™e —ppelé m—inF™ @le resteD ™e sont des (™hiers de projet générés p—r votre shiAF QS .UN MINIMUM DE CODE Demandez le code minimal à votre IDE ƒelon l9shi que vous —vez ™hoisi d—ns le ™h—pitre pré™édentD l— méthode pour ™réer un nouve—u projet n9est p—s l— mêmeF ‚eportezEvous à ™e ™h—pitre si vous —vez ou˜lié ™omment f—ireF €our r—ppelD sous gode: :flo™ks @qui est l9shi que je v—is utiliser tout —u long de ™e ™oursAD il f—ut —ller d—ns le menu pile G xew G €roje™tD puis ™hoisir gonsole eppli™—tion et séle™tionner le l—ng—ge gF gode: :flo™ks — don™ généré le minimum de ™ode en l—ng—ge g dont on — ˜esoinF ve voi™i X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@A { printf@4rello world3’n4AY return HY } Notez qu'il y a une ligne vide à la n de ce code. Chaque chier en C devrait normalement se terminer par une ligne vide. Si vous ne le faites pas. Il est nécessaire de taper sur la touche  Entrée  après la dernière accolade. mais le compilateur risque de vous acher un avertissement (warning ).

VOTRE PREMIER PROGRAMME Analysons le code minimal ge ™ode minim—l qu9on vient de voir n9est rien d9—utre que du ™hinois pour vousD j9im—gineF it pourt—ntD moi je vois là un progr—mme ™onsole qui —0™he un mess—ge à l9é™r—nF sl v— f—lloir —pprendre à lire tout ç— 3 gommençons p—r les deux premières lignes qui se ressem˜lent ˜e—u™oup X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb ge sont des lignes spé™i—les que l9on ne voit qu9en h—ut des (™hiers sour™eF ges lignes sont f—™ilement re™onn—iss—˜les ™—r elles ™ommen™ent p—r un dièse 5F ges lignes spé™i—lesD on les —ppelle directives de préprocesseur @un nom ™ompliquéD n9estE™e p—s cAF ge sont des lignes qui seront lues p—r un progr—mme —ppelé prépro™esseurD un progr—mme qui se l—n™e —u dé˜ut de l— ™ompil—tionF yui X ™omme je vous l9—i dit plus tôtD ™e qu9on — vu —u dé˜ut n9ét—it qu9un s™hém— très simpli(é de l— ™ompil—tionF sl se p—sse en ré—lité plusieurs ™hoses pend—nt une ™ompil—E tionF yn les dét—iller— plus t—rd X pour le momentD vous —vez juste ˜esoin d9insérer ™es lignes en h—ut de ™h—™un de vos (™hiersF Oui mais elles signient quoi. ces lignes ? J'aimerais bien savoir quand même ! ve mot in™lude en —ngl—is signi(e  in™lure en fr—nç—isF ges lignes dem—ndent d9inE ™lure des (™hiers —u projetD ™9estEàEdire d9—jouter des (™hiers pour l— ™ompil—tionF sl y — deux lignesD don™ deux (™hiers in™lusF ges (™hiers s9—ppellent stdioFh et stdli˜FhF ges (™hiers existent déjàD des (™hiers sour™e tout prêtsF yn verr— plus t—rd qu9on les —ppelle des bibliothèques @™ert—ins p—rlent —ussi de librairies m—is ™9est un —ngliE ™ismeAF in grosD ™es (™hiers ™ontiennent du ™ode tout prêt qui permet d9—0™her du texte à l9é™r—nF ƒ—ns ™es (™hiersD é™rire du texte à l9é™r—n —ur—it été mission impossi˜leF v9ordin—teur à l— ˜—se ne s—it rien f—ireD il f—ut tout lui direF †ous voyez l— g—lère d—ns l—quelle on est 3 frefD en résumé les deux premières lignes in™luent les ˜i˜liothèques qui vont nous permettre @entre —utresA d9—0™her du texte à l9é™r—n —ssez  f—™ilement F €—ssons à l— suiteF v— suiteD ™9est tout ç— X int m—in@A { printf@4rello world3’n4AY return HY } ge que vous voyez làD ™9est ™e qu9on —ppelle une fonctionF …n progr—mme en l—ng—ge g est ™onstitué de fon™tionsD il ne ™ontient qu—siment que ç—F €our le momentD notre progr—mme ne ™ontient don™ qu9une seule fon™tionF QT .CHAPITRE 3.

UN MINIMUM DE CODE …ne fon™tion permet grosso modo de r—ssem˜ler plusieurs ™omm—ndes à l9ordin—teurF ‚egroupées d—ns une fon™tionD les ™omm—ndes permettent de f—ire quelque ™hose de pré™isF €—r exempleD on peut ™réer une fon™tion ouvrir•fi™hier qui ™ontiendr— une suite d9instru™tions pour l9ordin—teur lui expliqu—nt ™omment ouvrir un (™hierF v9—v—nE t—geD ™9est qu9une fois l— fon™tion é™riteD vous n9—urez plus qu9à dire ouvrir•fi™hierD et votre ordin—teur s—ur— ™omment f—ire s—ns que vous —yez à tout répéter 3 ƒ—ns rentrer d—ns les dét—ils de l— ™onstru™tion d9une fon™tion @il est trop tôtD on rep—rE ler— des fon™tions plus t—rdAD —n—lysons qu—nd même ses gr—ndes p—rtiesF v— première ligne ™ontient le nom de l— fon™tionD ™9est le deuxième motF yui X notre fon™tion s9—pE pelle don™ m—inF g9est un nom de fon™tion p—rti™ulier qui signi(e  prin™ip—l F m—in est l— fon™tion prin™ip—le de votre progr—mmeD c'est toujours par la fonction m—in que le programme commenceF …ne fon™tion — un dé˜ut et une (nD délimités p—r des —™™ol—des { et }F „oute l— fon™tion m—in se trouve don™ entre ™es —™™ol—desF ƒi vous —vez ˜ien suiviD notre fon™tion m—in ™ontient deux lignes X printf@4rello world3’n4AY return HY ges lignes à l9intérieur d9une fon™tion ont un nomF yn les —ppelle instructions @ç— en f—it du vo™—˜ul—ire qu9il v— f—lloir retenirAF gh—que instru™tion est une ™omm—nde à l9ordin—teurF gh—™une de ™es lignes dem—nde à l9ordin—teur de f—ire quelque ™hose de pré™isF gomme je vous l9—i dit un peu plus h—utD en regroup—nt intelligemment @™9est le tr—v—il du progr—mmeurA les instru™tions d—ns des fon™tionsD on ™rée si on veut des  bouts de programmes tout prêts F in utilis—nt les ˜onnes instru™tionsD rien ne nous empê™her—it don™ de ™réer une fon™tion ouvrir•fi™hier ™omme je vous l9—i expliqué tout à l9heureD ou en™ore une fon™tion —v—n™er•personn—ge d—ns un jeu vidéoD p—r exempleF …n progr—mmeD ™e n9est —u ˜out du ™ompte rien d9—utre qu9une série d9instru™tions X  f—is ™e™i D  f—is ™el— F †ous donnez des ordres à votre ordin—teur et il les exé™ute F 2 Très important : toute instruction se termine obligatoirement par un pointvirgule  Y . Si vous oubliez de mettre un point-virgule à la n d'une instruction. QU . votre programme ne compilera pas ! v— première ligne X printf@4rello world3’n4AY dem—nde à —0™her le mess—ge  rello world 3 à l9é™r—nF u—nd votre progr—mme —rriver— à ™ette ligneD il v— don™ —0™her un mess—ge à l9é™r—nD puis p—sser à l9instru™tion suiv—nteF €—ssons à l9instru™tion suiv—nte justement X return HY ih ˜ien ç—D en grosD ç— veut dire que ™9est (ni @eh ouiD déjàAF gette ligne indique qu9on —rrive à l— (n de notre fon™tion m—in et dem—nde de renvoyer l— v—leur HF 2. Du moins si vous l'avez bien dressé. C'est d'ailleurs comme ça qu'on reconnaît ce qui est une instruction et ce qui n'en est pas une.

VOTRE PREMIER PROGRAMME Pourquoi mon programme renverrait-il le nombre 0 ? in f—itD ™h—que progr—mme une fois terminé renvoie une v—leurD p—r exemple pour dire que tout s9est ˜ien p—ssé F v— plup—rt du tempsD ™ette v—leur n9est p—s vr—iment utiliséeD m—is il f—ut qu—nd même en renvoyer uneF †otre progr—mme —ur—it m—r™hé s—ns le return HD m—is on v— dire que ™9est plus propre et plus sérieux de le mettreD don™ on le metF it voilà 3 yn vient de dét—iller un peu le fon™tionnement du ™ode minim—lF gertesD on n9— p—s vr—iment tout vu en profondeurD et vous devez —voir quelques quesE tions en suspensF ƒoyez r—ssurés X toutes vos questions trouveront une réponse petit à petitF te ne peux p—s tout vous divulguer d9un ™oupD ™el— fer—it trop de ™hoses à —ssimilerF †ous suivez toujours c ƒi tel n9est p—s le ™—sD rien ne presseF xe vous for™ez p—s à lire l— suiteF p—ites une p—use et relisez ™e dé˜ut de ™h—pitre à tête reposéeF „out ™e que je viens de vous —pprendre est fond—ment—lD surtout si vous voulez être sûrs de pouvoir suivre —prèsF „enez X ™omme je suis de ˜onne humeurD je vous f—is un s™hém— qui r陗pitule le vo™—˜ul—ire qu9on vient d9—pprendre @(gF QFRAF 3 Figure QFR ! ve vo™—˜ul—ire du progr—mme minim—l Testons notre programme „ester devr—it —ller viteF „out ™e que vous —vez à f—ire ™9est ™ompiler le projetD puis l9exé™uter @™liquez sur l9i™ône fuild 8 ‚un sous gode: :flo™ksAF ƒi vous ne l9—vez p—s en™ore f—itD on vous dem—nder— d9enregistrer les (™hiersF p—itesEleF eprès un temps d9—ttente insupport—˜le @l— ™ompil—tionAD votre premier progr—mme v— —pp—r—ître sous vos yeux tot—lement env—his de ˜onheur @(gF QFSAF ve progr—mme —0™he  rello world 3 @sur l— première ligneAF ves lignes en dessous ont été générées p—r gode: :flo™ks et indiquent que le progr—mme s9est ˜ien exé™uté et ™om˜ien de temps s9est é™oulé depuis le l—n™ementF yn vous invite à —ppuyer sur n9importe quelle tou™he du ™l—vier pour fermer l— fenêtreF 3. QV . 0 signie  tout s'est bien passé  et n'importe quelle autre valeur signie  erreur .CHAPITRE 3. En pratique.

ce n'est pas transcendant. où se trouve-t-elle ? Moi je ne vois que la fonction m—in ! 4. Mais bon. . .ÉCRIRE UN MESSAGE À L'ÉCRAN Figure QFS ! †otre premier progr—mme 3 †otre progr—mme s9—rrête —lors F 4 Écrire un message à l'écran À p—rtir de m—inten—ntD on v— modi(er nousEmêmes le ™ode de ™e progr—mme minim—lF †otre missionD si vous l9—™™eptez X —0™her le mess—ge  fonjour à l9é™r—nF gomme tout à l9heureD une ™onsole doit s9ouvrirF ve mess—ge  fonjour doit s9—0™her d—ns l— ™onsoleF Comment fait-on pour choisir le texte qui s'ache à l'écran ? ge ser— en f—it —ssez simpleF ƒi vous p—rtez du ™ode qui — été donné plus h—utD il vous su0t simplement de rempl—™er  rello world 3 p—r  fonjour d—ns l— ligne qui f—it —ppel à printfF gomme je vous le dis—is plus tôtD printf est une instructionF ille ™omm—nde à l9orE din—teur X  Ache-moi ce message à l'écran F sl f—ut s—voir que printf est en f—it une fon™tion qui — déjà été é™rite p—r d9—utres progr—mmeurs —v—nt vousF Cette fonction. Non ? QW . Oui je sais. quand même ! C'est un premier programme. un instant dont vous vous souviendrez toute votre vie ! .

VOTRE PREMIER PROGRAMME †ous vous souvenez de ™es deux lignes c 5in™lude `stdioFhb 5in™lude `stdli˜Fhb te vous —v—is dit qu9elles permett—ient d9—jouter des ˜i˜liothèques d—ns votre proE gr—mmeF ves ˜i˜liothèques sont en f—it des (™hiers —ve™ des tonnes de fon™tions toutes prêtes à l9intérieurF ges (™hiersElà @stdioFh et stdli˜FhA ™ontiennent l— plup—rt des fon™tions de ˜—se dont on — ˜esoin d—ns un progr—mmeF stdioFh en p—rti™ulier ™ontient des fon™tions permett—nt d9—0™her des ™hoses à l9é™r—n @™omme printfA m—is —ussi de dem—nder à l9utilis—teur de t—per quelque ™hose @™e sont des fon™tions que l9on verr— plus t—rdAF Dis Bonjour au Monsieur h—ns notre fon™tion m—inD on f—it don™ —ppel à l— fon™tion printfF g9est une fon™tion qui en —ppelle une —utre @i™iD m—in —ppelle printfAF †ous —llez voir que ™9est tout le temps ™omme ç— que ç— se p—sse en l—ng—ge g X une fon™tion ™ontient des instru™tions qui —ppellent d9—utres fon™tionsD et —insi de suiteF hon™D pour f—ire —ppel à une fon™tionD ™9est simple X il su0t d9é™rire son nomD suivi de deux p—renthèsesD puis un pointEvirguleF printf@AY g9est ˜ienD m—is ™e n9est p—s su0s—ntF sl f—ut indiquer quoi é™rire à l9é™r—nF €our f—ire ç—D il f—ut donner à l— fon™tion printf le texte à —0™herF €our ™e f—ireD ouvrez des guillemets à l9intérieur des p—renthèses et t—pez le texte à —0™her entre ™es guillemetsD ™omme ™el— —v—it déjà été f—it sur le ™ode minim—lF h—ns notre ™—sD on v— don™ t—per très ex—™tement X printf@4fonjour4AY t9espère que vous n9—vez p—s ou˜lié le pointEvirgule à l— (nD je vous r—ppelle que ™9est très import—nt 3 gel— permet d9indiquer que l9instru™tion s9—rrête làF †oi™i le ™ode sour™e que vous devriez —voir sous les yeux X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@A { printf@4fonjour4AY return HY } RH .CHAPITRE 3.

ÉCRIRE UN MESSAGE À L'ÉCRAN yn — don™ deux instru™tions qui ™omm—ndent d—ns l9ordre à l9ordin—teur X IF —0™he  fonjour à l9é™r—n Y PF l— fon™tion m—in est terminéeD renvoie HF ve progr—mme s9—rrête —lorsF v— (gF QFT vous montre ™e que donne ™e progr—mme à l9é™r—nF Figure QFT ! …n progr—mme poli qui dit fonjour gomme vous pouvez le voirD l— ligne du  fonjour est un peu ™ollée —ve™ le reste du texteD ™ontr—irement à tout à l9heureF …ne des solutions pour rendre notre progr—mme plus présent—˜le ser—it de f—ire un retour à l— ligne —près  fonjour @™omme si on —ppuy—it sur l— tou™he  intrée AF w—is ˜ien sûrD ™e ser—it trop simple de t—per  intrée d—ns notre ™ode sour™e pour qu9une entrée soit e'e™tuée à l9é™r—n 3 sl v— f—lloir utiliser ™e qu9on —ppelle des ™—r—™tères spé™i—uxF F F Les caractères spéciaux ves ™—r—™tères spé™i—ux sont des lettres spé™i—les qui permettent d9indiquer qu9on veut —ller à l— ligneD f—ire une t—˜ul—tionD et™F sls sont f—™iles à re™onn—ître X ™9est un enE sem˜le de deux ™—r—™tèresF ve premier d9entre eux est toujours un —ntiEsl—sh @ ’ AD et le se™ond un nom˜re ou une lettreF †oi™i deux ™—r—™tères spé™i—ux ™our—nts que vous —urez pro˜—˜lement ˜esoin d9utiliserD —insi que leur signi(™—tion X ! ’n X retour à l— ligne @a  intrée A Y ! ’t X t—˜ul—tionF h—ns notre ™—sD pour f—ire une entréeD il su0t de t—per ’n pour ™réer un retour à l— ligneF ƒi je veux don™ f—ire un retour à l— ligne juste —près le mot  fonjour D je devr—is t—per X printf@4fonjour’n4AY RI .

Seulement voilà. je m'appelle Gérard et j'ai voulu essayer de modier votre programme pour qu'il me dise  Bonjour Gérard . VOTRE PREMIER PROGRAMME †otre ordin—teur ™omprend qu9il doit —0™her  fonjour suivi d9un retour à l— ligne @(gF QFUAF Figure QFU ! ve progr—mme fonjour —ve™ un s—ut de ligne g9est déjà un peu mieuxD non c Vous pouvez écrire à la suite du ’n sans aucun problème. Le syndrome de Gérard Bonjour.CHAPITRE 3. Que faire ? „out d9—˜ordD ˜onjour qér—rdF g9est une question très intéress—nte que vous nous posez làF te tiens en premier lieu à vous féli™iter pour votre esprit d9initi—tiveD ™9est très ˜ien d9—voir eu l9idée de modi(er un peu le progr—mmeF g9est en  ˜idouill—nt les progr—mmes que je vous donne que vous —llez en —pprendre le plusF xe vous ™ontentez p—s de ™e que vous lisezD ess—yez un peu vos propres modi(™—tions des progr—mmes que nous voyons ensem˜le 3 fien 3 w—inten—ntD pour répondre à l— question de notre —mi qér—rdD j9—i une ˜ien triste nouvelle à vous —nnon™er X l— ™onsole de ‡indows ne gère p—s les —™™entsF €—r ™ontre l— ™onsole de vinuxD ouiF À p—rtir de là vous —vez deux solutionsF RP . Vous pourriez donc vous entraîner à écrire : printf@4fonjour’neu ‚evoir’n4AY Cela achera  Bonjour  sur la première ligne et  Au revoir  sur la ligne suivante. . Tout ce que vous écrirez à la suite du ’n sera placé sur la deuxième ligne. j'ai l'impression que l'accent de Gérard ne s'ache pas correctement. .

sachez que je n'ai rien contre ce prénom. Si d'aventure vous vous appeliez Gérard. il faut toujours que quelqu'un prenne pour les autres. C'EST TRÈS UTILE ! ! Passer à LinuxF g9est une solution un peu r—di™—le et il me f—udr—it un ™ours entier pour vous expliquer ™omment vous servir de vinuxF ƒi vous n9—vez p—s le nive—uD ou˜liez ™ette possi˜ilité pour le momentF ! Ne pas utiliser d'accentsF g9est m—lheureusement l— solution que vous risquez de ™hoisirF v— ™onsole de ‡indows — ses déf—utsD que voulezEvousF sl v— vous f—lE loir prendre l9h—˜itude d9é™rire s—ns —™™entsF fien entenduD ™omme plus t—rd vous ferez pro˜—˜lement des progr—mmes —ve™ des fenêtresD vous ne ren™ontrerez plus ™e pro˜lèmeElàF te vous re™omm—nde don™ de ne p—s utiliser d9—™™ents tempor—irementD pend—nt votre —pprentiss—ge d—ns l— ™onsoleF †os futurs progr—mmes  professionE nels n9—uront p—s ™e pro˜lèmeD r—ssurezEvousF €our ne p—s être gênéD vous devrez don™ é™rire s—ns —™™ent X printf@4fonjour qer—rd’n4AY yn remer™ie notre —mi qér—rd pour nous —voir soulevé ™e pro˜lème 3 5 Les commentaires. que voulez-vous ! RQ . . C'est simplement le premier prénom avec un accent qui m'est passé par la tête. . c'est très utile ! ev—nt de terminer ™e premier ™h—pitre de  vérit—˜le progr—mm—tionD je dois —˜soluE ment vous f—ire dé™ouvrir les commentairesF uel que soit le l—ng—ge de progr—mm—E tionD on — l— possi˜ilité d9—jouter des ™omment—ires à son ™odeF ve l—ng—ge g n9é™h—ppe p—s à l— règleF u9estE™e que ç— veut direD  ™ommenter c gel— signi(e t—per du texte —u milieu de votre progr—mme pour indiquer ™e qu9il f—itD à quoi sert telle ligne de ™odeD et™F g9est vr—iment quelque ™hose d9indispens—˜le ™—rD même en ét—nt un génie de l— progr—mm—E tionD on — ˜esoin de f—ire quelques —nnot—tions p—rE™i p—rElàF gel— permet X ! de vous retrouver —u milieu d9un de vos ™odes sour™e plus t—rdF yn ne dir—it p—s ™omme ç—D m—is on ou˜lie vite ™omment fon™tionnent les progr—mmes qu9on — é™ritsF ƒi vous f—ites une p—use ne ser—itE™e que quelques joursD vous —urez ˜esoin de vous —ider de vos propres ™omment—ires pour vous retrouver d—ns un gros ™ode Y ! si vous donnez votre projet à quelqu9un d9—utre @qui ne ™onn—ît — priori p—s votre ™ode sour™eAD ™el— lui permettr— de se f—mili—riser —ve™ ˜ien plus r—pidement Y ! en(nD ç— v— me permettre à moi d9—jouter des —nnot—tions d—ns les ™odes sour™e de ™e ™oursF it de mieux vous expliquer à quoi peut servir telle ou telle ligne de ™odeF sl y — plusieurs m—nières d9insérer un ™omment—ireF „out dépend de l— longueur du ™omment—ire que vous voulez é™rireF ! †otre ™omment—ire est court X il tient sur une seule ligneD il ne f—it que quelques motsF h—ns ™e ™—sD vous devez t—per un dou˜le sl—sh @GGA suivi de votre ™omment—ireF €—r exemple X GG ge™i est un ™omment—ire 5.LES COMMENTAIRES. Et puis bon.

CHAPITRE 3. VOTRE PREMIER PROGRAMME †ous pouvez —ussi ˜ien é™rire un ™omment—ire seul sur s— ligneD ou ˜ien à droite d9une instru™tionF g9est d9—illeurs quelque ™hose de très pr—tique ™—r —insiD on s—it que le ™omment—ire sert à indiquer à quoi sert l— ligne sur l—quelle il estF ixemple X printf@4fonjour4AY GG gette instru™tion —ffi™he fonjour à l9é™r—n xotez que ™e type de ™omment—ire — norm—lement été introduit p—r le l—ng—ge gCCD m—is vous n9—urez p—s de pro˜lème en l9utilis—nt pour un progr—mme en l—ng—ge g —ujourd9huiF ! †otre ™omment—ire est long X vous —vez ˜e—u™oup à direD vous —vez ˜esoin d9é™rire plusieurs phr—ses qui tiennent sur plusieurs lignesF h—ns ™e ™—sD vous devez t—per un ™ode qui signi(e  dé˜ut de ™omment—ire et un —utre ™ode qui signi(e  (n de ™omment—ire X ! pour indiquer le début du commentaire X t—pez un sl—sh suivi d9une étoile @GBA Y ! pour indiquer l— n du commentaire X t—pez une étoile suivie d9un sl—sh @BGAF †ous é™rirez don™ p—r exemple X GB ge™i est un ™omment—ire sur plusieurs lignes BG ‚eprenons notre ™ode sour™e qui é™rit  fonjour D et —joutonsElui quelques ™ommenE t—ires juste pour s9entr—îner X GB giEdessousD ™e sont des dire™tives de prépro™esseurF ges lignes permettent d9—jouter des fi™hiers —u projetD fi™hiers que l9on —ppelle ˜i˜liothèquesF qrâ™e à ™es ˜i˜liothèquesD on disposer— de fon™tions toutes prêtes pour —ffi™her p—r exemple un mess—ge à l9é™r—nF BG 5in™lude `stdioFhb 5in™lude `stdli˜Fhb GB giEdessousD vous —vez l— fon™tion prin™ip—le du progr—mmeD —ppelée m—inF g9est p—r ™ette fon™tion que tous les progr—mmes ™ommen™entF s™iD m— fon™tion se ™ontente d9—ffi™her fonjour à l9é™r—nF BG int m—in@A { printf@4fonjour4AY GG gette instru™tion —ffi™he fonjour à l9é™r—n return HY GG ve progr—mme renvoie le nom˜re H puis s9—rrête } †oilà ™e que donner—it notre progr—mme —ve™ quelques ™omment—iresF yuiD il — l9—ir d9être plus grosD m—is en f—it ™9est le même que tout à l9heureF vors de l— ™ompil—tionD RR .

Cela ne nous empêchera pas par la suite de travailler avec des fenêtres dans la partie III.LES COMMENTAIRES.-) RS . . jetez le tout ! En résumé ! ves progr—mmes peuvent ™ommuniquer —ve™ l9utilis—teur vi— une ™onsole ou une fenêtreF ! sl est ˜e—u™oup plus f—™ile pour nos premiers progr—mmes de tr—v—iller —ve™ l— consoleD ˜ien que ™elleE™i soit moins —ttir—nte pour un dé˜ut—nt F ! …n progr—mme est ™onstitué d9instructions qui se terminent toutes p—r un pointE virguleF ! ves instru™tions sont ™ontenues d—ns des fonctions qui permettent de les ™l—sserD ™omme d—ns des ˜oîtesF ! v— fon™tion m—in @qui signi(e  prin™ip—le A est l— fon™tion p—r l—quelle dém—rre votre progr—mmeF g9est l— seule qui soit o˜lig—toireD —u™un progr—mme ne peut être ™ompilé s—ns elleF ! printf est une fon™tion toute prête qui permet d9—0™her un mess—ge à l9é™r—n d—ns une ™onsoleF ! printf se trouve d—ns une bibliothèque où l9on retrouve de nom˜reuses —utres fon™tions prêtes à l9emploiF 6 6. Tout vient à point à qui sait attendre. C'EST TRÈS UTILE ! tous les ™omment—ires seront ignorésF ges ™omment—ires n9—pp—r—îtront p—s d—ns le progr—mme (n—lD ils servent seulement —ux progr—mmeursF xorm—lementD on ne ™ommente p—s ™h—que ligne du progr—mmeF t9—i dit @et je le reE dir—iA que ™9ét—it import—nt de mettre des ™omment—ires d—ns un ™ode sour™eD m—is il f—ut s—voir doser X ™ommenter ™h—que ligne ne servir— l— plup—rt du temps à rienF À for™eD vous s—urez que le printf permet d9—0™her un mess—ge à l9é™r—nD p—s ˜esoin de l9indiquer à ™h—que foisF ve mieux est de ™ommenter plusieurs lignes à l— foisD ™9estEàEdire d9indiquer à quoi sert une série d9instru™tions histoire d9—voir une idéeF eprèsD si le progr—mmeur veut se pen™her plus en dét—il d—ns ™es instru™tionsD il est —ssez intelligent pour y —rriver tout seulF Retenez donc X les ™omment—ires doivent guider le progr—mmeur d—ns son ™ode sour™eD lui permettre de se repérerF iss—yez de ™ommenter un ensem˜le de lignes plutôt que toutes les lignes une p—r uneF it pour (nir sur une petite tou™he ™ulturelleD voi™i une ™it—tion tirée de ™hez sfw X Si après avoir lu uniquement les commentaires d'un programme vous n'en comprenez pas le fonctionnement.

VOTRE PREMIER PROGRAMME RT .CHAPITRE 3.

Ça ne vole peut-être pas très haut pour le moment. c'est de faire retenir des nombres à l'ordinateur.Chapitre 4 Diculté : Un monde de variables V ous savez acher un texte à l'écran. RU . Comment fonctionne une mémoire ? Combien un ordinateur possède-t-il de mémoires diérentes ? Cela pourra paraître un peu simpliste à certains d'entre vous. On va apprendre à stocker des nombres dans la mémoire. mais je pense aussi à ceux qui ne savent pas bien ce qu'est une mémoire. Je souhaite que nous commencions par quelques explications sur la mémoire de votre ordinateur. Très bien. 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.

Eh oui : pour un ordinateur. UN MONDE DE VARIABLES Une aaire de mémoire ge que je v—is vous —pprendre d—ns ™e ™h—pitre — un r—pport dire™t —ve™ l— mémoire de votre ordin—teurF „out être hum—in norm—lement ™onstitué — une mémoireF ih ˜ien ™9est p—reil pour un ordin—teurF F F à un dét—il près X un ordin—teur — plusieurs types de mémoire 3 Pourquoi un ordinateur aurait-il plusieurs types de mémoire ? Une seule mémoire aurait su. c'est déjà trop long ! ue f—utEil retenir d—ns tout ç— c in f—itD je souh—ite vous situer un peuF †ous s—vez désorm—is qu9en progr—mm—tionD on v— surtout tr—v—iller —ve™ l— mémoire viveF yn verr— —ussi ™omment lire et é™rire sur le disque durD pour lire et ™réer des (™hiers @m—is RV . c'est à l'échelle de votre ordinateur bien sûr. non ? xon X en f—itD le pro˜lème ™9est qu9on — ˜esoin d9—voir une mémoire à l— fois rapide @pour ré™upérer une inform—tion très viteA et importante @pour sto™ker ˜e—u™oup de donnéesAF yrD vous —llez rireD m—is jusqu9i™i nous —vons été in™—p—˜les de ™réer une mémoire qui soit à l— fois très r—pide et import—nteF €lus ex—™tementD l— mémoire r—pide ™oûte ™herD on n9en f—it don™ qu9en petites qu—ntitésF hu ™oupD pour nous —rr—ngerD nous —vons dû doter les ordin—teurs de mémoires très r—pides m—is p—s import—ntesD et de mémoires import—ntes m—is p—s très r—pides @vous suivez toujours cAF Les diérents types de mémoire €our vous donner une idéeD voi™i les di'érents types de mémoire exist—nt d—ns un ordin—teurD de l— plus r—pide à l— plus lente X IF les registres X une mémoire ultr—Er—pide située dire™tement d—ns le pro™esseur Y PF l— mémoire ™—™he X elle f—it le lien entre les registres et l— mémoire vive Y QF l— mémoire vive X ™9est l— mémoire —ve™ l—quelle nous —llons tr—v—iller le plus souvent Y RF le disque dur X que vous ™onn—issez sûrementD ™9est là qu9on enregistre les (™hiersF gomme je vous l9—i ditD j9—i ™l—ssé les mémoires de l— plus r—pide @les registresA à l— plus lente @le disque durAF ƒi vous —vez ˜ien suiviD vous —vez ™ompris —ussi que l— mémoire l— plus r—pide ét—it l— plus petiteD et l— plus lente l— plus grosseF ves registres sont don™ à peine ™—p—˜les de retenir quelques nom˜resD t—ndis que le disque dur peut sto™ker de très gros (™hiersF Quand je dis qu'une mémoire est  lente .CHAPITRE 4. 8 millisecondes pour accéder au disque dur.

c'est beaucoup plus facile. ces mémoires se vident 3 reureusementD lorsque vous r—llumerez l9ordin—teurD votre disque dur ser— toujours là pour r—ppeler à votre ordin—teur qui il estF La mémoire vive en photos †u qu9on v— tr—v—iller pend—nt un moment —ve™ l— mémoire viveD je pense qu9il ser—it ˜ien de vous l— présenterF yn v— y —ller p—r zooms su™™essifsF gommençons p—r votre ordin—teur @(gF RFIAF Figure RFI ! …n ordin—teur et tous ses ™ompos—nts †ous re™onn—issez le ™l—vierD l— sourisD l9é™r—n et l9unité ™entr—le @l— tourAF sntéressonsE nous m—inten—nt à l9unité ™entr—le @(gF RFPAD le ™÷ur de votre ordin—teur qui ™ontient toutes les mémoiresF Figure RFP ! v9unité ™entr—le ge qui nous intéresseD ™9est ™e qu9il y — à l9intérieur de l9unité ™entr—leF yuvronsEl— @(gF RW . comme l'assembleur (abrégé  ASM ).UNE AFFAIRE DE MÉMOIRE on ne le fer— que plus t—rdAF u—nt à l— mémoire ™—™he et —ux registresD on n9y tou™her— p—s du tout 3 g9est votre ordin—teur qui s9en o™™upeF Dans des langages très bas niveau. Je l'ai fait. et je peux vous dire que faire une simple multiplication dans ce langage est un véritable parcours du combattant ! Heureusement. on travaille au contraire plutôt directement avec les registres. sl f—ut —jouter une dernière ™hose très import—nte X seul le disque dur retient tout le temps les inform—tions qu9il ™ontientF „outes les —utres mémoires @registresD mémoire ™—™heD mémoire viveA sont des mémoires tempor—ires X lorsque vous éteignez votre ordinateur. en langage C (et dans la plupart des autres langages de programmation).

CHAPITRE 4. UN MONDE DE VARIABLES RFQAF Figure RFQ ! sntérieur de l9unité ™entr—le g9est un joyeux petit ˜—z—rF ‚—ssurezEvousD je ne vous dem—nder—i p—s de s—voir ™omE ment tout ™el— fon™tionneF te veux juste que vous s—™hiez où se trouve l— mémoire vive làEded—nsF te vous l9—i en™—dréeF te n9—i p—s indiqué les —utres mémoires @registres et mémoire ™—™heA ™—r de toute f—çon elles sont ˜ien trop petites pour être visi˜les à l9oeil nuF †oi™i à quoi ressem˜le une ˜—rrette de mémoire vive de plus près @(gF RFRAF Figure RFR ! …ne ˜—rrette de mémoire vive v— mémoire vive est —ussi —ppelée RAMD ne vous étonnez don™ p—s si p—r l— suite j9utilise plutôt le mot ‚ew qui est un peu plus ™ourtF SH .

UNE AFFAIRE DE MÉMOIRE Le schéma de la mémoire vive in photogr—phi—nt de plus près l— mémoire viveD on n9y verr—it p—s gr—ndE™hoseF €ourE t—ntD il est très import—nt de s—voir ™omment ç— fon™tionne à l9intérieurF g9est d9—illeurs là que je veux en venir depuis tout à l9heureF te vous propose un s™hém— du fon™tionnement de l— mémoire vive @(gF RFSAF sl est très simpli(é @™omme mes s™hém—s de ™ompil—tion 3AD m—is ™9est p—r™e que nous n9—vons p—s ˜esoin de trop de dét—ilsF ƒi vous retenez ™e s™hém—D ™e ser— déjà très ˜ien 3 Figure RFS ! yrg—nis—tion de l— mémoire vive gomme vous le voyezD il f—ut en gros distinguer deux ™olonnesF ! sl y — les adresses X une —dresse est un nom˜re qui permet à l9ordin—teur de se repérer d—ns l— mémoire viveF yn ™ommen™e à l9—dresse H @—u tout dé˜ut de l— mémoireA et on (nit à l9—dresse Q RRV UTS WHH IPT et des poussièresF F F iuhD en f—it je ne ™onn—is p—s le nom˜re d9—dresses qu9il y — d—ns l— ‚ewD je s—is juste qu9il y en — ˜e—u™oupF in plus ç— dépend de l— qu—ntité de mémoire vive que vous —vezF €lus vous —vez de mémoire viveD plus il y — d9—dressesD don™ plus on peut sto™ker de ™hosesF ! À ™h—que —dresseD on peut sto™ker une valeur @un nom˜reA X votre ordin—teur sto™ke d—ns l— mémoire vive ™es nom˜res pour pouvoir s9en souvenir p—r l— suiteF yn ne peut sto™ker qu9un nom˜re p—r —dresse 3 xotre ‚ew ne peut sto™ker que des nom˜resF SI .

UN MONDE DE VARIABLES Mais alors. comment fait-on pour retenir des mots ? fonne questionF in f—itD même les lettres ne sont que des nom˜res pour l9ordin—teur 3 …ne phr—se est une simple su™™ession de nom˜resF sl existe un t—˜le—u qui f—it l— ™orE respond—n™e entre les nom˜res et les lettresF g9est un t—˜le—u qui dit p—r exemple X le nombre 67 correspond à la lettre YF te ne rentre p—s d—ns les dét—ilsD on —ur— l9o™™—sion de rep—rler de ™el— plus loin d—ns le ™oursF ‚evenons à notre s™hém—F ves ™hoses sont en f—it très simples X si l9ordin—teur veut retenir le nom˜re S @qui pourr—it être le nom˜re de vies qu9il reste —u personn—ge d9un jeuAD il le met quelque p—rt en mémoire où il y — de l— pl—™e et note l9—dresse ™orrespond—nte @p—r exemple Q HTP IWW WHPAF €lus t—rdD lorsqu9il veut s—voir à nouve—u quel est ™e nom˜reD il v— ™her™her à l—  ™—se mémoire n¦Q HTP IWW WHP ™e qu9il y —D et il trouve l— v—leurF F F S 3 †oilà en gros ™omment ç— fon™tionneF g9est peutEêtre un peu )ou pour le moment @quel intérêt de sto™ker un nom˜re s9il f—ut à l— pl—™e retenir l9—dresse cA m—is tout v— r—pidement prendre du sens d—ns l— suite de ™e ™h—pitreD je vous le prometsF Déclarer une variable groyezEmoiD ™ette petite introdu™tion sur l— mémoire v— nous être plus utile que vous ne le pensezF w—inten—nt que vous s—vez ™e qu9il f—utD on peut retourner progr—mmerF elors une v—ri—˜leD ™9est quoi c ih ˜ien ™9est une petite inform—tion tempor—ire qu9on sto™ke d—ns l— ‚ewF „out simplementF yn dit qu9elle est  v—ri—˜le ™—r ™9est une v—leur qui peut ™h—nger pend—nt le déroulement du progr—mmeF €—r exempleD notre nom˜re S de tout à l9heure @le nom˜re de vies rest—nt —u joueurA risque de diminuer —u (l du tempsF ƒi ™e nom˜re —tteint HD on s—ur— que le joueur — perduF xos progr—mmesD vous —llez le voirD sont remplis de v—ri—˜lesF †ous —llez en voir p—rtoutD à toutes les s—u™esF in l—ng—ge gD une v—ri—˜le est ™onstituée de deux ™hoses X ! une valeur X ™9est le nom˜re qu9elle sto™keD p—r exemple S Y ! un nom X ™9est ™e qui permet de l— re™onn—îtreF in progr—mm—nt en gD on n9—ur— p—s à retenir l9—dresse mémoire @ouf 3A X à l— pl—™eD on v— juste indiquer des noms de v—ri—˜lesF g9est le ™ompil—teur qui fer— l— ™onversion entre le nom et l9—dresseF †oilà déjà un sou™i de moinsF Donner un nom à ses variables in l—ng—ge gD ™h—que v—ri—˜le doit don™ —voir un nomF €our notre f—meuse v—ri—˜le qui retient le nom˜re de viesD on —imer—it ˜ien l9—ppeler  xom˜re de vies ou quelque ™hose du genreF SP .CHAPITRE 4.

C'est peut-être plus court. faites en sorte de donner des noms clairs à vos variables. N'ayez donc pas peur de donner des noms un peu plus longs pour que ça reste compréhensible. Les types de variables xotre ordin—teurD vous pourrez le ™onst—terD n9est en f—it rien d9—utre qu9une @très grosseA m—™hine à ™—l™ulerF sl ne s—it tr—iter que des nom˜resF yui m—is voilàD j9—i un s™oop 3 sl existe plusieurs types de nom˜res 3 €—r exempleD il y — les nom˜res entiers positifs X ! RS Y ! QWV Y ! UTSHF w—is il y — —ussi des nom˜res dé™im—uxD ™9estEàEdire des nom˜res à virgule X ! USDWHW Y ! IDUURI Y SQ . mais c'est beaucoup moins clair pour vous quand vous relisez votre code.DÉCLARER UNE VARIABLE rél—sD il y — quelques ™ontr—intesF †ous ne pouvez p—s —ppeler une v—ri—˜le n9importe ™omment X ! il ne peut y —voir que des minus™ulesD m—jus™ules et des ™hi'res @—˜™efgHIPA Y ! votre nom de v—ri—˜le doit ™ommen™er p—r une lettre Y ! les esp—™es sont interditsF À l— pl—™eD on peut utiliser le ™—r—™tère  unders™ore • @qui ressem˜le à un tr—it de soulignementAF g9est le seul ™—r—™tère di'érent des lettres et ™hi'res —utorisé Y ! vous n9—vez p—s le droit d9utiliser des —™™ents @éàê et™FAF in(nD et ™9est très import—nt à s—voirD le l—ng—ge g f—it l— di'éren™e entre les m—jusE ™ules et les minus™ulesF €our votre ™ultureD s—™hez qu9on dit que ™9est un l—ng—ge qui  respe™te l— ™—sse F hon™D du ™oupD les v—ri—˜les l—rgeurD ve‚qi…‚ ou en™ore vergiu‚ sont trois v—ri—˜les di'érentes en l—ng—ge gD même si pour nous ç— — l9—ir de signi(er l— même ™hose 3 †oi™i quelques exemples de noms de v—ri—˜les ™orre™ts X nom˜rehe†iesD prenomD nomD numero•de•telephoneD numerohe„elephoneF gh—que progr—mmeur — s— propre f—çon de nommer des v—ri—˜lesF €end—nt ™e ™oursD je v—is vous montrer m— m—nière de f—ire X ! je ™ommen™e tous mes noms de v—ri—˜les p—r une lettre minus™ule Y ! s9il y — plusieurs mots d—ns mon nom de v—ri—˜leD je mets une lettre m—jus™ule —u dé˜ut de ™h—que nouve—u motF te v—is vous dem—nder de f—ire de l— même m—nière que moiD ç— nous permettr— d9être sur l— même longueur d9ondesF Quoi que vous fassiez. en l'écrivant par exemple ndv. On aurait pu abréger nom˜rehe†ies.

mais aujourd'hui les mémoires ont évolué et on a assez de place pour stocker des grands nombres. Si vous ne connaissez pas les puissances de 10. même si certains sont un peu de trop. †ous verrez que l— plup—rt du temps on m—nipule des nom˜res entiers @t—nt mieuxD p—r™e que ™9est plus f—™ile à utiliserAF SR . . En pratique. UN MONDE DE VARIABLES ! WVIHDUF in plus de ç—D il y — —ussi des nom˜res entiers nég—tifs X ! EVU Y ! EWITF F F F it des nom˜res nég—tifs dé™im—ux 3 ! EUTDW Y ! EIHHDIIF †otre p—uvre ordin—teur — ˜esoin d9—ide 3 vorsque vous lui dem—ndez de sto™ker un nom˜reD vous devez dire de quel type il estF ge n9est p—s vr—iment qu9il ne soit p—s ™—p—˜le de le re™onn—ître tout seulD m—isF F F ç— l9—ide ˜e—u™oup à s9org—niserD et à f—ire en sorte de ne p—s prendre trop de mémoire pour rienF vorsque vous ™réez une v—ri—˜leD vous —llez don™ devoir indiquer son typeF †oi™i les prin™ip—ux types de v—ri—˜les exist—nt en l—ng—ge g X Nom du type Nombres stockables ™h—r int long flo—t dou˜le EIPV à IPU EP IRU RVQ TRV à P IRU RVQ TRU EP IRU RVQ TRV à P IRU RVQ TRU EQFR x IH puiss—n™e QV à QFR x IH puiss—n™e QV EIFU x IH puiss—n™e QHV à IFU x IH puiss—n™e QHV (Je suis loin d'avoir mis tous les types. j'utilise principalement ™h—r. (je ne vais quand même pas écrire 308 zéros pour vous !). Avant ce n'était pas le cas (un int était plus petit qu'un long). mais j'ai conservé les principaux) ves trois premiers types @™h—rD intD longA permettent de sto™ker des nom˜res entiers X ID PD QD RF F F ves deux derniers @flo—tD dou˜leA permettent de sto™ker des nom˜res dé™im—ux X IQFVD ITFWIIF F F Les types flo—t et dou˜le permettent de stocker des nombres décimaux extrêmement grands. Vous remarquerez qu'un int et un long ont l'air identiques. int et dou˜le. .CHAPITRE 4. on se moque donc un peu de la diérence entre un int et un long. Le langage C  conserve  tous ces types pour des raisons de compatibilité. dites-vous par exemple que le type dou˜le permet de stocker le nombre 1 suivi de 308 zéros derrière ! C'est-àdire : 10000000000000000000000000000000000000000000000000000.

non ? yuiD m—is on — ™réé à l9origine plusieurs types pour é™onomiser de l— mémoireF einsiD qu—nd on dit à l9ordin—teur qu9on — ˜esoin d9une v—ri—˜le de type ™h—rD on prend moins d9esp—™e en mémoire que si on —v—it dem—ndé une v—ri—˜le de type intF „outefoisD ™9ét—it utile surtout à l9époque où l— mémoire ét—it limitéeF eujourd9huiD nos ordin—teurs ont l—rgement —ssez de mémoire vive pour que ç— ne soit plus vr—iment un pro˜lèmeF sl ne ser— don™ p—s utile de se prendre l— tête pend—nt des heures sur le ™hoix d9un typeF ƒi vous ne s—vez p—s si votre v—ri—˜le risque de prendre une grosse v—leurD mettez intF in résuméD on fer— surtout l— distin™tion entre nom˜res entiers et dé™im—ux X ! pour un nom˜re entierD on utiliser— le plus souvent int Y ! pour un nom˜re décimalD on utiliser— génér—lement dou˜leF Déclarer une variable yn y —rriveF w—inten—ntD ™réez un nouve—u projet ™onsole que vous —ppellerez  v—E ri—˜les F yn v— voir ™omment dé™l—rer une v—ri—˜leD ™9estEàEdire demander à l'ordinateur la permission d'utiliser un peu de mémoireF …ne dé™l—r—tion de v—ri—˜leD ™9est très simple m—inten—nt que vous s—vez tout ™e qu9il f—utF sl su0t d—ns l9ordre X IF d9indiquer le type de l— v—ri—˜le que l9on veut ™réer Y PF d9insérer un esp—™e Y QF d9indiquer le nom que vous voulez donner à l— v—ri—˜le Y RF et en(nD de ne p—s ou˜lier le pointEvirguleF SS . il utilise le point. Vous ne devez donc pas écrire 54.9 ! ge n9est p—s tout 3 €our les types sto™k—nt des entiers @™h—rD intD longF F FAD il existe d9—utres types dits unsigned @non signésA qui eux ne peuvent sto™ker que des nom˜res positifsF €our les utiliserD il su0t d9é™rire le mot unsigned dev—nt le type X unsigned ™h—r 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 déf—ut de ne p—s pouvoir sto™ker de nom˜res nég—tifsD m—is l9—v—nt—ge de pouvoir sto™ker des nom˜res deux fois plus gr—nds @™h—r s9—rrête à IPVD t—ndis que unsigned ™h—r s9—rrête à PSS p—r exempleAF Pourquoi avoir créé trois types pour les nombres entiers ? Un seul type aurait été susant.9 mais plutôt 54.DÉCLARER UNE VARIABLE Attention avec les nombres décimaux ! Votre ordinateur ne connaît pas la virgule.

car pour remplir toute la mémoire rien qu'avec des int il faut vraiment le vouloir ! ST . . c'est qu'il n'y ait plus de place en mémoire.CHAPITRE 4. Le seul problème qu'il pourrait y avoir. . UN MONDE DE VARIABLES €—r exempleD si je veux ™réer m— v—ri—˜le nom˜rehe†ies de type intD je dois t—per l— ligne suiv—nte X int nom˜rehe†iesY it ™9est tout 3 uelques —utres exemples stupides pour l— forme X int notehew—thsY dou˜le sommeergent‚e™ueY unsigned int nom˜reheve™teursin„r—inhevire…nxomhe†—ri—˜le…n€euvongY fon ˜refD vous —vez ™ompris le prin™ipe je pense 3 ge qu9on f—it là s9—ppelle une déclaration de variable @un vo™—˜ul—ire à retenirAF †ous devez f—ire les dé™l—r—tions de v—ri—˜les —u dé˜ut des fon™tionsF gomme pour le moment on n9— qu9une seule fon™tion @l— fon™tion m—inAD vous —llez dé™l—rer l— v—ri—˜le ™omme ™e™i X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A GG Équiv—lent de int m—in@A { int nom˜rehe†iesY } return HY ƒi vous l—n™ez le progr—mme ™iEdessusD vous ™onst—terez —ve™ stupeurF F F qu9il ne f—it rienF Quelques explications elorsD —v—nt que vous ne m9étr—ngliez en ™roy—nt que je vous mène en ˜—te—u depuis tout à l9heureD l—issezEmoi juste dire une ™hose pour m— défenseF in f—itD il se p—sse des ™hosesD m—is vous ne les voyez p—sF vorsque le progr—mme —rrive à l— ligne de l— dé™l—r—tion de v—ri—˜leD il dem—nde ˜ien gentiment à l9ordin—teur s9il peut utiliser un peu d9esp—™e d—ns l— mémoire viveF ƒi tout v— ˜ienD l9ordin—teur répond  yui ˜ien sûrD f—is ™omme ™hez toi F qénér—lementD ™el— se p—sse s—ns pro˜lème F ƒoyez don™ s—ns ™r—inteD vos v—ri—˜les devr—ient norm—lement être ™réées s—ns sou™iF 1 1. Mais heureusement cela arrive rarement.

inutile de faire une ligne pour chaque variable. nive—u et it m—inten—nt c w—inten—nt qu9on — ™réé notre v—ri—˜leD on v— pouvoir lui donner une v—leurF Aecter une valeur à une variable g9est tout ™e qu9il y — de plus ˜êteF ƒi vous voulez donner une v—leur à l— v—ri—˜le nom˜rehe†iesD il su0t de pro™éder ™omme ™e™i X nom˜rehe†ies a SY ‚ien de plus à f—ireF †ous indiquez le nom de l— v—ri—˜leD un signe ég—lD puis l— v—leur que vous voulez y mettreF s™iD on vient de donner l— v—leur S à l— v—ri—˜le nom˜rehe†iesF xotre progr—mme ™omplet ressem˜le don™ à ™e™i X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜rehe†iesY nom˜rehe†ies a SY } return HY và en™oreD rien ne s9—0™he à l9é™r—nD tout se p—sse d—ns l— mémoireF uelque p—rt d—ns les tréfonds de votre ordin—teurD une petite ™—se de mémoire vient de prendre l— v—leur SF x9estE™e p—s m—gni(que c yn peut s9—muser si on veut à ™h—nger l— v—leur p—r l— suite X int nom˜rehe†iesY nom˜rehe†ies a SY nom˜rehe†ies a RY nom˜rehe†ies a QY h—ns ™et exempleD l— v—ri—˜le v— prendre d9—˜ord l— v—leur SD puis RD et en(n QF gomme votre ordin—teur est très r—pideD tout ™el— se p—sse extrêmement viteF †ous n9—vez p—s le temps de ™ligner des yeux que votre v—ri—˜le vient de prendre les v—leurs SD R et QF F F et ç— y estD votre progr—mme est (niF SU .DÉCLARER UNE VARIABLE Une petite astuce à connaître : si vous avez plusieurs variables du même type à déclarer. Il vous sut de séparer les diérents noms de variables par des virgules sur la même ligne : int nom˜rehe†iesD nive—uD —gehutoueurY Cela créera trois variables —gehutoueur. int appelées nom˜rehe†ies.

quelle valeur a-t-elle au départ ? in e'etD qu—nd l9ordin—teur lit ™ette ligne X int nom˜rehe†iesY il réserve un petit empl—™ement en mémoireD d9—™™ordF w—is quelle est l— v—leur de l— v—ri—˜le à ™e momentElà c ‰ —EtEil une v—leur p—r déf—ut @p—r exemple HA c ih ˜ienD —™™ro™hezEvous X l— réponse est nonF xonD non et nonD il n9y — p—s de v—leur p—r déf—utF in f—itD l9empl—™ement est réservé m—is l— v—leur ne ™h—nge p—sF yn n9e'—™e p—s ™e qui se trouve d—ns l—  ™—se mémoire F hu ™oupD votre v—ri—˜le prend l— v—leur qui se trouv—it là —v—nt d—ns l— mémoireD et cette valeur peut être n'importe quoi 3 ƒi ™ette zone de l— mémoire n9— j—m—is été modi(éeD l— v—leur est peutEêtre HF w—is vous n9en êtes p—s sûrsD il pourr—it très ˜ien y —voir le nom˜re QTQ ou IV à l— pl—™eD ™9estEàEdire un reste d9un vieux progr—mme qui est p—ssé p—r là —v—nt 3 sl f—ut don™ f—ire très —ttention à ç— si on veut éviter des pro˜lèmes p—r l— suiteF ve mieux est d9initi—liser l— v—ri—˜le dès qu9on l— dé™l—reF in gD ™9est tout à f—it possi˜leF in grosD ç— ™onsiste à ™om˜iner l— dé™l—r—tion et l9—'e™t—tion d9une v—ri—˜le d—ns l— même instru™tion X int nom˜rehe†ies a SY s™iD l— v—ri—˜le nom˜rehe†ies est dé™l—rée et prend tout de suite l— v—leur SF v9—v—nt—geD ™9est que vous êtes sûrs —près que ™ette v—ri—˜le ™ontient une v—leur ™orre™teD et p—s du n9importe quoiF Les constantes sl —rrive p—rfois que l9on —it ˜esoin d9utiliser une v—ri—˜le dont on voudr—it qu9elle g—rde l— même v—leur pend—nt toute l— durée du progr—mmeF g9estEàEdire qu9une fois dé™l—réeD vous voudriez que votre v—ri—˜le ™onserve s— v—leur et que personne n9—it le droit de ™h—nger ™e qu9elle ™ontientF ges v—ri—˜les p—rti™ulières sont —ppelées constantesD justement p—r™e que leur v—leur reste ™onst—nteF €our dé™l—rer une ™onst—nteD ™9est en f—it très simple X il f—ut utiliser le mot ™onst juste dev—nt le type qu—nd vous dé™l—rez votre v—ri—˜leF €—r —illeursD il f—ut o˜lig—toirement lui donner une v—leur —u moment de s— dé™l—r—tion ™omme on vient d9—pprendre à le f—ireF eprèsD il ser— trop t—rd X vous ne pourrez plus ™h—nger l— v—leur de l— ™onst—nteF ixemple de dé™l—r—tion de ™onst—nte X SV . UN MONDE DE VARIABLES La valeur d'une nouvelle variable †oi™i une question très import—nte que je veux vous soumettre X Quand on déclare une variable.CHAPITRE 4.

À p—rt ç—D une ™onst—nte s9utilise ™omme une v—ri—˜le norm—leD vous pouvez —0™her s— v—leur si vous le désirezF v— seule ™hose qui ™h—ngeD ™9est que si vous ess—yez de modi(er l— v—leur de l— ™onst—nte plus loin d—ns le progr—mmeD le ™ompil—teur vous indiquer— qu9il y — une erreur —ve™ ™ette ™onst—nteF ves erreurs de ™ompil—tion sont —0™hées en ˜—s de l9é™r—n @d—ns ™e que j9—ppelle l—  zone de l— mort D vous vous souvenez cAF h—ns un tel ™—sD le ™ompil—teur vous —0™her—it un mot doux du genre X ‘‡—rning“ —ssignment of re—dEonly v—ri—˜le 9xywf‚i•hi•†siƒ•sxs„seviƒ9 F 2 Acher le contenu d'une variable yn s—it —0™her du texte à l9é™r—n —ve™ l— fon™tion printfF w—inten—ntD on v— voir ™omment —0™her l— v—leur d9une v—ri—˜le —ve™ ™ette même fon™tionF yn utilise en f—it printf de l— même m—nièreD s—uf que l9on r—joute un sym˜ole spé™i—l à l9endroit où l9on veut —0™her l— v—leur de l— v—ri—˜leF €—r exemple X printf@4sl vous reste 7d vies4AY ge  sym˜ole spé™i—l dont je viens de vous p—rler est en f—it un 7 suivi de l— lettre  d F gette lettre permet d9indiquer ™e que l9on doit —0™herF  d signi(e que ™9est un nom˜re entierF sl existe plusieurs —utres possi˜ilitésD m—is pour des r—isons de simpli™ité on v— se ™ontenter de retenir ™es deuxElà X Symbole Signication 7d 7f xom˜re entier @exF X RA xom˜re dé™im—l @exF X SFIVA te vous p—rler—i des —utres sym˜oles en temps vouluF €our le momentD s—™hez que si vous voulez —0™her un int vous devez utiliser 7dD et pour un dou˜le vous utiliserez 7fF yn — presque (niF yn — indiqué qu9à un endroit pré™is on voul—it —0™her un nom˜re entierD m—is on n9— p—s pré™isé lequel 3 sl f—ut don™ indiquer à l— fon™tion printf quelle est l— v—ri—˜le dont on veut —0™her l— v—leurF €our ™e f—ireD vous devez t—per le nom de l— v—ri—˜le —près les guillemets et —près —voir r—jouté une virguleD ™omme ™e™i X 2. Traduction :  Triple idiot.AFFICHER LE CONTENU D'UNE VARIABLE ™onst int xywf‚i•hi•†siƒ•sxs„seviƒ a SY Ce n'est pas une obligation. mais par convention on écrit les noms des constantes entièrement en majuscules comme je viens de le faire là. Cela nous permet ainsi de distinguer facilement les constantes des variables. pourquoi tu essaies de modier la valeur d'une constante ?  SW . Notez qu'on utilise l'underscore _ à la place de l'espace.

UN MONDE DE VARIABLES printf@4sl vous reste 7d vies4D nom˜rehe†iesAY ve 7d ser— rempl—™é p—r l— v—ri—˜le indiquée —près l— virguleD à s—voir nom˜rehe†iesF yn se teste ç— d—ns un progr—mme c 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜rehe†ies a SY GG eu dép—rtD le joueur — S vies printf@4†ous —vez 7d vies’n4D nom˜rehe†iesAY printf@4BBBB f e w BBBB’n4AY GG và il se prend un gr—nd ™oup sur l— tête nom˜rehe†ies a RY GG sl vient de perdre une vie 3 printf@4eh desoleD il ne vous reste plus que 7d vies m—inten—nt 3’n’n4D → nom˜rehe†iesAY } return HY Ǘ pourr—it presque être un jeu vidéo @il f—ut juste ˜e—u™oup d9im—gin—tionAF ge proE gr—mme —0™he ™e™i à l9é™r—n X †ous —vez S vies BBBB f e w BBBB eh desoleD il ne vous reste plus que R vies m—inten—nt 3 †ous devriez re™onn—ître ™e qui se p—sse d—ns votre progr—mmeF IF eu dép—rt le joueur — S viesD on —0™he ç— d—ns un printfF PF insuiteD le joueur prend un ™oup sur l— tête @d9où le fewAF QF pin—lement il n9— plus que R viesD on —0™he ç— —ussi —ve™ un printfF frefD ™9est plutôt simpleF Acher plusieurs variables dans un même printf sl est possi˜le d9—0™her l— v—leur de plusieurs v—ri—˜les d—ns un seul printfF sl vous su0t pour ™el— d9indiquer des 7d ou des 7f là où vous voulezD puis d9indiquer les v—ri—˜les ™orrespond—ntes d—ns le même ordreD sép—rées p—r des virgulesF €—r exemple X printf@4†ous —vez 7d vies et vous etes —u nive—u n¦ 7d4D nom˜rehe†iesD nive—uAY TH .CHAPITRE 4.

RÉCUPÉRER UNE SAISIE Veillez à bien indiquer vos variables dans le bon ordre. pourquoi mettre un & devant le nom de la variable ? TI . votre phrase ne voudra plus rien dire. Le premier 7d sera remplacé par la première variable (nom˜rehe†ies). Si vous vous trompez d'ordre. ellezD un petit test m—inten—ntF xotez que j9enlève les lignes tout en h—ut @les dire™tives de prépro™esseur ™ommenç—nt p—r un 5AD je v—is supposer que vous les mettez à ™h—que fois m—inten—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜rehe†ies a SD nive—u a IY printf@4†ous —vez 7d vies et vous etes —u nive—u n¦ 7d’n4D nom˜rehe†iesD nive—u → AY } return HY ge qui —0™her— X †ous —vez S vies et vous etes —u nive—u n¦ I Récupérer une saisie ves v—ri—˜les vont en f—it ™ommen™er à devenir intéress—ntes m—inten—ntF yn v— —pE prendre à dem—nder à l9utilis—teur de t—per un nom˜re d—ns l— ™onsoleF ge nom˜reD on v— le ré™upérer et le sto™ker d—ns une v—ri—˜leF …ne fois que ç— ser— f—itD on pourr— f—ire tout un t—s de ™hoses —ve™D vous verrezF €our dem—nder à l9utilis—teur d9entrer quelque ™hose d—ns l— ™onsoleD on v— utiliser une —utre fon™tion toute prête X s™—nfF gette fon™tion ressem˜le ˜e—u™oup à printfF †ous devez mettre un 7d pour indiquer que l9utilis—teur doit entrer un nom˜re entier @pour les dé™im—uxD je v—is y revenirAF €uis vous devez ensuite indiquer le nom de l— v—ri—˜le qui v— re™evoir le nom˜reF †oi™i ™omment f—ire p—r exemple X int —ge a HY s™—nf@47d4D 8—geAY yn doit mettre le 7d entre guillemetsF €—r —illeursD il f—ut mettre le sym˜ole 8 dev—nt le nom de l— v—ri—˜le qui v— re™evoir l— v—leurF Euh. et le second 7d par la seconde variable (nive—u).

dou˜le poids a HY s™—nf@47lf4D 8poidsAY ‚evenons à notre progr—mmeF vorsque ™eluiE™i —rrive à un s™—nfD il se met en p—use et —ttend que l9utilis—teur entre un nom˜reF ge nom˜re ser— sto™ké d—ns l— v—ri—˜le —geF †oi™i un petit progr—mme simple qui dem—nde l9âge de l9utilis—teur et qui le lui —0™he ensuite X int m—in@int —rg™D ™h—r B—rgv‘“A { int —ge a HY GG yn initi—lise l— v—ri—˜le à H printf@4uel —ge —vezEvous c 4AY s™—nf@47d4D 8—geAY GG yn dem—nde d9entrer l9âge —ve™ s™—nf printf@4eh 3 †ous —vez don™ 7d —ns 3’n’n4D —geAY } return HY   £ gode we˜ X WWPIVT ¡ ¢ uel —ge —vezEvous c PH eh 3 †ous —vez don™ PH —ns 3 ve progr—mme se met don™ en p—use —près —voir —0™hé l— question  uel —ge —vezE vous c F ve ™urseur —pp—r—ît à l9é™r—nD vous devez t—per un nom˜re entier @votre âgeAF „—pez ensuite sur  intrée pour v—liderD et le progr—mme ™ontinuer— à s9exé™uterF s™iD tout ™e qu9il f—it —près ™9est —0™her l— v—leur de l— v—ri—˜le —ge à l9é™r—n @ Ah ! Vous avez donc 20 ans ! AF †oilàD vous —vez ™ompris le prin™ipeF qrâ™e à l— fon™tion s™—nfD on peut don™ ™ommenE ™er à inter—gir —ve™ l9utilis—teurF xotez que rien ne vous empê™he de t—per —utre ™hose qu9un nom˜re entier X ! si vous rentrez un nom˜re dé™im—lD ™omme PFWD il ser— —utom—tiquement tronquéD ™9estEàEdire que seule l— p—rtie entière ser— ™onservéeF h—ns ™e ™—sD ™9est le nom˜re P qui —ur—it été sto™ké d—ns l— v—ri—˜le Y TP . 7lf. . C'est une petite diérence avec le printf qui lui prenait 7f. cette fois il ne faut pas utiliser 7f comme on pourrait s'y attendre mais. .CHAPITRE 4. UN MONDE DE VARIABLES vàD il v— f—lloir que vous me f—ssiez ™on(—n™eF ƒi je dois vous expliquer ç— tout de suiteD on n9est p—s sortis de l9—u˜ergeD ™royezEmoi 3 ue je vous r—ssure qu—nd même X je vous expliquer—i un peu plus t—rd ™e que signi(e ™e sym˜oleF €our le momentD je ™hoisis de ne p—s vous l9expliquer pour ne p—s vous em˜rouillerD ™9est don™ plutôt un servi™e que je vous rends là 3 Attention : si vous voulez faire entrer un nombre décimal (de type dou˜le).

RÉCUPÉRER UNE SAISIE ! si vous t—pez des lettres —u h—s—rd @ éèydf AD l— v—ri—˜le ne ™h—nger— p—s de v—leurF ge qui est ˜ien i™iD ™9est qu9on —v—it initi—lisé notre v—ri—˜le à H —u dé˜utF he ™e f—itD le progr—mme —0™her—  H —ns si ç— n9— p—s m—r™héF ƒi on n9—v—it p—s initi—lisé l— v—ri—˜leD le progr—mme —ur—it pu —0™her n9importe quoi 3 En résumé ! xos ordin—teurs possèdent plusieurs types de mémoireF he l— plus r—pide à l— plus lente X les registresD l— mémoire ™—™heD l— mémoire vive et le disque durF ! €our  retenir des inform—tionsD notre progr—mme — ˜esoin de sto™ker des données d—ns l— mémoireF sl utilise pour ™el— l— mémoire vive F ! h—ns notre ™ode sour™eD les variables sont des données sto™kées tempor—irement en mémoire viveF v— v—leur de ™es données peut ™h—nger —u ™ours du progr—mmeF ! À l9opposéD on p—rle de constantes pour des données sto™kées en mémoire viveF v— v—leur de ™es données ne peut p—s ™h—ngerF ! sl existe plusieurs types de v—ri—˜lesD qui o™™upent plus ou moins d9esp—™e en mémoireF gert—ins types ™omme int sont prévus pour sto™ker des nom˜res entiersD t—ndis que d9—utres ™omme dou˜le sto™kent des nom˜res dé™im—uxF ! v— fon™tion s™—nf permet de dem—nder à l9utilis—teur de s—isir un nom˜reF 3 3. TQ . mais cela fonctionne automatiquement. Les registres et la mémoire cache sont aussi utilisés pour augmenter les performances. nous n'avons pas à nous en préoccuper.

CHAPITRE 4. UN MONDE DE VARIABLES TR .

à savoir les variables. Nous réutiliserons ce que nous venons tout juste d'apprendre.Chapitre 5 Diculté : Une bête de calcul J e vous l'ai dit dans le chapitre précédent : votre ordinateur n'est en fait qu'une grosse machine à calculer. TS . L'idée. Ce chapitre va vous apprendre à réaliser la plupart des calculs qu'un ordinateur sait faire. Même si vous n'êtes pas fan des mathématiques. c'est justement de faire des calculs avec vos variables : ajouter des variables entre elles. les multiplier. Que vous soyez en train d'écouter de la musique. regarder un lm ou jouer à un jeu vidéo. enregistrer le résultat dans une autre variable. votre ordinateur ne fait que des calculs. etc. ce chapitre vous sera absolument indispensable.

Je vous expliquerai ce que c'est si vous ne savez pas. UNE BÊTE DE CALCUL Les calculs de base sl f—ut s—voir qu9en plus de n9être qu9une vulg—ire ™—l™ul—tri™eD votre ordin—teur est une ™—l™ul—tri™e très ˜—sique puisqu9on ne peut f—ire que des opér—tions très simples X ! —ddition Y ! soustr—™tion Y ! multipli™—tion Y ! division Y ! modulo F ƒi vous voulez f—ire des opér—tions plus ™ompliquées @des ™—rrésD des puiss—n™esD des log—rithmes et —utres joyeusetésA il vous f—udr— les progr—mmerD ™9estEàEdire expliquer à l'ordinateur comment les faireF port heureusementD nous verrons plus loin d—ns ™e ™h—pitre qu9il existe une ˜i˜liothèque m—thém—tique livrée —ve™ le l—ng—ge g qui ™ontient des fon™tions m—thém—tiques toutes prêtesF †ous n9—urez don™ p—s à les réé™rireD à moins que vous souh—itiez volont—irement p—sser un s—le qu—rt d9heure @ou que vous soyez prof de m—thsAF †oyons don™ l9—ddition pour ™ommen™erF €our f—ire une —dditionD on utilise le signe C @s—ns ˜l—gue 3AF †ous devez mettre le résult—t de votre ™—l™ul d—ns une v—ri—˜leF yn v— don™ p—r exemple ™réer une v—ri—˜le result—t de type int et f—ire un ™—l™ul X 1 int result—t a HY result—t a S C QY €—s ˜esoin d9être un pro du ™—l™ul ment—l pour deviner que l— v—ri—˜le result—t ™ontiendr— l— v—leur V —près exé™utionF fien sûrD rien ne s9—0™he à l9é™r—n —ve™ ™e ™odeF ƒi vous voulez voir l— v—leur de l— v—ri—˜leD r—joutez un printf ™omme vous s—vez m—inten—nt si ˜ien le f—ire X printf@4S C Q a 7d4D result—tAY À l9é™r—nD ™el— donner— X S C Q a V †oilà pour l9—dditionF €our les —utres opér—tionsD ™9est l— même ™hoseD seul le signe utilisé ™h—nge @voir t—˜F SFIAF ƒi vous —vez déjà utilisé l— ™—l™ul—tri™e sur votre ordin—teurD vous devriez ™onn—ître ™es signesF sl n9y — p—s de di0™ulté p—rti™ulière pour ™es opér—tionsD à p—rt pour les deux dernières @l— division et le moduloAF xous —llons don™ p—rler un peu plus en dét—il de ™h—™une d9ellesF 1. TT . pas de panique.CHAPITRE 5.

TU . Aussi appelée  division euclidienne . il aurait pu stocker un nombre décimal à l'intérieur ! ih nonD ™e n9est p—s l— r—ison 3 iss—yez le même ™ode en tr—nsform—nt juste result—t en dou˜leD et vous verrez qu9on vous —0™he qu—nd même PF €—r™e que les nom˜res de l9opér—tion sont des nom˜res entiersD l9ordin—teur répond p—r un nom˜re entierF ƒi on veut que l9ordin—teur —0™he le ˜on résult—tD il v— f—lloir tr—nsformer les nom˜res S et P de l9opér—tion en nom˜res dé™im—uxD ™9estEàEdire é™rire SFH et PFH @™e sont les mêmes nom˜resD m—is l9ordin—teur ™onsidère que ™e sont des nom˜res dé™im—uxD don™ il f—it une division de nom˜res dé™im—uxA X dou˜le result—t a HY 2.LES CALCULS DE BASE eddition C ƒoustr—™tion E wultipli™—tion B hivision G wodulo 7 Table SFI ! ƒignes des opér—teurs Opération Signe La division ves divisions fon™tionnent norm—lement sur un ordin—teur qu—nd il n9y — p—s de resteF €—r exempleD T G Q font PD votre ordin—teur vous donner— l— réponse justeF tusqueElà p—s de sou™iF w—is prenons m—inten—nt une division —ve™ reste ™omme S G PF F F ve résult—t devr—it être PFSF it pourt—nt 3 ‚eg—rdez ™e que f—it ™e ™ode X int result—t a HY result—t a S G PY printf @4S G P a 7d4D result—tAY S G P a P sl y — un gros pro˜lèmeF yn — dem—ndé S G PD on s9—ttend à —voir PFSD et l9ordin—teur nous dit que ç— f—it P 3 sl y — —nguille sous ro™heF xos ordin—teurs ser—ientEils stupides à ™e point c in f—itD qu—nd il voit les ™hi'res S et PD votre ordin—teur f—it une division de nom˜res entiers F gel— veut dire qu9il tronque le résult—tD il ne g—rde que l— p—rtie entière @le PAF 2 Hé mais je sais pourquoi ! C'est parce que result—t est un int ! Si ça avait été un double.

CHAPITRE 5. UNE BÊTE DE CALCUL result—t a SFH G PFHY printf @4S G P a 7f4D result—tAY S G P a PFSHHHHH vàD le nom˜re est ™orre™tF fon X il —0™he des tonnes de zéros derrière si ç— lui ™h—nteD m—is le résult—t reste qu—nd même ™orre™tF gette propriété de l— division de nom˜res entiers est très import—nteF sl f—ut que vous reteniez que pour un ordin—teur X ! S G P a PY ! IH G Q a Q Y ! R G S a HF g9est un peu surpren—ntD m—is ™9est s— f—çon de ™—l™uler —ve™ des entiersF ƒi vous voulez —voir un résult—t dé™im—lD il f—ut que les nom˜res de l9opér—tion soient dé™im—ux X ! SFH G PFH a PFS Y ! IHFH G QFH a QFQQQQQ Y ! RFH G SFH a HFVF in f—itD en f—is—nt une division d9entiers ™omme S G PD votre ordin—teur répond à l— question  gom˜ien y —EtEil de fois P d—ns le nom˜re S c F v— réponse est deux foisF he mêmeD  ™om˜ien de fois y —EtEil le nom˜re Q d—ns IH c „rois foisF w—is —lors me direzEvousD ™omment on f—it pour ré™upérer le reste de l— division c g9est là que superEmodulo intervientF Le modulo ve modulo est une opér—tion m—thém—tique qui permet d9o˜tenir le reste d'une divisionF g9est peutEêtre une opér—tion moins ™onnue que les qu—tre —utresD m—is pour votre ordin—teur ç— reste une opér—tion de ˜—seF F F pro˜—˜lement pour justement ™om˜ler le pro˜lème de l—  division d9entiers qu9on vient de voirF ve moduloD je vous l9—i dit tout à l9heureD se représente p—r le signe 7F †oi™i quelques exemples de modulos X ! S 7 P a IY ! IR 7 Q a P Y ! R 7 P a HF ve modulo S 7 P est le reste de l— division S G PD ™9estEàEdire IF v9ordin—teur ™—l™ule que S a P B P C I @™9est ™e ID le resteD que le modulo renvoieAF he mêmeD IR 7 QD le ™—l™ul est IR a Q B R C P @modulo renvoie le PAF in(nD pour R 7 PD l— division tom˜e justeD il n9y — p—s de resteD don™ modulo renvoie HF †oilàD il n9y — rien à —jouter —u sujet des modulosF te ten—is juste à l9expliquer à ™eux qui ne ™onn—îtr—ient p—sF TV .

LES CALCULS DE BASE in plus j9—i une ˜onne nouvelle X on — vu toutes les opér—tions de ˜—seF pinis les ™ours de m—ths 3 Des calculs entre variables ge qui ser—it intéress—ntD m—inten—nt que vous s—vez f—ire les ™inq opér—tions de ˜—seD ™e ser—it de s9entr—îner à f—ire des ™—l™uls entre plusieurs v—ri—˜lesF in e'etD rien ne vous empê™he de f—ire X result—t a nom˜reI C nom˜rePY gette ligne f—it l— somme des v—ri—˜les nom˜reI et nom˜rePD et sto™ke le résult—t d—ns l— v—ri—˜le result—tF it ™9est là que les ™hoses ™ommen™ent à devenir très intéress—ntesF „enezD il me vient une idéeF †ous —vez m—inten—nt déjà le nive—u pour ré—liser une miniE™—l™ul—tri™eF ƒiD siD je vous —ssure 3 sm—ginez un progr—mme qui dem—nde deux nom˜res à l9utilis—teurF ges deux nom˜resD vous les sto™kez d—ns des v—ri—˜lesF insuiteD vous f—ites l— somme de ™es v—ri—˜les et vous sto™kez le résult—t d—ns une v—ri—˜le —ppelée result—tF †ous n9—vez plus qu9à —0™her le résult—t du ™—l™ul à l9é™r—nD sous les yeux 阗his de l9utilis—teur qui n9—ur—it j—m—is été ™—p—˜le de ™—l™uler ™el— de tête —ussi viteF iss—yez de ™oder vousEmêmes ™e petit progr—mmeD ™9est f—™ile et ç— vous entr—îner— 3 v— réponse est ™iEdessous X int m—in@int —rg™D ™h—r B—rgv‘“A { int result—t a HD nom˜reI a HD nom˜reP a HY GG yn dem—nde les nom˜res I et P à l9utilis—teur X printf@4intrez le nom˜re I X 4AY s™—nf@47d4D 8nom˜reIAY printf@4intrez le nom˜re P X 4AY s™—nf@47d4D 8nom˜rePAY GG yn f—it le ™—l™ul X result—t a nom˜reI C nom˜rePY GG it on —ffi™he l9—ddition à l9é™r—n X printf @47d C 7d a 7d’n4D nom˜reID nom˜rePD result—tAY } return HY TW .

il doit en faire des milliards en une seule seconde ! UH . Encore heureux. parce que des opérations comme ça. UNE BÊTE DE CALCUL £   gode we˜ X PSTRSP ¡ ¢ intrez le nom˜re I X QH intrez le nom˜re P X PS QH C PS a SS ƒ—ns en —voir l9—irD on vient de f—ire là notre premier progr—mme —y—nt un intérêtF xotre progr—mme est ™—p—˜le d9—dditionner deux nom˜res et d9—0™her le résult—t de l9opér—tion 3 †ous pouvez ess—yer —ve™ n9importe quel nom˜re @du moment que vous ne dép—ssez p—s les limites d9un type intAD votre ordin—teur e'e™tuer— le ™—l™ul en un é™l—ir F te vous ™onseille de f—ire l— même ™hose —ve™ les —utres opér—tions pour vous entr—îner @soustr—™tionD multipli™—tionF F FAF †ous ne devriez p—s —voir trop de m—l vu qu9il y — juste un ou deux signes à ™h—ngerF †ous pouvez —ussi —jouter une troisième v—ri—˜le et f—ire l9—ddition de trois v—ri—˜les à l— foisD ç— fon™tionne s—ns pro˜lème X 3 result—t a nom˜reI C nom˜reP C nom˜reQY Les raccourcis gomme promisD nous n9—vons p—s de nouvelles opér—tions à voirF it pour ™—use 3 xous les ™onn—issons déjà toutesF g9est —ve™ ™es simples opér—tions de ˜—se que vous pouvez tout ™réerF sl n9y — p—s ˜esoin d9—utres opér—tionsF te re™onn—is que ™9est di0™ile à —v—lerD se dire qu9un jeu Qh ne f—it rien d9—utre —u (n—l que des —dditions et des soustr—™tionsD pourt—ntF F F ™9est l— stri™te véritéF ge™i ét—ntD il existe en g des te™hniques permett—nt de r—™™our™ir l9é™riture des opéE r—tionsF €ourquoi utiliser des r—™™our™is c €—r™e queD souventD on f—it des opér—tions répétitivesF †ous —llez voir ™e que je veux dire p—r là tout de suiteD —ve™ ™e qu9on —ppelle l9in™rément—tionF L'incrémentation †ous verrez que vous serez souvent —menés à —jouter I à une v—ri—˜leF eu fur et à mesure du progr—mmeD vous —urez des v—ri—˜les qui —ugmentent de I en IF sm—ginons que votre v—ri—˜le s9—ppelle nom˜re @nom très origin—lD n9estE™e p—s cAF ƒ—uriezE vous ™omment f—ire pour —jouter I à ™ette v—ri—˜leD s—ns s—voir quel est le nom˜re qu9elle ™ontient c †oi™i ™omment on doit f—ire X nom˜re a nom˜re C IY 3.CHAPITRE 5.

le C++ permet surtout de programmer diéremment mais il n'est pas  meilleur  que le C : juste diérent. C'est en fait un clin d'oeil des programmeurs. vous avez d'ailleurs remarqué que ce signe ++ se trouve dans le nom du langage C++. c'est-à-dire si on veut  du langage C à un niveau supérieur . et vous êtes maintenant capables de le comprendre ! C++ signie qu'il s'agit du langage C  incrémenté .LES RACCOURCIS ue se p—sseEtEil i™i c yn f—it le ™—l™ul nom˜re C ID et on r—nge ™e résult—t d—ns l— v—ri—˜leF F F nom˜re 3 hu ™oupD si notre v—ri—˜le nom˜re v—l—it RD elle v—ut m—inten—nt SF ƒi elle v—l—it VD elle v—ut m—inten—nt WD et™F gette opér—tion est justement répétitiveF ves inform—ti™iens ét—nt des gens p—rti™ulièE rement f—iné—ntsD ils n9—v—ient guère envie de t—per deux fois le même nom de v—ri—˜le @˜en oui quoiD ™9est f—tig—nt 3AF sls ont don™ inventé un r—™™our™i pour ™ette opér—E tion qu9on —ppelle l'incrémentationF gette instru™tion produit ex—™tement le même résult—t que le ™ode qu9on vient de voir X nom˜reCCY gette ligneD ˜ien plus ™ourte que ™elle de tout à l9heureD signi(e  ejoute I à l— v—ri—˜le nom˜re F sl su0t d9é™rire le nom de l— v—ri—˜le à in™rémenterD de mettre deux signes CD et ˜ien entenduD de ne p—s ou˜lier le pointEvirguleF wine de rienD ™el— nous ser— ˜ien pr—tique p—r l— suite ™—rD ™omme je vous l9—i ditD on ser— souvent —menés à f—ire des in™rément—tions @™9estEàEdire —jouter I à une v—ri—˜leAF Si vous êtes perspicaces. En pratique. La décrémentation g9est tout ˜êtement l9inverse de l9in™rément—tion X on enlève I à une v—ri—˜leF wême si on f—it plus souvent des in™rément—tions que des dé™rément—tionsD ™el— reste une opér—tion pr—tique que vous utiliserez de temps en tempsF v— dé™rément—tionD si on l9é™rit en forme  longue X nom˜re a nom˜re E IY it m—inten—nt en forme  r—™™our™ie X nom˜reEEY yn l9—ur—it presque deviné tout seul 3 eu lieu de mettre un CCD vous mettez un EE X si votre v—ri—˜le v—ut TD elle v—udr— S —près l9instru™tion de dé™rément—tionF Les autres raccourcis sl existe d9—utres r—™™our™is qui fon™tionnent sur le même prin™ipeF gette foisD ™es r—™™our™is fon™tionnent pour toutes les opér—tions de ˜—se X C E B G 7F UI .

UNE BÊTE DE CALCUL gel— permet là en™ore d9éviter une répétition du nom d9une v—ri—˜le sur une même ligneF einsiD si vous voulez multiplier p—r deux une v—ri—˜le X nom˜re a nom˜re B PY †ous pouvez l9é™rire d9une f—çon r—™™our™ie ™omme ™e™i X nom˜re Ba PY ƒi le nom˜re v—ut S —u dép—rtD il v—udr— IH —près ™ette instru™tionF €our les —utres opér—tions de ˜—seD ™el— fon™tionne de l— même m—nièreF †oi™i un petit progr—mme d9exemple X int nom˜re a PY nom˜re nom˜re nom˜re nom˜re nom˜re Ca Ea Ba Ga 7a RY QY SY QY QY GG GG GG GG GG nom˜re v—ut TFFF FFF nom˜re v—ut m—inten—nt Q FFF nom˜re v—ut IS FFF nom˜re v—ut S FFF nom˜re v—ut P @™—r S a I B Q C PA (Ne boudez pas. Si vous ne savez pas ce que c'est. UP .CHAPITRE 5. c'est que vous êtes peut-être un peu trop jeunes ou que vous n'avez pas assez fait de maths dans votre vie. un peu de calcul mental n'a jamais tué personne !) v9—v—nt—ge i™i est qu9on peut utiliser toutes les opér—tions de ˜—seD et qu9on peut —jouE terD soustr—ireD multiplier p—r n9importe quel nom˜reF ge sont des r—™™our™is à ™onn—ître si vous —vez un jour des lignes répétitives à t—per d—ns un progr—mmeF ‚etenez qu—nd même que l9in™rément—tion reste de loin le r—™™our™i le plus utiliséF La bibliothèque mathématique in l—ng—ge gD il existe ™e qu9on —ppelle des ˜i˜liothèques  st—nd—rd D ™9estEàEdire des ˜i˜liothèques toujours utilis—˜lesF ge sont en quelque sorte des ˜i˜liothèques  de ˜—se qu9on utilise très souventF ves ˜i˜liothèques sontD je vous le r—ppelleD des ensem˜les de fon™tions toutes prêtesF ges fon™tions ont été é™rites p—r des progr—mmeurs —v—nt vousD elles vous évitent en quelque sorte d9—voir à réinventer l— roue à ™h—que nouve—u progr—mmeF †ous —vez déjà utilisé les fon™tions printf et s™—nf de l— ˜i˜liothèque stdioFhF sl f—ut s—voir qu9il existe une —utre ˜i˜liothèqueD —ppelée m—thFhD qui ™ontient de nom˜reuses fon™tions m—thém—tiques toutes prêtesF in e'etD les ™inq opér—tions de ˜—se que l9on — vues sont loin d9être su0s—ntes 3 fonD il se peut que vous n9—yez j—m—is ˜esoin de ™ert—ines opér—tions ™omplexes ™omme les exponentielles F „outefoisD l— ˜i˜liothèque m—thém—tique ™ontient de nom˜reuses —utres fon™tions dont vous —urez très pro˜—˜lement ˜esoinF 4 4.

cela ne vous pénalisera pas pour la suite. on ne dirait pas comme ça. Ceci étant. sauf qu'elle utilise des entiers (int). UQ .LA BIBLIOTHÈQUE MATHÉMATIQUE „enez p—r exempleD on ne peut p—s f—ire de puiss—n™es en g 3 gomment ™—l™uler un simple ™—rré c †ous pouvez toujours ess—yer de t—per S2 d—ns votre progr—mmeD m—is votre ordin—teur ne le ™omprendr— j—m—is ™—r il ne s—it p—s ™e que ™9estF F F À moins que vous le lui expliquiez en lui indiqu—nt l— ˜i˜liothèque m—thém—tique 3 €our pouvoir utiliser les fon™tions de l— ˜i˜liothèque m—thém—tiqueD il est indispens—˜le de mettre l— dire™tive de prépro™esseur suiv—nte en h—ut de votre progr—mme X 5in™lude `m—thFhb …ne fois que ™9est f—itD vous pouvez utiliser toutes les fon™tions de ™ette ˜i˜liothèqueF t9—i justement l9intention de vous les présenterF fon X ™omme il y — ˜e—u™oup de fon™E tionsD je ne peux p—s en f—ire l— liste ™omplète i™iF h9une p—rt ç— vous fer—it trop à —ssimilerD et d9—utre p—rt mes p—uvres petits doigts —ur—ient fondu —v—nt l— (n de l9é™riture du ™h—pitreF te v—is don™ me ™ontenter des fon™tions prin™ip—lesD ™9estEàEdire ™elles qui me sem˜lent les plus import—ntesF Vous n'avez peut-être pas tous le niveau en maths pour comprendre ce que font ces fonctions. Lisez juste. Si c'est votre cas. Elle renvoie donc un nombre entier de type int et non un dou˜le comme f—˜s. pas d'inquiétude. mais en fait ça nit par servir ! fabs gette fon™tion retourne l— v—leur —˜solue d9un nom˜reD ™9estEàEdire |x| @™9est l— not—tion m—thém—tiqueAF v— v—leur —˜solue d9un nom˜re est s— v—leur positive X ! si vous donnez ESQ à l— fon™tionD elle vous renvoie SQ Y ! si vous donnez SQ à l— fon™tionD elle vous renvoie SQF in ˜refD elle renvoie toujours l9équiv—lent positif du nom˜re que vous lui donnezF dou˜le —˜solu a HD nom˜re a EPUY —˜solu a f—˜s@nom˜reAY GG —˜solu v—udr— PU gette fon™tion renvoie un dou˜leD don™ votre v—ri—˜le —˜solu doit être de type dou˜leF Il existe aussi une fonction similaire appelée —˜s. je vous ore un petit conseil gratuit : soyez attentifs en cours de maths. située cette fois dans La fonction —˜s marche de la même manière. stdli˜Fh.

CHAPITRE 5. UNE BÊTE DE CALCUL ceil gette fon™tion renvoie le premier nom˜re entier —près le nom˜re dé™im—l qu9on lui donneF g9est une sorte d9—rrondiF yn —rrondit en f—it toujours —u nom˜re entier supéE rieurF €—r exempleD si on lui donne PTFSIPD l— fon™tion renvoie PUF gette fon™tion s9utilise de l— même m—nière et renvoie un dou˜le X dou˜le dessus a HD nom˜re a SPFUIY dessus a ™eil@nom˜reAY GG dessus v—udr— SQ oor g9est l9inverse de l— fon™tion pré™édente X ™ette foisD elle renvoie le nom˜re dire™tement en dessousF ƒi vous lui donnez QUFWID l— fon™tion floor vous renverr— don™ QUF pow gette fon™tion permet de ™—l™uler l— puiss—n™e d9un nom˜reF †ous devez lui indiquer deux v—leurs X le nom˜re et l— puiss—n™e à l—quelle vous voulez l9éleverF †oi™i le s™hém— de l— fon™tion X pow@nom˜reD puiss—n™eAY €—r exempleD  P puiss—n™e Q @que l9on é™rit h—˜ituellement P”Q sur un ordin—teurAD ™9est le ™—l™ul P B P B PD ™e qui f—it V X dou˜le result—t a HD nom˜re a PY result—t a pow@nom˜reD QAY GG result—t v—udr— P”Q a V †ous pouvez don™ utiliser ™ette fon™tion pour ™—l™uler des ™—rrésF sl su0t d9indiquer une puiss—n™e de PF sqrt gette fon™tion ™—l™ule l— r—™ine ™—rrée d9un nom˜reF ille renvoie un dou˜leF dou˜le result—t a HD nom˜re a IHHY result—t a sqrt@nom˜reAY GG result—t v—udr— IH UR .

6. atan ge sont les fon™tions —r™ sinusD —r™ ™osinus et —r™ t—ngenteD d9—utres fon™tions de trigoE nométrieF illes s9utilisent de l— même m—nière et renvoient un dou˜leF exp gette fon™tion ™—l™ule l9exponentielle d9un nom˜reF ille renvoie un dou˜le @ouiD ouiD elle —ussiAF log gette fon™tion ™—l™ule le log—rithme népérien d9un nom˜re @que l9on note —ussi  ln AF log10 gette fon™tion ™—l™ule le log—rithme ˜—se IH d9un nom˜reF En résumé ! …n ordin—teur n9est en f—it qu9une calculatrice géante X tout ™e qu9il s—it f—ireD ™e sont des opér—tionsF ! ves opér—tions ™onnues p—r votre ordin—teur sont très basiques X l9—dditionD l— sousE tr—™tionD l— multipli™—tionD l— division et le modulo F ! sl est possi˜le d9eectuer des calculs entre des variablesF g9est d9—illeurs ™e qu9un ordin—teur s—it f—ire de mieux X il le f—it ˜ien et viteF ! v9incrémentation est l9opér—tion qui ™onsiste à —jouter I à une v—ri—˜leF yn é™rit v—ri—˜leCCF ! v— décrémentation est l9opér—tion inverse X on retire I à une v—ri—˜leF yn é™rit don™ v—ri—˜leEEF ! €our —ugmenter le nom˜re d9opér—tions ™onnues p—r votre ordin—teurD il f—ut ™h—rger l— bibliothèque mathématique F ! gette ˜i˜liothèque ™ontient des fonctions mathématiques plus avancéesD telles que l— puiss—n™eD l— r—™ine ™—rréeD l9—rrondiD l9exponentielleD le log—rithmeD et™F 5 6 5. acos. tan ge sont les trois f—meuses fon™tions utilisées en trigonométrieF ve fon™tionnement est le mêmeD ™es fon™tions renvoient un dou˜leF ges fon™tions —ttendent une v—leur en radiansF asin. #include <math. cos.h> US .LA BIBLIOTHÈQUE MATHÉMATIQUE sin. Il s'agit du reste de la division.

UNE BÊTE DE CALCUL UT .CHAPITRE 5.

ils reprennent les principes de base de leurs aînés. En fait le langage C a été créé il y a assez longtemps. Certains se ressemblent d'ailleurs : un grand nombre d'entre eux sont inspirés du langage C. ce qui fait qu'il a servi de modèle à de nombreux autres plus récents. Nous avons vu comment créer des variables.Chapitre 6 Diculté : Les conditions N ous avons vu dans le premier chapitre qu'il existait de nombreux langages de programmation. nous allons maintenant nous intéresser aux conditions. En parlant de principes de base : nous sommes en plein dedans. nos programmes informatiques feraient toujours la même chose ! UU . Sans conditions. La plupart des langages de programmation ont nalement des ressemblances. faire des calculs avec (concept commun à tous les langages de programmation !).

CHAPITRE 6. il y a bien deux symboles aa pour tester l'égalité.. else ves ™onditions permettent de tester des v—ri—˜lesF yn peut p—r exemple dire  si l— v—ri—˜le m—™hin est ég—le à SHD f—is ™e™i F F F w—is ™e ser—it domm—ge de ne pouvoir tester que l9ég—lité 3 sl f—udr—it —ussi pouvoir tester si l— v—ri—˜le est inférieure à SHD inférieure ou ég—le à SHD supérieureD supérieure ou ég—leF F F xe vous inquiétez p—sD le g — tout prévu 3 €our étudier les ™onditions ifFFF elseD nous —llons suivre le pl—n suiv—nt X IF quelques sym˜oles à ™onn—ître —v—nt de ™ommen™erD PF le test ifD QF le test elseD RF le test else ifD SF plusieurs ™onditions à l— foisD TF quelques erreurs ™our—ntes à éviterF ev—nt de voir ™omment on é™rit une ™ondition de type ifFFF else en gD il f—ut don™ que vous ™onn—issiez deux ou trois sym˜oles de ˜—seF ges sym˜oles sont indispens—˜les pour ré—liser des ™onditionsF Quelques symboles à connaître †oi™i un petit t—˜le—u de sym˜oles du l—ng—ge g à connaître par coeur X Symbole Signication aa b ` ba `a 3a est ég—l à est supérieur à est inférieur à est supérieur ou ég—l à est inférieur ou ég—l à est di'érent de Faites très attention. Une erreur courante que font les débutants et de ne mettre qu'un symbole a. LES CONDITIONS La condition if. ce qui n'a pas la même signication en C. Un if simple ett—quons m—inten—nt s—ns plus t—rderF xous —llons f—ire un test simpleD qui v— dire à l9ordin—teur X ƒs l— v—ri—˜le v—ut ç—D evy‚ƒ f—is ™e™iF UV . Je vous en reparlerai un peu plus bas..

ELSE in —ngl—isD le mot  si se tr—duit p—r ifF g9est ™elui qu9on utilise en l—ng—ge g pour introduire une ™onditionF ərivez don™ un ifF yuvrez ensuite des p—renthèses X à l9intérieur de ™es p—renthèses vous devrez é™rire votre ™onditionF insuiteD ouvrez une —™™ol—de { et fermezEl— un peu plus loin }F „out ™e qui se trouve à l9intérieur des —™™ol—des ser— exé™uté uniquement si l— ™ondition est véri(éeF gel— nous donne don™ à é™rire X if @GB †otre ™ondition BGA { GG snstru™tions à exé™uter si l— ™ondition est vr—ie } À l— pl—™e de mon ™omment—ire  †otre ™ondition D on v— é™rire une ™ondition pour tester une v—ri—˜leF €—r exempleD on pourr—it tester une v—ri—˜le —ge qui ™ontient votre âgeF „enez pour s9entr—înerD on v— tester si vous êtes m—jeurD ™9estEàEdire si votre âge est supérieur ou égal à 18 X if @—ge ba IVA { printf @4†ous etes m—jeur 34AY } ve sym˜ole ba signi(e  supérieur ou ég—l D ™omme on l9— vu d—ns le t—˜le—u tout à l9heureF S'il n'y a qu'une instruction entre les accolades (comme c'est le cas ici).LA CONDITION IF. Tester ce code ƒi vous voulez tester les ™odes pré™édents pour voir ™omment le if fon™tionneD il f—udr— pl—™er le if à l9intérieur d9une fon™tion m—in et ne p—s ou˜lier de dé™l—rer une v—ri—˜le —ge à l—quelle on donner— l— v—leur de notre ™hoixF gel— peut p—r—ître évident pour ™ert—insD m—is plusieurs le™teurs visi˜lement perdus m9ont en™our—gé à —jouter ™ette expli™—tionF †oi™i don™ un ™ode ™omplet que vous pouvez tester X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { int —ge a PHY UW ... Je recommande néanmoins de toujours mettre des accolades pour des raisons de clarté. alors celles-ci deviennent facultatives.

CHAPITRE 6. c'est qu'il code avec un style diérent. Ça ne change rien au fonctionnement du programme nal. Le else pour dire  sinon  w—inten—nt que nous s—vons f—ire un test simpleD —llons un peu plus loin X si le test n9— p—s m—r™hé @il est f—uxAD on v— dire à l9ordin—teur d9exé™uter d9—utres instru™tionsF in fr—nç—isD nous —llons don™ é™rire quelque ™hose qui ressem˜le à ™el— X VH . Le principal dans tous les cas étant que le code reste aéré et lisible. LES CONDITIONS if @—ge ba IVA { printf @4†ous etes m—jeur 3’n4AY } } return HY we˜ X SQQURT ¡ s™iD l— v—ri—˜le —ge v—ut PHD don™ le  †ous êtes m—jeur 3 s9—0™her—F iss—yez de ™h—nger l— v—leur initi—le de l— v—ri—˜le pour voirF wettez p—r exemple IS X l— ™ondition ser— f—usseD et don™  †ous êtes m—jeur 3 ne s9—0™her— p—s ™ette foisF …tilisez ™e ™ode de ˜—se pour tester les pro™h—ins exemples du ™h—pitreF Une question de propreté £ ¢gode   v— f—çon dont vous ouvrez les —™™ol—des n9est p—s import—nteD votre progr—mme fon™E tionner— —ussi ˜ien si vous é™rivez tout sur une même ligneF €—r exemple X if @—ge ba IVA { printf @4†ous etes m—jeur 34AY } €ourt—ntD même s9il est possi˜le d9é™rire ™omme ç—D ™9est absolument déconseilléF in e'etD tout é™rire sur une même ligne rend votre ™ode di0™ilement lisi˜leF ƒi vous ne prenez p—s dès m—inten—nt l9h—˜itude d9—érer votre ™odeD plus t—rd qu—nd vous é™rirez de plus gros progr—mmes vous ne vous y retrouverez plus 3 iss—yez don™ de présenter votre ™ode sour™e de l— même f—çon que moi X une —™™ol—de sur une ligneD puis vos instru™tions @pré™édées d9une t—˜ul—tion pour les  d陗ler vers l— droite AD puis l9—™™ol—de de fermeture sur une ligneF Il existe plusieurs bonnes façons de présenter son code source. mais c'est une question de  style informatique  si vous voulez. Si vous voyez le code de quelqu'un d'autre présenté un peu diéremment.

..LA CONDITION IF. ELSE ƒs l— v—ri—˜le v—ut ç—D evy‚ƒ f—is ™e™iD ƒsxyx f—is ™el—F sl su0t de r—jouter le mot else —près l9—™™ol—de ferm—nte du ifF €etit exemple X if @—ge ba IVA GG ƒi l9âge est supérieur ou ég—l à IV { printf @4†ous etes m—jeur 34AY } else GG ƒinonFFF { printf @4eh ™9est ˜eteD vous etes mineur 34AY } ves ™hoses sont —ssez simples X si l— v—ri—˜le —ge est supérieure ou ég—le à IVD on —0™he le mess—ge  †ous êtes m—jeur 3 D sinon on —0™he  †ous êtes mineur F Le else if pour dire  sinon si  yn — vu ™omment f—ire un  si et un  sinon F sl est possi˜le —ussi de f—ire un  sinon si pour f—ire un —utre test si le premier test n9— p—s m—r™héF ve  sinon si se pl—™e entre le if et le elseF yn dit d—ns ™e ™—s à l9ordin—teur X ƒs l— v—ri—˜le v—ut ç— evy‚ƒ f—is ™e™iD ƒsxyx ƒs l— v—ri—˜le v—ut ç— evy‚ƒ f—is ç—D ƒsxyx f—is ™el—F „r—du™tion en l—ng—ge g X if @—ge ba IVA GG ƒi l9âge est supérieur ou ég—l à IV { printf @4†ous etes m—jeur 34AY } else if @ —ge b R A GG ƒinonD si l9âge est —u moins supérieur à R { printf @4fon t9es p—s trop jeune qu—nd memeFFF4AY } else GG ƒinonFFF { printf @4eg— g—— —g— g———4AY GG v—ng—ge ˜é˜éD vous pouvez p—s ™omprendre } v9ordin—teur f—it les tests d—ns l9ordreF IF h9—˜ord il teste le premier if X si l— ™ondition est vr—ieD —lors il exé™ute ™e qui se trouve entre les premières —™™ol—desF VI .

xotez qu9on peut mettre —ut—nt de else if que l9on veutF yn peut don™ é™rire X ƒs l— v—ri—˜le v—ut ç—D evy‚ƒ f—is ™e™iD ƒsxyx ƒs l— v—ri—˜le v—ut ç— evy‚ƒ f—is ç—D ƒsxyx ƒs l— v—ri—˜le v—ut ç— evy‚ƒ f—is ç—D ƒsxyx ƒs l— v—ri—˜le v—ut ç— evy‚ƒ f—is ç—D ƒsxyx f—is ™el—F Plusieurs conditions à la fois sl peut —ussi être utile de f—ire plusieurs tests à l— fois d—ns votre ifF €—r exempleD vous voudriez tester si l9âge est supérieur à IV i„ si l9âge est inférieur à PSF €our f—ire ™el—D il v— f—lloir utiliser de nouve—ux sym˜oles X Symbole Signication 88 || 3 i„ y… xyx Test ET ƒi on veut f—ire le test que j9—i mentionné plus h—utD il f—udr— é™rire X if @—ge b IV 88 —ge ` PSA ves deux sym˜oles 88 signi(ent i„F xotre ™ondition se dir—it en fr—nç—is X  si l9âge est supérieur à IV i„ si l9âge est inférieur à PS F Test OU €our f—ire un y…D on utilise les deux signes ||F te dois —vouer que ™e signe n9est p—s f—™ilement —™™essi˜le sur nos ™l—viersF €our le t—per sur un ™l—vier ei‚„‰ fr—nç—isD il f—udr— f—ire elt qr C TF ƒur un ™l—vier ˜elgeD il f—udr— f—ire elt qr C 8F VP . LES CONDITIONS PF ƒinonD il v— —u  sinon si et f—it à nouve—u un test X si ™e test est vr—iD —lors il exé™ute les instru™tions ™orrespond—ntes entre —™™ol—desF QF in(nD si —u™un des tests pré™édents n9— m—r™héD il exé™ute les instru™tions du  sinon F Le else et le else if ne sont pas obligatoires. seul un if est nécessaire (logique me direz-vous. Pour faire une condition.CHAPITRE 6. sinon il n'y a pas de condition !).

. ELSE sm—ginons pour l9exemple un progr—mme stupide qui dé™ide si une personne — le droit d9ouvrir un ™ompte en ˜—nqueF g9est ˜ien ™onnuD pour ouvrir un ™ompte en ˜—nque il v—ut mieux ne p—s être trop jeune @on v— dire —r˜itr—irement qu9il f—ut —voir —u moins QH —nsA ou ˜ien —voir ˜e—u™oup d9—rgent @p—r™e que làD même à IH —ns on vous —™™epter— à ˜r—s ouverts 3AF xotre test pour s—voir si le ™lient — le droit d9ouvrir un ™ompte en ˜—nque pourr—it être X if @—ge b QH || —rgent b IHHHHHA { printf@4fienvenue ™hez €i™souf—nque 34AY } else { printf@4rors de m— vueD miser—˜le 34AY } ge test n9est v—lide que si l— personne — plus de QH —ns ou si elle possède plus de IHH HHH euros 3 Test NON ve dernier sym˜ole qu9il nous reste à tester est le point d9ex™l—m—tionF in inform—tiqueD le point d9ex™l—m—tion signi(e  non F †ous devez mettre ™e signe —v—nt votre ™ondition pour dire  si ™el— n9est p—s vr—i X if @3@—ge ` IVAA gel— pourr—it se tr—duire p—r  si l— personne n9est p—s mineure F ƒi on —v—it enlevé le 3 dev—ntD ™el— —ur—it signi(é l9inverse X  si l— personne est mineure F Quelques erreurs courantes de débutant N'oubliez pas les deux signes aa ƒi on veut tester si l— personne — tout juste IV —nsD il f—udr— é™rire X if @—ge aa IVA { printf @4†ous venez de devenir m—jeur 34AY } N'oubliez pas de mettre deux signes  ég—l d—ns un ifD ™omme ™e™i X aa ƒi vous ne mettez qu9un seul signe aD —lors votre v—ri—˜le prendra l— v—leur IV @™omme on l9— —ppris d—ns le ™h—pitre sur les v—ri—˜lesAF xous ™e qu9on veut f—ire i™iD ™9est tester l— v—leur de l— v—ri—˜leD non p—s l— ™h—nger 3 p—ites très —ttention à ™el—D ˜e—u™oup d9entre vous n9en mettent qu9un qu—nd ils dé˜utent et for™émentF F F leur progr—mme ne fon™tionne p—s ™omme ils voudr—ient 3 VQ .LA CONDITION IF..

LES CONDITIONS Le point-virgule de trop …ne —utre erreur ™our—nte de dé˜ut—nt X vous mettez p—rfois 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 instru™tion et non d9une ™onditionF ve ™ode suiv—nt ne m—r™her— p—s ™omme prévu ™—r il y — un pointEvirgule à l— (n du if X if @—ge aa IVAY GG xotez le pointEvirgule i™i qui ne devr—it €eƒ être là { printf @4„u es tout juste m—jeur4AY } Les booléens. le coeur des conditions xous —llons m—inten—nt entrer plus en dét—ils d—ns le fon™tionnement d9une ™ondition de type ifFFF elseF in e'etD les ™onditions font intervenir quelque ™hose qu9on —ppelle les booléens en inform—tiqueF Quelques petits tests pour bien comprendre xous —llons ™ommen™er p—r f—ire quelques petites expérien™es —v—nt d9introduire ™ette nouvelle notionF †oi™i un ™ode sour™e très simple que je vous propose de tester X if @IA { printf@4g9est vr—i4AY } else { printf@4g9est f—ux4AY } ‚ésult—t X g9est vr—i Mais ? On n'a pas mis de condition dans le if. Qu'est-ce que ça veut dire ? Ça n'a pas de sens. ƒiD ç— en —D vous —llez ™omprendreF p—ites un —utre test en rempl—ç—nt I p—r H X if @HA { printf@4g9est vr—i4AY VR .CHAPITRE 6. juste un nombre.

LE COEUR DES CONDITIONS } else { printf@4g9est f—ux4AY } ‚ésult—t X g9est f—ux p—ites m—inten—nt d9—utres tests en rempl—ç—nt le H p—r n9importe quel —utre nom˜re entierD ™omme RD ISD PPTD EIHD EQTD et™F u9estE™e qu9on vous répond à ™h—que fois c yn vous répond X  g9est vr—i F Résumé de nos tests : si on met un HD le test est ™onsidéré ™omme f—uxD et si on met un I ou n9importe quel —utre nom˜reD le test est vr—iF Des explications s'imposent in f—itD à ™h—que fois que vous f—ites un test d—ns un ifD ™e test renvoie l— v—leur I s9il est vr—iD et H s9il est f—uxF €—r exemple X if @—ge ba IVA s™iD le test que vous f—ites est —ge ba IVF ƒupposons que —ge v—ille PQF elors le test est vr—iD et l9ordin—teur  rempl—™e en quelque sorte —ge ba IV p—r IF insuiteD l9ordin—teur o˜tient @d—ns s— têteA un if @IAF u—nd le nom˜re est ID ™omme on l9— vuD l9ordin—teur dit que l— ™ondition est vr—ieD don™ il —0™he  g9est vr—i 3 he mêmeD si l— ™ondition est f—usseD il rempl—™e —ge ba IV p—r le nom˜re HD et du ™oup l— ™ondition est f—usse X l9ordin—teur v— lire les instru™tions du elseF Un test avec une variable „estez m—inten—nt un —utre tru™ X envoyez le résult—t de votre ™ondition d—ns une v—ri—˜leD ™omme si ™9ét—it une opér—tion @™—r pour l9ordin—teurD c'est une opér—tion 3AF int —ge a PHY int m—jeur a HY m—jeur a —ge ba IVY printf@4w—jeur v—ut X 7d’n4D m—jeurAY gomme vous le voyezD l— ™ondition —ge ba IV — renvoyé le nom˜re I ™—r elle est vr—ieF hu ™oupD notre v—ri—˜le m—jeur v—ut ID on véri(e d9—illeurs ™el— grâ™e à un printf qui montre ˜ien qu9elle — ™h—ngé de v—leurF VS .LES BOOLÉENS.

LES CONDITIONS p—ites le même test en mett—nt —ge aa IH p—r exempleF gette foisD m—jeur v—udr— HF Cette variable majeur est un booléen ‚etenez ˜ien ™e™i X on dit qu9une v—ri—˜le à l—quelle on f—it prendre les v—leurs H et I est un booléenF it —ussi ™e™i X ! H a f—uxD ! I a vr—iF in l—ng—ge gD il n9existe p—s de type de v—ri—˜le  ˜ooléen F in f—itD le type ˜ooléen n9— été —jouté qu9en gCCF in e'etD en gCC vous —vez un nouve—u type ˜ool qui — été ™réé spé™i—lement pour ™es v—ri—˜les ˜ooléennesF gomme i™i on f—it du gD on ne dispose p—s de type spé™i—lF hu ™oupD on est o˜ligé d9utiliser un type entier ™omme int pour gérer les ˜ooléensF 1 Les booléens dans les conditions ƒouventD on fer— un test if sur une v—ri—˜le ˜ooléenne X int m—jeur a IY if @m—jeurA { printf@4„u es m—jeur 34AY } else { printf@4„u es mineur4AY } gomme m—jeur v—ut ID l— ™ondition est vr—ieD don™ on —0™he  „u es m—jeur 3 F ge qui est très pr—tiqueD ™9est que l— ™ondition peut être lue f—™ilement p—r un être hum—inF yn voit if @m—jeurAD ™e qui peut se tr—duire p—r  si tu es m—jeur F ves tests sur des ˜ooléens sont don™ f—™iles à lire et à ™omprendreD pour peu que vous —yez donné des noms ™l—irs à vos v—ri—˜les ™omme je vous —i dit de le f—ire dès le dé˜utF „enezD voi™i un —utre test im—gin—ire X if @m—jeur 88 g—r™onA ge test signi(e  si tu es m—jeur i„ que tu es un g—rçon F g—r™on est i™i une —utre v—ri—˜le ˜ooléenne qui v—ut I si vous êtes un g—rçonD et H si vous êtesF F F une (lle 3 fr—voD vous —vez tout ™ompris 3 1. 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 . Ceci dit. Pour être tout à fait exact. VT . 0 = faux et tous les autres nombres valent vrai (on a eu l'occasion de le tester plus tôt).CHAPITRE 6.

non ? „out à f—itF w—is le prin™ipe des ˜ooléens ™9est justement de r—™™our™ir l9expression du if et de l— rendre plus f—™ilement lisi˜leF evouez que if @m—jeurA ç— se ™omprend très ˜ienD non c Retenez donc X si votre v—ri—˜le est ™ensée ™ontenir un nom˜re @™omme un âgeAD f—ites un test sous l— forme if @v—ri—˜le aa IAF ƒi —u ™ontr—ire votre v—ri—˜le est ™ensée ™ontenir un ˜ooléen @™9estEàEdire soit I soit H pour dire vr—i ou f—uxAD f—ites un test sous l— forme if @v—ri—˜leAF La condition switch v— ™ondition ifFFF else que l9on vient de voir est le type de ™ondition le plus souvent utiliséF in f—itD il n9y — p—s QT f—çons de f—ire une ™ondition en gF ve ifFFF else permet de gérer tous les ™—sF „outefoisD le ifFFF else peut s9—vérer quelque peuF F F répétitifF €renons ™et exemple X if @—ge aa PA { printf@4ƒ—lut ˜e˜e 34AY } else if @—ge aa TA { printf@4ƒ—lut g—min 34AY } else if @—ge aa IPA { printf@4ƒ—lut jeune 34AY } else if @—ge aa ITA { printf@4ƒ—lut —do 34AY } else if @—ge aa IVA { printf@4ƒ—lut —dulte 34AY } else if @—ge aa TVA { printf@4ƒ—lut p—py 34AY VU . ça marche aussi.LA CONDITION SWITCH ves ˜ooléens permettent don™ de dire si quelque ™hose est vr—i ou f—uxF g9est vr—iment utile et ™e que je viens de vous expliquer vous permettr— de ™omprendre ˜on nom˜re de ™hoses p—r l— suiteF Petite question : si on fait le test if @m—jeur aa IA.

LES CONDITIONS } else { printf@4te n9—i —u™une phr—se de prete pour ton —ge4AY } £ ¢gode we˜ X WTRVIQ ¡   Construire un switch ves inform—ti™iens détestent f—ire des ™hoses répétitivesD on — eu l9o™™—sion de le véri(er plus tôtF elorsD pour éviter d9—voir à f—ire des répétitions ™omme ç— qu—nd on teste l— v—leur d9une seule et même v—ri—˜leD ils ont inventé une —utre stru™ture que le ifFFF elseF gette stru™ture p—rti™ulière s9—ppelle swit™hF †oi™i un swit™h ˜—sé sur l9exemple qu9on vient de voir X swit™h @—geA { ™—se PX printf@4ƒ—lut ˜e˜e 34AY ˜re—kY ™—se TX printf@4ƒ—lut g—min 34AY ˜re—kY ™—se IPX printf@4ƒ—lut jeune 34AY ˜re—kY ™—se ITX printf@4ƒ—lut —do 34AY ˜re—kY ™—se IVX printf@4ƒ—lut —dulte 34AY ˜re—kY ™—se TVX printf@4ƒ—lut p—py 34AY ˜re—kY def—ultX printf@4te n9—i —u™une phr—se de prete pour ton —ge ˜re—kY } 4AY we˜ X WWTWVV ¡ smprégnezEvous de mon exemple pour ™réer vos propres swit™hF yn les utilise plus r—rementD m—is ™9est vr—i que ™9est pr—tique ™—r ç— f—it @un peuA moins de ™ode à t—perF v9idée ™9est don™ d9é™rire swit™h @m—†—ri—˜leA pour dire  je v—is tester l— v—leur de VV £ ¢gode   .CHAPITRE 6.

Si vous ne le faites pas. alors l'ordinateur ira lire les instructions en dessous censées être réservées aux autres cas ! L'instruction ˜re—kY commande en fait à l'ordinateur de  sortir  des accolades.LA CONDITION SWITCH l— v—ri—˜le m—†—ri—˜le F †ous ouvrez ensuite des —™™ol—des que vous refermez tout en ˜—sF insuiteD à l9intérieur de ™es —™™ol—desD vous gérez tous les ™—s X ™—se PD ™—se RD ™—se SD ™—se RSF F F Vous devez mettre une instruction ˜re—kY obligatoirement à la n de chaque cas. in(nD le ™—s def—ult ™orrespond en f—it —u else qu9on ™onn—ît ˜ien m—inten—ntF ƒi l— v—ri—˜le ne v—ut —u™une des v—leurs pré™édentesD l9ordin—teur ir— lire le def—ultF Gérer un menu avec un switch ve swit™h est très souvent utilisé pour f—ire des menus en ™onsoleF te ™rois que le moment est venu de pr—tiquer un peu 3 Au boulot ! in ™onsoleD pour f—ire un menuD on f—it des printf qui —0™hent les di'érentes options possi˜lesF gh—que option est numérotéeD et l9utilis—teur doit entrer le numéro du menu qui l9intéresseF †oi™i p—r exemple ™e que l— ™onsole devr— —0™her X aaa wenu aaa IF ‚oy—l gheese PF w™ heluxe QF w™ f—™on RF fig w—™ †otre ™hoix c Voici votre mission (si vous l'acceptez) X reproduisez ™e menu à l9—ide de printf @f—™ileAD —joutez un s™—nf pour enregistrer le ™hoix de l9utilis—teur d—ns une v—ri—˜le ™hoixwenuD et en(n f—ites un swit™h pour dire à l9utilis—teur  tu —s ™hoisi le menu ‚oy—l gheese p—r exempleF ellezD —u tr—v—il 3 Correction †oi™i l— solution @j9espère que vous l9—vez trouvée 3A X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A VW .

CHAPITRE 6. LES CONDITIONS { int ™hoixwenuY printf@4aaa wenu aaa’n’n4AY printf@4IF ‚oy—l gheese’n4AY printf@4PF w™ heluxe’n4AY printf@4QF w™ f—™on’n4AY printf@4RF fig w—™’n4AY printf@4’n†otre ™hoix c 4AY s™—nf@47d4D 8™hoixwenuAY printf@4’n4AY swit™h @™hoixwenuA { ™—se IX printf@4†ous —vez ™hoisi le ‚oy—l gheeseF fon ™hoix 34AY ˜re—kY ™—se PX printf@4†ous —vez ™hoisi le w™ heluxeF ferkD trop de s—u™eFFF4AY ˜re—kY ™—se QX printf@4†ous —vez ™hoisi le w™ f—™onF fonD ™— p—sse en™ore ™— YoA4AY ˜re—kY ™—se RX printf@4†ous —vez ™hoisi le fig w—™F †ous devez —voir tres f—im 34AY ˜re—kY def—ultX printf@4†ous n9—vez p—s rentre un nom˜re ™orre™tF †ous ne m—ngerez rien → du tout 34AY ˜re—kY } printf@4’n’n4AY } return HY we˜ X SQRIIV ¡ it voilà le tr—v—il 3 t9espère que vous n9—vez p—s ou˜lié le def—ult à l— (n du swit™h 3 in e'etD qu—nd vous progr—mmez vous devez toujours penser à tous les ™—sF †ous —vez ˜e—u dire de t—per un nom˜re entre I et RD vous trouverez toujours un im˜é™ile qui ir— t—per IH ou en™ore ƒ—lut —lors que ™e n9est p—s ™e que vous —ttendezF frefD soyez toujours vigil—nts de ™e ™ôtéE™i X ne f—ites p—s ™on(—n™e à l9utilis—teurD il peut p—rfois entrer n9importe quoiF €révoyez toujours un ™—s def—ult ou un else si vous f—ites ç— —ve™ des ifF WH £ ¢gode   .

Les ternaires : des conditions condensées sl existe une troisième f—çon de f—ire des ™onditionsD plus r—reF yn —ppelle ™el— des expressions ternairesF gon™rètementD ™9est ™omme un ifFFF elseD s—uf qu9on f—it tout tenir sur une seule ligne 3 gomme un exemple v—ut mieux qu9un long dis™oursD je v—is vous donner deux fois l— même ™ondition X l— première —ve™ un ifFFF elseD et l— se™ondeD identiqueD m—is sous forme d9une expression tern—ireF Une condition if.. else bien connue ƒupposons qu9on —it une v—ri—˜le ˜ooléenne m—jeur qui v—ut vr—i @IA si on est m—jeurD et f—ux @HA si on est mineurF yn veut ™h—nger l— v—leur de l— v—ri—˜le —ge en fon™tion du ˜ooléenD pour mettre 4IV4 si on est m—jeurD 4IU4 si on est mineurF g9est un exemple ™omplètement stupide je suis d9—™™ordD m—is ç— me permet de vous montrer ™omment on peut se servir des expressions tern—iresF †oi™i ™omment f—ire ™el— —ve™ un ifFFF else X if @m—jeurA —ge a IVY else —ge a IUY Notez que j'ai enlevé dans cet exemple les accolades car elles sont facultatives s'il n'y a qu'une instruction. car on en fait souvent dans des programmes console et vous en aurez sûrement besoin. comme je vous l'ai expliqué plus tôt..LES TERNAIRES : DES CONDITIONS CONDENSÉES Je vous conseille de vous familiariser avec le fonctionnement des menus en console. La même condition en ternaire †oi™i un ™ode qui f—it ex—™tement l— même ™hose que le ™ode pré™édentD m—is é™rit ™ette fois sous forme tern—ire X —ge a @m—jeurA c IV X IUY ves tern—ires permettentD sur une seule ligneD de ™h—nger l— v—leur d9une v—ri—˜le en fon™tion d9une ™onditionF s™i l— ™ondition est tout simplement m—jeurD m—is ç— pourr—it WI .

3.CHAPITRE 6. WP . 4. Toute valeur diérente de 0 est en fait considérée comme  vraie . LES CONDITIONS être n9importe quelle ™ondition plus longue ˜ien entendu F ve point d9interrog—tion permet de dire  estE™e que tu es m—jeur c F ƒi ouiD —lors on met l— v—leur IV d—ns —geF ƒinon @le deuxEpoints X signi(e else i™iAD on met l— v—leur IUF ves tern—ires ne sont p—s du tout indispens—˜lesD personnellement je les utilise peu ™—r ils peuvent rendre l— le™ture d9un ™ode sour™e un peu di0™ileF ge™i ét—ntD il v—ut mieux que vous les ™onn—issiez pour le jour où vous tom˜erez sur un ™ode plein de tern—ires d—ns tous les sens 3 2 En résumé ! ves conditions sont à l— ˜—se de tous les progr—mmesF g9est un moyen pour l9ordiE n—teur de prendre une décision en fon™tion de l— v—leur d9une v—ri—˜leF ! ves motsE™lés ifD else ifD else signi(ent respe™tivement  si D  sinon si D  siE non F yn peut é™rire —ut—nt de else if que l9on désireF ! …n booléen est une v—ri—˜le qui peut —voir deux ét—ts X vr—i @IA ou f—ux @HA F yn utilise des int pour sto™ker des ˜ooléens ™—r ™e ne sont en f—it rien d9—utre que des nom˜resF ! ve swit™h est une —ltern—tive —u if qu—nd il s9—git d9—n—lyser l— v—leur d9une v—ri—˜leF sl permet de rendre un ™ode sour™e plus ™l—ir si vous vous —pprêtiez à tester de nom˜reux ™—s F ! ves ternaires sont des ™onditions très ™on™ises qui permettent d9—'e™ter r—pideE ment une v—leur à une v—ri—˜le en fon™tion du résult—t d9un testF yn les utilise —ve™ p—r™imonie ™—r le ™ode sour™e — tend—n™e à devenir moins lisi˜le —ve™ ellesF 3 4 2. Un autre exemple ? autorisation = (age >= 18) ? 1 : 0. Si vous utilisez de nombreux else if c'est en général le signe qu'un switch serait plus adapté pour rendre le code source plus lisible.

Enn protez-en. c'était un gros morceau à avaler. Relaxez-vous : ce chapitre sera simple. et là vous aurez intérêt à être bien réveillés ! WQ . Nous avons vu ce qu'étaient les conditions et les booléens dans le chapitre précédent. notamment pour le premier TP qui vous attend après ce chapitre. Maintenant ça va couler de source et le TP ne devrait pas vous poser trop de problèmes. nous allons découvrir les boucles. Qu'est-ce qu'une boucle ? C'est une technique permettant de répéter les mêmes instructions plusieurs fois. Cela nous sera bien utile par la suite.Chapitre 7 Diculté : Les boucles A près avoir vu comment réaliser des conditions en C. parce qu'ensuite nous ne tarderons pas à entrer dans la partie II du cours.

CHAPITRE 7. LES BOUCLES Qu'est-ce qu'une boucle ? te me répète X une ˜ou™le est une stru™ture qui permet de répéter les mêmes instru™tions plusieurs foisF „out ™omme pour les ™onditionsD il y — plusieurs f—çons de ré—liser des ˜ou™lesF eu ˜out du ™ompteD ™el— revient à f—ire l— même ™hose X répéter les mêmes instru™tions un ™ert—in nom˜re de foisF xous —llons voir trois types de ˜ou™les ™our—ntes en g X ! while ! doFFF while ! for h—ns tous les ™—sD le s™hém— est le même @(gF UFIAF Figure UFI ! ƒ™hém— d9une ˜ou™le †oi™i ™e qu9il se p—sse d—ns l9ordre X IF l9ordin—teur lit les instru™tions de h—ut en ˜—s @™omme d9h—˜itudeA Y PF puisD une fois —rrivé à l— (n de l— ˜ou™leD il rep—rt à l— première instru™tion Y QF il re™ommen™e —lors à lire les instru™tions de h—ut en ˜—sF F F RF F F F et il rep—rt —u dé˜ut de l— ˜ou™leF ve pro˜lème d—ns ™e système ™9est que si on ne l9—rrête p—sD l9ordin—teur est ™—p—˜le de répéter les instru™tions à l9in(ni 3 sl n9est p—s du genre à se pl—indreD vous s—vez X il f—it ™e qu9on lui dit de f—ireF F F sl pourr—it très ˜ien se ˜loquer d—ns une ˜ou™le in(nieD ™9est d9—illeurs une des nom˜reuses ™r—intes des progr—mmeursF it ™9est là qu9on retrouveF F F les ™onditions 3 u—nd on ™rée une ˜ou™leD on indique toujours une ™onditionF gette ™ondition signi(er—  ‚épète l— ˜ou™le t—nt que ™ette ™ondition est vr—ie F gomme je vous l9—i ditD il y — plusieurs m—nières de s9y prendreF †oyons voir s—ns plus t—rder ™omment on ré—lise une ˜ou™le de type while en gF La boucle while †oi™i ™omment on ™onstruit une ˜ou™le while X while @GB gondition BGA { WR .

LA BOUCLE WHILE GG snstru™tions à répéter } g9est —ussi simple que ™el—F while signi(e  „—nt que F yn dit don™ à l9ordin—teur  „—nt que l— ™ondition est vr—ieD répète les instru™tions entre —™™ol—des F te vous propose de f—ire un test simple X on v— dem—nder à l9utilis—teur de t—per le nom˜re RUF „—nt qu9il n9— p—s t—pé le nom˜re RUD on lui redem—nde le nom˜reF ve progr—mme ne pourr— s9—rrêter que si l9utilis—teur t—pe le nom˜re RU @je s—isD je s—isD je suis di—˜oliqueA X int nom˜reintre a HY while @nom˜reintre 3a RUA { printf@4„—pez le nom˜re RU 3 4AY s™—nf@47d4D 8nom˜reintreAY } †oi™i m—inten—nt le test que j9—i f—itF xotez que j9—i f—it exprès de me tromper PEQ fois —v—nt de t—per le ˜on nom˜reF „—pez „—pez „—pez „—pez le le le le nom˜re nom˜re nom˜re nom˜re RU RU RU RU 3 3 3 3 IH PU RH RU ve progr—mme s9est —rrêté —près —voir t—pé le nom˜re RUF gette ˜ou™le while se répète don™ t—nt que l9utilis—teur n9— p—s t—pé RUD ™9est —ssez simpleF w—inten—ntD ess—yons de f—ire quelque ™hose d9un peu plus intéress—nt X on veut que notre ˜ou™le se répète un ™ert—in nom˜re de foisF yn v— pour ™el— ™réer une v—ri—˜le ™ompteur qui v—udr— H —u dé˜ut du progr—mme et que l9on v— incrémenter —u fur et à mesureF †ous vous souvenez de l9in™rément—tion c Ǘ ™onsiste à —jouter I à l— v—ri—˜le en f—is—nt v—ri—˜leCCYF ‚eg—rdez —ttentivement ™e ˜out de ™ode etD surtoutD ess—yez de le ™omprendre X int ™ompteur a HY while @™ompteur ` IHA { printf@4ƒ—lut les eros 3’n4AY ™ompteurCCY } ‚ésult—t X WS .

LES BOUCLES ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut ƒ—lut les les les les les les les les les les eros eros eros eros eros eros eros eros eros eros 3 3 3 3 3 3 3 3 3 3 ge ™ode répète IH fois l9—0™h—ge de  ƒ—lut les eros 3 F Comment ça marche exactement ? IF eu dép—rtD on — une v—ri—˜le ™ompteur initi—lisée à HF ille v—ut don™ H —u dé˜ut du progr—mmeF PF v— ˜ou™le while ordonne l— répétition „ex„ …i ™ompteur est inférieur à IHF gomme ™ompteur v—ut H —u dép—rtD on rentre d—ns l— ˜ou™leF QF yn —0™he l— phr—se  ƒ—lut les eros 3 vi— un printfF RF yn incrémente l— v—leur de l— v—ri—˜le ™ompteurD grâ™e à ™ompteurCCYF ™ompteur v—l—it HD elle v—ut m—inten—nt IF SF yn —rrive à l— (n de l— ˜ou™le @—™™ol—de ferm—nteA X on rep—rt don™ —u dé˜utD —u nive—u du whileF yn ref—it le test du while X  Est-ce que compteur est toujours inférieure à 10 ? F fen ouiD ™ompteur v—ut I 3 hon™ on re™ommen™e les instru™tions de l— ˜ou™leF it —insi de suiteF F F ™ompteur v— v—loir progressivement HD ID PD QD F F FD VD WD et IHF vorsque ™ompteur v—ut IHD l— ™ondition ™ompteur ` IH est f—usseF gomme l9instru™tion est f—usseD on sort de l— ˜ou™leF yn pourr—it d9—illeurs voir que l— v—ri—˜le ™ompteur —ugmente —u fur et à mesure d—ns l— ˜ou™leD en l9—0™h—nt d—ns le printf X int ™ompteur a HY while @™ompteur ` IHA { printf@4v— v—ri—˜le ™ompteur v—ut 7d’n4D ™ompteurAY ™ompteurCCY } WT .CHAPITRE 7.

LA BOUCLE DO. vous n'avez pas d'autre choix que de fermer la console en cliquant sur la croix en haut à droite. while ge type de ˜ou™le est très simil—ire à whileD ˜ien qu9un peu moins utilisé en génér—lF v— seule ™hose qui ™h—nge en f—it p—r r—pport à whileD ™9est l— position de l— ™onditionF eu lieu d9être —u dé˜ut de l— ˜ou™leD l— ™ondition est à l— (n X int ™ompteur a HY WU .... WHILE v— v— v— v— v— v— v— v— v— v— v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le v—ri—˜le ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur ™ompteur v—ut v—ut v—ut v—ut v—ut v—ut v—ut v—ut v—ut v—ut H I P Q R S T U V W †oilà X si vous —vez ™ompris ç—D vous —vez tout ™ompris 3 †ous pouvez vous —muser à —ugmenter l— limite du nom˜re de ˜ou™les @` IHH —u lieu de ` IHAF gel— m9—ur—it été d9—illeurs très utile plus jeune pour rédiger les punitions que je dev—is réé™rire IHH foisF Attention aux boucles innies vorsque vous ™réez une ˜ou™leD assurez-vous toujours qu'elle peut s'arrêter à un moment 3 ƒi l— ™ondition est toujours vr—ieD votre progr—mme ne s9—rrêter— j—m—is 3 †oi™i un exemple de ˜ou™le in(nie X while @IA { printf@4fou™le infinie’n4AY } ƒouvenezEvous des ˜ooléens X I a vr—iD H a f—uxF s™iD l— ™ondition est toujours vr—ieD ™e progr—mme —0™her— don™  fou™le in(nie s—ns —rrêt 3 Pour arrêter un tel programme sous Windows. Sous Linux.. faites gtrl C g. p—ites don™ très —ttention X évitez à tout prix de tom˜er d—ns une ˜ou™le in(nieF xotez toutefois que les ˜ou™les in(nies peuvent s9—vérer utilesD not—mmentD nous le verrons plus t—rdD lorsque nous ré—liserons des jeuxF La boucle do.

LES BOUCLES do { printf@4ƒ—lut les eros 3’n4AY ™ompteurCCY } while @™ompteur ` IHAY u9estE™e que ç— ™h—nge c g9est très simple X l— ˜ou™le while pourr—it très ˜ien ne j—m—is être exé™utée si l— ™ondition est f—usse dès le dép—rtF €—r exempleD si on —v—it initi—lisé le ™ompteur à SHD l— ™ondition —ur—it été f—usse dès le dé˜ut et on ne ser—it j—m—is rentré d—ns l— ˜ou™leF €our l— ˜ou™le doFFF whileD ™9est di'érent X cette boucle s'exécutera toujours au moins une foisF in e'etD le test se f—it à l— (n ™omme vous pouvez le voirF ƒi on initi—lise ™ompteur à SHD l— ˜ou™le s9exé™uter— une foisF sl est don™ p—rfois utile de f—ire des ˜ou™les de ™e typeD pour s9—ssurer que l9on rentre —u moins une fois d—ns l— ˜ou™leF Il y a une particularité dans la boucle doFFF while qu'on a tendance à oublier quand on débute : il y a un point-virgule tout à la n ! N'oubliez pas d'en mettre un après le while. sinon votre programme plantera à la compilation ! La boucle for in théorieD l— ˜ou™le while permet de ré—liser toutes les ˜ou™les que l9on veutF „outeE foisD tout ™omme le swit™h pour les ™onditionsD il est d—ns ™ert—ins ™—s utile d9—voir un —utre système de ˜ou™le plus  ™ondensé D plus r—pide à é™rireF ves ˜ou™les for sont très très utilisées en progr—mm—tionF te n9—i p—s de st—tistiques sous l— m—inD m—is s—™hez que vous utiliserez ™ert—inement —ut—nt de for que de whileD si ™e n9est plusD il vous f—udr— don™ s—voir m—nipuler ™es deux types de ˜ou™lesF gomme je vous le dis—isD les ˜ou™les for sont juste une —utre f—çon de f—ire une ˜ou™le whileF †oi™i un exemple de ˜ou™le while que nous —vons vu tout à l9heure X int ™ompteur a HY while @™ompteur ` IHA { printf@4ƒ—lut les eros 3’n4AY ™ompteurCCY } †oi™i m—inten—nt l9équiv—lent en ˜ou™le for X int ™ompteurY for @™ompteur a H Y ™ompteur ` IH Y ™ompteurCCA { WV .CHAPITRE 7.

LA BOUCLE FOR printf@4ƒ—lut les eros 3’n4AY } uelles di'éren™es c ! †ous noterez que l9on n9— p—s initi—lisé l— v—ri—˜le ™ompteur à H dès s— dé™l—r—tion @m—is on —ur—it pu le f—ireAF ! sl y — ˜e—u™oup de ™hoses entre les p—renthèses —près le for @nous —llons dét—iller ç— —prèsAF ! sl n9y — plus de ™ompteurCCY d—ns l— ˜ou™leF sntéressonsEnous à ™e qui se trouve entre les p—renthèsesD ™—r ™9est là que réside tout l9intérêt de l— ˜ou™le forF sl y — trois instru™tions ™ondenséesD ™h—™une sép—rée p—r un pointEvirguleF ! v— première est l'initialisation X ™ette première instru™tion est utilisée pour prép—rer notre v—ri—˜le ™ompteurF h—ns notre ™—sD on initi—lise l— v—ri—˜le à HF ! v— se™onde est la condition X ™omme pour l— ˜ou™le whileD ™9est l— ™ondition qui dit si l— ˜ou™le doit être répétée ou nonF „—nt que l— ™ondition est vr—ieD l— ˜ou™le for ™ontinueF ! in(nD il y — l'incrémentation X ™ette dernière instru™tion est exé™utée à l— (n de ™h—que tour de ˜ou™le pour mettre à jour l— v—ri—˜le ™ompteurF v— qu—siEtot—lité du temps on fer— une in™rément—tionD m—is on peut —ussi f—ire une dé™rément—tion @v—ri—˜leEEYA ou en™ore n9importe quelle —utre opér—tion @v—ri—˜le Ca PY pour —v—n™er de P en P p—r exempleAF frefD ™omme vous le voyez l— ˜ou™le for n9est rien d9—utre qu9un ™ondenséF ƒ—™hez vous en servirD vous en —urez ˜esoin plus d9une fois 3 En résumé ! ves boucles sont des stru™tures qui nous permettent de répéter une série d9instru™E tions plusieurs foisF ! sl existe plusieurs types de ˜ou™les X whileD doFFF while et forF gert—ines sont plus —d—ptées que d9—utres selon les ™—sF ! v— ˜ou™le for est pro˜—˜lement ™elle qu9on utilise le plus d—ns l— pr—tiqueF yn y f—it très souvent des in™rément—tions ou des dé™rément—tions de v—ri—˜lesF WW .

LES BOUCLES IHH .CHAPITRE 7.

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. Le but est de vous montrer que vous savez faire des choses avec ce que je vous ai appris. . la théorie c'est bien. votre premier jeu N ous arrivons maintenant dans le premier TP. Croyez-le ou non. mais si on ne sait pas mettre tout cela en pratique de manière concrète. C'est un petit jeu en mode console (les programmes en fenêtres arriveront plus tard je vous le rappelle). IHI . . Car en eet. vous avez déjà le niveau pour réaliser un premier programme amusant.Chapitre 8 Diculté : TP : Plus ou Moins. ça ne sert à rien d'avoir passé tout ce temps à apprendre.

CHAPITRE 8. VOTRE PREMIER JEU Préparatifs et conseils Le principe du programme ev—nt toute ™hoseD il f—ut que je vous explique en quoi v— ™onsister notre progr—mmeF g9est un petit jeu que j9—ppelle  €lus ou moins F ve prin™ipe est le suiv—ntF IF v9ordin—teur tire —u sort un nom˜re entre I et IHHF PF sl vous dem—nde de deviner le nom˜reF †ous entrez don™ un nom˜re entre I et IHHF QF v9ordin—teur ™omp—re le nom˜re que vous —vez entré —ve™ le nom˜re  mystère qu9il — tiré —u sortF sl vous dit si le nom˜re mystère est supérieur ou inférieur à ™elui que vous —vez entréF RF €uis l9ordin—teur vous redem—nde le nom˜reF SF F F F it il vous indique si le nom˜re mystère est supérieur ou inférieurF TF it —insi de suiteD jusqu9à ™e que vous trouviez le nom˜re mystèreF ve ˜ut du jeuD ˜ien sûrD est de trouver le nom˜re mystère en un minimum de ™oupsF †oi™i une  ™—pture d9é™r—n d9une p—rtieD ™9est ™e que vous devez —rriver à f—ire X uel est le nom˜re c SH g9est plus 3 uel est le nom˜re c US g9est plus 3 uel est le nom˜re c VS g9est moins 3 uel est le nom˜re c VH g9est moins 3 uel est le nom˜re c UV g9est plus 3 uel est le nom˜re c UW fr—voD vous —vez trouve le nom˜re mystere 333 Tirer un nombre au sort Mais comment tirer un nombre au hasard ? Je ne sais pas le faire ! gertesD nous ne s—vons p—s générer un nom˜re —lé—toireF sl f—ut dire que dem—nder ™el— à l9ordin—teur n9est p—s simple X il s—it ˜ien f—ire des ™—l™ulsD m—is lui dem—nder de ™hoisir un nom˜re —u h—s—rdD ç—D il ne s—it p—s f—ire 3 IHP . TP : PLUS OU MOINS.

Je ne pouvais pas trop vous demander de la deviner ! IHQ . Il faut obligatoirement faire un sr—nd une fois. Vous pouvez ensuite faire autant de r—nd@A que vous voulez pour générer des nombres aléatoires. et seulement une fois. ne l'oubliez pas. mais il ne faut PAS que l'ordinateur lise l'instruction sr—nd deux fois par programme. weˆ et wsx sont des ™onst—ntesD le premier est le nom˜re m—xim—l @IHHA et le se™ond le nom˜re minim—l @IAF te vous re™omm—nde de dé(nir ™es ™onst—ntes —u dé˜ut du progr—mmeD ™omme ™e™i X ™onst int weˆ a IHHD wsx a IY Les bibliothèques à inclure €our que votre progr—mme fon™tionne ™orre™tementD vous —urez ˜esoin d9in™lure trois ˜i˜liothèques X stdli˜D stdio et time @l— dernière sert pour les nom˜res —lé—toiresAF †otre progr—mme devr— don™ ™ommen™er p—r X 1.PRÉPARATIFS ET CONSEILS in f—itD pour  ess—yer d9o˜tenir un nom˜re —lé—toireD on doit f—ire f—ire des ™—l™uls ™omplexes à l9ordin—teurF F F ™e qui revient —u ˜out du ™ompte à f—ire des ™—l™uls 3 fonD on — don™ deux solutionsF ! ƒoit on dem—nde à l9utilis—teur d9entrer le nom˜re mystère vi— un s™—nf d9—˜ordF Ǘ implique qu9il y —it deux joueurs X l9un entre un nom˜re —u h—s—rd et l9—utre ess—ie de le deviner ensuiteF ! ƒoit on tente le tout pour le tout et on ess—ie qu—nd même de générer un nom˜re —lé—toire —utom—tiquementF v9—v—nt—ge est qu9on peut jouer tout seul du ™oupF ve déf—utF F F est qu9il v— f—lloir que je vous explique ™omment f—ire 3 xous —llons tenter l— se™onde solutionD m—is rien ne vous empê™he de ™oder l— première ensuite si vous voulezF €our générer un nom˜re —lé—toireD on utilise l— fon™tion r—nd@AF gette fon™tion génère un nom˜re —u h—s—rdF w—is nousD on veut que ™e nom˜re soit ™ompris entre I et IHH p—r exemple @si on ne ™onn—ît p—s les limitesD ç— v— devenir trop ™ompliquéAF €our ™e f—ireD on v— utiliser l— formule suiv—nte X 1 sr—nd@time@x…vvAAY nom˜rewystere a @r—nd@A 7 @weˆ E wsx C IAA C wsxY v— première ligne @—ve™ sr—ndA permet d9initi—liser le génér—teur de nom˜res —lé—toiresF yuiD ™9est un peu ™ompliquéD je vous —v—is prévenusF nom˜rewystere est une v—ri—˜le qui ™ontiendr— le nom˜re tiré —u h—s—rdF L'instruction sr—nd ne doit être exécutée qu'une seule fois (au début du programme).

VOTRE PREMIER JEU 5in™lude `stdioFhb 5in™lude `stdli˜Fhb 5in™lude `timeFhb J'en ai assez dit ! fon —llezD j9—rrête là p—r™e que sinon je v—is vous donner tout le ™ode du progr—mme si ç— ™ontinue 3 Pour vous faire générer des nombres aléatoires. En général je n'aime pas faire ça mais là.CHAPITRE 8. frefD vous en s—vez —ssezF te vous —i expliqué le prin™ipe du progr—mmeD je vous —i f—it une ™—pture d9é™r—n du progr—mme —u ™ours d9une p—rtieF eve™ tout ç—D vous êtes tout à f—it ™—p—˜les d9é™rire le progr—mmeF À vous de jouer 3 fonne ™h—n™e 3 Correction ! ƒtop 3 À p—rtir d9i™i je r—m—sse les ™opiesF te v—is vous donner une ™orre™tion @l— mienneAD m—is il y — plusieurs ˜onnes f—çons de f—ire le progr—mmeF ƒi votre ™ode sour™e n9est p—s identique —u mien et que vous —vez trouvé une —utre f—çon de le f—ireD s—™hez que ™9est pro˜—˜lement —ussi ˜ienF La correction de  Plus ou Moins  †oi™i l— ™orre™tion que je vous propose X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb 5in™lude `timeFhb int m—in @ int —rg™D ™h—rBB —rgv A { int nom˜rewystere a HD nom˜reintre a HY ™onst int weˆ a IHHD wsx a IY GG qénér—tion du nom˜re —lé—toire IHR . TP : PLUS OU MOINS. sans vous expliquer totalement comment ils fonctionnent. je n'ai pas vraiment le choix car ça compliquerait trop les choses pour le moment. j'ai été obligé de vous donner des codes  tout prêts . Soyez sûrs toutefois que par la suite vous apprendrez de nouvelles notions qui vous permettront de comprendre cela.

CORRECTION ! sr—nd@time@x…vvAAY nom˜rewystere a @r—nd@A 7 @weˆ E wsx C IAA C wsxY → GB v— ˜ou™le du progr—mmeF ille se répète t—nt que l9utilis—teur n9— p—s trouvé le nom˜re mystère BG do { GG yn dem—nde le nom˜re printf@4uel est le nom˜re c 4AY s™—nf@47d4D 8nom˜reintreAY GG yn ™omp—re le nom˜re entré —ve™ le nom˜re mystère if @nom˜rewystere b nom˜reintreA printf@4g9est plus 3’n’n4AY else if @nom˜rewystere ` nom˜reintreA printf@4g9est moins 3’n’n4AY else printf @4fr—voD vous —vez trouve le nom˜re mystere 333’n’n4AY } while @nom˜reintre 3a nom˜rewystereAY } £ ¢gode we˜ X SVWTTH ¡   Exécutable et sources €our ™eux qui le désirentD je mets à votre disposition en télé™h—rgement l9exé™ut—˜le du progr—mme —insi que les sour™esF £   ¢gode we˜ X IUSSUR ¡ L'exécutable (. donc si vous êtes sous un autre système d'exploitation il faudra obligatoirement recompiler le programme pour qu'il marche chez vous.exe) est compilé pour Windows. sl y — deux dossiersD l9un —ve™ l9exé™ut—˜le @™ompilé sous ‡indows je le r—ppelleA et l9—utre —ve™ les sour™esF h—ns le ™—s de  €lus ou moins D les sour™es sont très simples X il y — juste un (™hier m—inF™F x9ouvrez p—s le (™hier m—inF™ dire™tementF yuvrez d9—˜ord votre shi f—vori @gode: :flo™ksD †isu—lD et™FA et ™réez un nouve—u projet de type ™onsoleD videF …ne fois que ™9est f—itD dem—ndez à —jouter —u projet le (™hier m—inF™F †ous pourrez —lors ™ompiler le progr—mme pour tester et le modi(er si vous le désirezF IHS .

VOTRE PREMIER JEU Explications te v—is m—inten—nt vous expliquer mon ™odeD en ™ommenç—nt p—r le dé˜utF Les directives de préprocesseur ge sont les lignes ™ommenç—nt p—r 5 tout en h—utF illes in™luent les ˜i˜liothèques dont on — ˜esoinF te vous les —i données tout à l9heureD don™ si vous —vez réussi à f—ire une erreur làD vous êtes très fortsF Les variables yn n9en — p—s eu ˜esoin de ˜e—u™oupF tuste une pour le nom˜re entré p—r l9utilis—teur @nom˜reintreA et une —utre qui retient le nom˜re —lé—toire généré p—r l9ordin—teur @nom˜rewystereAF t9—i —ussi dé(ni les ™onst—ntes ™omme je vous l9—i dit —u dé˜ut de ™e ™h—pitreF v9—v—nt—ge de dé(nir les ™onst—ntes en h—ut du progr—mmeD ™9est que pour ™h—nger l— di0™ulté @en mett—nt IHHH pour weˆ p—r exempleA il su0t juste d9éditer ™ette ligne et de re™ompilerF La boucle t9—i ™hoisi de f—ire une ˜ou™le doFFF whileF in théorieD une ˜ou™le while simple —ur—it pu fon™tionner —ussiD m—is j9—i trouvé qu9utiliser doFFF while ét—it plus logiqueF €ourquoi c €—r™e queD souvenezEvousD doFFF while est une ˜ou™le qui s9exé™ute —u moins une foisF it nousD on s—it qu9on veut dem—nder le nom˜re à l9utilis—teur —u moins une fois @il ne peut p—s trouver le résult—t en moins d9un ™oupD ou —lors ™9est qu9il est super fort 3AF À ™h—que p—ss—ge d—ns l— ˜ou™leD on redem—nde à l9utilis—teur d9entrer un nom˜reF yn sto™ke le nom˜re qu9il propose d—ns nom˜reintreF €uisD on ™omp—re ™e nom˜reintre —u nom˜rewystereF sl y — trois possi˜ilités X ! le nom˜re mystère est supérieur —u nom˜re entréD on indique don™ l9indi™e  g9est plus 3 Y ! le nom˜re mystère est inférieur —u nom˜re entréD on indique l9indi™e  g9est moins 3 Y ! et si le nom˜re mystère n9est ni supérieur ni inférieur c ih ˜ienF F F ™9est qu9il est ég—lD for™ément 3 h9où le elseF h—ns ™e ™—sD on —0™he l— phr—se  fr—vo vous —vez trouvé 3 F sl f—ut une ™ondition pour l— ˜ou™leF gelleE™i ét—it f—™ile à trouver X on ™ontinue l— ˜ou™le TANT QUE le nombre entré n'est pas égal au nombre mystèreF u—nd ™es deux nom˜res sont ég—ux @™9estEàEdire qu—nd on — trouvéAD l— ˜ou™le s9—rrêteF ve progr—mme est —lors terminéF IHT . TP : PLUS OU MOINS.CHAPITRE 8.

IDÉES D'AMÉLIORATION Idées d'amélioration †ous ne ™royiez tout de même p—s qu9on —ll—it s9—rrêter là c te veux vous in™iter à ™ontinuer à —méliorer ™e progr—mmeD pour vous entr—înerF x9ou˜liez p—s que ™9est en vous entr—în—nt ™omme ™el— que vous progresserez 3 geux qui lisent les ™ours d9une tr—ite s—ns j—m—is f—ire de tests font une grosse erreurD je l9—i dit et je le redir—i 3 pigurezEvous que j9—i une im—gin—tion dé˜ord—nteD et même sur un petit progr—mme ™omme ™eluiElà je ne m—nque p—s d9idées pour l9—méliorer 3 ettention X ™ette fois je ne vous fournis p—s de ™orre™tionD il f—udr— vous dé˜rouiller tout seuls 3 ƒi vous —vez vr—iment des pro˜lèmesD n9hésitez p—s à —ller f—ire un tour sur les forums du ƒite du éroD se™tion l—ng—ge gF p—ites une re™her™he pour voir si on n9— p—s déjà donné l— réponse à vos questionsD sinon ™réez un nouve—u sujet pour poser ™es questionsF £   ¢gode we˜ X RUQSUQ ¡ ! Faites un compteur de  coups F ge ™ompteur devr— être une v—ri—˜le que vous in™rémenterez à ™h—que fois que vous p—ssez d—ns l— ˜ou™leF vorsque l9utilis—teur — trouvé le nom˜re mystèreD vous lui direz  fr—voD vous —vez trouvé le nom˜re mystère en V ™oups p—r exempleF ! vorsque l9utilis—teur — trouvé le nom˜re mystèreD le progr—mme s9—rrêteF €ourquoi ne p—s dem—nder s9il veut f—ire une autre partie c ƒi vous f—ites ç—D il vous f—udr— f—ire une ˜ou™le qui englo˜er— l— qu—siEtot—lité de votre progr—mmeF gette ˜ou™le devr— se répéter „ex„ …i l9utilis—teur n9— p—s dem—ndé à —rrêter le progr—mmeF te vous ™onseille de r—jouter une v—ri—˜le ˜ooléenne ™ontinuer€—rtie initi—lisée à I —u dép—rtF ƒi l9utilis—teur dem—nde à —rrêter le progr—mmeD vous mettrez l— v—ri—˜le à H et le progr—mme s9—rrêter—F ! smplémentez 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™ f—ire un menu —u dé˜ut de votre progr—mme qui dem—nde à l9utilis—teur le mode de jeu qui l9intéresseF v— seule ™hose qui ™h—nger— entre les deux modes de jeuD ™9est l— génér—tion du nom˜re mystèreF h—ns un ™—s ™e ser— un r—nd@A ™omme on — vuD d—ns l9—utre ™—s ç— ser—F F F un s™—nfF ! gréez plusieurs niveaux de dicultéF eu dé˜utD f—ites un menu qui dem—nde le nive—u de di0™ultéF €—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 f—ites ç—D vous devrez ™h—nger votre ™onst—nte weˆF F F ih ouiD ç— ne peut plus être une ™onst—nte si l— v—leur doit ™h—nger —u ™ours du progr—mme 3 ‚enommez don™ ™ette v—ri—˜le en nom˜rew—ximum @vous prendrez soin d9enlever le motE™lé ™onst sinon ç— ser— toujours une ™onst—nte 3AF v— v—leur de ™ette v—ri—˜le dépendr— du nive—u qu9on —ur— ™hoisiF †oilàD ç— devr—it vous o™™uper un petit ˜out de tempsF emusezEvous ˜ien et n9hésitez p—s à ™her™her d9—utres idées pour —méliorer ™e  €lus ou woins D je suis sûr qu9il y en — 3 x9ou˜liez p—s que les forums sont à votre disposition si vous —vez des questionsF IHU .

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

Chapitre 9 Diculté : Les fonctions N 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. des fonctions ! IHW . . . 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. . Nous allons apprendre à structurer nos programmes en petits bouts. un peu comme si on jouait aux Legos.

c'est mal d'avoir fait comme ça ? xon ™e n9est p—s  m—l D m—is ™e n9est p—s ™e que les progr—mmeurs en g font d—ns l— ré—litéF u—siment —u™un progr—mme n9est é™rit uniquement à l9intérieur des —™™ol—des de l— fon™tion m—inF tusqu9i™i nos progr—mmes ét—ient ™ourtsD don™ ç— ne pos—it p—s de gros pro˜lèmesD m—is im—ginez des plus gros progr—mmes qui font des milliers de lignes de ™ode 3 ƒi tout ét—it ™on™entré d—ns l— fon™tion m—inD ˜onjour le ˜—z—rF F F xous —llons don™ m—inten—nt —pprendre à nous org—niserF xous —llons en f—it dé™ouper nos progr—mmes en petits ˜outs @souvenezEvous de l9im—ge des vegos que je vous —i donnée tout à l9heureAF gh—que  petit ˜out de progr—mme ser— ™e qu9on —ppelle une fon™tionF …ne fon™tion exé™ute des —™tions et renvoie un résult—tF g9est un morceau de code qui sert à f—ire quelque ™hose de pré™isF yn dit qu9une fon™tion possède une entrée et une sortieF v— (gF WFP représente une fon™tion s™hém—tiquementF vorsqu9on —ppelle une fon™tionD il y — trois ét—pesF IF L'entrée X on f—it  rentrer des inform—tions d—ns l— fon™tion @en lui donn—nt des inform—tions —ve™ lesquelles tr—v—illerAF IIH .CHAPITRE 9. LES FONCTIONS Créer et appeler une fonction xous —vons vu d—ns les tout premiers ™h—pitres qu9un progr—mme en g ™ommenç—it p—r une fon™tion —ppelée m—inF te vous —v—is même f—it un s™hém— r陗pitul—tifD pour vous r—ppeler quelques mots de vo™—˜ul—ire @(gF WFIAF Figure WFI ! ve vo™—˜ul—ire du progr—mme minim—l in h—utD on y trouve les dire™tives de prépro™esseur @un nom ˜—r˜—re sur lequel on reviendr— d9—illeursAF ges dire™tives sont f—™iles à identi(er X elles ™ommen™ent p—r un 5 et sont génér—lement mises tout en h—ut des (™hiers sour™esF €uis en dessousD il y —v—it ™e que j9—v—is déjà —ppelé  une fon™tion F s™iD sur mon s™hém—D vous voyez une fon™tion m—in @p—s trop remplie il f—ut le re™onn—îtreAF te vous —v—is dit qu9un progr—mme en l—ng—ge g ™ommenç—it p—r l— fon™tion m—inF te vous r—ssureD ™9est toujours vr—i 3 ƒeulementD jusqu9i™i nous sommes restés à l9intérieur de l— fon™tion m—inF xous n9en sommes j—m—is sortisF ‚evoyez vos ™odes sour™es et vous verrez X nous sommes toujours restés à l9intérieur des —™™ol—des de l— fon™tion m—inF Eh bien.

les fonctions seront en général plus compliquées. III . Bien entendu.CRÉER ET APPELER UNE FONCTION Figure WFP ! …ne fon™tion — une entrée et une sortie PF Les calculs X grâ™e —ux inform—tions qu9elle — reçues en entréeD l— fon™tion tr—E v—illeF QF La sortie X une fois qu9elle — (ni ses ™—l™ulsD l— fon™tion renvoie un résult—tF g9est ™e qu9on —ppelle l— sortieD ou en™ore le retourF gon™rètementD on peut im—giner p—r exemple une fon™tion —ppelée triple qui ™—l™ule le triple du nom˜re qu9on lui donneD en le multipli—nt p—r Q @(gF WFQAF 1 Figure WFQ ! intrée et sortie de l— fon™tion triple ve ˜ut des fon™tions est don™ de simpli(er le ™ode sour™eD pour ne p—s —voir à ret—per le même ™ode plusieurs fois d9—0léeF ‚êvez un peu X plus t—rdD nous ™réerons p—r exemple une fon™tion —ffi™herpenetre qui ouvrir— une fenêtre à l9é™r—nF …ne fois l— fon™tion é™rite @™9est l9ét—pe l— plus di0™ileAD on n9—ur— plus qu9à dire  rep 3 toi l— fon™tion —ffi™herpenetreD ouvreEmoi une fenêtre 3 F yn pourr— —ussi é™rire une fon™tion depl—™er€ersonn—ge dont le ˜ut ser— de dépl—™er le personn—ge d9un jeu à l9é™r—nD et™F Schéma d'une fonction †ous —vez déjà eu un —perçu de l— f—çon dont est f—ite une fon™tion —ve™ l— fon™tion m—inF gepend—nt pour ˜ien que vous ™ompreniez il v— f—lloir que je vous montre qu—nd même ™omment on ™onstruit une fon™tionF ve ™ode suiv—nt représente une fon™tion s™hém—tiquementF g9est un modèle à ™onn—ître X type nompon™tion@p—r—metresA { GG snsérez vos instru™tions i™i } †ous re™onn—issez l— forme de l— fon™tion m—inF †oi™i ™e qu9il f—ut s—voir sur ™e s™hém—F 1.

IIP . LES FONCTIONS @™orrespond à l— sortieA X ™9est le type de l— fon™tionF gomme les v—ri—˜lesD les fon™tions ont un typeF ge type dépend du résult—t que l— fon™tion renvoie X si l— fon™tion renvoie un nom˜re dé™im—lD vous mettrez sûrement dou˜leD si elle renvoie un entier vous mettrez int ou long p—r exempleF w—is il est —ussi possi˜le de ™réer des fon™tions qui ne renvoient rien 3 sl y — don™ deux sortes de fon™tions X ! les fon™tions qui renvoient une v—leur X on leur met un des types que l9on ™onn—ît @™h—rD intD dou˜leD et™FA Y ! les fon™tions qui ne renvoient p—s de v—leur X on leur met un type spé™i—l void @qui signi(e  vide AF ! nompon™tion X ™9est le nom de votre fon™tionF †ous pouvez —ppeler votre fon™tion ™omme vous voulezD du temps que vous respe™tez les mêmes règles que pour les v—ri—˜les @p—s d9—™™entsD p—s d9esp—™esD et™FAF ! p—r—metres @™orrespond à l9entréeA X entre p—renthèsesD vous pouvez envoyer des p—r—mètres à l— fon™tion F ge sont des v—leurs —ve™ lesquelles l— fon™tion v— tr—v—illerF €—r exempleD pour une fon™tion tripleD vous envoyez un nom˜re en p—r—mètreF v— fon™tion  ré™upère ™e nom˜re et en ™—l™ule le tripleD en le multipli—nt p—r QF ille renvoie ensuite le résult—t de ses ™—l™ulsF ! insuite vous —vez les accolades qui indiquent le dé˜ut et l— (n de l— fon™tionF À l9intérieur de ™es —™™ol—des vous mettrez les instru™tions que vous voulezF €our l— fon™tion tripleD il f—udr— t—per des instru™tions qui multiplient p—r Q le nom˜re reçu en entréeF …ne fon™tionD ™9est don™ un m陗nisme qui reçoit des v—leurs en entrée @les p—r—mètresA et qui renvoie un résult—t en sortieF type 2 ! Créer une fonction †oyons un exemple pr—tique s—ns plus t—rder X l— f—meuse fon™tion triple dont je vous p—rle depuis tout à l9heureF yn v— dire que ™ette fon™tion reçoit un nom˜re entier de type int et qu9elle renvoie un nom˜re entier —ussi de type intF gette fon™tion ™—l™ule le triple du nom˜re qu9on lui donne X int triple@int nom˜reA { int result—t a HY result—t a Q B nom˜reY GG yn multiplie le nom˜re fourni p—r Q return result—tY GG yn retourne l— v—ri—˜le result—t qui v—ut le → triple de nom˜re } †oilà notre première fon™tion 3 …ne première ™hose import—nte X ™omme vous le voyezD l— fon™tion est de type intF ille doit don™ renvoyer une v—leur de type intF intre les p—renthèsesD vous —vez les v—ri—˜les que l— fon™tion reçoitF s™iD notre fon™tion triple reçoit une v—ri—˜le de type int —ppelée nom˜reF 2. mais ça se fait plus rarement. Vous pouvez aussi n'envoyer aucun paramètre à la fonction.CHAPITRE 9. Vous pouvez envoyer autant de paramètres que vous le voulez.

rares seront les fonctions aussi courtes que triple. IIQ . vos fonctions contiendront plusieurs variables pour eectuer leurs calculs et leurs opérations.CRÉER ET APPELER UNE FONCTION v— ligne qui donne pour ™onsigne de  renvoyer une v—leur est ™elle qui ™ontient le returnF gette ligne se trouve génér—lement à l— (n de l— fon™tionD —près les ™—l™ulsF return result—tY ge ™ode signi(e pour l— fon™tion X  errêteEtoi là et renvoie le nom˜re result—t F gette v—ri—˜le result—t hys„ être de type intD ™—r l— fon™tion renvoie un int ™omme on l9— dit plus h—utF v— v—ri—˜le result—t est dé™l—rée @a ™rééeA d—ns l— fon™tion tripleF gel— signi(e qu9elle n9est utilis—˜le que d—ns ™ette fon™tionD et p—s d—ns une —utre ™omme l— fon™tion m—in p—r exempleF g9est don™ une v—ri—˜le propre à l— fon™tion tripleF w—is estE™e l— f—çon l— plus ™ourte d9é™rire notre fon™tion triple c xonD on peut f—ire tout ™el— en une ligne en f—it X int triple@int nom˜reA { return Q B nom˜reY } gette fon™tion f—it ex—™tement l— même ™hose que l— fon™tion de tout à l9heureD elle est juste plus r—pide à é™rire F 3 Plusieurs paramètres. aucun paramètre Plusieurs paramètres xotre fon™tion triple ™ontient un p—r—mètreD m—is il est possi˜le de ™réer des fon™tions —™™ept—nt plusieurs p—r—mètresF €—r exempleD une fon™tion —ddition qui —dditionne deux nom˜res — et ˜ X int —ddition@int —D int ˜A { return — C ˜Y } sl su0t de sép—rer les di'érents p—r—mètres p—r une virgule ™omme vous le voyezF Aucun paramètre gert—ines fon™tionsD plus r—resD ne prennent —u™un p—r—mètre en entréeF ges fon™tions feront génér—lement toujours l— même ™hoseF in e'etD si elles n9ont p—s de nom˜res sur 3. Généralement.

CHAPITRE 9. Et encore. ce sera forcément toujours le même texte puisque la fonction ne reçoit aucun paramètre susceptible de modier son comportement ! IIR . LES FONCTIONS lesquels tr—v—illerD vos fon™tions serviront juste à e'e™tuer ™ert—ines —™tionsD ™omme —0™her du texte à l9é™r—n F sm—ginons une fon™tion ˜onjour qui —0™he juste  fonjour à l9é™r—n X 4 void ˜onjour@A { printf@4fonjour4AY } te n9—i rien mis entre p—renthèses ™—r l— fon™tion ne prend —u™un p—r—mètreF he plusD j9—i utilisé le type void dont je vous —i p—rlé plus h—utF in e'etD ™omme vous le voyez m— fon™tion n9— p—s non plus de returnF ille ne retourne rienF …ne fon™tion qui ne retourne rien est de type voidF Appeler une fonction yn v— m—inten—nt tester un ™ode sour™e pour s9entr—îner un peu —ve™ ™e qu9on vient d9—pprendreF xous —llons utiliser notre fon™tion triple @dé™idément je l9—ime ˜ienA pour ™—l™uler le triple d9un nom˜reF €our le momentD je vous dem—nde d9é™rire l— fon™tion triple e†ex„ l— fon™tion m—inF ƒi vous l— pl—™ez —prèsD ç— ne m—r™her— p—sF te vous expliquer—i pourquoi p—r l— suiteF †oi™i un ™ode à tester et à ™omprendre X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int triple@int nom˜reA { return Q B nom˜reY } int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜reintre a HD nom˜re„riple a HY printf@4intrez un nom˜reFFF 4AY s™—nf@47d4D 8nom˜reintreAY nom˜re„riple a triple@nom˜reintreAY printf@4ve triple de ™e nom˜re est 7d’n4D nom˜re„ripleAY } return HY 4.

CRÉER ET APPELER UNE FONCTION we˜ X VISRWT ¡ xotre progr—mme ™ommen™e p—r l— fon™tion m—in ™omme vous le s—vezF yn dem—nde à l9utilis—teur d9entrer un nom˜reF yn envoie ™e nom˜re qu9il — entré à l— fon™tion tripleD et on ré™upère le résult—t d—ns l— v—ri—˜le nom˜re„ripleF ‚eg—rdez en p—rti™ulier ™ette ligneD ™9est l— plus intéress—nte ™—r ™9est l9—ppel de l— fon™tion X nom˜re„riple a triple@nom˜reintreAY £ ¢gode   intre p—renthèsesD on envoie une v—ri—˜le en entrée à l— fon™tion tripleD ™9est le nom˜re sur lequel elle v— tr—v—illerF gette fon™tion renvoie une v—leurD v—leur qu9on ré™upère d—ns l— v—ri—˜le nom˜re„ripleF yn ordonne don™ à l9ordin—teur d—ns ™ette ligne X  hem—nde à l— fon™tion triple de me ™—l™uler le triple de nom˜reintreD et sto™ke le résult—t d—ns l— v—ri—˜le nom˜re„riple F Les mêmes explications sous forme de schéma †ous —vez en™ore du m—l à ™omprendre ™omment ç— fon™tionne ™on™rètement c €—s de p—nique 3 te suis sûr que vous —llez ™omprendre —ve™ mes s™hém—sF ge ™ode p—rti™ulièrement ™ommenté vous indique d—ns quel ordre le ™ode est luF gomE men™ez don™ p—r lire l— ligne numérotée ID puis PD puis Q @˜on vous —vez ™ompris je ™rois 3A X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int triple@int nom˜reA GG T { return Q B nom˜reY GG U } int m—in@int —rg™D ™h—r B—rgv‘“A GG I { int nom˜reintre a HD nom˜re„riple a HY GG P printf@4intrez un nom˜reFFF 4AY GG Q s™—nf@47d4D 8nom˜reintreAY GG R nom˜re„riple a triple@nom˜reintreAY GG S printf@4ve triple de ™e nom˜re est 7d’n4D nom˜re„ripleAY GG V } return HY GG W †oi™i ™e qui se p—sseD ligne p—r ligneF IF ve progr—mme ™ommen™e p—r l— fon™tion m—inF IIS .

CHAPITRE 9. LES FONCTIONS PF QF RF SF TF UF VF WF sl lit les instru™tions d—ns l— fon™tion une p—r une d—ns l9ordreF sl lit l9instru™tion suiv—nte et f—it ™e qui est dem—ndé @printfAF he mêmeD il lit l9instru™tion et f—it ™e qui est dem—ndé @s™—nfAF sl lit l9instru™tionF F F eh 3 yn —ppelle l— fon™tion tripleD on doit don™ s—uter à l— ligne de l— fon™tion triple plus h—utF yn s—ute à l— fon™tion triple et on ré™upère un p—r—mètre @nom˜reAF yn f—it des ™—l™uls sur le nom˜re et on termine l— fon™tionF return signi(e l— (n de l— fon™tion et permet d9indiquer le résult—t à renvoyerF yn retourne d—ns le m—in à l9instru™tion suiv—nteF …n return 3 v— fon™tion m—in se termine et don™ le progr—mme est terminéF ƒi vous —vez ™ompris d—ns quel ordre l9ordin—teur lit les instru™tionsD vous —vez déjà ™ompris le prin™ip—lF w—inten—ntD il f—ut ˜ien ™omprendre qu9une fon™tion reçoit des p—r—mètres en entrée et renvoie une v—leur en sortie @(gF WFRAF Figure WFR ! pon™tion et return Note X ™e n9est p—s le ™—s de toutes les fon™tionsF €—rfoisD une fon™tion ne prend —u™un p—r—mètre en entréeD ou —u ™ontr—ire elle en prend plusieurs @je vous —i expliqué ç— un peu plus h—utAF he mêmeD p—rfois une fon™tion renvoie une v—leurD p—rfois elle ne renvoie rien @d—ns ™e ™—s il n9y — p—s de returnAF Testons ce programme †oi™i un exemple d9utilis—tion du progr—mme X intrez un nom˜reFFF IH ve triple de ™e nom˜re est QH IIT .

CRÉER ET APPELER UNE FONCTION Vous n'êtes pas obligés de stocker le résultat d'une fonction dans une variable ! Vous pouvez directement envoyer le résultat de la fonction triple à une autre fonction. comme si triple@nom˜reintreA était une variable. ‚eg—rdez ˜ien ™e™iD ™9est le même ™ode m—is il y — un ™h—ngement —u nive—u du dernier printfF he plusD on n9— p—s dé™l—ré de v—ri—˜le nom˜re„riple ™—r on ne s9en sert plus X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int triple@int nom˜reA { return Q B nom˜reY } int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜reintre a HY printf@4intrez un nom˜reFFF 4AY s™—nf@47d4D 8nom˜reintreAY → GG ve résult—t de l— fon™tion est dire™tement envoyé —u printf et n9est p—s sto™ké d—ns une v—ri—˜le printf@4ve triple de ™e nom˜re est 7d’n4D triple@nom˜reintreAAY return HY } gomme vous le voyezD triple@nom˜reintreA est dire™tement envoyé —u printfF ue f—it l9ordin—teur qu—nd il tom˜e sur ™ette ligne c g9est très simpleF sl voit que l— ligne ™ommen™e p—r printfD il v— don™ —ppeler l— fon™tion printfF sl envoie à l— fon™tion printf tous les p—r—mètres qu9on lui donneF ve premier p—r—mètre est le texte à —0™her et le se™ond est un nom˜reF †otre ordin—teur voit que pour envoyer ™e nom˜re à l— fon™tion printf il doit d9—˜ord —ppeler l— fon™tion tripleF g9est ™e qu9il f—it X il —ppelle tripleD il e'e™tue les ™—l™uls de triple et une fois qu9il — le résult—t il l9envoie dire™tement d—ns l— fon™tion printf 3 g9est un peu une im˜ri™—tion de fon™tionsF it le plus (n d—ns tout ç—D ™9est qu9une fon™tion peut en —ppeler une —utre à son tour 3 xotre fon™tion triple pourr—it —ppeler une —utre fon™tionD qui elleEmême —ppeller—it une —utre fon™tionD et™F g9est ç— le prin™ipe de l— progr—mm—tion en g 3 „out est ™om˜inéD ™omme d—ns un jeu de vegoF eu (n—lD le plus dur ser— d9é™rire vos fon™tionsF …ne fois que vous les —urez é™ritesD vous n9—urez plus qu9à —ppeler les fon™tions s—ns vous sou™ier des ™—l™uls qu9elles peuvent ˜ien f—ire à l9intérieurF Ǘ v— permettre de simpli(er ™onsidér—˜lement l9é™riture de nos progr—mmes et ç— ™royezEmoi on en —ur— ˜ien ˜esoin 3 IIU .

LES FONCTIONS Des exemples pour bien comprendre †ous —vez dû vous en rendre ™ompte X je suis un m—ni—que des exemplesF v— théorie ™9est ˜ienD m—is si on ne f—it que ç— on risque de ne p—s retenir gr—ndE™hose et surtout ne p—s ™omprendre ™omment s9en servirD ™e qui ser—it un peu domm—geF F F te v—is don™ m—inten—nt vous montrer plusieurs exemples d9utilis—tion de fon™tionsD pour que vous —yez une idée de leur intérêtF te v—is m9e'or™er de f—ire des ™—s di'érents à ™h—que foisD pour que vous puissiez —voir des exemples de tous les types de fon™tions qui peuvent existerF te ne vous —pprendr—i rien de nouve—uD m—is ™e ser— l9o™™—sion de voir des exemples pr—tiquesF ƒi vous —vez déjà ™ompris tout ™e que j9—i expliqué —v—ntD ™9est très ˜ien et norm—lement —u™un des exemples qui vont suivre ne devr—it vous surprendreF Conversion euros / francs yn ™ommen™e p—r une fon™tion très simil—ire à tripleD qui — qu—nd même un minimum d9intérêt ™ette fois X une fon™tion qui ™onvertit les euros en fr—n™sF €our ™eux d9entre vous qui ne ™onn—îtr—ient p—s ™es monn—ies s—™hez que I euro a TDSSWSU fr—n™sF yn v— ™réer une fon™tion —ppelée ™onversionF gette fon™tion prend une v—ri—˜le en entrée de type dou˜le et retourne une sortie de type dou˜le ™—r on v— for™ément m—nipuler des nom˜res dé™im—uxF visezEl— —ttentivement X dou˜le ™onversion@dou˜le eurosA { dou˜le fr—n™s a HY fr—n™s a TFSSWSU B eurosY return fr—n™sY } int m—in@int —rg™D ™h—r B—rgv‘“A { printf@4IH euros a 7fp’n4D ™onversion@IHAAY printf@4SH euros a 7fp’n4D ™onversion@SHAAY printf@4IHH euros a 7fp’n4D ™onversion@IHHAAY printf@4PHH euros a 7fp’n4D ™onversion@PHHAAY } return HY £   ¢gode we˜ X UVTSRW ¡ IH euros a TSFSWSUHHp SH euros a QPUFWUVSHHp IHH euros a TSSFWSUHHHp PHH euros a IQIIFWIRHHHp IIV .CHAPITRE 9.

DES EXEMPLES POUR BIEN COMPRENDRE sl n9y — p—s gr—ndE™hose de di'érent p—r r—pport à l— fon™tion tripleD je vous —v—is prévenusF h9—illeursD m— fon™tion ™onversion est un peu longue et pourr—it être r—™E ™our™ie en une ligneD je vous l—isse le f—ire je vous —i déjà expliqué ™omment f—ire plus h—utF h—ns l— fon™tion m—inD j9—i f—it exprès de f—ire plusieurs printf pour vous montrer l9intérêt d9—voir une fon™tionF €our o˜tenir l— v—leur de SH eurosD je n9—i qu9à é™rire ™onversion@SHAF it si je veux —voir l— ™onversion en fr—n™s de IHH eurosD j9—i juste ˜esoin de ™h—nger le p—r—mètre que j9envoie à l— fon™tion @IHH —u lieu de SHAF À vous de jouer ! ərivez une se™onde fon™tion @toujours —v—nt l— fon™tion m—inA qui fer— elle l— ™onversion inverse X pr—n™s ab iurosF ge ne ser— p—s ˜ien di0™ileD il y — juste un signe d9opér—tion à ™h—ngerF La punition yn v— m—inten—nt s9intéresser à une fon™tion qui ne renvoie rien @p—s de sortieAF g9est une fon™tion qui —0™he le même mess—ge à l9é™r—n —ut—nt de fois qu9on lui dem—ndeF gette fon™tion prend un p—r—mètre en entrée X le nom˜re de fois où il f—ut —0™her l— punitionF void punition@int nom˜rehevignesA { int iY for @i a H Y i ` nom˜rehevignes Y iCCA { printf@4te ne dois p—s re™opier mon voisin’n4AY } } int m—in@int —rg™D ™h—r B—rgv‘“A { punition@IHAY } return HY £ ¢gode we˜ X VHSQRQ ¡ IIW   .

CHAPITRE 9. je vous rappelle qu'on n'a fait que manipuler des variables contenant des nombres depuis le début du cours ! IPH . LES FONCTIONS te te te te te te te te te te ne ne ne ne ne ne ne ne ne ne dois dois dois dois dois dois dois dois dois dois p—s p—s p—s p—s p—s p—s p—s p—s p—s p—s re™opier re™opier re™opier re™opier re™opier re™opier re™opier re™opier re™opier re™opier mon mon mon mon mon mon mon mon mon mon voisin voisin voisin voisin voisin voisin voisin voisin voisin voisin yn — i™i —'—ire à une fon™tion qui ne renvoie —u™une v—leurF gette fon™tion se ™ontente juste d9e'e™tuer des —™tions @i™iD elle —0™he des mess—ges à l9é™r—nAF …ne fon™tion qui ne renvoie —u™une v—leur est de type voidD ™9est pour ™el— qu9on — é™rit voidF À p—rt ç—D il n9y — rien de ˜ien di'érentF sl —ur—it été ˜ien plus intéress—nt de ™réer une fon™tion punition qui s9—d—pte à n9imE porte quelle s—n™tionF yn lui —ur—it envoyé deux p—r—mètres X le texte à répéter et le nom˜re de fois qu9il doit être répétéF ve pro˜lèmeD ™9est qu9on ne s—it p—s en™ore gérer le texte en g F h9—illeurs à ™e sujetD je vous —nnon™e que nous ne t—rderons p—s à —pprendre à utiliser des v—ri—˜les qui retiennent du texteF g9est plus ™ompliqué qu9il n9y p—r—ît et on ne pouv—it p—s l9—pprendre dès le dé˜ut du ™ours 3 5 Aire d'un rectangle v9—ire d9un re™t—ngle est f—™ile à ™—l™uler X l—rgeur B h—uteurF xotre fon™tion nommée v— prendre deux p—r—mètres X l— l—rgeur et l— h—uteurF ille renverr— l9—ireF —ire‚e™t—ngle dou˜le —ire‚e™t—ngle@dou˜le l—rgeurD dou˜le h—uteurA { return l—rgeur B h—uteurY } int m—in@int —rg™D ™h—r B—rgv‘“A { printf@4‚e™t—ngle de l—rgeur S et h—uteur IHF eire a 7f’n4D —ire‚e™t—ngle@SD → IHAAY printf@4‚e™t—ngle de l—rgeur PFS et h—uteur QFSF eire a 7f’n4D —ire‚e™t—ngle → @PFSD QFSAAY printf@4‚e™t—ngle de l—rgeur RFP et h—uteur WFUF eire a 7f’n4D —ire‚e™t—ngle → @RFPD WFUAAY } return HY 5. Au cas où vous n'auriez pas vu.

la hauteur et l'aire dans la fonction ? fien sûr 3 h—ns ™e ™—sD l— fon™tion ne renverr—it plus rienD elle se ™ontenter—it de ™—l™uler l9—ire et de l9—0™her immédi—tementF void —ire‚e™t—ngle@dou˜le l—rgeurD dou˜le h—uteurA { dou˜le —ire a HY —ire a l—rgeur B h—uteurY printf@4‚e™t—ngle de l—rgeur 7f et h—uteur 7fF eire a 7f’n4D l—rgeurD → h—uteurD —ireAY } int m—in@int —rg™D ™h—r B—rgv‘“A { —ire‚e™t—ngle@SD IHAY —ire‚e™t—ngle@PFSD QFSAY —ire‚e™t—ngle@RFPD WFUAY } return HY gomme vous le voyezD le printf est à l'intérieur de l— fon™tion —ire‚e™t—ngle et proE duit le même —0™h—ge que tout à l9heureF g9est juste une f—çon di'érente de pro™éderF Un menu ge ™ode est plus intéress—nt et ™on™retF yn ™rée une fon™tion menu@A qui ne prend —u™un p—r—mètre en entréeF gette fon™tion se ™ontente d9—0™her le menu et dem—nde à l9utilis—teur de f—ire un ™hoixF v— fon™tion renvoie le ™hoix de l9utilis—teurF int menu@A { int ™hoix a HY while @™hoix ` I || ™hoix b RA { printf@4wenu X’n4AY IPI .DES EXEMPLES POUR BIEN COMPRENDRE £   gode we˜ X QUVISW ¡ ¢ ‚e™t—ngle de l—rgeur S et h—uteur IHF eire a SHFHHHHHH ‚e™t—ngle de l—rgeur PFS et h—uteur QFSF eire a VFUSHHHH ‚e™t—ngle de l—rgeur RFP et h—uteur WFUF eire a RHFURHHHH Pourrait-on acher directement la largeur.

CHAPITRE 9. LES FONCTIONS printf@4I X €oulet de dinde —ux es™—rgots rotis — l— s—u™e ˜e—rn—ise’n4A Y printf@4P X gon™om˜res su™res — l— s—u™e de myrtilles enro˜ee de ™ho™ol— t’n4AY printf@4Q X is™—lope de k—ngourou s—ign—nte et s— gelee —ux fr—ises poiv ree’n4AY printf@4R X v— surprise du ghef @j9en s—live d9—v—n™eFFFA’n4AY printf@4†otre ™hoix c 4AY s™—nf@47d4D 8™hoixAY → → → } } return ™hoixY int m—in@int —rg™D ™h—r B—rgv‘“A { swit™h @menu@AA { ™—se IX printf@4†ous —vez pris le poulet’n4AY ˜re—kY ™—se PX printf@4†ous —vez pris les ™on™om˜res’n4AY ˜re—kY ™—se QX printf@4†ous —vez pris l9es™—lope’n4AY ˜re—kY ™—se RX printf@4†ous —vez pris l— surprise du ghefF †ous etes un s—™re → —venturier dites don™ 3’n4AY ˜re—kY } } return HY we˜ X IIRHRS ¡ t9en —i pro(té pour —méliorer le menu @p—r r—pport à ™e qu9on f—is—it h—˜ituellementA X l— fon™tion menu —0™he à nouve—u le menu t—nt que l9utilis—teur n9— p—s entré un nom˜re ™ompris entre I et RF gomme ç—D —u™un risque que l— fon™tion renvoie un nom˜re qui ne (gure p—s —u menu 3 h—ns le m—inD vous —vez vu qu9on f—it un swit™h@menu@AAF …ne fois que l— fon™tion menu@A est terminéeD elle renvoie le ™hoix de l9utilis—teur dire™tement d—ns le swit™hF g9est une méthode r—pide et pr—tiqueF À vous de jouer ! ve ™ode est en™ore —mélior—˜le X on pourr—it —0™her un mess—ge d9erreur si l9utilis—teur entre un m—uv—is nom˜re plutôt que de simplement —0™her une nouvelle fois le menuF IPP £ ¢gode   .

DES EXEMPLES POUR BIEN COMPRENDRE En résumé ! ves fon™tions s9—ppellent entre ellesF einsiD le m—in peut —ppeler des fon™tions toutes prêtes telles que printf ou s™—nfD m—is —ussi des fon™tions que nous —vons ™rééesF ! …ne fon™tion ré™upère en entrée des v—ri—˜les qu9on —ppelle paramètresF ! ille e'e™tue ™ert—ines opér—tions —ve™ ™es p—r—mètres puis retourne en génér—l une v—leur à l9—ide de l9instru™tion returnF IPQ .

CHAPITRE 9. LES FONCTIONS IPR .

Deuxième partie Techniques  avancées  du langage C IPS .

.

Pour le moment c'était acceptable car nos programmes étaient tout petits. mais ils vont bientôt être composés de dizaines. Lorsque vous serez arrivés à la n de cette partie. etc. Dans la partie suivante nous verrons alors comment ouvrir une fenêtre. vous serez capables de vous débrouiller dans la plupart des programmes écrits en C.Chapitre 10 Diculté : La programmation modulaire D ans cette seconde partie. Jusqu'ici nous n'avons travaillé que dans un seul chier appelé m—inF™. nous le  séparons  en plusieurs petits chiers. et si vous les mettez toutes dans un même chier celui-là va nir par devenir très long ! C'est pour cela que l'on a inventé ce qu'on appelle la programmation modulaire. créer des jeux 2D. Je ne vous le cache pas. IPU . la partie II est d'un cran de diculté supérieur. et vous vous en doutiez sûrement. nous allons découvrir des concepts plus avancés du langage C. Le principe est tout bête : plutôt que de placer tout le code de notre programme dans un seul chier (m—inF™). que dis-je de centaines de fonctions.

c'est un peu mal fait. .CHAPITRE 10. LA PROGRAMMATION MODULAIRE Les prototypes tusqu9i™iD je vous —i dem—ndé de pl—™er votre fon™tion —v—nt l— fon™tion m—inF €ourquoi c €—r™e que l9ordre — une réelle import—n™e i™i X si vous mettez votre fon™tion —v—nt le m—in d—ns votre ™ode sour™eD votre ordin—teur l9—ur— lue et l— ™onn—îtr—F vorsque vous ferez un —ppel à l— fon™tion d—ns le m—inD l9ordin—teur ™onn—îtr— l— fon™tion et s—ur— où —ller l— ™her™herF in rev—n™heD si vous mettez votre fon™tion —près le m—inD ç— ne m—r™her— p—s ™—r l9ordin—teur ne ™onn—îtr— p—s en™ore l— fon™tionF iss—yezD vous verrez 3 Mais. non ? „out à f—it d9—™™ord —ve™ vous 3 w—is r—ssurezEvousD les progr—mmeurs s9en sont rendu ™ompte —v—nt vous et ont prévu le ™oupF qrâ™e à ™e que je v—is vous —pprendre m—inten—ntD vous pourrez positionner vos fon™E tions d—ns n9importe quel ordre d—ns le ™ode sour™eF g9est mieux de ne p—s —voir à s9en sou™ierD ™royezEmoiF Le prototype pour annoncer une fonction xous —llons  —nnon™er nos fon™tions à l9ordin—teur en é™riv—nt ™e qu9on —ppelle des prototypesF xe soyez p—s intimidés p—r ™e nom high-techD ç— ™—™he en f—it quelque ™hose de très simpleF ‚eg—rdez l— première ligne de notre fon™tion —ire‚e™t—ngle X dou˜le —ire‚e™t—ngle@dou˜le l—rgeurD dou˜le h—uteurA { return l—rgeur B h—uteurY } gopiez l— première ligne @dou˜le —ire‚e™t—ngleF F FA tout en h—ut de votre (™hier sour™e @juste —près les 5in™ludeAF Rajoutez un point-virgule à l— (n de ™ette nouE velle ligneF it voilà 3 w—inten—ntD vous pouvez pl—™er votre fon™tion —ire‚e™t—ngle —près l— fon™tion m—in si vous le voulez 3 †ous devriez —voir le ™ode suiv—nt sous les yeux X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb GG v— ligne suiv—nte est le prototype de l— fon™tion —ire‚e™t—ngle X dou˜le —ire‚e™t—ngle@dou˜le l—rgeurD dou˜le h—uteurAY int m—in@int —rg™D ™h—r B—rgv‘“A { IPV . .

IPW . Si vous ne le faites pas.LES PROTOTYPES printf@4‚e™t—ngle de l—rgeur S et h—uteur IHF eire a 7f’n4D —ire‚e™t—ngle@SD IHAAY printf@4‚e™t—ngle de l—rgeur PFS et h—uteur QFSF eire a 7f’n4D —ire‚e™t—ngle → @PFSD QFSAAY printf@4‚e™t—ngle de l—rgeur RFP et h—uteur WFUF eire a 7f’n4D —ire‚e™t—ngle → @RFPD WFUAAY → } return HY GG xotre fon™tion —ire‚e™t—ngle peut m—inten—nt être mise n9importe où d—ns le → ™ode sour™e X dou˜le —ire‚e™t—ngle@dou˜le l—rgeurD dou˜le h—uteurA { return l—rgeur B h—uteurY } we˜ X QVUUPQ ¡ ge qui — ™h—ngé i™iD ™9est l9—jout du prototype en h—ut du ™ode sour™eF …n prototypeD ™9est en f—it une indi™—tion pour l9ordin—teurF gel— lui indique qu9il existe une fon™tion —ppelée —ire‚e™t—ngle qui prend tels p—r—mètres en entrée et renvoie une sortie du type que vous indiquezF gel— permet à l9ordin—teur de s9org—niserF qrâ™e à ™ette ligneD vous pouvez m—inten—nt pl—™er vos fon™tions d—ns n9importe quel ordre s—ns vous prendre l— tête 3 ərivez toujours les prototypes de vos fon™tionsF †os progr—mmes ne vont p—s t—rder à se ™omplexi(er et à utiliser de nom˜reuses fon™tions X mieux v—ut prendre dès m—inten—nt l— ˜onne h—˜itude d9é™rire le prototype de ™h—™une d9ellesF gomme vous le voyezD l— fon™tion m—in n9— p—s de prototypeF in f—itD ™9est l— seule qui n9en né™essite p—sD p—r™e que l9ordin—teur l— ™onn—ît @™9est toujours l— même pour tous les progr—mmesD —lors il peut ˜ien l— ™onn—îtreD à for™e 3AF €our être tout à f—it ex—™tD il f—ut s—voir que d—ns l— ligne du prototype il est f—™ult—tif d9é™rire les noms de v—ri—˜les en entréeF v9ordin—teur — juste ˜esoin de ™onn—ître les types des v—ri—˜lesF yn —ur—it don™ pu simplement é™rire X dou˜le —ire‚e™t—ngle@dou˜leD dou˜leAY £ ¢gode   „outefoisD l9—utre méthode que je vous —i montrée tout à l9heure fon™tionne —ussi ˜ienF v9—v—nt—ge —ve™ m— méthodeD ™9est que vous —vez juste ˜esoin de ™opierE™oller l— preE mière ligne de l— fon™tion et de r—jouter 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 diérencier un prototype du véritable début d'une fonction. vous risquez d'avoir des erreurs incompréhensibles lors de la compilation.

ce n'est pas du tout une obligation. LA PROGRAMMATION MODULAIRE Les headers tusqu9i™iD nous n9—vions qu9un seul (™hier sour™e d—ns notre projetF ge (™hier sour™eD je vous —v—is dem—ndé de l9—ppeler m—inF™F Plusieurs chiers par projet h—ns l— pr—tiqueD vos progr—mmes ne seront p—s tous é™rits d—ns ™e même (™hier m—inF™F fien sûrD il est possible de le f—ireD m—is ™e n9est j—m—is très pr—tique de se ˜—l—der d—ns un (™hier de IH HHH lignes @en(nD personnellementD je trouve 3AF g9est pour ™el— qu9en génér—l on ™rée plusieurs (™hiers p—r projetF Qu'est-ce qu'un projet. IQH . Pour information.CHAPITRE 10. chacun s'organise comme il veut. Pour bien me suivre. je vous conseille néanmoins de faire comme moi. déjà ? xonD vous n9—vez p—s déjà ou˜lié c fon X je vous le réexpliqueD p—r™e qu9il est import—nt qu9on soit ˜ien d9—™™ord sur ™e termeF …n projetD ™9est l9ensem˜le des (™hiers sour™e de votre progr—mmeF €our le momentD nos projets n9ét—ient ™omposés que d9un (™hier sour™eF ‚eg—rdez d—ns votre shiD géE nér—lement ™9est sur l— g—u™he @(gF IHFIAF Figure IHFI ! viste des (™hiers d9un projet simple gomme vous pouvez le voir à g—u™he sur ™ette ™—pture d9é™r—nD ™e projet n9est ™omposé que d9un (™hier m—inF™F v—issezEmoi m—inten—nt vous montrer un vr—i projet que vous ré—liserez un peu plus loin d—ns le ™ours X un jeu de ƒoko˜—n @(gF IHFPAF gomme vous le voyezD il y — plusieurs (™hiersF …n vr—i projet ressem˜ler— à ç— X vous verE rez plusieurs (™hiers d—ns l— ™olonne de g—u™heF †ous re™onn—issez d—ns l— liste le (™hier m—inF™ X ™9est ™elui qui ™ontient l— fon™tion m—inF in génér—l d—ns mes progr—mmesD je ne mets que le m—in d—ns m—inF™ F 1 Mais pourquoi avoir créé plusieurs chiers ? Et comment je sais combien de chiers je dois créer pour mon projet ? 1.

h et .LES HEADERS Figure IHFP ! viste des (™hiers d9un projet plus ™omplexe ǗD ™9est vous qui ™hoisissezF in génér—lD on regroupe d—ns un même (™hier des fon™tions —y—nt le même thèmeF einsiD d—ns le (™hier editeurF™ j9—i regroupé toutes les fon™tions ™on™ern—nt l9éditeur de nive—u Y d—ns le (™hier jeuF™D j9—i regroupé toutes les fon™tions ™on™ern—nt le jeu luiEmêmeD et™F Fichiers .c gomme vous le voyezD il y — deux types de (™hiers di'érents sur l— (gF IHFPF ! Les FhD —ppelés (™hiers headersF ges (™hiers ™ontiennent les prototypes des fon™tionsF ! Les F™ X les (™hiers sour™eF ges (™hiers ™ontiennent les fon™tions ellesEmêmesF in génér—lD on met don™ r—rement les prototypes d—ns les (™hiers F™ ™omme on l9— f—it tout à l9heure d—ns le m—inF™ @s—uf si votre progr—mme est tout petitAF €our ™h—que (™hier F™D il y — son équiv—lent Fh qui ™ontient les prototypes des fon™tionsF tetez un ÷il plus —ttentif à l— (gF IHFP X ! il y — editeurF™ @le ™ode des fon™tionsA et editeurFh @les prototypes des fon™tionsA Y ! il y — jeuF™ et jeuFh Y ! et™F Mais comment faire pour que l'ordinateur sache que les prototypes sont dans un autre chier que le F™ ? sl f—ut in™lure le (™hier Fh grâ™e à une dire™tive de prépro™esseurF ettentionD prép—rezE vous à ™omprendre ˜e—u™oup de ™hoses d9un ™oup 3 gomment in™lure un (™hier he—der cF F F †ous s—vez le f—ireD vous l9—vez déjà f—it 3 ‚eg—rdez p—r exemple le dé˜ut de mon (™hier jeuF™ X IQI .

LA PROGRAMMATION MODULAIRE 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude 4jeuFh4 void jouer@ƒhv•ƒurf—™eB e™r—nA { GG FFF v9in™lusion se f—it grâ™e à l— dire™tive de prépro™esseur 5in™lude que vous ™onn—issez ˜ien m—inten—ntF ‚eg—rdez les premières lignes du ™ode sour™e ™iEdessus X 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude 4jeuFh4 GG yn in™lut jeuFh yn in™lut trois (™hiers Fh X stdioD stdli˜ et jeuF xotez une di'éren™e X les (™hiers que vous —vez ™réés et pl—™és d—ns le répertoire de votre projet doivent être in™lus —ve™ des guillemets @4jeuFh4A t—ndis que les (™hiers ™orrespond—nt —ux ˜i˜liothèques @qui sont génér—lement inst—llésD euxD d—ns le répertoire de votre shiA sont in™lus entre ™hevrons @`stdioFhbAF †ous utiliserez don™ X ! les chevrons ` b pour in™lure un (™hier se trouv—nt d—ns le répertoire  in™lude de votre shi Y ! les guillemets 4 4 pour in™lure un (™hier se trouv—nt d—ns le répertoire de votre projet @à ™ôté des F™D génér—lementAF v— ™omm—nde 5in™lude dem—nde d9insérer le ™ontenu du (™hier d—ns le F™F g9est don™ une ™omm—nde qui dit  snsère i™i le (™hier jeuFh p—r exempleF it d—ns le (™hier jeuFhD que trouveEtEon c yn trouve simplement les prototypes des fon™tions du (™hier jeuF™ 3 GB jeuFh EEEEE €—r m—teoPID pour ve ƒite du éro @wwwFsiteduzeroF™omA ‚ôle X prototypes des fon™tions du jeuF BG void jouer@ƒhv•ƒurf—™eB e™r—nAY void depl—™ertoueur@int ™—rte‘“‘xf•fvygƒ•re…„i…‚“D ƒhv•‚e™t BposD int → dire™tionAY void depl—™erg—isse@int Bpremiereg—seD int Bse™ondeg—seAY †oilà ™omment fon™tionne un vr—i projet 3 IQP .CHAPITRE 10.

Comment puis-je ajouter des chiers F™ et Fh à mon projet ? Ǘ dépend de l9shi que vous utilisezD m—is glo˜—lement l— pro™édure est l— même X pi™hier G xouve—u G pi™hier sour™eF gel— ™rée un nouve—u (™hier videF ge (™hier n9est p—s en™ore de type F™ ou FhD il f—ut que vous l9enregistriez pour le direF inregistrez don™ ™e nouve—u (™hier @même s9il est en™ore vide 3AF yn vous dem—nder— —lors quel nom vous voulez donner —u (™hierF g9est là que vous ™hoisissez si ™9est un F™ ou un Fh X ! si vous l9—ppelez fi™hierF™D ™e ser— un F™ Y ! si vous l9—ppelez fi™hierFhD ™e ser— un FhF g9est —ussi simple que ™el—F inregistrez votre (™hier d—ns le répertoire d—ns lequel se trouvent les —utres (™hiers de votre projet @le même dossier que m—inF™AF qénér—lementD vous enregistrerez tous vos (™hiers d—ns le même répertoireD les F™ ™omme les FhF ve dossier du projet ressem˜le —u (n—l à l— (gF IHFQF †ous y voyez des F™ et des Fh ensem˜leF IQQ . Souvenez-vous de cette règle : à chaque fois que vous faites appel à une fonction X dans un chier.LES HEADERS Quel est l'intérêt de mettre les prototypes dans des chiers Fh ? v— r—ison est en f—it —ssez simpleF u—nd d—ns votre ™ode vous f—ites —ppel à une fon™tionD votre ordin—teur doit déjà l— ™onn—îtreD s—voir ™om˜ien de p—r—mètres elle prendD et™F g9est à ç— que sert un prototype X ™9est le mode d9emploi de l— fon™tion pour l9ordin—teurF „out est une question d9ordre X si vous pl—™ez vos prototypes d—ns des Fh @he—dersA in™lus en h—ut des (™hiers F™D votre ordin—teur ™onn—îtr— le mode d9emploi de toutes vos fon™tions dès le dé˜ut de l— le™ture du (™hierF in f—is—nt ™el—D vous n9—urez —insi p—s à vous sou™ier de l9ordre d—ns lequel les fon™tions se trouvent d—ns vos (™hiers F™F ƒi m—inten—nt vous f—ites un petit progr—mme ™onteE n—nt deux ou trois fon™tionsD vous vous rendrez peutEêtre ™ompte que les prototypes sem˜lent f—™ult—tifs @ç— m—r™he s—nsAF w—is ç— ne durer— p—s longtemps 3 hès que vous —urez un peu plus de fon™tionsD si vous ne mettez p—s vos prototypes de fon™tions d—ns des FhD l— ™ompil—tion é™houer— s—ns —u™un douteF Lorsque vous appellerez une fonction située dans fon™tionsF™ depuis le chier m—inF™. Il faudra donc mettre un 5in™lude 4fon™tionsFh4 en haut de m—inF™. Cela permet au compilateur de vérier si vous l'avez correctement appelée. vous aurez besoin d'inclure les prototypes de fon™tionsF™ dans m—inF™. il faut que vous ayez inclus les prototypes de cette fonction dans votre chier.

CHAPITRE 10. LA PROGRAMMATION MODULAIRE Figure IHFQ ! …n dossier de projet †otre (™hier est m—inten—nt enregistréD m—is il n9est p—s en™ore vr—iment —jouté —u projet 3 €our l9—jouter —u projetD f—ites un ™li™ droit d—ns l— p—rtie à g—u™he de l9é™r—n @où il y — l— liste des (™hiers du projetA et ™hoisissez edd files @(gF IHFRAF Figure IHFR ! ejout de (™hiers —u projet …ne fenêtre s9ouvre et vous dem—nde quels (™hiers —jouter —u projetF ƒéle™tionnez le (™hier que vous venez de ™réer et ™9est f—itF ve (™hier f—it m—inten—nt p—rtie du projet et —pp—r—ît d—ns l— liste à g—u™he 3 IQR .

LA COMPILATION SÉPARÉE Les include des bibliothèques standard …ne question devr—it vous trotter d—ns l— têteF F F ƒi on in™lut les (™hiers stdioFh et stdli˜FhD ™9est don™ qu9ils existent quelque p—rt et qu9on peut —ller les ™her™herD non c yuiD ˜ien sûr 3 sls sont norm—lement inst—llés là où se trouve votre shiF h—ns mon ™—s sous gode: :flo™ksD je les trouve là X g:’€rogr—m piles’godeflo™ks’winq‡’in™lude sl f—ut génér—lement ™her™her un dossier in™ludeF vàEded—nsD vous —llez trouver de très nom˜reux (™hiersF ge sont des he—ders @FhA des ˜i˜liothèques st—nd—rdD ™9estEàEdire des ˜i˜liothèques disponi˜les p—rtout @que ™e soit sous ‡indowsD w—™D vinuxF F FAF †ous y retrouverez don™ stdioFh et stdli˜FhD entre —utresF †ous pouvez les ouvrir si vous voulezD m—is ç— risque de piquer un peu les yeuxF in e'etD ™9est un peu ™ompliqué @il y — p—s m—l de ™hoses qu9on n9— p—s en™ore vuesD not—mment ™ert—ines dire™tives de prépro™esseurAF ƒi vous ™her™hez ˜ienD vous verrez que ™e (™hier est rempli de prototypes de fon™tions st—nd—rdD ™omme printf p—r exempleF Ok. Mais comment pourrais-je voir le code source de ces fonctions ? Où sont les F™ ? †ous ne les —vez p—s 3 in f—itD les (™hiers F™ sont déjà ™ompilés @en ™ode ˜in—ireD ™9estE àEdire en ™ode m—™hineAF sl est don™ tot—lement impossi˜le de les lireF †ous pouvez retrouver les (™hiers ™ompilés d—ns un répertoire —ppelé li˜ F ghez moiD on peut les trouver d—ns le répertoire X 2 g:’€rogr—m piles’godeflo™ks’winq‡’li˜ ves (™hiers ™ompilés des ˜i˜liothèques ont l9extension F— sous gode: :flo™ks @qui utilise le ™ompil—teur —ppelé mingwA et ont l9extension Fli˜ sous †isu—l gCC @qui utilise le ™ompil—teur †isu—lAF x9ess—yez p—s de les lire X ™e n9est —˜solument p—s ™omesti˜le pour un hum—inF in résuméD d—ns vos (™hiers F™D vous in™luez les Fh des ˜i˜liothèques st—nd—rd pour pouvoir utiliser des fon™tions st—nd—rd ™omme printfF †otre ordin—teur — —insi les prototypes sous les yeux et peut véri(er si vous —ppelez les fon™tions ™orre™tementD p—r exemple que vous n9ou˜liez p—s de p—r—mètresF La compilation séparée w—inten—nt que vous s—vez qu9un projet est ™omposé de plusieurs (™hiers sour™eD nous pouvons rentrer plus en dét—il d—ns le fon™tionnement de l— ™ompil—tionF tusqu9i™iD nous —vions vu un s™hém— très simpli(éF v— (gF IHFS est un s™hém— ˜ien plus pré™is de l— ™ompil—tionF g9est le genre de s™hém—s 2. je sais maintenant où se trouvent les prototypes des fonctions standard. IQS . C'est l'abréviation de library qui signie  bibliothèque  en français.

Bien qu'inutiles puisque temporaires.CHAPITRE 10. En eet. LA PROGRAMMATION MODULAIRE qu9il est fortement ™onseillé de ™omprendre et de ™onn—ître p—r ™÷ur 3 Figure IHFS ! ƒ™hém— d9une ™ompil—tion ǗD ™9est un vr—i s™hém— de ™e qu9il se p—sse à l— ™ompil—tionF hét—illonsEleF IF Préprocesseur X le prépro™esseur est un progr—mme qui dém—rre —v—nt l— ™ompiE l—tionF ƒon rôle est d9exé™uter les instru™tions spé™i—les qu9on lui — données d—ns des dire™tives de prépro™esseurD ™es f—meuses lignes qui ™ommen™ent p—r un 5F €our l9inst—ntD l— seule dire™tive de prépro™esseur que l9on ™onn—ît est 5in™ludeD qui permet d9in™lure un (™hier d—ns un —utreF ve prépro™esseur s—it f—ire d9—utres ™hosesD m—is ç—D nous le verrons plus t—rdF ve 5in™lude est qu—nd même ™e qu9il y — de plus import—nt à ™onn—îtreF ve prépro™esseur  rempl—™e don™ les lignes 5in™lude p—r le (™hier indiquéF sl met à l9intérieur de ™h—que (™hier F™ le ™ontenu des (™hiers Fh qu9on — dem—ndé d9in™lureF À ™e momentElà de l— ™ompiE l—tionD votre (™hier F™ est ™omplet et ™ontient tous les prototypes des fon™tions que vous utilisez @votre (™hier F™ est don™ un peu plus gros que l— norm—leAF PF Compilation X ™ette ét—pe très import—nte ™onsiste à tr—nsformer vos (™hiers sour™e en ™ode ˜in—ire ™ompréhensi˜le p—r l9ordin—teurF ve ™ompil—teur ™ompile ™h—que (™hier F™ un à unF sl ™ompile tous les (™hiers sour™e de votre projetD d9où l9import—n™e d9—voir ˜ien —jouté tous vos (™hiers —u projet @ils doivent tous —pp—r—ître d—ns l— f—meuse liste à g—u™heAF ve ™ompil—teur génère un (™hier Fo @ou Fo˜jD ç— dépend du ™ompil—teurA p—r (™hier F™ ™ompiléF ge sont des (™hiers ˜in—ires tempor—iresF qénér—lementD ™es (™hiers sont supprimés à l— (n de l— ™ompil—tionD m—is selon les options de votre shiD vous pouvez ™hoisir de les ™onserver F QF Édition de liens X le linker @ou  éditeur de liens en fr—nç—isA est un progr—mme dont le rôle est d9—ssem˜ler les (™hiers ˜in—ires FoF sl les —ssem˜le en un seul gros 3 3. IQT . Pour les autres. on peut trouver un intérêt à conserver les . le compilateur n'aura qu'à recompiler seulement ce chier .c.c de votre projet seul l'un d'eux a changé depuis la dernière compilation.o compilés. si parmi les 10 chiers . il possède déjà les .o.

LA COMPILATION SÉPARÉE (™hier X l9exé™ut—˜le (n—l 3 get exé™ut—˜le — l9extension Fexe sous ‡indowsF ƒi vous êtes sous un —utre yƒD il devr—it prendre l9extension —déqu—teF w—inten—ntD vous s—vez ™omment ç— se p—sse à l9intérieurF te le dis et je le répèteD ™e s™hém— de l— (gF IHFS est très import—ntF sl f—it l— di'éren™e entre un progr—mmeur du dim—n™he qui ™opie s—ns ™omprendre des ™odes sour™e et un —utre qui s—it et ™omprend ™e qu9il f—itF v— plup—rt des erreurs surviennent à l— ™ompil—tionD m—is il m9est —ussi —rrivé d9—voir des erreurs de linkerF gel— signi(e que le linker n9est p—s —rrivé à —ssem˜ler tous les Fo @il en m—nqu—it peutEêtreAF xotre s™hém— est p—r ™ontre en™ore un peu in™ompletF in e'etD les ˜i˜liothèques n9y —pp—r—issent p—s 3 gomment ™el— se p—sseEtEil qu—nd on utilise des ˜i˜liothèques c in f—itD le dé˜ut du s™hém— reste le mêmeD ™9est seulement le linker qui v— —voir un peu plus de tr—v—ilF sl v— —ssem˜ler vos Fo @tempor—iresA —ve™ les ˜i˜liothèques ™ompilées dont vous —vez ˜esoin @F— ou Fli˜ selon le ™ompil—teurAF v— (gF IHFT est don™ une version —méliorée de l— (gF IHFSF Figure IHFT ! ƒ™hém— d9une ™ompil—tion —ve™ ˜i˜liothèques xous y sommesD le s™hém— est ™ette fois ™ompletF †os (™hiers de ˜i˜liothèques F— @ou sont r—ssem˜lés d—ns l9exé™ut—˜le —ve™ vos FoF g9est ™omme ™el— qu9on peut o˜tenir —u (n—l un progr—mme IHH 7 ™ompletD qui ™ontient Fli˜A IQU .

LA PROGRAMMATION MODULAIRE toutes les instru™tions né™ess—ires à l9ordin—teurD même ™elles qui lui expliquent ™omE ment —0™her du texte 3 €—r exempleD l— fon™tion printf se trouve d—ns un F—D et ser— don™ r—ssem˜lée —ve™ votre ™ode sour™e d—ns l9exé™ut—˜leF h—ns quelque tempsD nous —pprendrons à utiliser des ˜i˜liothèques gr—phiquesF gellesE™i seront là —ussi d—ns des F— et ™ontiendront des instru™tions pour indiquer à l9ordin—teur ™omment ouvrir une fenêtre à l9é™r—nD p—r exempleF w—is p—tien™eD ™—r tout vient à point à qui s—it —ttendreD ™9est ˜ien ™onnuF La portée des fonctions et des variables €our ™lore ™e ™h—pitreD il nous f—ut impér—tivement dé™ouvrir l— notion de portée des fon™tions et des v—ri—˜lesF xous —llons voir qu—nd les v—ri—˜les et les fon™tions sont —™™essi˜lesD ™9estEàEdire qu—nd on peut f—ire —ppel à ellesF Les variables propres aux fonctions vorsque vous dé™l—rez une v—ri—˜le d—ns une fon™tionD ™elleE™i est supprimée de l— mémoire à l— (n de l— fon™tion X int triple@int nom˜reA { int result—t a HY GG v— v—ri—˜le result—t est ™réée en mémoire result—t a Q B nom˜reY return result—tY } GG v— fon™tion est terminéeD l— v—ri—˜le result—t est supprimée de l— mémoire …ne v—ri—˜le dé™l—rée d—ns une fon™tion n9existe don™ que pend—nt que l— fon™tion est exé™utéeF u9estE™e que ç— veut direD ™on™rètement c ue vous ne pouvez p—s y —™™éder depuis une —utre fon™tion 3 int triple@int nom˜reAY int m—in@int —rg™D ™h—r B—rgv‘“A { printf@4ve triple de IS est 7d’n4D triple@ISAAY printf@4ve triple de IS est 7d4D result—tAY GG irreur } return HY int triple@int nom˜reA { IQV .CHAPITRE 10.

LA PORTÉE DES FONCTIONS ET DES VARIABLES int result—t a HY result—t a Q B nom˜reY return result—tY } h—ns le m—inD j9ess—ie i™i d9—™™éder à l— v—ri—˜le result—tF yrD ™omme ™ette v—ri—˜le result—t — été ™réée d—ns l— fon™tion tripleD elle n9est p—s —™™essi˜le d—ns l— fon™tion m—in 3 Retenez bien X une v—ri—˜le dé™l—rée d—ns une fon™tion n9est —™™essi˜le qu9à l9intérieur de ™ette fon™tionF yn dit que ™9est une v—ri—˜le lo™—leF Les variables globales : à éviter Variable globale accessible dans tous les chiers sl est possi˜le de dé™l—rer des v—ri—˜les qui seront —™™essi˜les d—ns toutes les fon™tions de tous les (™hiers du projetF te v—is vous montrer ™omment f—ire pour que vous s—™hiez que ç— existeD m—is génér—lement il f—ut éviter de le f—ireF Ǘ —ur— l9—ir de simpli(er votre ™ode —u dé˜utD m—is ensuite vous risquez de vous retrouver —ve™ de nom˜reuses v—ri—˜les —™™essi˜les p—rtoutD ™e qui risquer— de vous ™réer des sou™isF €our dé™l—rer une v—ri—˜le  glo˜—le —™™essi˜le p—rtoutD vous devez f—ire l— dé™l—r—tion de l— v—ri—˜le en dehors des fon™tionsF †ous ferez génér—lement l— dé™l—r—tion tout en h—ut du (™hierD —près les 5in™ludeF 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int result—t a HY GG hé™l—r—tion de v—ri—˜le glo˜—le void triple@int nom˜reAY GG €rototype de fon™tion int m—in@int —rg™D ™h—r B—rgv‘“A { triple@ISAY GG yn —ppelle l— fon™tion tripleD qui modifie l— v—ri—˜le glo˜—le → result—t printf@4ve triple de IS est 7d’n4D result—tAY GG yn — —™™ès à result—t } return HY void triple@int nom˜reA { result—t a Q B nom˜reY } ƒur ™et exempleD m— fon™tion triple ne renvoie plus rien @voidAF ille se ™ontente de IQW .

CHAPITRE 10. Variable globale accessible uniquement dans un chier v— v—ri—˜le glo˜—le que nous venons de voir ét—it —™™essi˜le d—ns tous les (™hiers du projetF sl est possi˜le de l— rendre —™™essi˜le uniquement d—ns le (™hier d—ns lequel elle se trouveF Ǘ reste une v—ri—˜le glo˜—le qu—nd mêmeD m—is disons qu9elle n9est glo˜—le qu9—ux fon™tions de ™e (™hierD et non à toutes les fon™tions du progr—mmeF €our ™réer une v—ri—˜le glo˜—le —™™essi˜le uniquement d—ns un (™hierD r—joutez simpleE ment le motE™lé st—ti™ dev—nt X st—ti™ int result—t a HY Variable statique à une fonction ettention X ™9est un peu plus déli™—tD i™iF ƒi vous r—joutez le motE™lé st—ti™ dev—nt l— dé™l—r—tion d9une v—ri—˜le à l9intérieur d9une fon™tionD ç— n9— p—s le même sens que pour les v—ri—˜les glo˜—lesF in f—itD l— v—ri—˜le st—ti™ n9est plus supprimée à l— (n de l— fon™tionF v— pro™h—ine fois qu9on —ppeller— l— fon™tionD l— v—ri—˜le —ur— ™onservé s— v—leurF €—r exemple X int triple@int nom˜reA { st—ti™ int result—t a HY GG v— v—ri—˜le result—t est ™réée l— première fois → que l— fon™tion est —ppelée result—t a Q B nom˜reY return result—tY } GG v— v—ri—˜le result—t n9est €eƒ supprimée lorsque l— fon™tion est terminéeF u9estE™e que ç— signi(eD ™on™rètement c u9on pourr— r—ppeler l— fon™tion plus t—rd et l— v—ri—˜le result—t ™ontiendr— toujours l— v—leur de l— dernière foisF †oi™i un petit exemple pour ˜ien ™omprendre X int in™remente@AY IRH . LA PROGRAMMATION MODULAIRE modi(er l— v—ri—˜le glo˜—le result—t que l— fon™tion m—in peut ré™upérerF w— v—ri—˜le result—t ser— —™™essi˜le d—ns tous les (™hiers du projetD on pourr— don™ f—ire —ppel à elle d—ns „y…„iƒ les fon™tions du progr—mmeF Ce type de choses est généralement à bannir dans un programme en C. Utilisez plutôt le retour de la fonction (return) pour renvoyer un résultat.

LA PORTÉE DES FONCTIONS ET DES VARIABLES int m—in@int —rg™D { printf@47d’n4D printf@47d’n4D printf@47d’n4D printf@47d’n4D } return HY ™h—r B—rgv‘“A in™remente@AAY in™remente@AAY in™remente@AAY in™remente@AAY int in™remente@A { st—ti™ int nom˜re a HY nom˜reCCY return nom˜reY } £ ¢gode we˜ X WPSUUT ¡   I P Q R s™iD l— première fois qu9on —ppelle l— fon™tion in™rementeD l— v—ri—˜le nom˜re est ™rééeF ille est in™rémentée à ID et une fois l— fon™tion terminée l— v—ri—˜le n9est p—s suppriméeF vorsque l— fon™tion est —ppelée une se™onde foisD l— ligne de l— dé™l—r—tion de v—ri—˜le est tout simplement  s—utée F yn ne re™rée p—s l— v—ri—˜leD on réutilise l— v—ri—˜le qu9on —v—it déjà ™rééeF gomme l— v—ri—˜le v—l—it ID elle v—udr— m—inten—nt PD puis QD puis RD et™F Les fonctions locales à un chier €our en (nir —ve™ les portéesD nous —llons nous intéresser à l— portée des fon™tionsF xorm—lementD qu—nd vous ™réez une fon™tionD ™elleE™i est glo˜—le à tout le progr—mmeF ille est —™™essi˜le depuis n9importe quel —utre (™hier F™F sl se peut que vous —yez ˜esoin de ™réer des fon™tions qui ne seront —™™essi˜les que d—ns le (™hier d—ns lequel se trouve l— fon™tionF €our f—ire ™el—D r—joutez le motE™lé st—ti™ @en™ore luiA dev—nt l— fon™tion X st—ti™ int triple@int nom˜reA { GG snstru™tions } €ensez à mettre à jour le prototype —ussi X IRI .

CHAPITRE 10. LA PROGRAMMATION MODULAIRE st—ti™ int triple@int nom˜reAY w—inten—ntD votre fon™tion st—ti™ triple ne peut être —ppelée que depuis une —utre fon™tion du même (™hierF ƒi vous ess—yez d9—ppeler l— fon™tion triple depuis une fon™tion d9un —utre (™hierD ç— ne m—r™her— p—s ™—r triple n9y ser— p—s —™™essi˜leF ‚ésumons tous les types de portée qui peuvent exister pour les v—ri—˜les X ! …ne v—ri—˜le dé™l—rée d—ns une fon™tion est supprimée à l— (n de l— fon™tionD elle n9est —™™essi˜le que d—ns ™ette fon™tionF ! …ne v—ri—˜le dé™l—rée d—ns une fon™tion —ve™ le motE™lé st—ti™ dev—nt n9est p—s supprimée à l— (n de l— fon™tionD elle ™onserve s— v—leur —u fur et à mesure de l9exé™ution du progr—mmeF ! …ne v—ri—˜le dé™l—rée en dehors des fon™tions est une v—ri—˜le glo˜—leD —™™essi˜le depuis toutes les fon™tions de tous les (™hiers sour™e du projetF ! …ne v—ri—˜le glo˜—le —ve™ le motE™lé st—ti™ dev—nt est glo˜—le uniquement d—ns le (™hier d—ns lequel elle se trouveD elle n9est p—s —™™essi˜le depuis les fon™tions des —utres (™hiersF he mêmeD voi™i les types de portée qui peuvent exister pour les fon™tions X ! …ne fon™tion est p—r déf—ut —™™essi˜le depuis tous les (™hiers du projetD on peut don™ l9—ppeler depuis n9importe quel —utre (™hierF ! ƒi on veut qu9une fon™tion ne soit —™™essi˜le que d—ns le (™hier d—ns lequel elle se trouveD il f—ut r—jouter le motE™lé st—ti™ dev—ntF En résumé ! …n progr—mme ™ontient de nom˜reux (™hiers F™F in règle génér—leD ™h—que (™hier F™ — un petit frère du même nom —y—nt l9extension Fh @qui signi(e headerAF ve F™ ™ontient les fon™tions t—ndis que le Fh ™ontient les prototypesD ™9estEàEdire l— sign—ture de ™es fon™tionsF ! ve ™ontenu des (™hiers Fh est in™lus en h—ut des F™ p—r un progr—mme —ppelé préprocesseurF ! ves F™ sont tr—nsformés en (™hiers Fo ˜in—ires p—r le compilateurF ! ves Fo sont —ssem˜lés en un exé™ut—˜le @FexeA p—r le linkerD —ussi —ppelé éditeur de liensF ! …ne v—ri—˜le dé™l—rée d—ns une fon™tion n9est p—s —™™essi˜le d—ns une —utre fon™tionF yn p—rle de portée des variablesF IRP .

Prenez un grand bol d'air avant car ce chapitre ne sera probablement pas une partie de plaisir. Si j'insiste autant sur leur importance. IRQ . Nombre de ceux qui apprennent le langage C titubent en général sur les pointeurs. nous les avons d'ailleurs déjà utilisés sans le savoir. c'est parce qu'il est impossible de programmer en langage C sans les connaître et bien les comprendre. Les pointeurs sont omniprésents. Nous allons faire en sorte que ce ne soit pas votre cas. Redoublez d'attention et prenez le temps de comprendre les nombreux schémas de ce chapitre.Chapitre 11 Diculté : À l'assaut des pointeurs L 'heure est venue pour vous de découvrir les pointeurs. Les pointeurs représentent en eet une des notions les plus délicates du langage C.

CHAPITRE 11. À L'ASSAUT DES POINTEURS Un problème bien ennuyeux …n des plus gros pro˜lèmes —ve™ les pointeursD en plus d9être —ssez déli™—ts à —ssimiler pour des dé˜ut—ntsD ™9est qu9on — du m—l à ™omprendre à quoi ils peuvent ˜ien servirF elors ˜ien sûrD je pourr—is vous dire X  ves pointeurs sont tot—lement indispens—˜lesD on s9en sert tout le tempsD ™royezEmoi 3 D m—is je s—is que ™el— ne vous su0r— p—sF te v—is don™ vous poser un pro˜lème que vous ne pourrez p—s résoudre s—ns utiliser de pointeursF ge ser— en quelque sorte le (l rouge du ™h—pitreF xous en rep—rlerons à l— (n de ™e ™h—pitre et verrons quelle est l— solution en utilis—nt ™e que vous —urez —pprisF †oi™i le pro˜lème X je veux é™rire une fon™tion qui renvoie deux v—leursF  smpossi˜le me direzEvous 3 in e'etD on ne peut renvoyer qu9une v—leur p—r fon™tion X int fon™tion@A { return v—leurY } ƒi on indique intD on renverr— un nom˜re de type int @grâ™e à l9instru™tion returnAF yn peut —ussi é™rire une fon™tion qui ne renvoie —u™une v—leur —ve™ le motE™lé void X void fon™tion@A { } w—is renvoyer deux v—leurs à l— foisF F F ™9est impossi˜leF yn ne peut p—s f—ire deux returnF ƒupposons que je veuille é™rire une fon™tion à l—quelle on envoie un nom˜re de minutesF gelleE™i renverr—it le nom˜re d9heures et minutes ™orrespond—ntes X IF si on envoie RSD l— fon™tion renvoie H heure et RS minutes Y PF si on envoie THD l— fon™tion renvoie I heure et H minutes Y QF si on envoie WHD l— fon™tion renvoie I heure et QH minutesF ƒoyons fousD tentons le ™oup X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb GB te mets le prototype en h—utF gomme ™9est un tout petit progr—mme je ne le mets p—s d—ns un FhD m—is en temps norm—l @d—ns un vr—i progr—mmeAD j9—ur—is pl—™é le prototype d—ns un fi™hier Fh ˜ien entendu BG void de™oupewinutes@int heuresD int minutesAY IRR .

comme une fonction fait une copie des variables qu'on lui envoie. Ainsi. Si vos variables ne s'appellent pas de la même façon dans la fonction et dans le m—in. vous pourriez très bien écrire : void de™oupewinutes@int hD int mA h pour heures et m pour minutes.UN PROBLÈME BIEN ENNUYEUX int m—in@int —rg™D ™h—r B—rgv‘“A { int heures a HD minutes a WHY GB yn — une v—ri—˜le minutes qui v—ut WHF eprès —ppel de l— fon™tionD je veux que m— v—ri—˜le 4heures4 v—ille I et que m— v—ri—˜le 4minutes4 v—ille QH BG de™oupewinutes@heuresD minutesAY printf@47d heures et 7d minutes4D heuresD minutesAY } return HY void de™oupewinutes@int heuresD int minutesA { heures a minutes G THY GG WH G TH a I minutes a minutes 7 THY GG WH 7 TH a QH } we˜ X QRISVT ¡ ‚ésult—t X £ ¢gode   H heures et WH minutes utD zutD zut et rezutD ç— n9— p—s m—r™héF ue s9estEil p—ssé c in f—itD qu—nd vous  envoyez une v—ri—˜le à une fon™tionD une ™opie de l— v—ri—˜le est ré—liséeF einsiD l— v—ri—˜le heures d—ns l— fon™tion de™oupewinutes n9est p—s l— même que ™elle de l— fon™tion m—in 3 g9est simplement une ™opie 3 †otre fon™tion de™oupewinutes f—it son jo˜F À l9intérieur de de™oupewinutesD les v—ri—˜les heures et minutes ont les ˜onnes v—leurs X I et QHF w—is ensuiteD l— fon™tion s9—rrête lorsqu9on —rrive à l9—™™ol—de ferm—nteF gomme on l9— —ppris d—ns les ™h—pitres pré™édentsD toutes les v—ri—˜les ™réées d—ns une fon™tion sont détruites à l— (n de ™ette fon™tionF †os ™opies de heures et de minutes sont don™ suppriméesF yn retourne ensuite à l— fon™tion m—inD d—ns l—quelle vos v—ri—˜les heures et minutes v—lent toujours H et WHF g9est un é™he™ 3 Notez que. vous n'êtes pas du tout obligés d'appeler vos variables de la même façon que dans le m—in. ça ne pose donc aucun problème ! IRS .

À L'ASSAUT DES POINTEURS frefD vous —urez ˜e—u retourner le pro˜lème d—ns tous les sensF F F vous pouvez ess—yer de renvoyer une v—leur —ve™ l— fon™tion @en utilis—nt un return et en mett—nt le type int à l— fon™tionAD m—is vous n9—rriveriez à renvoyer qu9une des deux v—leursF †ous ne pouvez p—s renvoyer les deux v—leurs à l— foisF he plusD vous ne pouvez p—s utiliser de v—ri—˜les glo˜—les ™—rD ™omme on l9— vuD ™ette pr—tique est fortement dé™onseilléeF †oilàD le pro˜lème est poséF gomment les pointeurs vontEils nous permettre de le réE soudre c La mémoire.CHAPITRE 11. une question d'adresse Rappel des faits €etit )—shE˜—™kF †ous souvenezEvous du ™h—pitre sur les v—ri—˜les c uelle que soit l— réponseD je vous re™omm—nde très vivement d9—ller relire l— première p—rtie de ™e ™h—pitreD intitulée  …ne —'—ire de mémoire F sl y —v—it un s™hém— très import—nt que je vous propose i™i à nouve—u @(gF IIFIAF Figure IIFI ! yrg—nis—tion de l— mémoire vive g9est un peu ™omme ç— qu9on peut représenter l— mémoire vive @‚ewA de votre ordiE n—teurF IRT .

UNE QUESTION D'ADRESSE sl f—ut lire ™e s™hém— ligne p—r ligneF v— première ligne représente l—  ™ellule du tout dé˜ut de l— mémoire viveF gh—que ™ellule — un numéroD ™9est son adresse F v— mémoire ™omporte un gr—nd nom˜re d9—dressesD ™ommenç—nt à l9—dresse numéro H et se termin—nt à l9—dresse numéro (insérez un très grand nombre ici) F À ™h—que —dresseD on peut sto™ker un nom˜reF …n et …x ƒi…v nom˜reF yn ne peut p—s sto™ker deux nom˜res p—r —dresseF †otre mémoire n9est f—ite que pour sto™ker des nom˜resF ille ne peut sto™ker ni lettres ni phr—sesF €our ™ontourner ™e pro˜lèmeD on — inventé une t—˜le qui f—it l— li—ison entre les nom˜res et les lettresF gette t—˜le dit p—r exemple X  ve nom˜re VW représente l— lettre ‰ F xous reviendrons d—ns un pro™h—in ™h—pitre sur l— gestion des ™—r—™tères Y pour l9inst—ntD nous nous ™on™entrons sur le fon™tionnement de l— mémoireF 1 2 Adresse et valeur u—nd vous ™réez une v—ri—˜le —ge de type int p—r exempleD en t—p—nt ç— X int —ge a IHY F F F votre progr—mme dem—nde —u système d9exploit—tion @‡indowsD p—r exempleA l— permission d9utiliser un peu de mémoireF ve système d9exploit—tion répond en indiqu—nt à quelle —dresse en mémoire il vous l—isse le droit d9ins™rire votre nom˜reF g9est d9—illeurs justement là un des rôles prin™ip—ux d9un système d9exploit—tion X on dit qu9il —lloue de l— mémoire —ux progr—mmesF g9est un peu lui le ™hefD il ™ontrôle ™h—que progr—mme et véri(e que ™e dernier — l9—utoris—tion de se servir de l— mémoire à l9endroit où il le f—itF C'est d'ailleurs là la cause no 1 de plantage des programmes : si votre programme essaie d'accéder à une zone de la mémoire qui ne lui appartient pas. Le nombre d'adresses disponibles dépend en fait de la quantité de mémoire dont dispose votre ordinateur. voit une jolie boîte de dialogue du type  Ce programme va être arrêté parce qu'il a eectué une opération non conforme .LA MÉMOIRE. ‚evenons à notre v—ri—˜le —geF v— v—leur IH — été ins™rite quelque p—rt en mémoireD disons p—r exemple à l9—dresse no RTSSF ge qu9il se p—sse @et ™9est le rôle du ™ompil—teurAD ™9est que le mot —ge d—ns votre progr—mme est rempl—™é p—r l9—dresse RTSS à l9exé™utionF gel— f—it queD à ™h—que fois que vous —vez t—pé le mot —ge d—ns votre ™ode sour™eD il est rempl—™é p—r RTSSD et votre ordin—teur voit —insi à quelle —dresse il doit —ller ™her™her en mémoire 3 hu ™oupD l9ordin—teur se rend en mémoire à l9—dresse RTSS et répond (èrement X  v— v—ri—˜le —ge v—ut IH 3 F 1. L'utilisateur. Le vocabulaire est très important. 2. IRU . le système d'exploitation (abrégez  OS ) le refuse et coupe brutalement le programme en guise de punition ( C'est qui le chef ici ? ). retenez-le. lui.

CHAPITRE 11. etc. Il est totalement impossible de prédire à quelle adresse la variable sera stockée chez vous. Tout dépend de la place que vous avez en mémoire. Si vous lancez votre programme plusieurs fois d'alée. l'adresse sera très certainement diérente. des programmes que vous avez lancés. À L'ASSAUT DES POINTEURS yn s—it don™ ™omment ré™upérer l— v—leur de l— v—ri—˜le X il su0t tout ˜êtement de t—per —ge d—ns son ™ode sour™eF ƒi on veut —0™her l9âgeD on peut utiliser l— fon™tion printf X printf@4v— v—ri—˜le —ge v—ut X 7d4D —geAY ‚ésult—t à l9é™r—n X v— v—ri—˜le —ge v—ut X IH ‚ien de ˜ien nouve—u jusqueElàF Le scoop du jour yn s—it —0™her l— v—leur de l— v—ri—˜leD m—is s—viezEvous que l9on peut —ussi —0™her l9—dresse ™orrespond—nte c €our —0™her l9—dresse de l— v—ri—˜leD on doit utiliser le sym˜ole 7p @le p du mot  poinE teur A d—ns le printfF in outreD on doit envoyer à l— fon™tion printf non p—s l— v—ri—˜le —geD m—is son —dresseF F F it pour f—ire ™el—D vous devez mettre le sym˜ole 8 dev—nt l— v—ri—˜le —geD ™omme je vous —v—is dem—ndé de le f—ire pour les s™—nfD il y — quelque tempsD s—ns vous expliquer pourquoiF „—pez don™ X printf@4v9—dresse de l— v—ri—˜le —ge est X 7p4D 8—geAY ‚ésult—t X v9—dresse de l— v—ri—˜le —ge est X HHPQppUR ge que vous voyez là est l9—dresse de l— v—ri—˜le —ge —u moment où j9—i l—n™é le proE gr—mme sur mon ordin—teurF yuiD ouiD HHPQppUR est un nom˜reD il est simplement é™rit d—ns le système hex—dé™im—lD —u lieu du système dé™im—l dont nous —vons l9h—˜itudeF ƒi vous rempl—™ez 7p p—r 7dD vous o˜tiendrez un nom˜re dé™im—l que vous ™onn—issezF Si vous exécutez ce programme sur votre ordinateur. il se peut que l'adresse soit identique. la mémoire n'ayant pas beaucoup changé entre temps. yù je veux en venir —ve™ tout ç— c ih ˜ien en f—itD je veux vous f—ire retenir ™e™i X ! —ge X désigne la valeur de l— v—ri—˜le Y ! 8—ge X désigne l'adresse de l— v—ri—˜leF IRV . Si par contre vous redémarrez votre ordinateur. vous aurez sûrement une valeur diérente.

En eet. non ? Ça revient à stocker des nombres encore et toujours ! g9est ex—™tF w—is ™es nom˜res —uront une signi(™—tion p—rti™ulière X ils indiqueront l9—dresse d9une —utre v—ri—˜le en mémoireF Créer un pointeur €our ™réer une v—ri—˜le de type pointeurD on doit r—jouter le sym˜ole B dev—nt le nom de l— v—ri—˜leF int Bmon€ointeurY Notez qu'on peut aussi écrire.UTILISER DES POINTEURS eve™ —geD l9ordin—teur v— lire l— v—leur de l— v—ri—˜le en mémoire et vous renvoie ™ette v—leurF eve™ 8—geD votre ordin—teur vous dit en rev—n™he à quelle —dresse se trouve l— v—ri—˜leF Utiliser des pointeurs tusqu9i™iD nous —vons uniquement ™réé des v—ri—˜les f—ites pour ™ontenir des nom˜resF w—inten—ntD nous —llons —pprendre à ™réer des v—ri—˜les f—ites pour ™ontenir des —dresses X ™e sont justement ™e qu9on —ppelle des pointeursF Mais. Veillez à l'écrire en majuscules. Les adresses sont des nombres aussi. intB mon€ointeurY Cela revient exactement au même. . si vous voulez déclarer plusieurs pointeurs sur la même ligne. . vous serez obligés de mettre l'étoile devant le nom : int BpointeurID BpointeurPD BpointeurQY gomme je vous l9—i —pprisD il est import—nt d9initi—liser dès le dé˜ut ses v—ri—˜lesD en leur donn—nt l— v—leur H p—r exempleF g9est en™ore plus import—nt de le f—ire —ve™ les pointeurs 3 €our initi—liser un pointeurD ™9estEàEdire lui donner une v—leur p—r déf—utD on n9utilise génér—lement p—s le nom˜re H m—is le motE™lé x…vv X 3 int Bmon€ointeur a x…vvY vàD vous —vez un pointeur initi—lisé à x…vvF gomme ç—D vous s—urez d—ns l— suite de votre progr—mme que votre pointeur ne ™ontient —u™une —dresseF 3. la première méthode est à préférer. . . IRW . Cependant.

. À L'ASSAUT DES POINTEURS ue se p—sseEtEil c ge ™ode v— réserver une ™—se en mémoire ™omme si vous —viez ™réé une v—ri—˜le norm—leF gepend—ntD et ™9est ™e qui ™h—ngeD l— v—leur du pointeur est f—ite pour ™ontenir une —dresseF v9—dresseF F F d9une —utre v—ri—˜leF €ourquoi p—s l9—dresse de l— v—ri—˜le —ge c †ous s—vez m—inten—nt ™omment indiquer l9—dresse d9une v—ri—˜le —u lieu de s— v—leur @en utilis—nt le sym˜ole 8AD —lors —llonsEy 3 Ǘ nous donne X int —ge a IHY int Bpointeurƒurege a 8—geY v— première ligne signi(e X  gréer une v—ri—˜le de type int dont l— v—leur v—ut IH F v— se™onde ligne signi(e X  gréer une v—ri—˜le de type pointeur dont l— v—leur v—ut l9—dresse de l— v—ri—˜le —ge F v— se™onde ligne f—it don™ deux ™hoses à l— foisF ƒi vous le souh—itezD pour ne p—s tout mél—ngerD s—™hez qu9on peut l— dé™ouper en deux temps X int —ge a IHY int BpointeurƒuregeY GG IA signifie 4te ™rée un pointeur4 pointeurƒurege a 8—geY GG PA signifie 4pointeurƒurege ™ontient l9—dresse de l— → v—ri—˜le —ge4 †ous —vez rem—rqué qu9il n9y — p—s de type  pointeur ™omme il y — un type int et un type dou˜leF yn n9é™rit don™ p—s X pointeur pointeurƒuregeY eu lieu de ç—D on utilise le sym˜ole BD m—is on ™ontinue à é™rire intF u9estE™e que ç— signi(e c in f—itD on doit indiquer quel est le type de l— v—ri—˜le dont le pointeur v— ™ontenir l9—dresseF gomme notre pointeur pointeurƒurege v— ™ontenir l9—dresse de l— v—ri—˜le —ge @qui est de type intAD —lors mon pointeur doit être de type intB 3 ƒi m— v—ri—˜le —ge —v—it été de type dou˜leD —lors j9—ur—is dû é™rire dou˜le Bmon€ointeurF Vocabulaire X on dit que le pointeur pointeurƒurege pointe sur l— v—ri—˜le —geF v— (gF IIFP résume ™e qu9il s9est p—ssé d—ns l— mémoireF h—ns ™e s™hém—D l— v—ri—˜le —ge — été pl—™ée à l9—dresse IUURSH @vous voyez d9—illeurs que s— v—leur est IHAD et le pointeur pointeurƒurege — été pl—™é à l9—dresse Q @™9est tout à f—it le fruit du h—s—rdAF vorsque mon pointeur est ™rééD le système d9exploit—tion réserve une ™—se en mémoire ™omme il l9— f—it pour —geF v— di'éren™e i™iD ™9est que l— v—leur de pointeurƒurege est un peu p—rti™ulièreF ‚eg—rdez ˜ien le s™hém— X ™9est l9—dresse de l— v—ri—˜le —ge 3 ge™iD ™hers le™teursD est le se™ret —˜solu de tout progr—mme é™rit en l—ng—ge gF yn y estD nous venons de rentrer d—ns le monde merveilleux des pointeurs 3 Et. . ça sert à quoi ? ISH .CHAPITRE 11.

UTILISER DES POINTEURS Figure IIFP ! wémoireD —dresses et pointeurs ISI .

À L'ASSAUT DES POINTEURS Ǘ ne tr—nsforme p—s en™ore votre ordin—teur en m—™hine à ™—féD ™ertesF ƒeulement m—inten—ntD on — un pointeurƒurege qui ™ontient l9—dresse de l— v—ri—˜le —geF iss—yons de voir ™e que ™ontient le pointeur à l9—ide d9un printf X int —ge a IHY int Bpointeurƒurege a 8—geY printf@47d4D pointeurƒuregeAY IUURSH rumF in f—itD ™el— n9est p—s très étonn—ntF yn dem—nde l— v—leur de pointeurƒuregeD et s— v—leur ™9est l9—dresse de l— v—ri—˜le —ge @IUURSHAF gomment f—ire pour dem—nder à —voir l— v—leur de l— v—ri—˜le se trouv—nt à l9—dresse indiquée d—ns pointeurƒurege c sl f—ut pl—™er le sym˜ole B dev—nt le nom du pointeur X int —ge a IHY int Bpointeurƒurege a 8—geY printf@47d4D BpointeurƒuregeAY IH rourr— 3 xous y sommes —rrivés 3 in pl—ç—nt le sym˜ole B dev—nt le nom du pointeurD on —™™ède à l— v—leur de l— v—ri—˜le —geF ƒi —u ™ontr—ire on —v—it utilisé le sym˜ole 8 dev—nt le nom du pointeurD on —ur—it o˜tenu l9—dresse à l—quelle se trouve le pointeur @i™iD ™9est QAF Qu'est-ce qu'on y gagne ? On a simplement réussi à compliquer les choses ici. On n'avait pas besoin d'un pointeur pour acher la valeur de la variable —ge ! gette question @que vous devez inévit—˜lement vous poserA est légitimeF eprès toutD qui pourr—it vous en vouloir c e™tuellement l9intérêt n9est p—s évidentD m—is petit à petitD tout —u long des ™h—pitres suiv—ntsD vous ™omprendrez que tout ™el— n9— p—s été inventé p—r pur pl—isir de ™ompliquer les ™hosesF p—ites l9imp—sse sur l— frustr—tion que vous devez ressentir @ „out ç— pour ç— c AF ƒi vous —vez ™ompris le prin™ipeD ™9est l9essentielF ves ™hoses s9é™l—ir™iront d9ellesEmêmes p—r l— suiteF À retenir absolument †oi™i ™e qu9il f—ut —voir ™ompris et ™e qu9il f—ut retenir pour l— suite de ™e ™h—pitre X ! sur une v—ri—˜leD ™omme l— v—ri—˜le —ge X ISP .CHAPITRE 11.

UTILISER DES POINTEURS ! —ge signi(e X  te veux l— v—leur de l— v—ri—˜le —ge D ! 8—ge signi(e X  te veux l9—dresse à l—quelle se trouve l— v—ri—˜le —ge Y ! sur un pointeurD ™omme pointeurƒurege X ! pointeurƒurege signi(e X  te veux l— v—leur de pointeurƒurege @™ette v—leur ét—nt une —dresseAD ! Bpointeurƒurege signi(e X  te veux l— v—leur de l— v—ri—˜le qui se trouve à l9—dresse ™ontenue d—ns pointeurƒurege F gontentezEvous de ˜ien retenir ™es qu—tre pointsF p—ites des tests et véri(ez que ç— m—r™heF ve s™hém— de l— (gF IIFQ devr—it ˜ien vous —ider à situer ™h—™un de ™es élémentsF Figure IIFQ ! hésign—tion des v—ri—˜les et pointeurs ISQ .

CHAPITRE 11. „out ™el— est fonEd—EmenEt—lF sl f—ut ™onn—ître ™el— p—r ™÷ur et surtout le ™omprendreF x9hésitez p—s à lire et relire ™e qu9on vient d9—pprendreF te ne peux p—s vous en vouloir si vous n9—vez p—s ™ompris du premier ™oup et ™e n9est p—s une honte non plusD d9—illeursF sl f—ut en génér—l quelques jours pour ˜ien ™omprendre et souvent quelques mois pour en s—isir toutes les su˜tilitésF ƒi vous vous sentez un peu perdusD pensez à ™es gens qui sont —ujourd9hui de gr—nds gourous de l— progr—mm—tion X —u™un d9entre eux n9— ™ompris tout le fon™tionnement des pointeurs du premier ™oupF it si j—m—is ™ette personne existeD il f—udr— vr—iment me l— présenterF Envoyer un pointeur à une fonction ve gros intérêt des pointeurs @m—is ™e n9est p—s le seulA est qu9on peut les envoyer à des fon™tions pour qu9ils modi(ent dire™tement une v—ri—˜le en mémoireD et non une ™opie ™omme on l9— vuF gomment ç— m—r™he c sl y — en f—it plusieurs f—çons de f—ireF †oi™i un premier exemple X void triple€ointeur@int Bpointeurƒurxom˜reAY int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜re a SY triple€ointeur@8nom˜reAY GG yn envoie l9—dresse de nom˜re à l— fon™tion printf@47d4D nom˜reAY GG yn —ffi™he l— v—ri—˜le nom˜reF v— fon™tion — → dire™tement modifié l— v—leur de l— v—ri—˜le ™—r elle ™onn—iss—it son → —dresse } return HY void triple€ointeur@int Bpointeurƒurxom˜reA { Bpointeurƒurxom˜re Ba QY GG yn multiplie p—r Q l— v—leur de nom˜re ISR . . lorsqu'ensuite vous utilisez votre pointeur en écrivant : printf@47d4D BpointeurƒuregeAY . . cela ne signie pas  Je veux créer un pointeur  mais :  Je veux la valeur de la variable sur laquelle pointe mon pointeurƒurege . l'étoile sert juste à indiquer qu'on veut créer un pointeur : int BpointeurƒuregeY En revanche. À L'ASSAUT DES POINTEURS Attention à ne pas confondre les diérentes signications de l'étoile ! Lorsque vous déclarez un pointeur.

ENVOYER UN POINTEUR À UNE FONCTION } £ ¢gode IS we˜ X PTSPSR ¡   v— fon™tion triple€ointeur prend un p—r—mètre de type intB @™9estEàEdire un pointeur sur intAF †oi™i ™e qu9il se p—sse d—ns l9ordreD en p—rt—nt du dé˜ut du m—in X IF une v—ri—˜le nom˜re est ™réée d—ns le m—inF yn lui —'e™te l— v—leur SF ǗD vous ™onn—issez Y PF on —ppelle l— fon™tion triple€ointeurF yn lui envoie en p—r—mètre l9—dresse de notre v—ri—˜le nom˜re Y QF l— fon™tion triple€ointeur reçoit ™ette —dresse d—ns pointeurƒurxom˜reF À l9inE térieur de l— fon™tion triple€ointeurD on — don™ un pointeur pointeurƒurxom˜re qui ™ontient l9—dresse de l— v—ri—˜le nom˜re Y RF m—inten—nt qu9on — un pointeur sur nom˜reD on peut modi(er dire™tement l— v—ri—˜le nom˜re en mémoire 3 sl su0t d9utiliser Bpointeurƒurxom˜re pour désiE gner l— v—ri—˜le nom˜re 3 €our l9exempleD on f—it un simple test X on multiplie l— v—ri—˜le nom˜re p—r Q Y SF de retour d—ns l— fon™tion m—inD notre nom˜re v—ut m—inten—nt IS ™—r l— fon™tion triple€ointeur — modi(é dire™tement l— v—leur de nom˜reF fien sûrD j9—ur—is pu f—ire un simple return ™omme on — —ppris à le f—ire d—ns le ™h—pitre sur les fon™tionsF w—is l9intérêtD làD ™9est que de ™ette m—nièreD en utilis—nt des pointeursD on peut modi(er l— v—leur de plusieurs v—ri—˜les en mémoire @on peut don™  renvoyer plusieurs v—leurs AF xous ne sommes plus limités à une seule v—leur 3 Quel est l'intérêt maintenant d'utiliser un return dans une fonction si on peut se servir des pointeurs pour modier des valeurs ? Ǘ dépendr— de vous et de votre progr—mmeF g9est à vous de dé™iderF sl f—ut s—voir que les return sont ˜el et ˜ien toujours utilisés en gF ve plus souventD on s9en sert pour renvoyer ™e qu9on —ppelle un ™ode d9erreur X l— fon™tion renvoie I @vr—iA si tout s9est ˜ien p—sséD et H @f—uxA s9il y — eu une erreur pend—nt le déroulement de l— fon™tionF Une autre façon d'envoyer un pointeur à une fonction h—ns le ™ode sour™e qu9on vient de voirD il n9y —v—it p—s de pointeur d—ns l— fon™tion m—inF tuste une v—ri—˜le nom˜reF ve seul pointeur qu9il y —v—it vr—iment ét—it d—ns l— fon™tion triplexom˜re @de type intBAF sl f—ut —˜solument que vous s—™hiez qu9il y — une —utre f—çon d9é™rire le ™ode pré™édentD en —jout—nt un pointeur d—ns l— fon™tion m—in X ISS .

CHAPITRE 11. À L'ASSAUT DES POINTEURS void triple€ointeur@int Bpointeurƒurxom˜reAY int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜re a SY int Bpointeur a 8nom˜reY GG pointeur prend l9—dresse de nom˜re → triple€ointeur@pointeurAY GG yn envoie pointeur @l9—dresse de nom˜reA à l— fon™tion printf@47d4D BpointeurAY GG yn —ffi™he l— v—leur de nom˜re —ve™ Bpointeur return HY } void triple€ointeur@int Bpointeurƒurxom˜reA { Bpointeurƒurxom˜re Ba QY GG yn multiplie p—r Q l— v—leur de nom˜re } we˜ X QWIQIU ¡ gomp—rez ˜ien ™e ™ode sour™e —ve™ le pré™édentF sl y — de su˜tiles di'éren™es et pourt—nt le résult—t est stri™tement le même X IS £ ¢gode   ge qui ™ompteD ™9est d9envoyer l9—dresse de l— v—ri—˜le nom˜re à l— fon™tionF yrD pointeur v—ut l9—dresse de l— v—ri—˜le nom˜reD don™ ™9est ˜on de ™e ™ôté 3 yn le f—it seulement d9une m—nière di'érente en ™ré—nt un pointeur d—ns l— fon™tion m—inF h—ns le printf @et ™9est juste pour l9exer™i™eAD j9—0™he le ™ontenu de l— v—ri—˜le nom˜re en t—p—nt BpointeurF xotez qu9à l— pl—™eD j9—ur—is pu é™rire nom˜re X le résult—t —ur—it été identique ™—r Bpointeur et nom˜re désignent l— même ™hose d—ns l— mémoireF h—ns le progr—mme  €lus ou woins D nous —vons utilisé des pointeurs s—ns vr—iment le s—voirF g9ét—it en f—it en —ppel—nt l— fon™tion s™—nfF in e'etD ™ette fon™tion — pour rôle de lire ™e que l9utilis—teur — entré —u ™l—vier et de renvoyer le résult—tF €our que l— fon™tion puisse modi(er dire™tement le ™ontenu de votre v—ri—˜le —(n d9y pl—™er l— v—leur t—pée —u ™l—vierD elle — ˜esoin de l9—dresse de l— v—ri—˜le X int nom˜re a HY s™—nf@47d4D 8nom˜reAY v— fon™tion tr—v—ille —ve™ un pointeur sur l— v—ri—˜le nom˜re et peut —insi modi(er dire™tement le ™ontenu de nom˜reF gomme on vient de le voirD on pourr—it ™réer un pointeur qu9on enverr—it à l— fon™tion s™—nf X int nom˜re a HY int Bpointeur a 8nom˜reY s™—nf@47d4D pointeurAY IST .

ISU . C'est un chapitre important. vous devez faire beaucoup d'eorts pour comprendre : je peux donc bien en faire moi aussi pour vous.QUI A DIT :  UN PROBLÈME BIEN ENNUYEUX  ? ettention à ne p—s mettre le sym˜ole 8 dev—nt pointeur d—ns l— fon™tion s™—nf 3 s™iD pointeur ™ontient luiEmême l9—dresse de l— v—ri—˜le nom˜reD p—s ˜esoin de mettre un 8 3 ƒi vous f—isiez ç—D vous enverriez l9—dresse où se trouve le pointeur X or ™9est de l9—dresse de nom˜re dont on — ˜esoinF Qui a dit :  Un problème bien ennuyeux  ? ve ™h—pitre est sur le point de s9—™heverD il est temps de retrouver notre (l rougeF ƒi vous —vez ™ompris ™e ™h—pitreD vous devriez être ™—p—˜les de résoudre le pro˜lèmeD m—inten—ntF u9estE™e que vous en dites c iss—yez 3 †oi™i l— solution pour ™omp—rer X void de™oupewinutes@intB pointeurreuresD intB pointeurwinutesAY int m—in@int —rg™D ™h—r B—rgv‘“A { int heures a HD minutes a WHY GG yn envoie l9—dresse de heures et minutes de™oupewinutes@8heuresD 8minutesAY GG gette foisD les v—leurs ont été modifiées 3 printf@47d heures et 7d minutes4D heuresD minutesAY } return HY void de™oupewinutes@intB pointeurreuresD intB pointeurwinutesA { GB ettention à ne p—s ou˜lier de mettre une étoile dev—nt le nom des pointeurs 3 gomme ç—D vous pouvez modifier l— v—leur des v—ri—˜lesD et non leur —dresse 3 †ous ne voudriez p—s diviser des —dressesD n9estE™e p—s c YoA BG Bpointeurreures a Bpointeurwinutes G THY Bpointeurwinutes a Bpointeurwinutes 7 THY } we˜ X RPQHVQ ¡ ‚ésult—t X £ ¢gode   I heures et QH minutes ‚ien ne devr—it vous surprendre d—ns ™e ™ode sour™eF „outefoisD ™omme on n9est j—m—is trop prudentD je v—is r☗™her une fois de plus ™e qui se p—sse d—ns ™e ™ode —(n d9être ™ert—in que tout le monde me suit ˜ien F 4 4.

Oui. Je ne l'ai pas fait car je ne veux pas que vous risquiez de confondre avec les variables heures et ISV . En résumé ! gh—que v—ri—˜le est sto™kée à une adresse pré™ise en mémoireF ! ves pointeurs sont sem˜l—˜les —ux v—ri—˜lesD à ™e™i près qu9—u lieu de sto™ker un nom˜re ils sto™kent l9—dresse à l—quelle se trouve une v—ri—˜le en mémoireF ! ƒi on pl—™e un sym˜ole 8 dev—nt un nom de v—ri—˜leD on o˜tient son —dresse —u lieu de s— v—leur @exF X 8—geAF ! ƒi on pl—™e un sym˜ole B dev—nt un nom de pointeurD on o˜tient l— v—leur de l— v—ri—˜le sto™kée à l9—dresse indiquée p—r le pointeurF ! ves pointeurs ™onstituent une notion essentielle du l—ng—ge gD m—is né—nmoins un peu ™omplexe —u dé˜utF sl f—ut prendre le temps de ˜ien ™omprendre ™omment ils fon™tionnent ™—r ˜e—u™oup d9—utres notions sont ˜—sées dessusF minutes du main. c'est mal). À L'ASSAUT DES POINTEURS IF ves v—ri—˜les heures et minutes sont ™réées d—ns le m—inF PF yn envoie à l— fon™tion de™oupewinutes l9—dresse de heures et minutesF QF v— fon™tion de™oupewinutes ré™upère ™es —dresses d—ns des pointeurs —ppelés pointeurreures et pointeurwinutesF xotez que là en™oreD le nom importe peuF t9—ur—is pu les —ppeler h et mD ou même en™ore heures et minutes F RF v— fon™tion de™oupewinutes modi(e dire™tement les v—leurs des v—ri—˜les heures et minutes en mémoire ™—r elle possède leurs —dresses d—ns des pointeursF v— seule ™ontr—inteD un peu gên—nte je dois le re™onn—îtreD ™9est qu9il f—ut impér—tivement mettre une étoile dev—nt le nom des pointeurs si on veut modi(er l— v—leur de heures et de minutesF ƒi on n9—v—it p—s f—it ç—D on —ur—it modi(é l9—dresse ™onteE nue d—ns les pointeursD ™e qui n9—ur—it serviF F F à rienF 5 De nombreux lecteurs m'ont fait remarquer qu'il était possible de résoudre le  problème  sans utiliser de pointeurs. ce qui vous fait peut-être douter de l'intérêt des pointeurs. 5.CHAPITRE 11. bien sûr c'est possible. mais il faut contourner certaines règles que nous nous sommes xées : on peut utiliser des variables globales (mais on l'a dit. qui ne sont pas les mêmes. ou encore faire un printf dans la fonction de™oupewinutes (alors que c'est dans le m—in qu'on veut faire le printf !). L'exercice est un peu scolaire et peut donc être contourné si vous êtes malins. Soyez assurés que cet intérêt vous paraîtra de plus en plus évident au cours des chapitres suivants.

Nous commencerons dans un premier temps par quelques explications sur le fonctionnement des tableaux en mémoire (schémas à l'appui). Vous comptiez y échapper ? C'est raté ! Les pointeurs sont partout en C. Un programmeur qui comprend ce qu'il fait. Ces petites introductions sur la mémoire sont extrêmement importantes : elles vous permettent de comprendre comment cela fonctionne. non ? .Chapitre 12 Diculté : Les tableaux C e chapitre est la suite directe des pointeurs et va vous faire comprendre un peu plus leur utilité. Les tableaux sont très utilisés en C car ils sont vraiment pratiques pour organiser une série de valeurs. nous apprendrons à créer des variables de type  tableaux . vous avez été prévenus ! Dans ce chapitre.-) ISW . c'est quand même un peu plus rassurant pour la stabilité de ses programmes.

LES TABLEAUX Les tableaux dans la mémoire fonD je re™onn—is que ç— ressem˜le un peu à une dé(nition du di™tionn—ireF gon™rèteE mentD il s9—git de  grosses v—ri—˜les pouv—nt ™ontenir plusieurs nom˜res du même type @longD intD ™h—rD dou˜leF F FAF …n t—˜le—u — une dimension ˜ien pré™iseF sl peut o™™uper PD QD IHD ISHD P SHH ™—sesD ™9est vous qui dé™idezF v— (gF IPFI est un s™hém— d9un t—˜le—u de R ™—ses en mémoire qui ™ommen™e à l9—dresse ITHHF  Les tableaux sont une suite de variables de même type.CHAPITRE 12.  Figure IPFI ! …n t—˜le—u de R ™—ses vorsque vous dem—ndez à ™réer un t—˜le—u de R ™—ses en mémoireD votre progr—mme dem—nde à l9yƒ l— permission d9utiliser R ™—ses en mémoireF ges R ™—ses doivent être ™ontiguësD ™9estEàEdire les unes à l— suite des —utresF gomme vous le voyezD les —dresses se suivent X ITHHD ITHID ITHPD ITHQF sl n9y — p—s de  trou —u milieuF in(nD ™h—que ™—se du t—˜le—u ™ontient un nom˜re du même typeF ƒi le t—˜le—u est de type intD —lors ™h—que ™—se du t—˜le—u ™ontiendr— un intF yn ne peut p—s f—ire de t—˜le—u ™onten—nt à l— fois des int et des dou˜le p—r exempleF in résuméD voi™i ™e qu9il f—ut retenir sur les t—˜le—uxF ! vorsqu9un t—˜le—u est ™rééD il prend un esp—™e ™ontigu en mémoire X les ™—ses sont les unes à l— suite des —utresF ! „outes les ™—ses d9un t—˜le—u sont du même typeF einsiD un t—˜le—u de int ™ontiendr— uniquement des intD et p—s —utre ™hoseF Dénir un tableau €our ™ommen™erD nous —llons voir ™omment dé(nir un t—˜le—u de R int X int t—˜le—u‘R“Y ITH . situées dans un espace contigu en mémoire.

souvenez-vous-en. quand même. ITI . ƒi je veux mettre d—ns mon t—˜le—u les mêmes v—leurs que ™elles indiquées sur l— (gF IPFID je devr—i don™ é™rire X int t—˜le—u‘R“Y t—˜le—u‘H“ t—˜le—u‘I“ t—˜le—u‘P“ t—˜le—u‘Q“ a a a a IHY PQY SHSY VY Je ne vois pas le rapport entre les tableaux et les pointeurs ? in f—itD si vous é™rivez juste t—˜le—uD vous o˜tenez un pointeurF g9est un pointeur sur l— première ™—se du t—˜le—uF p—ites le test X int t—˜le—u‘R“Y printf@47d4D t—˜le—uAY ‚ésult—tD on voit l9—dresse où se trouve t—˜le—u X ITHH in rev—n™heD si vous indiquez l9indi™e de l— ™—se du t—˜le—u entre ™ro™hetsD vous o˜tenez l— v—leur X int t—˜le—u‘R“Y printf@47d4D t—˜le—u‘H“AY IH he même pour les —utres indi™esF xotez que ™omme t—˜le—u est un pointeurD on peut utiliser le sym˜ole B pour ™onn—ître l— première v—leur X 1. 2 et 3. 1. À part peut-être la taille de votre mémoire. Il n'y a pas d'indice 4 dans un tableau de 4 cases ! C'est une source d'erreurs très courantes.DÉFINIR UN TABLEAU †oilàD ™9est toutF sl su0t don™ de r—jouter entre ™ro™hets le nom˜re de ™—ses que vous voulez mettre d—ns votre t—˜le—uF sl n9y — p—s de limite F w—inten—ntD ™omment —™™éder à ™h—que ™—se du t—˜le—u c g9est simpleD il f—ut é™rire t—˜le—u‘numerohev—g—se“F 1 Attention : un tableau commence à l'indice no 0 ! Notre tableau de 4 int a donc les indices 0.

il est interdit de créer un tableau dont la taille dépend d'une variable ? xonD r—ssurezEvous X ™9est possi˜leD même en gVWF w—is pour f—ire ™el—D nous utiliserons une —utre te™hnique @plus sûre et qui m—r™he p—rtoutA —ppelée l'allocation dynamiqueF xous verrons ™el— ˜ien plus loin d—ns ™e ™oursF ITP . LES TABLEAUX int t—˜le—u‘R“Y printf@47d4D Bt—˜le—uAY IH sl est —ussi possi˜le d9o˜tenir l— v—leur de l— se™onde ™—se —ve™ B@t—˜le—u de t—˜le—u C IAF ves deux lignes suiv—ntes sont don™ identiques X C IA @—dresse t—˜le—u‘I“ GG ‚envoie l— v—leur de l— se™onde ™—se @l— première ™—se ét—nt HA B@t—˜le—u C IA GG sdentique X renvoie l— v—leur ™ontenue d—ns l— se™onde ™—se in ™l—irD qu—nd vous é™rivez t—˜le—u‘H“D vous dem—ndez l— v—leur qui se trouve à l9—dresse t—˜le—u C H ™—se @™9estEàEdire ITHHAF ƒi vous é™rivez t—˜le—u‘I“D vous deE m—ndez l— v—leur se trouv—nt à l9—dresse t—˜le—u C I ™—se @™9estEàEdire ITHIAF it —insi de suite pour les —utres v—leursF Les tableaux à taille dynamique ve l—ng—ge g existe en plusieurs versionsF …ne version ré™enteD —ppelée le gWWD —utorise l— ™ré—tion de t—˜le—ux à t—ille dyn—miqueD ™9estEàEdire de t—˜le—ux dont l— t—ille est dé(nie p—r une v—ri—˜le X int t—ille a SY int t—˜le—u‘t—ille“Y yr ™el— n9est p—s for™ément re™onnu p—r tous les ™ompil—teursD ™ert—ins pl—nteront sur l— se™onde ligneF ve l—ng—ge g que je vous enseigne depuis le dé˜ut @—ppelé le gVWA n9—utorise p—s ™e genre de ™hosesF xous ™onsidèrerons don™ que f—ire ™el— est interditF xous —llons nous mettre d9—™™ord sur ™e™i X vous n9—vez p—s le droit d9utiliser une v—ri—˜le entre ™ro™hets pour l— dé(nition de l— t—ille du t—˜le—uD même si ™ette v—ri—˜le est une ™onst—nte 3 ve t—˜le—u doit —voir une dimension (xeD ™9estEàEdire que vous devez é™rire noir sur ˜l—n™ le nom˜re ™orrespond—nt à l— t—ille du t—˜le—u X int t—˜le—u‘S“Y Mais alors. . .CHAPITRE 12.

PARCOURIR UN TABLEAU Parcourir un tableau ƒupposons que je veuille m—inten—nt —0™her les v—leurs de ™h—que ™—se du t—˜le—uF te pourr—is f—ire —ut—nt de printf qu9il y — de ™—sesF w—is ˜onD ™e ser—it répétitif et lourd F ve mieux est de se servir d9une ˜ou™leF €ourquoi p—s d9une ˜ou™le for c ves ˜ou™les for sont très pr—tiques pour p—r™ourir un t—˜le—u X 2 int m—in@int —rg™D ™h—r B—rgv‘“A { int t—˜le—u‘R“D i a HY t—˜le—u‘H“ t—˜le—u‘I“ t—˜le—u‘P“ t—˜le—u‘Q“ a a a a IHY PQY SHSY VY for @i a H Y i ` R Y iCCA { printf@47d’n4D t—˜le—u‘i“AY } } return HY £ ¢gode IH PQ SHS V we˜ X WIPPWP ¡   xotre ˜ou™le p—r™ourt le t—˜le—u à l9—ide d9une v—ri—˜le —ppelée i @™9est le nom très origin—l que les progr—mmeurs donnent en génér—l à l— v—ri—˜le qui leur permet de p—r™ourir un t—˜le—u 3AF ge qui est p—rti™ulièrement pr—tiqueD ™9est qu9on peut mettre une v—ri—˜le entre ™roE ™hetsF in e'etD l— v—ri—˜le ét—it interdite pour l— ™ré—tion du t—˜le—u @pour dé(nir s— t—illeAD m—is elle est heureusement —utorisée pour  p—r™ourir le t—˜le—uD ™9estEàEdire —0™her ses v—leurs 3 s™iD on — mis l— v—ri—˜le iD qui v—ut su™™essivement HD ID PD et QF he ™ette f—çonD on v— don™ —0™her l— v—leur de t—˜le—u‘H“D t—˜le—u‘I“D t—˜le—u‘P“ et t—˜le—u‘Q“ 3 2. Imaginez un peu la taille de notre code si on devait acher le contenu de chaque case du tableau une à une ! ITQ .

point barre. soit une belle erreur. 2 et 3. l'OS coupant votre programme car il aura tenté d'accéder à une adresse ne lui appartenant pas. Si vous tentez d'acher t—˜le—u‘R“. vous aurez soit n'importe quoi. 1. Initialiser un tableau w—inten—nt que l9on s—it p—r™ourir un t—˜le—uD nous sommes ™—p—˜les d9initi—liser toutes ses v—leurs à H en f—is—nt une ˜ou™le 3 fonD p—r™ourir le t—˜le—u pour mettre H à ™h—que ™—seD ™9est de votre nive—u m—inten—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { int t—˜le—u‘R“D i a HY GG sniti—lis—tion du t—˜le—u for @i a H Y i ` R Y iCCA { t—˜le—u‘i“ a HY } GG effi™h—ge de ses v—leurs pour vérifier for @i a H Y i ` R Y iCCA { printf@47d’n4D t—˜le—u‘i“AY } } return HY £ ¢gode we˜ X ISUVVW ¡   H H H H Une autre façon d'initialiser sl f—ut s—voir qu9il existe une —utre f—çon d9initi—liser un t—˜le—u un peu plus —utom—tisée en gF ille ™onsiste à é™rire t—˜le—u‘R“ a {v—leurID v—leurPD v—leurQD v—leurR}F in ™l—irD vous pl—™ez les v—leurs une à une entre —™™ol—desD sép—rées p—r des virgules X int m—in@int —rg™D ™h—r B—rgv‘“A { ITR .CHAPITRE 12. LES TABLEAUX Attention à ne pas tenter d'acher la valeur de t—˜le—u‘R“ ! Un tableau de 4 cases possède les indices 0.

les autres seront à 0. Passage de tableaux à une fonction †ous —urez à ™oup sûr souvent ˜esoin d9—0™her tout le ™ontenu de votre t—˜le—uF €ourquoi ne p—s é™rire une fon™tion qui f—it ç— c Ǘ v— nous permettre de dé™ouvrir ITS . on n'initialise pas toutes les cases à 1 en faisant cela : seule la première case sera à 1. à moins de faire une boucle. On ne peut donc pas initialiser toutes les cases à 1 automatiquement.PASSAGE DE TABLEAUX À UNE FONCTION int t—˜le—u‘R“ a {HD HD HD H}D i a HY for @i a H Y i ` R Y iCCA { printf@47d’n4D t—˜le—u‘i“AY } } return HY H H H H w—is en f—itD ™9est même mieux que ç— X vous pouvez dé(nir les v—leurs des premières ™—ses du t—˜le—uD toutes ™elles que vous n9—urez p—s renseignées seront —utom—tiquement mises à HF einsiD si je f—is X int t—˜le—u‘R“ a {IHD PQ}Y GG †—leurs insérées X IHD PQD HD H F F F l— ™—se no H prendr— l— v—leur IHD l— no I prendr— PQD et toutes les —utres prendront l— v—leur H @p—r déf—utAF gomment initi—liser tout le t—˜le—u à H en s—™h—nt ç— c ih ˜ien il vous su0t d9initi—liser —u moins l— première v—leur à HD et toutes les —utres v—leurs non indiquées prendront l— v—leur HF int t—˜le—u‘R“ a {H}Y GG „outes les ™—ses du t—˜le—u seront initi—lisées à H gette te™hnique — l9—v—nt—ge de fon™tionner —ve™ un t—˜le—u de n9importe quelle t—ille @làD ç— m—r™he pour R ™—sesD m—is s9il en —v—it eu IHH ç— —ur—it été ˜on —ussiAF Attention. on rencontre souvent : int t—˜le—u‘R“ a {I}Y GG †—leurs insérées X ID HD HD H Contrairement à ce que beaucoup d'entre vous semblent croire.

CHAPITRE 12. LES TABLEAUX ™omment on envoie un t—˜le—u à une fon™tion @™e qui m9—rr—ngeAF sl v— f—lloir envoyer deux inform—tions à l— fon™tion X le t—˜le—u @en(nD l9—dresse du t—˜le—uA et —ussi et surtout s— t—ille 3 in e'etD notre fon™tion doit être ™—p—˜le d9initi—E liser un t—˜le—u de n9importe quelle t—illeF yrD d—ns votre fon™tionD vous ne ™onn—issez p—s l— t—ille de votre t—˜le—uF g9est pour ™el— qu9il f—ut envoyer en plus une v—ri—˜le que vous —ppellerez p—r exemple t—ille„—˜le—uF gomme je vous l9—i ditD t—˜le—u peut être ™onsidéré ™omme un pointeurF yn peut don™ l9envoyer à l— fon™tion ™omme on l9—ur—it f—it —ve™ un vulg—ire pointeur X GG €rototype de l— fon™tion d9—ffi™h—ge void —ffi™he@int Bt—˜le—uD int t—ille„—˜le—uAY int m—in@int —rg™D ™h—r B—rgv‘“A { int t—˜le—u‘R“ a {IHD ISD Q}Y GG yn —ffi™he le ™ontenu du t—˜le—u —ffi™he@t—˜le—uD RAY } return HY void —ffi™he@int Bt—˜le—uD int t—ille„—˜le—uA { int iY for @i a H Y i ` t—ille„—˜le—u Y iCCA { printf@47d’n4D t—˜le—u‘i“AY } } £ ¢gode IH IS Q H we˜ X SUIVSV ¡   v— fon™tion n9est p—s di'érente de ™elles que l9on — étudiées d—ns le ™h—pitre sur les pointeursF ille prend en p—r—mètre un pointeur sur int @notre t—˜le—uAD —insi que l— t—ille du t—˜le—u @très import—nt pour s—voir qu—nd s9—rrêter d—ns l— ˜ou™le 3AF „out le ™ontenu du t—˜le—u est —0™hé p—r l— fon™tion vi— une ˜ou™leF xotez qu9il existe une —utre f—çon d9indiquer que l— fon™tion reçoit un t—˜le—uF €lutôt que d9indiquer que l— fon™tion —ttend un int Bt—˜le—uD mettez ™e™i X void —ffi™he@int t—˜le—u‘“D int t—ille„—˜le—uA ITT .

PASSAGE DE TABLEAUX À UNE FONCTION gel— revient ex—™tement —u mêmeD m—is l— présen™e des ™ro™hets permet —u progr—mE meur de ˜ien voir que ™9est un t—˜le—u que l— fon™tion prendD et non un simple pointeurF gel— permet d9éviter des ™onfusionsF t9utilise personnellement tout le temps les ™ro™hets d—ns mes fon™tions pour ˜ien monE trer que l— fon™tion —ttend un t—˜le—uF te vous ™onseille de f—ire de mêmeF sl n9est p—s né™ess—ire de mettre l— t—ille du t—˜le—u entre les ™ro™hets ™ette foisF Quelques exercices ! te ne m—nque p—s d9idées d9exer™i™es pour vous entr—îner 3 te vous propose de ré—liser des fon™tions tr—v—ill—nt sur des t—˜le—uxF te donne juste les énon™és des exer™i™es i™i pour vous for™er à ré)é™hir à vos fon™tionsF ƒi vous —vez du m—l à ré—liser ™es fon™tionsD rendezEvous sur les forums pour poser vos questionsF   £ ¢gode we˜ X RUQSUQ ¡ Exercice 1 gréez une fon™tion somme„—˜le—u qui renvoie l— somme des v—leurs ™ontenues d—ns le t—˜le—u @utilisez un return pour renvoyer l— v—leurAF €our vous —iderD voi™i le prototype de l— fon™tion à ™réer X int somme„—˜le—u@int t—˜le—u‘“D int t—ille„—˜le—uAY Exercice 2 gréez une fon™tion €rototype X moyenne„—˜le—u qui ™—l™ule et renvoie l— moyenne des v—leursF dou˜le moyenne„—˜le—u@int t—˜le—u‘“D int t—ille„—˜le—uAY v— fon™tion renvoie un dou˜le ™—r une moyenne est souvent un nom˜re dé™im—lF Exercice 3 gréez une fon™tion ™opier„—˜le—u qui prend en p—r—mètre deux t—˜le—uxF ve ™ontenu du premier t—˜le—u devr— être ™opié d—ns le se™ond t—˜le—uF €rototype X void ™opie@int t—˜le—uyrigin—l‘“D int t—˜le—ugopie‘“D int t—ille„—˜le—uAY ITU .

eu tr—v—il 3 XEA En résumé ! ves tableaux sont des ensem˜les de v—ri—˜les du même type sto™kées ™ôte à ™ôte en mémoireF ! v— t—ille d9un t—˜le—u doit être déterminée —v—nt l— ™ompil—tionD elle ne peut p—s dépendre d9une v—ri—˜leF ! gh—que ™—se d9un t—˜le—u de type int ™ontient une v—ri—˜le de type intF ! ves ™—ses sont numérotées vi— des indices ™ommenç—nt à H X t—˜le—u‘H“D t—˜le—u‘I“D t—˜le—u‘P“D et™F ITV .CHAPITRE 12. bien sûr !) contenant toutes les fonctions de votre cru réalisant des opérations sur des tableaux. LES TABLEAUX Exercice 4 gréez une fon™tion m—ximum„—˜le—u qui —ur— pour rôle de remettre à H toutes les ™—ses du t—˜le—u —y—nt une v—leur supérieure à un m—ximumF gette fon™tion prendr— en p—r—mètres le t—˜le—u —insi que le nom˜re m—ximum —utorisé @v—leurw—xAF „outes les ™—ses qui ™ontiennent un nom˜re supérieur à v—leurw—x doivent être mises à HF €rototype X void m—ximum„—˜le—u@int t—˜le—u‘“D int t—ille„—˜le—uD int v—leurw—xAY Exercice 5 get exer™i™e est plus di0™ileF gréez une fon™tion ordonner„—˜le—u qui ™l—sse les v—leurs d9un t—˜le—u d—ns l9ordre ™roiss—ntF einsiD un t—˜le—u qui v—ut {ISD VID PPD IQ} doit à l— (n de l— fon™tion v—loir {IQD ISD PPD VI}F €rototype X void ordonner„—˜le—u@int t—˜le—u‘“D int t—ille„—˜le—uAY get exer™i™e est don™ un peu plus di0™ile que les —utresD m—is tout à f—it ré—lis—˜leF Ǘ v— vous o™™uper un petit momentF Faites-vous un petit chier de fonctions appelé t—˜le—uxF™ (avec son homologue t—˜le—uxFh qui contiendra les prototypes.

Chapitre 13 Diculté : Les chaînes de caractères U ne  chaîne de caractères . On pourrait ainsi stocker le nom de l'utilisateur. tout simplement ! Une chaîne de caractères. Les lettres sont exclues. . Comment diable les programmeurs font-ils pour manipuler du texte. Comme nous l'avons dit plus tôt. vous allez voir ! ITW . alors ? Eh bien ils sont malins. c'est donc du texte que l'on peut retenir sous forme de variable en mémoire. du texte. notre ordinateur ne peut retenir que des nombres. . c'est un nom programmatiquement correct pour désigner.

Certes. la mémoire. ve type ™h—r est en f—it prévu pour sto™kerF F F une lettre 3 ettentionD j9—i ˜ien dit X …xi lettreF gomme l— mémoire ne peut sto™ker que des nom˜resD on — inventé une t—˜le qui f—it l— ™onversion entre les nom˜res et les lettresF gette t—˜le indique —insi p—r exemple que le nom˜re TS équiv—ut à l— lettre eF ve l—ng—ge g permet de f—ire très f—™ilement l— tr—du™tion lettre `ab nom˜re ™orE respond—ntF €our o˜tenir le nom˜re —sso™ié à une lettreD il su0t d9é™rire ™ette lettre entre —postrophesD ™omme ™e™i X 9e9F À l— ™ompil—tionD 9e9 ser— rempl—™é p—r l— v—leur ™orrespond—nteF „estons X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r lettre a 9e9Y printf@47d’n4D lettreAY } return HY TS yn s—it don™ que l— lettre e m—jus™ule est représentée p—r le nom˜re TSF f v—ut TTD g v—ut TUD et™F „estez —ve™ des minus™ules et vous verrez que les v—leurs sont di'érentesF in e'etD l— lettre 9—9 n9est p—s identique à l— lettre 9e9D l9ordin—teur f—is—nt l— di'éren™e entre les m—jus™ules et les minus™ules F v— plup—rt des ™—r—™tères  de ˜—se sont ™odés entre les nom˜res H et IPUF …ne t—˜le f—it l— ™onversion entre les nom˜res et les lettres X l— t—˜le eƒgss @pronon™ez  eski AF ve site es™ii„—˜leF™om est ™élè˜re pour proposer ™ette t—˜le m—is ™e n9est p—s le seulD on peut —ussi l— retrouver sur ‡ikipédi— et ˜ien d9—utres sites en™oreF £   gode we˜ X PSRUVP ¡ ¢ 1 1. En général. On dit qu'il  respecte la casse . mais aujourd'hui. il faut savoir qu'en C on l'utilise rarement pour ça. on le stocke dans un int.CHAPITRE 13. IUH . LES CHAÎNES DE CARACTÈRES Le type char h—ns ™e ™h—pitreD nous —llons porter une —ttention p—rti™ulière —u type ™h—rF ƒi vous vous souvenez ˜ienD le type ™h—r permet de sto™ker des nom˜res ™ompris entre EIPV et IPUF Si ce type ™h—r permet de stocker des nombres. même si le nombre est petit. ce n'est vraiment pas ce qui manque sur un ordinateur. ça prend un peu plus de place en mémoire.

Le premier des deux B est celui que j'ai tapé au clavier.LE TYPE CHAR Acher un caractère v— fon™tion printfD qui n9— dé™idemment p—s (ni de nous étonnerD peut —ussi —0™her un ™—r—™tèreF €our ™el—D on doit utiliser le sym˜ole 7™ @™ ™omme ™—r—™tèreA X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r lettre a 9e9Y printf@47™’n4D lettreAY } return HY e rourr— 3 xous s—vons —0™her une lettreF yn peut —ussi dem—nder à l9utilis—teur d9entrer une lettre en utilis—nt le 7™ d—ns un s™—nf X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r lettre a HY s™—nf@47™4D 8lettreAY printf@47™’n4D lettreAY } return HY ƒi je t—pe l— lettre fD je verr—i X 2 f f †oi™i à peu près tout ™e qu9il f—ut s—voir sur le type ™h—rF ‚etenez ˜ien X ! le type ™h—r permet de sto™ker des nom˜res —ll—nt de EIPV à IPUD unsigned ™h—r des nom˜res de H à PSS Y ! il y — une t—˜le que votre ordin—teur utilise pour ™onvertir les lettres en nom˜res et inversementD l— t—˜le eƒgss Y ! on peut don™ utiliser le type ™h—r pour sto™ker …xi lettre Y ! 9e9 est rempl—™é à l— ™ompil—tion p—r l— v—leur ™orrespond—nte @TS en l9o™™urren™eAF yn utilise don™ les —postrophes pour o˜tenir l— v—leur d9une lettreF 2. le second est celui aché par le printf. IUI .

CHAPITRE 13. LES CHAÎNES DE CARACTÈRES Les chaînes sont des tableaux de char gomme on ditD tout est d—ns le titreF in e'et X une ™h—îne de ™—r—™tères n9est rien d9—utre qu9un t—˜le—u de type ™h—rF …n ˜ête t—˜le—u de rien du toutF ƒi on ™rée un t—˜le—u X ™h—r ™h—ine‘S“Y et qu9on met d—ns ™h—ine‘H“ l— lettre 9ƒ9D d—ns ™h—ine‘I“ l— lettre 9—9F F F on peut —insi former une ™h—îne de ™—r—™tèresD ™9estEàEdire du texteF v— (gF IQFI vous donne une idée de l— f—çon dont l— ™h—îne est sto™kée en mémoire @—ttention X je vous préviens de suiteD ™9est un peu plus ™ompliqué que ç— en ré—litéD je vous explique —près pourquoiAF Figure IQFI ! …ne ™h—îne de ™—r—™tères en mémoire @simpli(éeA gomme on peut le voirD ™9est un t—˜le—u qui prend S ™—ses en mémoire pour représenter le mot  ƒ—lut F €our l— v—leurD j9—i volont—irement é™rit sur le s™hém— les lettres entre —postrophes pour indiquer que ™9est un nom˜re qui est sto™kéD et non une lettreF in ré—litéD d—ns l— mémoireD ™e sont ˜el et ˜ien les nom˜res ™orrespond—nt à ™es lettres qui sont sto™késF „outefoisD une ™h—îne de ™—r—™tères ne ™ontient p—s que des lettres 3 ve s™hém— de l— (gF IQFI est en f—it in™ompletF …ne ™h—îne de ™—r—™tère doit impérativement contenir un caractère spécial à la n de la chaîneD —ppelé  ™—r—™tère de (n de ™h—îne F ge ™—r—™tère s9é™rit 9’H9F Pourquoi faut-il que la chaîne de caractères se termine par un ’H ? IUP .

LES CHAÎNES SONT DES TABLEAUX DE CHAR „out simplement pour que votre ordin—teur s—™he qu—nd s9—rrête l— ™h—îne 3 ve ™—r—™tère ’H permet de dire X  ƒtopD ™9est (niD y9— plus rien à lire —prèsD ™ir™ulez 3 €—r ™onséquentD pour sto™ker le mot  ƒ—lut @qui ™omprend S lettresA en mémoireD il ne f—ut p—s un t—˜le—u de S ™h—rD m—is de T 3 gh—que fois que vous ™réez une ™h—îne de ™—r—™tèresD vous —llez don™ devoir penser à prévoir de l— pl—™e pour le ™—r—™tère de (n de ™h—îneF sl f—ut toujours toujours toujours —jouter un ˜lo™ de plus d—ns le t—˜le—u pour sto™ker ™e ™—r—™tère ’HD ™9est impér—tif 3 yu˜lier le ™—r—™tère de (n ’H est une sour™e d9erreurs impitoy—˜le du l—ng—ge gF te le s—is pour en —voir f—it les fr—is plus d9une foisF v— (gF IQFP est le s™hém— ™orre™t de l— représent—tion de l— ™h—îne de ™—r—™tères  ƒ—lut en mémoireF Figure IQFP ! …ne ™h—îne de ™—r—™tères en mémoire gomme vous le voyezD l— ™h—îne prend T ™—r—™tères et non p—s SD il v— f—lloir s9y f—ireF v— ™h—îne se termine p—r 9’H9D le ™—r—™tère de (n de ™h—îne qui permet d9indiquer à l9ordin—teur que l— ™h—îne se termine làF †oyez le ™—r—™tère ’H ™omme un —v—nt—geF qrâ™e à luiD vous n9—urez p—s à retenir l— t—ille de votre t—˜le—u ™—r il indique que le t—˜le—u s9—rrête à ™et endroitF †ous pourrez p—sser votre t—˜le—u de ™h—r à une fon™tion s—ns —voir à —jouter à ™ôté une v—ri—˜le indiqu—nt l— t—ille du t—˜le—uF gel— n9est v—l—˜le que pour les ™h—înes de ™—r—™tères @™9estEàEdire le type ™h—rBD qu9on peut —ussi é™rire ™h—r‘“AF €our les —utres types de t—˜le—uxD vous êtes toujours o˜ligés de retenir l— t—ille du t—˜le—u quelque p—rtF Création et initialisation de la chaîne ƒi on veut initi—liser notre t—˜le—u ™h—ine —ve™ le texte  ƒ—lut D on peut utiliser l— méthode m—nuelle m—is peu e0™—™e X IUQ .

LES CHAÎNES DE CARACTÈRES ™h—r ™h—ine‘T“Y GG „—˜le—u de T ™h—r pour sto™ker ƒE—ElEuEt C le ’H ™h—ine‘H“ ™h—ine‘I“ ™h—ine‘P“ ™h—ine‘Q“ ™h—ine‘R“ ™h—ine‘S“ a a a a a a 9ƒ9Y 9—9Y 9l9Y 9u9Y 9t9Y 9’H9Y gette méthode m—r™heF yn peut le véri(er —ve™ un printfF €our f—ire un printf il f—ut utiliser le sym˜ole 7s @s ™omme string D qui signi(e  ™h—îne en —ngl—isAF †oi™i le ™ode ™omplet qui ™rée une ™h—îne  ƒ—lut en méE moire et qui l9—0™he X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘T“Y GG „—˜le—u de T ™h—r pour sto™ker ƒE—ElEuEt C le ’H GG sniti—lis—tion de l— ™h—îne @on é™rit les ™—r—™tères un à un en mémoireA ™h—ine‘H“ a 9ƒ9Y ™h—ine‘I“ a 9—9Y ™h—ine‘P“ a 9l9Y ™h—ine‘Q“ a 9u9Y ™h—ine‘R“ a 9t9Y ™h—ine‘S“ a 9’H9Y GG effi™h—ge de l— ™h—îne grâ™e —u 7s du printf printf@47s4D ™h—ineAY } return HY we˜ X VTSUPI ¡ ‚ésult—t X ƒ—lut £ ¢gode   †ous rem—rquerez que ™9est un peu f—tig—nt et répétitif de devoir é™rire les ™—r—™tères un à un ™omme on l9— f—it d—ns le t—˜le—u ™h—ineF €our initi—liser une ™h—îneD il existe heureusement une méthode plus simple X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘“ a 4ƒ—lut4Y GG v— t—ille du t—˜le—u ™h—ine est —utom—tiquement → ™—l™ulée IUR .CHAPITRE 13.

Et il y a des programmes qui gâchent la mémoire de façon bien pire que cela ! IUS .LES CHAÎNES SONT DES TABLEAUX DE CHAR printf@47s4D ™h—ineAY } return HY £ ¢gode ƒ—lut we˜ X SHVHSU ¡   gomme vous le voyez à l— première ligneD je ™rée une v—ri—˜le de type ™h—r‘“F t9—ur—is pu é™rire —ussi ™h—rBD le résult—t —ur—it été le mêmeF in t—p—nt entre guillemets l— ™h—îne que vous voulez mettre d—ns votre t—˜le—uD le ™ompil—teur g ™—l™ule —utom—tiquement l— t—ille né™ess—ireF g9estEàEdire qu9il ™ompte les lettres et —joute I pour pl—™er le ™—r—™tère ’HF sl é™rit ensuite une à une les lettres du mot  ƒ—lut en mémoire et —joute le ’H ™omme on l9— f—it nousEmêmes m—nuellement quelques inst—nts plus tôtF frefD ™9est ˜ien plus pr—tiqueF sl y — toutefois un déf—ut X ç— ne m—r™he que pour l9initi—lis—tion 3 †ous ne pouvez p—s é™rire plus loin d—ns le ™ode X ™h—ine a 4ƒ—lut4Y gette te™hnique est don™ à réserver à l9initi—lis—tionF eprès ™el—D il f—udr— é™rire les ™—r—™tères m—nuellement un à un en mémoire ™omme on l9— f—it —u dé˜utF Récupération d'une chaîne via un scanf †ous pouvez enregistrer une ™h—îne entrée p—r l9utilis—teur vi— un s™—nfD en utilis—nt là en™ore le sym˜ole 7sF ƒeul pro˜lème X vous ne s—vez p—s ™om˜ien de ™—r—™tères l9utilis—teur v— entrerF ƒi vous lui dem—ndez son prénomD il s9—ppelle peutEêtre vu™ @Q ™—r—™tèresAD m—is qui vous dit qu9il ne s9—ppelle p—s te—nEidou—rd @˜e—u™oup plus de ™—r—™tèresA c €our ç—D il n9y — p—s QT solutionsF sl v— f—lloir ™réer un t—˜le—u de ™h—r très gr—ndD su0s—mment gr—nd pour pouvoir sto™ker le prénomF yn v— don™ ™réer un ™h—r‘IHH“F †ous —vez peutEêtre l9impression de gâ™her de l— mémoireD m—is souvenezEvous en™ore une fois que de l— pl—™e en mémoireD ™e n9est p—s ™e qui m—nque F 3 int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r prenom‘IHH“Y printf@4gomment t9—ppellesEtu petit ero c 4AY s™—nf@47s4D prenomAY printf@4ƒ—lut 7sD je suis heureux de te ren™ontrer 34D prenomAY 3.

LES CHAÎNES DE CARACTÈRES } return HY £   ¢gode we˜ X UQSUVH ¡ gomment t9—ppellesEtu petit ero c w—teoPI ƒ—lut w—teoPID je suis heureux de te ren™ontrer 3 Fonctions de manipulation des chaînes ves ™h—înes de ™—r—™tères sontD vous vous en doutezD fréquemment utiliséesF „ous les motsD tous les textes que vous voyez sur votre é™r—n sont en f—it des t—˜le—ux de ™h—r en mémoire qui fon™tionnent ™omme je viens de vous l9expliquerF e(n de nous —ider un peu à m—nipuler les ™h—înesD on nous fournit d—ns l— ˜i˜liothèque stringFh une pléthore de fon™tions dédiées —ux ™—l™uls sur des ™h—înesF te ne peux p—s vr—iment toutes vous les présenter i™iD ™e ser—it un peu long et elles ne sont p—s toutes indispens—˜lesF te v—is me ™ontenter de vous p—rler des prin™ip—les dont vous —urez très ™ert—inement ˜esoin d—ns peu de tempsF Pensez à inclure string.CHAPITRE 13.h wême si ™el— devr—it vous p—r—ître évidentD je préfère vous le pré™iser en™ore —u ™—s où X ™omme on v— utiliser une nouvelle ˜i˜liothèque —ppelée stringFhD vous devez l9in™lure en h—ut des (™hiers F™ où vous en —vez ˜esoin X 5in™lude `stringFhb ƒi vous ne le f—ites p—sD l9ordin—teur ne ™onn—îtr— p—s les fon™tions que je v—is vous présenter ™—r il n9—ur— p—s les prototypesD et l— ™ompil—tion pl—nter—F in ˜refD n9ouE ˜liez p—s d9in™lure ™ette ˜i˜liothèque à ™h—que fois que vous utilisez des fon™tions de m—nipul—tion de ™h—înesF strlen : calculer la longueur d'une chaîne gette fon™tion vous retourne l— longueur de l— ™h—îneF w—inten—nt que vous s—vez ™e qu9est un prototypeD je v—is vous donner le prototype des fon™tions dont je vous p—rleF ves progr—mmeurs s9en servent ™omme  mode d9emploi de l— fon™tion @même si quelques expli™—tions à ™ôté ne sont j—m—is super)uesA X IUT strlen est une fon™tion qui ™—l™ule l— longueur d9une ™h—îne de ™—r—™tères @s—ns ™ompter le ™—r—™tère ’H AF †ous devez lui envoyer un seul p—r—mètre X votre ™h—îne de ™—r—™tèresF .

c'est un type  inventé . Ce n'est pas un type de base comme int. on va se contenter de stocker la valeur renvoyée par strlen dans une variable de type int (l'ordinateur convertira de size•t en int automatiquement). En toute rigueur. Pour le moment. v— fon™tion prend un p—r—mètre de type ™onst ™h—rBF ve ™onst @qui signi(e ™onst—nteD r—ppelezEvousA f—it que l— fon™tion strlen  s9interdit en quelque sorte de modi(er votre ™h—îneF u—nd vous voyez un ™onstD vous s—vez que l— v—ri—˜le n9est p—s modi(ée p—r l— fon™tionD elle est juste lueF „estons l— fon™tion strlen X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘“ a 4ƒ—lut4Y int longueurgh—ine a HY GG yn ré™upère l— longueur de l— ™h—îne d—ns longueurgh—ine longueurgh—ine a strlen@™h—ineAY GG yn —ffi™he l— longueur de l— ™h—îne printf@4v— ™h—ine 7s f—it 7d ™—r—™teres de long4D ™h—ineD longueurgh—ineAY } return HY £   ¢gode we˜ X VUSUIW ¡ v— ™h—ine ƒ—lut f—it S ™—r—™teres de long gette fon™tion strlen est d9—illeurs f—™ile à é™rireF sl su0t de f—ire une ˜ou™le sur le t—˜le—u de ™h—r qui s9—rrête qu—nd on tom˜e sur le ™—r—™tère ’HF …n ™ompteur s9in™rémente à ™h—que tour de ˜ou™leD et ™9est ™e ™ompteur que l— fon™tion retourneF „iensD tout ç— m9— donné envie d9é™rire moiEmême une fon™tion simil—ire à strlenF Ǘ vous permettr— en plus de ˜ien ™omprendre ™omment l— fon™tion m—r™he X int longueurgh—ine@™onst ™h—rB ™h—ineAY int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘“ a 4ƒ—lut4Y IUU . il faudrait plutôt stocker le résultat dans une variable de type size•t. mais en pratique un int est susant pour cela.FONCTIONS DE MANIPULATION DES CHAÎNES size•t strlen@™onst ™h—rB ™h—ineAY size•t est un type spécial qui signie que la fonction renvoie un nombre correspondant à une taille. Nous apprendrons nous aussi à créer nos propres types de variables quelques chapitres plus loin. long ou ™h—r.

CHAPITRE 13. LES CHAÎNES DE CARACTÈRES int longueur a HY longueur a longueurgh—ine@™h—ineAY printf@4v— ™h—ine 7s f—it 7d ™—r—™teres de long4D ™h—ineD longueurAY return HY } int longueurgh—ine@™onst ™h—rB ™h—ineA { int nom˜reheg—r—™teres a HY ™h—r ™—r—™teree™tuel a HY do { } while@™—r—™teree™tuel 3a 9’H9AY GG yn ˜ou™le t—nt qu9on n9est p—s —rrivé → à l9’H → ™—r—™teree™tuel a ™h—ine‘nom˜reheg—r—™teres“Y nom˜reheg—r—™teresCCY nom˜reheg—r—™teresEEY GG yn retire I ™—r—™tère de long pour ne p—s ™ompter le ™—r—™tère ’H return nom˜reheg—r—™teresY } we˜ X ISHUVS ¡ v— fon™tion longueurgh—ine f—it une ˜ou™le sur le t—˜le—u ™h—ineF ille sto™ke les ™—r—™tères un p—r un d—ns ™—r—™teree™tuelF hès que ™—r—™tèree™tuel v—ut 9’H9D l— ˜ou™le s9—rrêteF À ™h—que p—ss—ge d—ns l— ˜ou™leD on —joute I —u nom˜re de ™—r—™tères qu9on — —n—lysésF À l— (n de l— ˜ou™leD on retire I ™—r—™tère —u nom˜re tot—l de ™—r—™tères qu9on — ™omptésF gel— permet de ne p—s ™ompter le ™—r—™tère ’H d—ns le lotF in(nD on retourne nom˜reheg—r—™teres et le tour est joué 3 strcpy £ ¢gode   : copier une chaîne dans une autre v— fon™tion str™py @™omme  string ™opy A permet de ™opier une ™h—îne à l9intérieur d9une —utreF ƒon prototype est X ™h—rB str™py@™h—rB ™opiehev—gh—ineD ™onst ™h—rB ™h—ineegopierAY gette fon™tion prend deux p—r—mètres X IUV .

dans mon exemple. ƒ™hém—tiquementD l— ™opie — fon™tionné ™omme sur l— (gF IQFQF gh—que ™—r—™tère de ™h—ine — été pl—™é d—ns ™opieF v— ™h—îne ™opie ™ontient de nom˜reux ™—r—™tères inutilisésD vous l9—urez rem—rquéF te lui —i donné l— t—ille IHH p—r sé™uritéD m—is en toute rigueurD l— t—ille T —ur—it su0tF v9—v—nt—ge de ™réer un t—˜le—u un peu plus gr—ndD ™9est que de ™ette f—çon l— ™h—îne ™opie ser— ™—p—˜le de re™evoir d9—utres ™h—înes peutEêtre plus gr—ndes d—ns l— suite du progr—mmeF IUW . ™h—ine. bien sûr. la fonction str™py aurait  débordé en mémoire  et probablement fait planter votre programme.FONCTIONS DE MANIPULATION DES CHAÎNES ! X ™9est un pointeur vers un ™h—rB @t—˜le—u de ™h—rAF g9est d—ns ™e t—˜le—u que l— ™h—îne ser— ™opiée Y ! ™h—ineegopier X ™9est un pointeur vers un —utre t—˜le—u de ™h—rF gette ™h—îne ser— ™opiée d—ns ™opiehev—gh—ineF v— fon™tion renvoie un pointeur sur ™opiehev—gh—ineD ™e qui n9est p—s très utileF in génér—lD on ne ré™upère p—s ™e que ™ette fon™tion renvoieF „estons ™el— X ™opiehev—gh—ine int m—in@int —rg™D ™h—r B—rgv‘“A { GB yn ™rée une ™h—îne 4™h—ine4 qui ™ontient un peu de texte et une ™opie @videA de t—ille IHH pour être sûr d9—voir l— pl—™e pour l— ™opie BG ™h—r ™h—ine‘“ a 4„exte4D ™opie‘IHH“ a {H}Y str™py@™opieD ™h—ineAY GG yn ™opie 4™h—ine4 d—ns 4™opie4 GG ƒi tout s9est ˜ien p—sséD l— ™opie devr—it être identique à ™h—ine printf@4™h—ine v—ut X 7s’n4D ™h—ineAY printf@4™opie v—ut X 7s’n4D ™opieAY } return HY £   gode we˜ X IWQWHQ ¡ ¢ ™h—ine v—ut X „exte ™opie v—ut X „exte yn voit que ™h—ine v—ut  „exte F tusqueElàD ™9est norm—lF €—r ™ontreD on voit —ussi que l— v—ri—˜le ™opieD qui ét—it vide —u dép—rtD — été remplie p—r le ™ontenu de ™h—ineF v— ™h—îne — don™ ˜ien été ™opiée d—ns ™opieF Vériez que la chaîne ™opie est assez grande pour accueillir le contenu de Si. j'avais déni ™opie‘S“ (ce qui n'est pas susant car il n'y aurait pas eu de place pour le ’H). À éviter à tout prix. sauf si vous aimez faire planter votre ordinateur.

LES CHAÎNES DE CARACTÈRES Figure IQFQ ! gopie d9une ™h—îne de ™—r—™tères strcat : concaténer 2 chaînes gette fon™tion —joute une ™h—îne à l— suite d9une —utreF yn —ppelle ™el— l— ™on™—tén—tionF ƒupposons que l9on —it les v—ri—˜les suiv—ntes X ! ™h—ineI a 4ƒ—lut 4 ! ™h—ineP a 4w—teoPI4 ƒi je ™on™—tène ™h—ineP d—ns ™h—ineID —lors ™h—ineI v—udr— 4ƒ—lut w—teoPI4F u—nt à ™h—inePD elle n9—ur— p—s ™h—ngé et v—udr— don™ toujours 4w—teoPI4F ƒeule ™h—ineI est modi(éeF g9est ex—™tement ™e que f—it str™—tD dont voi™i le prototype X ™h—rB str™—t@™h—rB ™h—ineID ™onst ™h—rB ™h—inePAY gomme vous pouvez le voirD ™h—ineP ne peut p—s être modi(ée ™—r elle est dé(nie ™omme ™onst—nte d—ns le prototype de l— fon™tionF v— fon™tion retourne un pointeur vers ™h—ineID ™e quiD ™omme pour str™pyD ne sert p—s à gr—ndE™hose d—ns le ™—s présent X on peut don™ ignorer ™e que l— fon™tion nous renvoieF v— fon™tion —joute à ™h—ineI le ™ontenu de ™h—inePF ‚eg—rdonsEy de plus près X int m—in@int —rg™D ™h—r B—rgv‘“A { GB yn ™rée P ™h—înesF ™h—ineI doit être —ssez gr—nde pour —™™ueillir le ™ontenu de ™h—ineP en plusD sinon risque de pl—nt—ge BG ™h—r ™h—ineI‘IHH“ a 4ƒ—lut 4D ™h—ineP‘“ a 4w—teoPI4Y str™—t@™h—ineID ™h—inePAY GG yn ™on™—tène ™h—ineP d—ns ™h—ineI GG ƒi tout s9est ˜ien p—sséD ™h—ineI v—ut 4ƒ—lut w—teoPI4 printf@4™h—ineI v—ut X 7s’n4D ™h—ineIAY GG ™h—ineP n9— p—s ™h—ngé X printf@4™h—ineP v—ut toujours X 7s’n4D ™h—inePAY } return HY £ ¢gode we˜ X PPHISQ ¡   IVH .CHAPITRE 13.

je le reconnais. Si les caractères de la ™h—ineI sont supérieurs à ceux de la ™h—ineP. †oi™i un ™ode de test X IVI . Si tous les caractères sont identiques. la fonction renvoie un nombre positif.FONCTIONS DE MANIPULATION DES CHAÎNES ™h—ineI v—ut X ƒ—lut w—teoPI ™h—ineP v—ut toujours X w—teoPI †éri(ez —˜solument que ™h—ineI est —ssez gr—nde pour qu9on puisse lui —jouter le ™ontenu de ™h—inePD sinon vous ferez un dé˜ordement en mémoire qui peut ™onduire à un pl—nt—geF g9est pour ™el— que j9—i dé(ni ™h—ineI de t—ille IHHF u—nt à ™h—inePD j9—i l—issé l9ordin—teur ™—l™uler s— t—ille @je n9—i don™ p—s pré™isé l— t—illeA ™—r ™ette ™h—îne n9est p—s modi(éeD il n9y — don™ p—s ˜esoin de l— rendre plus gr—nde que né™ess—ireF v— (gF IQFR résume le fon™tionnement de l— ™on™—tén—tionF Figure IQFR ! gon™—tén—tion de ™h—înes ve t—˜le—u ™h—ineP — été —jouté à l— suite de ™h—ineI @qui ™ompren—it une ™ent—ine de ™—sesAF ve ’H de ™h—ineI — été supprimé @en f—itD il — été rempl—™é p—r le w de w—teoPIAF in e'etD il ne f—ut p—s l—isser un ’H —u milieu de l— ™h—îneD sinon ™elleE™i —ur—it été  ™oupée —u milieu 3 yn ne met qu9un ’H à l— (n de l— ™h—îneD une fois qu9elle est (nieF strcmp str™mp : comparer 2 chaînes ™omp—re P ™h—înes entre ellesF †oi™i son prototype X int str™mp@™onst ™h—rB ™h—ineID ™onst ™h—rB ™h—inePAY ves v—ri—˜les ™h—ineI et ™h—ineP sont ™omp—réesF gomme vous le voyezD —u™une d9elles n9est modi(ée ™—r elles sont indiquées ™omme ™onst—ntesF sl est import—nt de ré™upérer ™e que l— fon™tion renvoieF in e'etD str™mp renvoie X ! H si les ™h—înes sont identiques Y ! une —utre v—leur @positive ou nég—tiveA si les ™h—înes sont di'érentesF Il aurait été plus logique. la fonction renvoie un nombre négatif. Si c'est l'inverse. Dans la pratique. La raison est simple : la fonction compare les valeurs de chacun des caractères un à un. que la fonction renvoie 1 si les chaînes avaient été identiques pour dire  vrai  (rappelez-vous des booléens). on se sert surtout de str™mp pour vérier si 2 chaînes sont identiques ou non. elle renvoie 0.

Néanmoins.CHAPITRE 13. un caractère est et restera toujours un nombre. v— fon™tion renvoie un pointeur vers le premier ™—r—™tère qu9elle — trouvéD ™9estEàEdire qu9elle renvoie l9—dresse de ™e ™—r—™tère d—ns l— mémoireF ille renvoie x…vv si elle n9— rien trouvéF h—ns l9exemple suiv—ntD je ré™upère ™e pointeur d—ns suitegh—ine X IVP . on utilise quand même plus souvent un ™h—r qu'un int pour stocker un caractère en mémoire. au fond. LES CHAÎNES DE CARACTÈRES int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ineI‘“ a 4„exte de test4D ™h—ineP‘“ a 4„exte de test4Y if @str™mp@™h—ineID ™h—inePA aa HA GG ƒi ™h—înes identiques { printf@4ves ™h—ines sont identiques’n4AY } else { printf@4ves ™h—ines sont differentes’n4AY } } return HY £   gode we˜ X RUIWRV ¡ ¢ ves ™h—ines sont identiques ves ™h—înes ét—nt identiquesD l— fon™tion str™mp — renvoyé le nom˜re HF xotez que j9—ur—is pu sto™ker ™e que renvoie str™mp d—ns une v—ri—˜le de type intF „outefoisD ™e n9est p—s o˜lig—toireD on peut dire™tement mettre l— fon™tion d—ns le if ™omme je l9—i f—itF te n9—i p—s gr—ndE™hose à —jouter à propos de ™ette fon™tionF ille est —ssez simple à utiliser en f—itD m—is il ne f—ut p—s ou˜lier que H signi(e  identique et une —utre v—leur signi(e  di'érent F g9est l— seule sour™e d9erreurs possi˜le i™iF strchr : rechercher un caractère v— fon™tion str™hr re™her™he un ™—r—™tère d—ns une ™h—îneF €rototype X ™h—rB str™hr@™onst ™h—rB ™h—ineD int ™—r—™teree‚e™her™herAY v— fon™tion prend P p—r—mètres X ! ™h—ine X l— ™h—îne d—ns l—quelle l— re™her™he doit être f—ite Y ! ™—r—™teree‚e™her™her X le ™—r—™tère que l9on doit re™her™her d—ns l— ™h—îneF Vous remarquerez que ™—r—™teree‚e™her™her est de type int et non de type ™h—r. Ce n'est pas réellement un problème car.

FONCTIONS DE MANIPULATION DES CHAÎNES int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘“ a 4„exte de test4D Bsuitegh—ine a x…vvY suitegh—ine a str™hr@™h—ineD 9d9AY if @suitegh—ine 3a x…vvA GG ƒi on — trouvé quelque ™hose { printf@4†oi™i l— fin de l— ™h—ine — p—rtir du premier d X 7s4D → suitegh—ineAY } } return HY   £ gode we˜ X ITIVWT ¡ ¢ †oi™i l— fin de l— ™h—ine — p—rtir du premier d X de test evezEvous ˜ien ™ompris ™e qu9il se p—sse i™i c g9est un peu p—rti™ulierF in f—itD suitegh—ine est un pointeur ™omme ™h—ineD s—uf que ™h—ine pointe sur le premier ™—r—™tère @le 9„9 m—jus™uleAD t—ndis que suitegh—ine pointe sur le premier ™—r—™tère 9d9 qui — été trouvé d—ns ™h—ineF ve s™hém— de l— (gF IQFS vous montre où pointe ™h—que pointeur X Figure IQFS ! €ointeurs et ™h—înes ™h—ine ™ommen™e —u dé˜ut de l— ™h—ine @9„9 m—jus™uleAD t—ndis que suitegh—ine pointe sur le 9d9 minus™uleF vorsque je f—is un printf de suitegh—ineD il est don™ norm—l que l9on m9—0™he juste  de test F v— fon™tion printf —0™he tous les ™—r—™tères qu9elle ren™ontre @9d9D 9e9D 9 9D 9t9D 9e9D 9s9D 9t9A jusqu9à ™e qu9elle tom˜e sur le ’H qui lui dit que l— ™h—îne s9—rrête làF Variante sl existe une fon™tion strr™hr stri™tement identique à str™hrD s—uf que ™elleElà renvoie un pointeur vers le dernier caractère qu9elle — trouvé d—ns l— ™h—îne plutôt que vers le premierF IVQ .

LES CHAÎNES DE CARACTÈRES strpbrk : premier caractère de la liste gette fon™tion ressem˜le ˜e—u™oup à l— pré™édenteF gelleE™i re™her™he un des ™—r—™tères d—ns l— liste que vous lui donnez sous forme de ™h—îneD ™ontr—irement à str™hr qui ne peut re™her™her qu9un seul ™—r—™tère à l— foisF €—r exempleD si on forme l— ™h—îne 4xds4 et qu9on en f—it une re™her™he d—ns 4„exte de test4D l— fon™tion renvoie un pointeur vers le premier de ™es ™—r—™tères qu9elle y — trouvéF in l9o™™urren™eD le premier ™—r—™tère de 4xds4 qu9elle trouve d—ns 4„exte de test4 est le xD don™ strp˜rk renverr— un pointeur sur 9x9F €rototype X ™h—rB strp˜rk@™onst ™h—rB ™h—ineD ™onst ™h—rB lettrese‚e™her™herAY „estons l— fon™tion X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r Bsuitegh—ineY GG yn ™her™he l— première o™™urren™e de xD d ou s d—ns 4„exte de test4 suitegh—ine a strp˜rk@4„exte de test4D 4xds4AY if @suitegh—ine 3a x…vvA { printf@4†oi™i l— fin de l— ™h—ine — p—rtir du premier des ™—r—™teres → trouves X 7s4D suitegh—ineAY } } return HY £   ¢gode we˜ X VTTUUQ ¡ †oi™i l— fin de l— ™h—ine — p—rtir du premier des ™—r—™teres trouves X xte de test €our ™et exempleD j9—i dire™tement é™rit les v—leurs à envoyer à l— fon™tion @entre guilleE metsAF xous ne sommes en e'et p—s o˜ligés d9employer une v—ri—˜le à tous les ™oupsD on peut très ˜ien é™rire l— ™h—îne dire™tementF sl f—ut simplement retenir l— règle suiv—nte X ! si vous utilisez les guillemets 44D ™el— signi(e chaîne Y ! si vous utilisez les —postrophes D ™el— signi(e caractèreF strstr : rechercher une chaîne dans une autre gette fon™tion re™her™he l— première o™™urren™e d9une ™h—îne d—ns une —utre ™h—îneF ƒon prototype est X IVR .CHAPITRE 13.

FONCTIONS DE MANIPULATION DES CHAÎNES ™h—rB strstr@™onst ™h—rB ™h—ineD ™onst ™h—rB ™h—inee‚e™her™herAY ve prototype est simil—ire à strp˜rkD m—is —ttention à ne p—s ™onfondre X strp˜rk re™her™he …x des ™—r—™tèresD t—ndis que strstr re™her™he toute l— ™h—îneF ixemple X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r Bsuitegh—ineY GG yn ™her™he l— première o™™urren™e de 4test4 d—ns 4„exte de test4 X suitegh—ine a strstr@4„exte de test4D 4test4AY if @suitegh—ine 3a x…vvA { printf@4€remiere o™™urren™e de test d—ns „exte de test X 7s’n4D → suitegh—ineAY } } return HY £   ¢gode we˜ X PWQRUS ¡ €remiere o™™urren™e de test d—ns „exte de test X test v— fon™tion strstr re™her™he l— ™h—îne 4test4 d—ns 4„exte de test4F ille renvoieD ™omme les —utresD un pointeur qu—nd elle — trouvé ™e qu9elle ™her™h—itF ille renvoie x…vv si elle n9— rien trouvéF tusqu9i™iD je me suis ™ontenté d9—0™her l— ™h—îne à p—rtir du pointeur retourné p—r les fon™tionsF h—ns l— pr—tiqueD ç— n9est p—s très utileF †ous ferez juste un if @result—t 3a x…vvA pour s—voir si l— re™her™he — ou non donné quelque ™hoseD et vous —0™herez  ve texte que vous re™her™hiez — été trouvé F sprintf : écrire dans une chaîne Cette fonction se trouve dans stdioFh contrairement aux autres fonctions que nous avons étudiées jusqu'ici. qui étaient dans stringFh. ge nom doit v—guement vous r—ppeler quelque ™hoseF gette fon™tion ressem˜le énorE mément —u printf que vous ™onn—issez m—isD —u lieu d9é™rire à l9é™r—nD sprintf é™rit d—nsF F F une ™h—îne 3 h9où son nom d9—illeursD qui ™ommen™e p—r le  s de  string @™h—îne en —ngl—isAF g9est une fon™tion très pr—tique pour mettre en forme une ™h—îneF €etit exemple X IVS .

Il stocke en réalité un nombre mais ce nombre est automatiquement traduit par l'ordinateur à l'achage. LES CHAÎNES DE CARACTÈRES 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ine‘IHH“Y int —ge a ISY GG yn é™rit 4„u —s IS —ns4 d—ns ™h—ine sprintf@™h—ineD 4„u —s 7d —ns 34D —geAY GG yn —ffi™he ™h—ine pour vérifier qu9elle ™ontient ˜ien ™el— X printf@47s4D ™h—ineAY } return HY £   ¢gode we˜ X PUWWTQ ¡ „u —s IS —ns 3 ille s9utilise de l— même m—nière que printfD mis à p—rt le f—it que vous devez lui donner en premier p—r—mètre un pointeur vers l— ™h—îne qui doit re™evoir le texteF h—ns mon exempleD j9é™ris d—ns ™h—ine  „u —s 7d —ns D où 7d est rempl—™é p—r le ™ontenu de l— v—ri—˜le —geF „outes les règles du printf s9—ppliquentD vous pouvez don™ si vous le voulez mettre des 7s pour insérer d9—utres ™h—înes à l9intérieur de votre ™h—îne 3 gomme d9h—˜itudeD véri(ez que votre ™h—îne est su0s—mment gr—nde pour —™™ueillir tout le texte que le sprintf v— lui envoyerF ƒinonD ™omme on l9— vuD vous vous exposez à des dép—ssements de mémoire et don™ à un pl—nt—ge de votre progr—mmeF En résumé ! …n ordin—teur ne s—it p—s m—nipuler du texteD il ne ™onn—ît que les nom˜resF €our régler le pro˜lèmeD on —sso™ie à ™h—que lettre de l9—lph—˜et un nom˜re ™orrespond—nt d—ns une t—˜le —ppelée l— table ASCIIF ! ve type ™h—r est utilisé pour sto™ker une et une seule lettre F ! €our ™réer un mot ou une phr—seD on doit ™onstruire une chaîne de caractèresF €our ™el—D on utilise un tableau de ™h—rF ! „oute ™h—îne de ™—r—™tère se termine p—r un ™—r—™tère spé™i—l —ppelé ’H qui signi(e  (n de ™h—îne F ! sl existe de nom˜reuses fon™tions toutes prêtes de m—nipul—tion des ™h—înes d—ns l— bibliothèque stringF sl f—ut in™lure stringFh pour pouvoir les utiliserF 4 4. IVT .CHAPITRE 13.

Ne vous y trompez pas : les informations contenues dans ce chapitre vous seront utiles.Chapitre 14 Diculté : Le préprocesseur A près ces derniers chapitres harassants sur les pointeurs. tableaux et chaînes de caractères. Vous avez dû intégrer un certain nombre de nouveautés dans les chapitres précédents. nous allons faire une pause. ce programme qui s'exécute juste avant la compilation. je ne peux donc pas vous refuser de souer un peu. IVU . Elles sont en revanche moins complexes que ce que vous avez eu à assimiler récemment. Ce chapitre va traiter du préprocesseur.

CHAPITRE 14. LE PRÉPROCESSEUR Les include gomme je vous l9—i expliqué d—ns les tout premiers ™h—pitres du ™oursD on trouve d—ns les ™odes sour™e des lignes un peu p—rti™ulières —ppelées directives de préprocesseurF ges dire™tives de prépro™esseur ont l— ™—r—™téristique suiv—nte X elles ™ommen™ent toujours p—r le sym˜ole 5F illes sont don™ f—™iles à re™onn—îtreF v— première @et seuleA dire™tive que nous —yons vue pour l9inst—nt est 5in™ludeF gette dire™tive permet d9in™lure le ™ontenu d9un (™hier d—ns un —utreD je vous l9—i dit plus tôtF yn s9en sert en p—rti™ulier pour in™lure des (™hiers Fh ™omme les (™hiers Fh des ˜i˜liothèques @stdli˜FhD stdioFhD stringFhD m—thFhF F FA et vos propres (™hiers FhF €our in™lure un (™hier Fh se trouv—nt d—ns le dossier où est inst—llé votre shiD vous devez utiliser les ™hevrons ` b X 5in™lude `stdli˜Fhb €our in™lure un (™hier Fh se trouv—nt d—ns le dossier de votre projetD vous devez en rev—n™he utiliser les guillemets X 5in™lude 4monfi™hierFh4 gon™rètementD le prépro™esseur est dém—rré —v—nt l— ™ompil—tionF sl p—r™ourt tous vos (™hiers à l— re™her™he de dire™tives de prépro™esseurD ™es f—meuses lignes qui ™omE men™ent p—r un 5F vorsqu9il ren™ontre l— dire™tive 5in™ludeD il insère littér—lement le ™ontenu du (™hier indiqué à l9endroit du 5in™ludeF ƒupposons que j9—ie un fi™hierF™ ™onten—nt le ™ode de mes fon™tions et un fi™hierFh ™onten—nt les prototypes des fon™tions de fi™hierF™F yn pourr—it résumer l— situ—tion d—ns le s™hém— de l— (gF IRFIF Figure IRFI ! sn™lusion de (™hier „out le ™ontenu de fi™hierFh est mis à l9intérieur de fi™hierF™D à l9endroit où il y — l— dire™tive 5in™lude fi™hierFhF sm—ginons qu9on —it d—ns le fi™hierF™ X 5in™lude 4fi™hierFh4 IVV .

c'est essentiellement par principe. mais pour des questions d'organisation il est vivement conseillé de placer ses prototypes dans des Fh. On pourrait a priori mettre les prototypes en haut des F™ (d'ailleurs. Lorsque votre programme grossira et que plusieurs chiers F™ feront appel à un même Fh.LES INCLUDE int m—pon™tion@int tru™D dou˜le ˜iduleA { GB gode de l— fon™tion BG } void —utrepon™tion@int v—leurA { GB gode de l— fon™tion BG } it d—ns le fi™hierFh X int m—pon™tion@int tru™D dou˜le ˜iduleAY void —utrepon™tion@int v—leurAY vorsque le prépro™esseur p—sse p—r làD juste —v—nt l— ™ompil—tion de fi™hierF™D il insère fi™hierFh d—ns fi™hierF™F eu (n—lD le ™ode sour™e de fi™hierF™ juste avant l— ™ompil—tion ressem˜le à ç— X int m—pon™tion@int tru™D dou˜le ˜iduleAY void —utrepon™tion@int v—leurAY int m—pon™tion@int tru™D dou˜le ˜iduleA { GB gode de l— fon™tion BG } void —utrepon™tion@int v—leurA { GB gode de l— fon™tion BG } ve ™ontenu du Fh est venu se mettre à l9empl—™ement de l— ligne 5in™ludeF ge n9est p—s ˜ien ™ompliqué à ™omprendreD je pense d9—illeurs que ˜on nom˜re d9entre vous dev—ient se douter que ç— fon™tionn—it ™omme ç—F eve™ ™es expli™—tions suppléE ment—iresD j9espère —voir mis tout le monde d9—™™ordF ve 5in™lude ne f—it rien d9—utre qu9insérer un (™hier d—ns un —utreD ™9est import—nt de ˜ien le ™omprendreF Si on a décidé de mettre les prototypes dans les Fh. vous serez heureux de ne pas avoir à copier-coller les prototypes des mêmes fonctions plusieurs fois ! IVW . dans certains très petits programmes on le fait parfois). au lieu de tout mettre dans les F™.

CHAPITRE 14. LE PRÉPROCESSEUR Les define xous —llons dé™ouvrir m—inten—nt une nouvelle dire™tive de prépro™esseur X le 5defineF gette dire™tive permet de dé(nir une constante de préprocesseurF gel— permet d9—sso™ier une v—leur à un motF †oi™i un exemple X 5define xywf‚i•†siƒ•sxs„seviƒ Q †ous devez é™rire d—ns l9ordre X ! le 5define Y ! le mot —uquel l— v—leur v— être —sso™iée Y ! l— v—leur du motF ettention X m—lgré les —pp—ren™es @not—mment le nom que l9on — l9h—˜itude de mettre en m—jus™ulesAD ™el— est très di'érent des ™onst—ntes que nous —vons étudiées jusqu9i™iD telles que X ™onst int xywf‚i•†siƒ•sxs„seviƒ a QY ves ™onst—ntes o™™up—ient de l— pl—™e en mémoireF wême si l— v—leur ne ™h—nge—it p—sD votre nom˜re Q ét—it sto™ké quelque p—rt d—ns l— mémoireF ge n9est p—s le ™—s des ™onst—ntes de prépro™esseur 3 gomment ç— fon™tionne c in f—itD le 5define rempl—™e d—ns votre ™ode sour™e tous les mots p—r leur v—leur ™orrespond—nteF g9est un peu ™omme l— fon™tion  ‚e™her™her G ‚empl—™er de ‡ord si vous voulezF einsiD l— ligne X 5define xywf‚i•†siƒ•sxs„seviƒ Q F F F rempl—™e d—ns le (™hier ™h—que xywf‚i•†siƒ•sxs„seviƒ p—r QF †oi™i un exemple de (™hier F™ —v—nt p—ss—ge du prépro™esseur X 5define xywf‚i•†siƒ•sxs„seviƒ Q int m—in@int —rg™D ™h—r B—rgv‘“A { int vies a xywf‚i•†siƒ•sxs„seviƒY GB gode FFFBG eprès p—ss—ge du prépro™esseur X int m—in@int —rg™D ™h—r B—rgv‘“A { int vies a QY GB gode FFFBG IWH .

LES DEFINE ev—nt l— ™ompil—tionD tous les 5define —uront don™ été rempl—™és p—r les v—leurs ™orE respond—ntesF ve ™ompil—teur  voit le (™hier —près p—ss—ge du prépro™esseurD d—ns lequel tous les rempl—™ements —uront été e'e™tuésF Quel intérêt par rapport à l'utilisation de constantes comme on l'a vu jusqu'ici ? ih ˜ienD ™omme je vous l9—i ditD ç— ne prend p—s de pl—™e en mémoireF g9est logiqueD vu que lors de l— ™ompil—tion il ne reste plus que des nom˜res d—ns le ™ode sour™eF …n —utre intérêt est que le rempl—™ement se f—it d—ns tout le (™hier d—ns lequel se trouve le 5defineF ƒi vous —viez dé(ni une ™onst—nte en mémoire d—ns une fon™tionD ™elleE™i n9—ur—it été v—l—˜le que d—ns l— fon™tion puis —ur—it été suppriméeF ve 5define en rev—n™he s9—ppliquer— à toutes les fon™tions du (™hierD ™e qui peut s9—vérer p—rfois pr—tique selon les ˜esoinsF …n exemple ™on™ret d9utilis—tion des 5define c in voi™i un que vous ne t—rderez p—s à utiliserF vorsque vous ouvrirez une fenêtre en gD vous —urez pro˜—˜lement envie de dé(nir des ™onst—ntes de prépro™esseur pour indiquer les dimensions de l— fenêtre X 5define ve‚qi…‚•pixi„‚i 5define re…„i…‚•pixi„‚i VHH THH v9—v—nt—ge est que si plus t—rd vous dé™idez de ™h—nger l— t—ille de l— fenêtre @p—r™e que ç— vous sem˜le trop petitAD il vous su0r— de modi(er les 5define puis de re™ompilerF À noter X les 5define sont génér—lement pl—™és d—ns des FhD à ™ôté des prototypes @vous pouvez d9—illeurs —ller voir les Fh des ˜i˜liothèques ™omme stdli˜FhD vous verrez qu9il y — des 5define 3AF ves 5define sont don™  f—™iles d9—™™ès D vous pouvez ™h—nger les dimensions de l— fenêtre en modi(—nt les 5define plutôt que d9—ller ™her™her —u fond de vos fon™tions l9endroit où vous ouvrez l— fenêtre pour modi(er les dimensionsF g9est don™ du temps g—gné pour le progr—mmeurF in résuméD les ™onst—ntes de prépro™esseur permettent de  ™on(gurer votre proE gr—mme —v—nt s— ™ompil—tionF g9est une sorte de miniE™on(gur—tionF Un define pour la taille des tableaux yn utilise souvent les define pour dé(nir l— t—ille des t—˜le—uxF yn é™rit p—r exemple X 5define „esvvi•weˆ IHHH int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ineI‘„esvvi•weˆ“D ™h—ineP‘„esvvi•weˆ“Y GG FFF IWI .

. IWP . Vous trouverez ce symbole sous le chire 8. tout du moins si vous avez un clavier AZERTY français. . LE PRÉPROCESSEUR Mais. Il faut appuyer sur les touches Alt Gr et 8 en même temps. je croyais qu'on ne pouvait pas mettre de variable ni de constante entre les crochets lors d'une dénition de tableau ? yuiD m—is „esvvi•weˆ n9est €eƒ une v—ri—˜le ni une ™onst—nteF in e'et je vous l9—i ditD le prépro™esseur tr—nsforme le (™hier —v—nt ™ompil—tion en X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r ™h—ineI‘IHHH“D ™h—ineP‘IHHH“Y GG FFF F F F et ™el— est v—lide 3 in dé(niss—nt „esvvi•weˆ —insiD vous pouvez vous en servir pour ™réer des t—˜le—ux d9une ™ert—ine t—illeF ƒi à l9—venir ™el— s9—vère insu0s—ntD vous n9—urez qu9à modi(er l— ligne du 5defineD re™ompilerD et vos t—˜le—ux de ™h—r prendront tous l— nouvelle t—ille que vous —urez indiquéeF Calculs dans les define sl est possi˜le de f—ire quelques petits ™—l™uls d—ns les defineF €—r exempleD ™e ™ode ™rée une ™onst—nte ve‚qi…‚•pixi„‚iD une —utre re…„i…‚•pixi„‚iD puis une troisième xywf‚i•€sˆivƒ qui ™ontiendr— le nom˜re de pixels —0™hés à l9intérieur de l— fenêtre @le ™—l™ul est simple X l—rgeur B h—uteurA X 5define ve‚qi…‚•pixi„‚i 5define re…„i…‚•pixi„‚i 5define xywf‚i•€sˆivƒ VHH THH @ve‚qi…‚•pixi„‚i B re…„i…‚•pixi„‚iA v— v—leur de xywf‚i•€sˆivƒ est rempl—™ée —v—nt l— ™ompil—tion p—r le ™ode suiE v—nt X @ve‚qi…‚•pixi„‚i B re…„i…‚•pixi„‚iAD ™9estEàEdire p—r @VHH B THHAD ™e qui f—it RVHHHHF wettez toujours votre ™—l™ul entre p—renthèses ™omme je l9—i f—it p—r sé™uE rité pour ˜ien isoler l9opér—tionF †ous pouvez f—ire toutes les opér—tions de ˜—se que vous ™onn—issez X —ddition @CAD soustr—™tion @EAD multipli™—tion @BAD division @GA et modulo @7AF Les constantes prédénies in plus des ™onst—ntes que vous pouvez dé(nir vousEmêmesD il existe quelques ™onst—ntes prédé(nies p—r le prépro™esseurF gh—™une de ™es ™onst—ntes ™ommen™e et se termine p—r deux sym˜oles unders™ore • F 1 1.CHAPITRE 14.

LES MACROS ! ••vsxi•• X donne le numéro de l— ligne —™tuelleF ! ••psvi•• X donne le nom du (™hier —™tuelF ! ••he„i•• X donne l— d—te de l— ™ompil—tionF ! ••„swi•• X donne l9heure de l— ™ompil—tionF ges ™onst—ntes peuvent être utiles pour gérer des erreursD en f—is—nt p—r exemple ™e™i X printf@4irreur — l— ligne 7d du fi™hier 7s’n4D ••vsxi••D ••psvi••AY printf@4ge fi™hier — ete ™ompile le 7s — 7s’n4D ••he„i••D ••„swi••AY irreur — l— ligne W du fi™hier m—inF™ ge fi™hier — ete ™ompile le t—n IQ PHHT — IWXPIXIH Les dénitions simples sl est —ussi possi˜le de f—ire tout simplement X 5define gyxƒ„ex„i F F F s—ns pré™iser de v—leurF gel— veut dire pour le prépro™esseur que le mot gyxƒ„ex„i est dé(niD tout simplementF sl n9— p—s de v—leurD m—is il  existe F Quel peut en être l'intérêt ? v9intérêt est moins évident que tout à l9heureD m—is il y en — un et nous —llons le dé™ouvrir très r—pidementF Les macros xous —vons vu qu9—ve™ le 5define on pouv—it dem—nder —u prépro™esseur de rempl—™er un mot p—r une v—leurF €—r exemple X 5define xywf‚i W F F F signi(e que tous les xywf‚i de votre ™ode seront rempl—™és p—r WF xous —vons vu qu9il s9—giss—it en f—it d9un simple re™her™herErempl—™er f—it p—r le prépro™esseur —v—nt l— ™ompil—tionF t9—i du nouve—u 3 in f—itD le 5define est en™ore plus puiss—nt que ç—F sl permet de rempl—™er —ussi p—rF F F un ™ode sour™e tout entier 3 u—nd on utilise 5define pour re™her™herErempl—™er un mot p—r un ™ode sour™eD on dit qu9on ™rée une macroF IWQ .

.CHAPITRE 14. LE PRÉPROCESSEUR Macro sans paramètres †oi™i un exemple de m—™ro très simple X 5define gy…gy…@A printf@4gou™ou4AY ge qui ™h—nge i™iD ™e sont les p—renthèses qu9on — —joutées —près le motE™lé @i™i gy…gy…@AAF xous verrons à quoi elles peuvent servir tout à l9heureF „estons l— m—™ro d—ns un ™ode sour™e X 5define gy…gy…@A printf@4gou™ou4AY int m—in@int —rg™D ™h—r B—rgv‘“A { gy…gy…@A } return HY gou™ou te vous l9—™™ordeD ™e n9est p—s origin—l pour le momentF ge qu9il f—ut déjà ˜ien ™omE prendreD ™9est que les m—™ros ne sont en f—it que des ˜outs de ™ode qui sont dire™tement rempl—™és d—ns votre ™ode sour™e juste —v—nt l— ™ompil—tionF ve ™ode qu9on vient de voir ressem˜ler— en f—it à ç— lors de l— ™ompil—tion X int m—in@int —rg™D ™h—r B—rgv‘“A { printf@4gou™ou4AY } return HY ƒi vous —vez ™ompris ç—D vous —vez ™ompris le prin™ipe de ˜—se des m—™rosF Mais. . on ne peut mettre qu'une seule ligne de code par macro ? xonD heureusement il est possi˜le de mettre plusieurs lignes de ™ode à l— foisF sl su0t de pl—™er un ’ —v—nt ™h—que nouvelle ligneD ™omme ™e™i X 5define ‚egyx„i‚•ƒe•†si@A printf@4gou™ouD je m9—ppelle fri™e’n4AY ’ printf@4t9h—˜ite — xi™e’n4AY ’ printf@4t9—ime l— glisse’n4AY IWR .

LES MACROS int m—in@int —rg™D ™h—r B—rgv‘“A { ‚egyx„i‚•ƒe•†si@A } return HY gou™ouD je m9—ppelle fri™e t9h—˜ite — xi™e t9—ime l— glisse ‚em—rquez d—ns le m—in que l9—ppel de l— m—™ro ne prend p—s de pointEvirgule à l— (nF in e'etD ™9est une ligne pour le prépro™esseurD elle ne né™essite don™ p—s d9être terminée p—r un pointEvirguleF Macro avec paramètres €our le momentD on — vu ™omment f—ire une m—™ro s—ns p—r—mètreD ™9estEàEdire —ve™ des p—renthèses videsF ve prin™ip—l intérêt de ™e type de m—™rosD ™9est de pouvoir  r—™™our™ir un ™ode un peu longD surtout s9il est —mené à être répété de nom˜reuses fois d—ns votre ™ode sour™eF gepend—ntD les m—™ros deviennent réellement intéress—ntes lorsqu9on leur met des p—E r—mètresF gel— m—r™he qu—siment ™omme —ve™ les fon™tionsF 5define weti…‚@—geA if @—ge ba IVA ’ printf@4†ous etes m—jeur’n4AY int m—in@int —rg™D ™h—r B—rgv‘“A { weti…‚@PPA } return HY †ous etes m—jeur Notez qu'on aurait aussi pu ajouter un else pour acher  Vous êtes mineur . Essayez de le faire pour vous entraîner. ce n'est pas bien dicile. N'oubliez pas de mettre un antislash ’ avant chaque nouvelle ligne. ve prin™ipe de notre m—™ro est —ssez intuitif X 5define weti…‚@—geA if @—ge ba IVA ’ printf@4†ous etes m—jeur’n4AY IWS .

LE PRÉPROCESSEUR yn met entre p—renthèses le nom d9une  v—ri—˜le qu9on nomme —geF h—ns tout notre ™ode de m—™roD —ge ser— rempl—™é p—r le nom˜re qui est indiqué lors de l9—ppel à l— m—™ro @i™iD ™9est PPAF einsiD notre ™ode sour™e pré™édent ressem˜ler— à ™e™i juste —près le p—ss—ge du préproE ™esseur X int m—in@int —rg™D ™h—r B—rgv‘“A { if @PP ba IVA printf@4†ous etes m—jeur’n4AY } return HY ve ™ode sour™e — été mis à l— pl—™e de l9—ppel de l— m—™roD et l— v—leur de l—  v—ri—˜le —ge — été mise dire™tement d—ns le ™ode sour™e de rempl—™ementF sl est possi˜le —ussi de ™réer une m—™ro qui prend plusieurs p—r—mètres X 5define weti…‚@—geD nomA if @—ge ba IVA ’ printf@4†ous etes m—jeur 7s’n4D nomAY int m—in@int —rg™D ™h—r B—rgv‘“A { weti…‚@PPD 4w—xime4A } return HY †oilà tout ™e qu9on peut dire sur les m—™rosF sl f—ut don™ retenir que ™9est un simple rempl—™ement de ™ode sour™e qui — l9—v—nt—ge de pouvoir prendre des p—r—mètresF Normalement. vous ne devriez pas avoir besoin d'utiliser très souvent les macros.CHAPITRE 14. Il est donc préférable de savoir comment cela fonctionne dès maintenant pour ne pas être perdu plus tard. certaines bibliothèques assez complexes comme wxWidgets ou Qt (bibliothèques de création de fenêtres que nous étudierons bien plus tard) utilisent beaucoup de macros. Les conditions „enezEvous ˜ien X il est possi˜le de ré—liser des ™onditions en l—ng—ge prépro™esseur 3 †oi™i ™omment ™el— fon™tionne X 5if ™ondition GB gode sour™e à ™ompiler si l— ™ondition est vr—ie BG IWT . Toutefois.

LES CONDITIONS 5elif ™onditionP GB ƒinon si l— ™ondition P est vr—ie ™ompiler ™e ™ode sour™e BG 5endif ve motE™lé 5if permet d9insérer une ™ondition de prépro™esseurF 5elif signi(e else if @sinon siAF v— ™ondition s9—rrête lorsque vous insérez un 5endifF †ous noterez qu9il n9y — p—s d9—™™ol—des en prépro™esseurF v9intérêtD ™9est qu9on peut —insi f—ire des compilations conditionnellesF in e'etD si l— ™ondition est vr—ieD le ™ode qui suit ser— ™ompiléF ƒinonD il ser— tout simplement supE primé du (™hier le temps de l— ™ompil—tionF sl n9—pp—r—îtr— don™ p—s d—ns le progr—mme (n—lF #ifdef. #ifndef xous —llons voir m—inten—nt l9intérêt de f—ire un 5define d9une ™onst—nte s—ns pré™iser de v—leurD ™omme je vous l9—i montré p—ge IWQ X 5define gyxƒ„ex„i in e'etD il est possi˜le d9utiliser 5ifdef pour dire  ƒi l— ™onst—nte est dé(nie F 5ifndefD luiD sert à dire  ƒi l— ™onst—nte n9est p—s dé(nie F yn peut —lors im—giner ™e™i X 5define ‡sxhy‡ƒ 5ifdef ‡sxhy‡ƒ GB gode sour™e pour ‡indows BG 5endif 5ifdef vsx…ˆ GB gode sour™e pour vinux BG 5endif 5ifdef weg GB gode sour™e pour w—™ BG 5endif g9est ™omme ç— que font ™ert—ins progr—mmes multiEpl—tesEformes pour s9—d—pter à l9yƒ p—r exempleF elorsD ˜ien entenduD il f—ut re™ompiler le progr—mme pour ™h—que yƒ @™e n9est p—s m—giqueAF ƒi vous êtes sous ‡indowsD vous é™rivez un 5define ‡sxhy‡ƒ en h—utD puis vous ™ompilezF ƒi vous voulez ™ompiler votre progr—mme pour vinux @—ve™ l— p—rtie du ™ode sour™e spé™i(que à vinuxAD vous devrez —lors modi(er le define et mettre à l— pl—™e X 5define vsx…ˆF ‚e™ompilezD et ™ette fois ™9est l— portion de ™ode sour™e pour vinux qui ser— ™ompiléeD les —utres p—rties ét—nt ignoréesF IWU .

CHAPITRE 14. LE PRÉPROCESSEUR #ifndef 5ifndef pour éviter les inclusions innies est très utilisé d—ns les Fh pour éviter les  in™lusions in(nies F Une inclusion innie ? C'est-à-dire ? sm—ginezD ™9est très simpleF t9—i un (™hier eFh et un (™hier fFhF ve (™hier eFh ™ontient un in™lude du (™hier fFhF ve (™hier f est don™ in™lus d—ns le (™hier eF w—isD et ™9est là que ç— ™ommen™e à ™oin™erD supposez que le (™hier fFh ™ontienne à son tour un in™lude du (™hier eFh 3 Ǘ —rrive quelques fois en progr—mm—tion 3 ve premier (™hier — ˜esoin du se™ond pour fon™tionnerD et le se™ond — ˜esoin du premierF ƒi on y ré)é™hit un peuD on im—gine vite ™e qu9il v— se p—sser X IF l9ordin—teur lit eFh et voit qu9il f—ut in™lure fFh Y PF il lit fFh pour l9in™lureD et là il voit qu9il f—ut in™lure eFh Y QF il in™lut don™ eFh d—ns fFhD m—is d—ns eFh on lui indique qu9il doit in™lure fFh 3 RF re˜eloteD il v— voir fFh et voit à nouve—u qu9il f—ut in™lure eFh Y SF et™F †ous vous doutez ˜ien que tout ™el— est s—ns (n 3 in f—itD à for™e de f—ire trop d9in™luE sionsD le prépro™esseur s9—rrêter— en dis—nt  t9en —i m—rre des in™lusions 3 ™e qui fer— pl—nter votre ™ompil—tionF gomment di—˜le f—ire pour éviter ™et —'reux ™—u™hem—r c †oi™i l9—stu™eF hésorm—isD je vous dem—nde de f—ire ™omme ç— dans TOUS vos chiers Fh s—ns ex™eption X 5ifndef hip•xywh…psgrsi‚ GG ƒi l— ™onst—nte n9— p—s été définie le fi™hier n9— → j—m—is été in™lus 5define hip•xywh…psgrsi‚ GG yn définit l— ™onst—nte pour que l— pro™h—ine fois → le fi™hier ne soit plus in™lus GB gontenu de votre fi™hier Fh @—utres in™ludeD prototypesD defineFFFA BG 5endif we˜ X TWVIIV ¡ †ous mettrez en f—it tout le ™ontenu de votre (™hier Fh @à s—voir vos —utres in™ludeD vos prototypesD vos defineF F FA entre le 5ifndef et le 5endifF gomprenezEvous ˜ien ™omment ™e ™ode fon™tionne c v— première fois qu9on m9— présenté ™ette te™hniqueD j9ét—is —ssez désorienté X je v—is ess—yer de vous l9expliquerF sm—ginez que le (™hier Fh est in™lus pour l— première foisF ve prépro™esseur lit l— ™ondition  ƒi l— ™onst—nte hip•xywh…psgrsi‚ n9— p—s été dé(nie F gomme ™9est l— première fois que le (™hier est luD l— ™onst—nte n9est p—s dé(nieD don™ le prépro™esseur entre à l9intérieur du ifF IWV £ ¢gode   .

Vous verrez qu'ils sont TOUS construits sur le même principe (un 5ifndef au début et un 5endif à la n). Ils s'assurent ainsi qu'il ne pourra pas y avoir d'inclusions innies. En résumé ! ve prépro™esseur est un progr—mme qui —n—lyse votre ™ode sour™e et y e'e™tue des modi(™—tions —v—nt l— ™ompil—tionF ! v9instru™tion de prépro™esseur 5in™lude insère le ™ontenu d9un —utre (™hierF ! v9instru™tion 5define dé(nit une ™onst—nte de prépro™esseurF ille permet de remE pl—™er un motE™lé p—r une v—leur d—ns le ™ode sour™eF ! ves m—™ros sont des mor™e—ux de ™ode tout prêts dé(nis à l9—ide d9un 5defineF sls peuvent —™™epter des p—r—mètresF ! sl est possi˜le d9é™rire des ™onditions en l—ng—ge prépro™esseur pour ™hoisir ™e qui ser— ™ompiléF yn utilise not—mment les motsE™lés 5ifD 5elif et 5endifF ! €our éviter qu9un (™hier Fh ne soit in™lus un nom˜re in(ni de foisD on le protège à l9—ide d9une ™om˜in—ison de ™onst—ntes de prépro™esseur et de ™onditionsF „ous vos futurs (™hiers Fh devront être protégés de ™ette m—nièreF IWW .LES CONDITIONS v— première instru™tion qu9il ren™ontre est justement X 5define hip•xywh…psgrsi‚ w—inten—ntD l— ™onst—nte est dé(nieF v— pro™h—ine fois que le (™hier ser— in™lusD l— ™ondition ne ser— plus vr—ie et don™ le (™hier ne risque plus d9être in™lus à nouve—uF fien entenduD vous —ppelez votre ™onst—nte ™omme vous voulezF woiD je l9—ppelle hip•xywh…psgrsi‚ p—r h—˜itudeF ge qui ™ompte en rev—n™heD et j9espère que vous l9—viez ˜ien ™omprisD ™9est de ™h—nger de nom de ™onst—nte à ™h—que (™hier Fh di'érentF sl ne f—ut p—s que ç— soit l— même ™onst—nte pour tous les (™hiers FhD sinon seul le premier (™hier Fh ser—it lu et p—s les —utres 3 †ous rempl—™erez don™ xywh…psgrsi‚ p—r le nom de votre (™hier FhF Je vous invite à aller consulter les Fh des bibliothèques standard sur votre disque dur.

LE PRÉPROCESSEUR PHH .CHAPITRE 14.

d'autres de types penetre. un peu plus tard. Des  types de variables personnalisés . etc. gl—vier. PHI . eudio.Chapitre 15 Diculté : Créez vos propres types de variables L e langage C nous permet de faire quelque chose de très puissant : créer nos propres types de variables. Restez attentifs tout de même parce que nous réutiliserons les structures tout le temps à partir du prochain chapitre. nous allons en voir deux sortes : les structures et les énumérations. Il faut savoir que les bibliothèques dénissent généralement leurs propres types. Ce n'est (heureusement) pas bien compliqué à comprendre et à manipuler. Vous ne tarderez donc pas à manipuler un type de variable pi™hier ou encore. Créer de nouveaux types de variables devient indispensable quand on cherche à faire des programmes plus complexes.

eprès le nom de votre stru™tureD vous ouvrez les —™™ol—des et les fermez plus loinD ™omme pour une fon™tionF Attention. it m—inten—ntD que mettre entre les —™™ol—des c g9est simpleD vous y pl—™ez les v—ri—˜les dont est ™omposée votre stru™tureF …ne stru™ture est génér—lement ™omposée d9—u moins deux  sousEv—ri—˜les D sinon elle n9— p—s trop d9intérêtF gomme vous le voyezD l— ™ré—tion d9un type de v—ri—˜le personn—lisé n9est p—s ˜ien ™omplexeF „outes les stru™tures que vous verrez sont en f—it des  —ssem˜l—ges de v—ri—˜les de type de ˜—seD ™omme longD intD dou˜leD et™F sl n9y — p—s de mir—™leD un type pi™hier n9est don™ ™omposé que de nom˜res de ˜—se 3 PHP . excepté que je mets la première lettre en majuscule pour pouvoir faire la diérence. la compilation plantera. je sais que c'est une variable car cela commence par une lettre minuscule. Si vous ne le faites pas. C'est obligatoire.CHAPITRE 15. Ainsi. CRÉEZ VOS PROPRES TYPES DE VARIABLES Dénir une structure …ne stru™ture est un —ssem˜l—ge de v—ri—˜les qui peuvent —voir di'érents typesF gontr—iE rement —ux t—˜le—ux qui vous o˜ligent à utiliser le même type d—ns tout le t—˜le—uD vous pouvez ™réer une stru™ture ™omport—nt des v—ri—˜les de types longD ™h—rD int et dou˜le à l— foisF ves stru™tures sont génér—lement dé(nies d—ns les (™hiers FhD —u même titre don™ que les prototypes et les defineF †oi™i un exemple de stru™ture X stru™t xomhe†otreƒtru™ture { int v—ri—˜leIY int v—ri—˜lePY int —utre†—ri—˜leY dou˜le nom˜rehe™im—lY }Y …ne dé(nition de stru™ture ™ommen™e p—r le motE™lé stru™tD suivi du nom de votre stru™ture @p—r exemple pi™hierD ou en™ore i™r—nAF J'ai personnellement l'habitude de nommer mes structures en suivant les mêmes règles que pour les noms de variables. ici c'est particulier : vous DEVEZ mettre un point-virgule après l'accolade fermante. Quand je vois wor™e—ueudio je sais qu'il s'agit d'une structure (un type personnalisé) car cela commence par une majuscule. quand je vois le mot —gehug—pit—ine dans mon code.

DÉFINIR UNE STRUCTURE Exemple de structure sm—ginons p—r exemple que vous vouliez ™réer une v—ri—˜le qui sto™ke les ™oordonnées d9un point à l9é™r—nF †ous —urez très ™ert—inement ˜esoin d9une stru™ture ™omme ™el— lorsque vous ferez des jeux Ph d—ns l— p—rtie suiv—nteD ™9est don™ l9o™™—sion de s9—v—n™er un peuF €our ™eux ™hez qui le mot  géométrie provoque des —pp—ritions de ˜outons inexpliE ™—˜les sur tout le vis—geD l— (gF ISFI v— f—ire o0™e de petit r—ppel fond—ment—l sur l— PhF Figure ISFI ! e˜s™isses et ordonnées vorsqu9on tr—v—ille en Ph @P dimensionsAD on — deux —xes X l9—xe des —˜s™isses @de g—u™he à droiteA et l9—xe des ordonnées @de ˜—s en h—utAF yn — l9h—˜itude d9exprimer les —˜s™isses p—r une v—ri—˜le —ppelée xD et les ordonnées p—r yF ÊtesEvous ™—p—˜les d9é™rire une stru™ture goordonnees qui permette de sto™ker à l— fois l— v—leur de l9—˜s™isse @xA et ™elle de l9ordonnée @yA d9un point c ellonsD —llonsD ™e n9est p—s ˜ien di0™ile X stru™t goordonnees { int xY GG e˜s™isses int yY GG yrdonnées }Y xotre stru™ture s9—ppelle goordonnees et est ™omposée de deux v—ri—˜lesD x et yD ™9estE àEdire de l9—˜s™isse et de l9ordonnéeF ƒi on le voul—itD on pourr—it f—™ilement f—ire une stru™ture goordonnees pour de l— Qh X il su0r—it d9—jouter une troisième v—ri—˜le @p—r exemple zA qui indiquer—it l— h—uteurF eve™ ç—D nous —urions une stru™ture f—ite pour gérer des points en Qh d—ns l9esp—™e 3 Tableaux dans une structure ves stru™tures peuvent ™ontenir des t—˜le—uxF Ǘ tom˜e ˜ienD on v— pouvoir —insi pl—™er des t—˜le—ux de ™h—r @™h—înes de ™—r—™tèresA s—ns pro˜lème 3 ellezD im—ginons une stru™ture €ersonne qui sto™ker—it diverses inform—tions sur une personne X PHQ .

CRÉEZ VOS PROPRES TYPES DE VARIABLES stru™t €ersonne { ™h—r nom‘IHH“Y ™h—r prenom‘IHH“Y ™h—r —dresse‘IHHH“Y int —geY int g—r™onY GG fooléen X I a g—rçonD H a fille }Y gette stru™ture est ™omposée de ™inq sousEv—ri—˜lesF ves trois premières sont des ™h—înes qui sto™keront le nomD le prénom et l9—dresse de l— personneF ves deux dernières sto™kent l9âge et le sexe de l— personneF ve sexe est un ˜ooléenD I a vr—i a g—rçonD H a f—ux a (lleF gette stru™ture pourr—it servir à ™réer un progr—mme de ™—rnet d9—dressesF fien enE tenduD vous pouvez r—jouter des v—ri—˜les d—ns l— stru™ture pour l— ™ompléter si vous le voulezF sl n9y — p—s de limite —u nom˜re de v—ri—˜les d—ns une stru™tureF Utilisation d'une structure w—inten—nt que notre stru™ture est dé(nie d—ns le FhD on v— pouvoir l9utiliser d—ns une fon™tion de notre (™hier F™F †oi™i ™omment ™réer une v—ri—˜le de type goordonnees @l— stru™ture qu9on — dé(nie plus h—utA X 5in™lude 4m—inFh4 GG sn™lusion du Fh qui ™ontient les prototypes et stru™tures int m—in@int —rg™D ™h—r B—rgv‘“A { stru™t goordonnees pointY GG gré—tion d9une v—ri—˜le 4point4 de type → goordonnees } return HY xous —vons —insi ™réé une v—ri—˜le point de type goordonneesF gette v—ri—˜le est —uE tom—tiquement ™omposée de deux sousEv—ri—˜les X x et y @son —˜s™isse et son ordonnéeAF Faut-il obligatoirement écrire le mot-clé variable ? stru™t lors de la dénition de la yui X ™el— permet à l9ordin—teur de di'éren™ier un type de ˜—se @™omme intA d9un type personn—liséD ™omme goordonneesF „outefoisD les progr—mmeurs trouvent souvent un peu lourd de mettre le mot stru™t à ™h—que dé(nition de v—ri—˜le personn—liséeF €our régler ™e pro˜lèmeD ils ont inventé une instru™tion spé™i—le X le typedefF PHR .CHAPITRE 15.

UTILISATION D'UNE STRUCTURE Le typedef ‚etournons d—ns le (™hier Fh qui ™ontient l— dé(nition de notre stru™ture de type goordonneesF xous —llons —jouter une instru™tion —ppelée typedef qui sert à ™réer un —li—s de stru™tureD ™9estEàEdire à dire qu9é™rire telle ™hose équiv—ut à é™rire telle —utre ™hoseF xous —llons —jouter une ligne ™ommenç—nt p—r typedef juste —v—nt l— dé(nition de l— stru™ture X typedef stru™t goordonnees goordonneesY stru™t goordonnees { int xY int yY }Y gette ligne doit être dé™oupée en trois mor™e—ux @nonD je n9—i p—s ˜ég—yé le mot goordonnees 3A X ! typedef X indique que nous —llons ™réer un —li—s de stru™ture Y ! stru™t goordonnees X ™9est le nom de l— stru™ture dont vous —llez ™réer un —li—s @™9estEàEdire un  équiv—lent A Y ! goordonnees X ™9est le nom de l9équiv—lentF in ™l—irD ™ette ligne dit  ərire le mot goordonnees est désorm—is équiv—lent à é™rire stru™t goordonnees F in f—is—nt ™el—D vous n9—urez plus ˜esoin de mettre le mot stru™t à ™h—que dé(nition de v—ri—˜le de type goordonneesF yn peut don™ retourner d—ns notre m—in et é™rire tout simplement X int m—in@int —rg™D ™h—r B—rgv‘“A { goordonnees pointY GG v9ordin—teur ™omprend qu9il s9—git de 4stru™t → goordonnees4 grâ™e —u typedef return HY } te vous re™omm—nde de f—ire un typedef ™omme je l9—i f—it i™i pour goordonneesF v— plup—rt des progr—mmeurs font ™omme ™el—F Ǘ leur évite d9—voir à é™rire le mot stru™t p—rtout F 1 Modier les composantes de la structure w—inten—nt que notre v—ri—˜le point est ™rééeD nous voulons modi(er ses ™oordonnéesF gomment —™™éder —u x et —u y de point c gomme ™e™i X 1. Un bon programmeur est un programmeur fainéant ! Il en écrit le moins possible. PHS .

C'est la notation mathématique d'une coordonnée. Je dois être programmeur. c'est pour ça.CHAPITRE 15. . CRÉEZ VOS PROPRES TYPES DE VARIABLES int m—in@int —rg™D ™h—r B—rgv‘“A { goordonnees pointY pointFx a IHY pointFy a PHY } return HY yn — —insi modi(é l— v—leur de pointD en lui donn—nt une —˜s™isse de IH et une ordonnée de PHF xotre point se situe désorm—is à l— position @IH Y PHA F €our —™™éder don™ à ™h—que ™ompos—nte de l— stru™tureD vous devez é™rire X 2 v—ri—˜leFnomhev—gompos—nte ve point f—it l— sép—r—tion entre l— v—ri—˜le et l— ™ompos—nteF ƒi on prend l— stru™ture €ersonne que nous —vons vue tout à l9heure et qu9on dem—nde le nom et le prénomD on devr— f—ire ™omme ç— X int m—in@int —rg™D ™h—r B—rgv‘“A { €ersonne utilis—teurY printf@4uel est votre nom c 4AY s™—nf@47s4D utilis—teurFnomAY printf@4†otre prenom c 4AY s™—nf@47s4D utilis—teurFprenomAY printf@4†ous vous —ppelez 7s 7s4D utilis—teurFprenomD utilis—teurFnomAY } return HY uel est votre nom c hupont †otre prenom c te—n †ous vous —ppelez te—n hupont yn envoie l— v—ri—˜le utilis—teurFnom à s™—nf qui é™rir— dire™tement d—ns notre v—ri—˜le utilis—teurF yn f—it de même pour prenomD et on pourr—it —ussi le f—ire pour l9—dresseD l9âge et le sexeD m—is je n9—i guère envie de me répéter F †ous —uriez pu f—ire l— même ™hose s—ns ™onn—ître les stru™turesD en ™ré—nt juste une v—ri—˜le nom et une —utre prenomF w—is l9intérêt i™i est que vous pouvez ™réer une —utre v—ri—˜le de type €ersonne qui —ur— —ussi son propre nomD son propre prénomD et™F yn peut don™ f—ire X 3 2. 3.-) PHT .

UTILISATION D'UNE STRUCTURE €ersonne joueurID joueurPY F F F et sto™ker —insi les inform—tions sur ™h—que joueurF gh—que joueur — son propre nomD son propre prénomD et™F yn peut même f—ire en™ore mieux X on peut ™réer un t—˜le—u de €ersonne 3 g9est f—™ile à f—ire X €ersonne joueurs‘P“Y it ensuiteD vous —™™édez p—r exemple —u nom du joueur no H en t—p—nt X joueurs‘H“Fnom v9—v—nt—ge d9utiliser un t—˜le—u i™iD ™9est que vous pouvez f—ire une ˜ou™le pour dem—nE der les infos du joueur I et du joueur PD s—ns —voir à répéter deux fois le même ™odeF sl su0t de p—r™ourir le t—˜le—u joueur et de dem—nder à ™h—que fois nomD prénomD —dresseF F F Exercice X ™réez ™e t—˜le—u de type €ersonne et dem—ndez les infos de ™h—™un grâ™e à une ˜ou™le @qui se répète t—nt qu9il y — des joueursAF p—ites un petit t—˜le—u de P joueurs pour ™ommen™erD m—is si ç— vous —museD vous pourrez —gr—ndir l— t—ille du t—˜le—u plus t—rdF e0™hez à l— (n du progr—mme les infos que vous —vez re™ueillies sur ™h—™un des joueursF Initialiser une structure €our les stru™tures ™omme pour les v—ri—˜lesD t—˜le—ux et pointeursD il est vivement ™onseillé de les initi—liser dès leur ™ré—tion pour éviter qu9elles ne ™ontiennent  n9imE porte quoi F in e'etD je vous le r—ppelleD une v—ri—˜le qui est ™réée prend l— v—leur de ™e qui se trouve en mémoire là où elle — été pl—™éeF €—rfois ™ette v—leur est HD p—rfois ™9est un résidu d9un —utre progr—mme qui est p—ssé p—r là —v—nt vous et l— v—ri—˜le — —lors une v—leur qui n9— —u™un sensD ™omme EVRSUHF €our r—ppelD voi™i ™omment on initi—lise X ! une variable X on met s— v—leur à H @™—s le plus simpleA Y ! un pointeur X on met s— v—leur à x…vvF x…vv est en f—it un 5define situé d—ns stdli˜Fh qui v—ut génér—lement HD m—is on ™ontinue à utiliser x…vvD p—r ™onventionD sur les pointeurs pour ˜ien voir qu9il s9—git de pointeurs et non de v—ri—˜les ordin—ires Y ! un tableau X on met ™h—™une de ses v—leurs à HF €our les stru™turesD l9initi—lis—tion v— un peu ressem˜ler à ™elle d9un t—˜le—uF in e'etD on peut f—ire à l— dé™l—r—tion de l— v—ri—˜le X goordonnees point a {HD H}Y gel— dé(nir—D d—ns l9ordreD pointFx a H et pointFy a HF PHU .

CRÉEZ VOS PROPRES TYPES DE VARIABLES ‚evenons à l— stru™ture €ersonne @qui ™ontient des ™h—înesAF †ous —vez —ussi le droit d9initi—liser une ™h—îne en é™riv—nt juste 44 @rien entre les guillemetsAF te ne vous —i p—s p—rlé de ™ette possi˜ilité d—ns le ™h—pitre sur les ™h—înesD m—is il n9est p—s trop t—rd pour l9—pprendreF yn peut don™ initi—liser d—ns l9ordre nomD prenomD —dresseD —ge et g—r™on ™omme ™e™i X €ersonne utilis—teur a {44D 44D 44D HD H}Y „outefoisD j9utilise —ssez peu ™ette te™hniqueD personnellementF te préfère envoyer p—r exemple m— v—ri—˜le point à une fon™tion initi—lisergoordonnees qui se ™h—rge de f—ire les initi—lis—tions pour moi sur m— v—ri—˜leF €our f—ire ™el— il f—ut envoyer un pointeur de m— v—ri—˜leF in e'et si j9envoie juste m— v—ri—˜leD une ™opie en ser— ré—lisée d—ns l— fon™tion @™omme pour une v—ri—˜le de ˜—seA et l— fon™tion modi(er— les v—leurs de l— ™opie et non ™elle de m— vr—ie v—ri—˜leF ‚evoyez le (l rouge du ™h—pitre sur les pointeurs si vous —vez ou˜lié ™omment ™el— fon™tionneF sl v— don™ f—lloir —pprendre à utiliser des pointeurs sur des stru™turesF ves ™hoses vont ™ommen™er à se ™orser un petit peu 3 Pointeur de structure …n pointeur de stru™ture se ™rée de l— même m—nière qu9un pointeur de intD de dou˜le ou de n9importe quelle —utre type de ˜—se X goordonneesB point a x…vvY yn — —insi un pointeur de goordonnees —ppelé pointF gomme un r—ppel ne fer— de m—l à personneD je tiens à vous répéter que l9on —ur—it —ussi pu mettre l9étoile dev—nt le nom du pointeurD ™el— revient ex—™tement —u même X goordonnees Bpoint a x…vvY te f—is d9—illeurs —ssez souvent ™omme ™el—D ™—r pour dé(nir plusieurs pointeurs sur l— même ligneD nous sommes o˜ligés de pl—™er l9étoile dev—nt ™h—que nom de pointeur X goordonnees BpointI a x…vvD BpointP a x…vvY Envoi de la structure à une fonction ge qui nous intéresse i™iD ™9est de s—voir ™omment envoyer un pointeur de stru™ture à une fon™tion pour que ™elleE™i puisse modi(er le ™ontenu de l— v—ri—˜leF yn v— f—ire ™e™i pour ™et exemple X on v— simplement ™réer une v—ri—˜le de type goordonnees d—ns le m—in et envoyer son —dresse à initi—lisergoordonneesF gette fon™tion —ur— pour rôle de mettre tous les éléments de l— stru™ture à HF PHV .CHAPITRE 15.

POINTEUR DE STRUCTURE xotre fon™tion initi—lisergoordonnees v— prendre un p—r—mètre X un pointeur sur une stru™ture de type goordonnees @un goordonneesBD don™AF int m—in@int —rg™D ™h—r B—rgv‘“A { goordonnees mon€ointY initi—lisergoordonnees@8mon€ointAY } return HY void initi—lisergoordonnees@goordonneesB pointA { GG sniti—lis—tion de ™h—™un des mem˜res de l— stru™ture i™i } w— v—ri—˜le mon€oint est don™ ™réée d—ns le m—inF yn envoie son —dresse à l— fon™tion initi—lisergoordonnees qui ré™upère ™ette v—ri—˜le sous l— forme d9un pointeur —pE pelé point @on —ur—it d9—illeurs pu l9—ppeler n9importe ™omment d—ns l— fon™tionD ™el— n9—ur—it p—s eu d9in™iden™eAF fien X m—inten—nt que nous sommes d—ns initi—lisergoordonneesD nous —llons iniE ti—liser ™h—™une des v—leurs une à uneF sl ne f—ut p—s ou˜lier de mettre une étoile dev—nt le nom du pointeur pour —™™éder à l— v—ri—˜leF ƒi vous ne le f—ites p—sD vous risquez de modi(er l9—dresseD et ™e n9est p—s ™e que nous voulons f—ireF yui m—is voilàD pro˜lèmeF F F yn ne peut p—s vr—iment f—ire X void initi—lisergoordonnees@goordonneesB pointA { BpointFx a HY BpointFy a HY } ge ser—it trop f—™ileF F F €ourquoi on ne peut p—s f—ire ç— c €—r™e que le point de sép—r—E tion s9—pplique sur le mot point et non sur Bpoint en entierF yrD nous ™e qu9on veutD ™9est —™™éder à Bpoint pour en modi(er l— v—leurF €our régler le pro˜lèmeD il f—ut pl—™er des p—renthèses —utour de BpointF gomme ™el—D le point de sép—r—tion s9—ppliquer— à Bpoint et non juste à point X void initi—lisergoordonnees@goordonneesB pointA { @BpointAFx a HY @BpointAFy a HY } ge ™ode fon™tionneD vous pouvez testerF v— v—ri—˜le de type goordonnees — été tr—nsE mise à l— fon™tion qui — initi—lisé x et y à HF PHW .

CHAPITRE 15. 4 Un raccourci pratique et très utilisé †ous —llez voir qu9on m—nipuler— très souvent des pointeurs de stru™turesF €our être fr—n™D je dois même vous —vouer qu9en gD on utilise plus souvent des pointeurs de stru™tures que des stru™tures tout ™ourt F gomme les pointeurs de stru™tures sont très utilisésD on ser— souvent —mené à é™rire ™e™i X 5 @BpointAFx a HY yui m—is voilàD en™ore une fois les progr—mmeurs trouvent ç— trop longF ves p—renthèses —utour de BpointD quelle pl—ie 3 elorsD ™omme les progr—mmeurs sont des gens f—iné—nts @m—is ç—D je l9—i déjà ditD je ™roisAD ils ont inventé le r—™™our™i suiv—nt X pointEbx a HY ge r—™™our™i ™onsiste à former une )è™he —ve™ un tiret suivi d9un ™hevron bF ərire pointEbx est don™ ƒ„‚sg„iwix„ équiv—lent à é™rire @BpointAFxF N'oubliez pas qu'on ne peut utiliser la èche que sur un pointeur ! Si vous travaillez directement sur la variable. beaucoup de choses découlent de cela et il faudrait un livre entier pour en parler . 5. Bien entendu. je ne le disais presque pas en rigolant ! PIH . Le C++ n'est en fait rien d'autre qu'une sorte de  super-amélioration  des structures. CRÉEZ VOS PROPRES TYPES DE VARIABLES En langage C. ‚eprenons notre fon™tion initi—lisergoordonneesF xous pouvons don™ l9é™rire ™omme ™e™i X void initi—lisergoordonnees@goordonneesB pointA { pointEbx a HY pointEby a HY } ‚etenez ˜ien ™e r—™™our™i de l— )è™heD nous —llons le réutiliser un ™ert—in nom˜re de foisF it surtoutD ne ™onfondez p—s l— )è™he —ve™ le  point F v— )è™he est réservée —ux pointeursD le  point est réservé —ux v—ri—˜lesF …tilisez ™e petit exemple pour vous en souvenir X 4. vous devez utiliser le point comme on l'a vu au début. les initialisations sont plus souvent faites dans des  fonctions . Chaque chose en son temps. Quand je vous disais que les pointeurs vous poursuivraient jusque dans votre tombe. En C++ en revanche. on initialise généralement nos structures avec la méthode simple qu'on a vue plus haut.

LES ÉNUMÉRATIONS int m—in@int —rg™D ™h—r B—rgv‘“A { goordonnees mon€ointY goordonnees Bpointeur a 8mon€ointY mon€ointFx a IHY GG yn tr—v—ille sur une v—ri—˜leD on utilise le 4point4 pointeurEbx a IHY GG yn tr—v—ille sur un pointeurD on utilise l— flè™he } return HY yn modi(e l— v—leur du x à IH de deux m—nières di'érentesD i™i X l— première fois en tr—v—ill—nt dire™tement sur l— v—ri—˜leD l— se™onde fois en p—ss—nt p—r le pointeurF Les énumérations ves énumér—tions ™onstituent une f—çon un peu di'érente de ™réer ses propres types de v—ri—˜lesF …ne énumér—tion ne ™ontient p—s de  sousEv—ri—˜les ™omme ™9ét—it le ™—s pour les stru™turesF g9est une liste de  v—leurs possi˜les pour une v—ri—˜leF …ne énumér—tion ne prend don™ qu9une ™—se en mémoire et ™ette ™—se peut prendre une des v—leurs que vous dé(nissez @et une seule à l— foisAF †oi™i un exemple d9énumér—tion X typedef enum †olume †olumeY enum †olume { pesfviD wy‰ixD py‚„ }Y †ous noterez qu9on utilise un typedef là —ussiD ™omme on l9— f—it jusqu9i™iF €our ™réer une énumér—tionD on utilise le motE™lé enumF xotre énumér—tion s9—ppelle i™i †olumeF g9est un type de v—ri—˜le personn—lisé qui peut prendre une des trois v—leurs qu9on — indiquées X soit pesfviD soit wy‰ixD soit py‚„F yn v— pouvoir ™réer une v—ri—˜le de type †olumeD p—r exemple musiqueD qui sto™ker— le volume —™tuel de l— musiqueF yn peut p—r exemple initi—liser l— musique —u volume wy‰ix X †olume musique a wy‰ixY †oilà qui est f—itF €lus t—rd d—ns le progr—mmeD on pourr— modi(er l— v—leur du volume et l— mettre soit à pesfviD soit à py‚„F PII .

py‚„ vaut 2.CHAPITRE 15. est-ce utile de savoir que wy‰ix vaut 1. etc. CRÉEZ VOS PROPRES TYPES DE VARIABLES Association de nombres aux valeurs †ous —vez rem—rqué que j9—i é™rit les v—leurs possi˜les de l9énumér—tion en m—jus™ulesF gel— devr—it vous r—ppeler les ™onst—ntes et les defineD non c in e'etD ™9est —ssez simil—ire m—is ™e n9est pourt—nt p—s ex—™tement l— même ™hoseF ve ™ompil—teur —sso™ie —utom—tiquement un nom˜re à ™h—™une des v—leurs possi˜les de l9énumér—tionF h—ns le ™—s de notre énumér—tion †olumeD pesfvi v—ut HD wy‰ix v—ut I et py‚„ v—ut PF v9—sso™i—tion est —utom—tique et ™ommen™e à HF gontr—irement —u 5defineD ™9est le ™ompil—teur qui —sso™ie wy‰ix à I p—r exempleD et non le prépro™esseurF eu ˜out du ™ompteD ç— revient un peu —u mêmeF in f—itD qu—nd on — initi—lisé l— v—ri—˜le musique à wy‰ixD on — don™ mis l— ™—se en mémoire à l— v—leur IF En pratique. ? xonF in génér—l ç— nous est ég—lF g9est le ™ompil—teur qui —sso™ie —utom—tiquement un nom˜re à ™h—que v—leurF qrâ™e à ç—D vous n9—vez plus qu9à é™rire X if @musique aa wy‰ixA { GG touer l— musique —u volume moyen } €eu importe l— v—leur de wy‰ixD vous l—issez le ™ompil—teur se ™h—rger de gérer les nom˜resF v9intérêt de tout ç— c g9est que de ™e f—it votre ™ode est très lisi˜leF in e'etD tout le monde peut f—™ilement lire le if pré™édent @on ™omprend ˜ien que l— ™ondition signi(e  ƒi l— musique est —u volume moyen AF Associer une valeur précise €our le momentD ™9est le ™ompil—teur qui dé™ide d9—sso™ier le nom˜re H à l— première v—leurD puis ID PD Q d—ns l9ordreF sl est possi˜le de dem—nder d9—sso™ier une v—leur pré™ise à ™h—que élément de l9énumér—tionF uel intérêt estE™e que ç— peut ˜ien —voir c ih ˜ien supposons que sur votre ordin—teurD le volume soit géré entre H et IHH @H a p—s de sonD IHH a IHH 7 du sonAF sl est —lors pr—tique d9—sso™ier une v—leur pré™ise à ™h—que élément X typedef enum †olume †olumeY enum †olume { PIP .

LES ÉNUMÉRATIONS pesfvi a IHD wy‰ix a SHD py‚„ a IHH }Y s™iD le volume pesfvi ™orrespondr— à IH 7 de volumeD le volume wy‰ix à SH 7D et™F yn pourr—it f—™ilement —jouter de nouvelles v—leurs possi˜les ™omme w…i„F yn —sso™ier—it d—ns ™e ™—s w…i„ à l— v—leurF F F H 3 †ous —vez ™omprisF En résumé ! …ne stru™ture est un type de v—ri—˜le personn—lisé que vous pouvez ™réer et utiliser d—ns vos progr—mmesF g9est à vous de l— dé(nirD ™ontr—irement —ux types de ˜—se tels que int et dou˜le que l9on retrouve d—ns tous les progr—mmesF ! …ne stru™ture est ™omposée de  sousEv—ri—˜les qui sont en génér—l des v—ri—˜les de type de ˜—se ™omme int et dou˜leD m—is —ussi des t—˜le—uxF ! yn —™™ède à un des ™ompos—nts de l— stru™ture en sép—r—nt le nom de l— v—ri—˜le et l— ™ompos—nte d9un point X joueurFprenomF ! ƒi on m—nipule un pointeur de stru™ture et qu9on veut —™™éder à une des ™ompos—ntesD on utilise une )è™he à l— pl—™e du point X pointeurtoueurEbprenomF ! …ne énumér—tion est un type de v—ri—˜le personn—lisé qui peut seulement prendre une des v—leurs que vous prédé(nissez X pesfviD wy‰ix ou py‚„ p—r exempleF PIQ .

CHAPITRE 15. CRÉEZ VOS PROPRES TYPES DE VARIABLES PIR .

enregistrer les meilleurs scores obtenus à son jeu ? Comment peut-on faire un éditeur de texte si tout le texte écrit disparaît lorsqu'on arrête le programme ? Heureusement. nous allons avoir besoin de réutiliser tout ce que nous avons appris jusqu'ici : pointeurs. c'est qu'elles n'existent que dans la mémoire vive. chaînes de caractères.Chapitre 16 Diculté : Lire et écrire dans des chiers L e défaut avec les variables. on peut lire et écrire dans des chiers en langage C. même si vous arrêtez le programme ou l'ordinateur. Une fois votre programme arrêté. Pour lire et écrire dans des chiers. Ces chiers seront écrits sur le disque dur de votre ordinateur : l'avantage est donc qu'ils restent là. dans ce cas-là. structures. etc. PIS . toutes vos variables sont supprimées de la mémoire et il n'est pas possible de retrouver ensuite leur valeur. Comment peut-on.

Linux. Pour obtenir des fonctions plus avancées. il faudra télécharger et installer de nouvelles bibliothèques. Mac ou autre. stdioFh. Les bibliothèques standard ne sont pas très nombreuses et ne permettent de faire que des choses très basiques. LIRE ET ÉCRIRE DANS DES FICHIERS Ouvrir et fermer un chier €our lire et é™rire d—ns des (™hiersD nous —llons nous servir de fon™tions situées d—ns l— ˜i˜liothèque stdio que nous —vons déjà utiliséeF yuiD ™ette ˜i˜liothèqueElà ™ontient —ussi les fon™tions printf et s™—nf que nous ™onn—issons ˜ien 3 w—is elle ne ™ontient p—s que ç— X il y — —ussi d9—utres fon™tionsD not—mment des fon™tions f—ites pour tr—v—iller sur des (™hiersF Toutes les bibliothèques que je vous ai fait utiliser jusqu'ici (stdli˜Fh.) sont ce qu'on appelle des bibliothèques standard.CHAPITRE 16. Nous verrons cela bientôt ! essurezEvous don™D pour ™ommen™erD que vous in™luez ˜ien —u moins les ˜i˜liothèques stdioFh et stdli˜Fh en h—ut de votre (™hier F™ X 5in™lude `stdli˜Fhb 5in™lude `stdioFhb ges ˜i˜liothèques sont tellement fond—ment—lesD tellement ˜—siquesD que je vous re™omE m—nde d9—illeurs de les in™lure d—ns tous vos futurs progr—mmesD quels qu9ils soientF fienF w—inten—nt que les ˜onnes ˜i˜liothèques sont in™lusesD nous —llons pouvoir —tt—E quer les ™hoses sérieusesF †oi™i ™e qu9il f—ut f—ire à ™h—que fois d—ns l9ordre qu—nd on veut ouvrir un (™hierD que ™e soit pour le lire ou pour y é™rireF IF yn —ppelle l— fon™tion d9ouverture de chier fopen qui nous renvoie un poinE teur sur le (™hierF PF On vérie si l'ouverture a réussi @™9estEàEdire si le (™hier exist—itA en test—nt l— v—leur du pointeur qu9on — reçuF ƒi le pointeur v—ut x…vvD ™9est que l9ouverture du (™hier n9— p—s fon™tionnéD d—ns ™e ™—s on ne peut p—s ™ontinuer @il f—ut —0™her un mess—ge d9erreurAF QF ƒi l9ouverture — fon™tionné @si le pointeur est di'érent de x…vv don™AD —lors on peut s9—muser à lire et écrire dans le chier à tr—vers des fon™tions que nous verrons un peu plus loinF RF …ne fois qu9on — terminé de travailler sur le chierD il f—ut penser à le  fermer —ve™ l— fon™tion f™loseF xous —llons d—ns un premier temps —pprendre à nous servir de fopen et f™loseF …ne fois que vous s—urez f—ire ™el—D nous —pprendrons à lire le ™ontenu du (™hier et à y é™rire du texteF PIT . m—thFh. comme ce que nous avons fait jusqu'ici. stringFh. que vous soyez sous Windows. Vous pouvez donc les utiliser partout. comme ouvrir des fenêtres. . Ce sont des bibliothèques automatiquement livrées avec votre IDE qui ont la particularité de fonctionner sur tous les OS. .

Je reconnais néanmoins que l'on a toujours besoin de quelques petites explications à côté quand même ! PIU .OUVRIR ET FERMER UN FICHIER fopen : ouverture du chier 1 h—ns le ™h—pitre sur les ™h—înesD nous nous sommes servis des prototypes des fon™tions ™omme d9un  mode d9emploi F g9est ™omme ç— que les progr—mmeurs font en génér—l X ils lisent le prototype et ™omprennent ™omment ils doivent utiliser l— fon™tion F †oyons justement le prototype de l— fon™tion fopen X psviB fopen@™onst ™h—rB nomhupi™hierD ™onst ™h—rB modeyuvertureAY gette fon™tion —ttend deux p—r—mètres X ! le nom du (™hier à ouvrir Y ! le mode d9ouverture du (™hierD ™9estEàEdire une indi™—tion qui mentionne ™e que vous voulez f—ire X seulement é™rire d—ns le (™hierD seulement le lireD ou les deux à l— foisF gette fon™tion renvoieF F F un pointeur sur psvi 3 g9est un pointeur sur une stru™ture de type psviF gette stru™ture est dé(nie d—ns stdioFhF †ous pouvez ouvrir ™e (™hier pour voir de quoi est ™onstitué le type psviD m—is ç— n9— —u™un intérêt en ™e qui nous ™on™erneF Pourquoi le nom de la structure est-il tout en majuscules (psvi) ? Je croyais que les noms tout en majuscules étaient réservés aux constantes et aux define ? gette  règle D ™9est moi qui me l— suis (xée @et nom˜re d9—utres progr—mmeurs suivent l— mêmeD d9—illeursAF Ǘ n9— j—m—is été une o˜lig—tionF por™e est de ™roire que ™eux qui ont progr—mmé stdio ne suiv—ient p—s ex—™tement les mêmes règles 3 gel— ne doit p—s vous pertur˜er pour —ut—ntF †ous verrez d9—illeurs que les ˜i˜liothèques que nous étudierons ensuite respe™tent les mêmes règles que moiD à s—voir i™i mettre juste l— première lettre d9une stru™ture en m—jus™uleF ‚evenons à notre fon™tion fopenF ille renvoie un psviBF sl est extrêmement import—nt de ré™upérer ™e pointeur pour pouvoir ensuite lire et é™rire d—ns le (™hierF xous —llons don™ ™réer un pointeur de psvi —u dé˜ut de notre fon™tion @p—r exemple l— fon™tion m—inA X int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY } return HY ve pointeur est initi—lisé à x…vv dès le dé˜utF te vous r—ppelle que ™9est une règle fond—ment—le que d9initi—liser ses pointeurs à x…vv dès le dé˜ut si on n9— p—s d9—utre 1.

il sera créé. Pour cette raison. w—inten—ntD nous —llons —ppeler l— fon™tion fopen et ré™upérer l— v—leur qu9elle renvoie d—ns le pointeur fi™hierF w—is —v—nt ç—D il f—ut que je vous explique ™omment se servir du se™ond p—r—mètreD le p—r—mètre modeyuvertureF in e'etD il y — un ™ode à envoyer qui indiquer— à l9ordin—teur si vous ouvrez le (™hier en mode de le™ture seuleD d9é™riture seuleD ou des deux à l— foisF †oi™i les modes d9ouverture possi˜lesF ! 4r4 : lecture seuleF †ous pourrez lire le ™ontenu du (™hierD m—is p—s y é™rireF Le ! ! chier doit avoir été créé au préalable. ! 4rC4 : lecture et écritureF †ous pourrez lire et é™rire d—ns le (™hierF Le chier doit Si le chier n'existe pas. €our inform—tionD je ne vous —i présenté qu9une p—rtie des modes d9ouvertureF sl y en — le dou˜leD en ré—lité 3 €our ™h—que mode qu9on — vu làD si vous —joutez un 4˜4 —près le premier ™—r—™tère @4r˜4D 4w˜4D 4—˜4D 4r˜C4D 4w˜C4D 4—˜C4AD —lors le (™hier est ouvert en mode ˜in—ireF g9est un mode un peu p—rti™ulier que nous ne verrons p—s i™iF in f—itD le mode texte est f—it pour sto™kerF F F du texte ™omme le nom l9indique @uniquement des ™—r—™tères —0™h—˜lesAD t—ndis que le mode ˜in—ire permet de sto™kerF F F des inform—tions o™tet p—r o™tet @des nom˜resD prin™ip—lementAF g9est sensi˜lement di'érentF ve fon™tionnement est de toute f—çon qu—siment le même que ™elui que nous —llons voir i™iF €ersonnellementD j9utilise souvent 4r4 @le™tureAD 4w4 @é™ritureA et 4rC4 @le™ture et é™riE tureAF ve mode 4wC4 est un peu d—ngereux p—r™e qu9il vide de suite le ™ontenu du (™hierD s—ns dem—nde de ™on(rm—tionF sl ne doit être utilisé que si vous voulez d9—˜ord réiniti—liser le (™hierF ve mode d9—jout @4—4A peut être utile d—ns ™ert—ins ™—sD si vous voulez seulement —jouter des inform—tions à l— (n du (™hierF 4—C4 Si le chier n'existe pas. on ne modiera jamais le contenu d'un psvi directement (on ne fera pas fi™hierFelement par exemple). Notez que la forme de la structure peut changer d'un OS à l'autre (elle ne contient pas forcément les mêmes sous-variables partout). avec suppression du contenu au préalableF ve (™hier est don™ d9—˜ord vidé de son ™ontenuD vous pouvez y é™rireD et le lire ensuiteF avoir été créé au préalable. : écriture seuleF †ous pourrez é™rire d—ns le (™hierD m—is p—s lire son ™ontenuF ! ! 4wC4 : lecture et écriture. il sera créé. On passera par des fonctions qui manipulent le psvi à notre place. LIRE ET ÉCRIRE DANS DES FICHIERS v—leur à leur donnerF ƒi vous ne le f—ites p—sD vous —ugmentez ™onsidér—˜lement le risque d9erreur p—r l— suiteF Vous noterez qu'il n'est pas nécessaire d'écrire stru™t psviB fi™hier a Les créateurs de stdio ont donc fait un typedef comme je vous ai appris à le faire il n'y a pas longtemps.CHAPITRE 16. : ajout en lecture / écriture à la nF †ous é™rivez et lisez du texte à p—rtir de l— (n du (™hierF Si le chier n'existe pas. il sera créé. PIV . 4w4 4—4 : mode d'ajoutF †ous é™rirez d—ns le (™hierD en p—rt—nt de l— (n du (™hierF †ous —jouterez don™ du texte à l— (n du (™hierF Si le chier n'existe pas. x…vv. il sera créé.

il est conseillé de mettre 4r4. Certes. ƒi vous é™rivez une fon™tion ™h—rgerxive—u @pour ™h—rger le nive—u d9un jeuD p—r exempleAD le mode 4r4 su0tF ƒi vous é™rivez une fon™tion enregistrerxive—uD le mode 4w4 ser— —lors —d—ptéF ve ™ode suiv—nt ouvre le (™hier testFtxt en mode 4rC4 @le™ture G é™ritureA X int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY fi™hier a fopen@4testFtxt4D 4rC4AY } return HY ve pointeur fi™hier devient —lors un pointeur sur testFtxtF Où doit être situé testFtxt ? sl doit être situé d—ns le même dossier que votre exé™ut—˜le @FexeAF €our les ˜esoins de ™e ™h—pitreD ™réez un (™hier testFtxt ™omme moi d—ns le même dossier que le Fexe @(gF ITFIAF gomme vous le voyezD je tr—v—ille —™tuellement —ve™ l9shi gode: :flo™ksD ™e qui explique l— présen™e d9un (™hier de projet F™˜p @—u lieu de FslnD si vous —vez †isu—l gCC p—r exempleAF frefD ™e qui ™ompte ™9est de ˜ien voir que mon progr—mme @testsFexeA est situé d—ns le même dossier que le (™hier d—ns lequel on v— lire et é™rire @testFtxtAF Le chier doit-il être de type Ftxt ? xonF g9est vous qui ™hoisissez l9extension lorsque vous ouvrez le (™hierF †ous pouvez très ˜ien inventer votre propre form—t de (™hier Fnive—u pour enregistrer les nive—ux de vos jeux p—r exempleF Le chier doit-il être obligatoirement dans le même répertoire que l'exécutable ? xon plusF sl peut être d—ns un sousEdossier X PIW . ce qui est en quelque sorte une sécurité. mais en mettant 4r4 vous vous assurez que le chier ne pourra pas être modié.OUVRIR ET FERMER UN FICHIER Si vous avez juste l'intention de lire un chier. le mode 4rC4 aurait fonctionné lui aussi.

votre ordinateur aurait cru que vous essayiez d'insérer un symbole spécial comme ’n ou ’t.CHAPITRE 16. En eet. si j'en avais écrit un seul. il faut donc l'écrire deux fois ! Votre ordinateur comprend alors que c'est bien le symbole ’ que vous vouliez utiliser. Pour écrire un antislash dans une chaîne. ve déf—ut des ™hemins —˜solusD ™9est qu9ils ne fon™tionnent que sur un yƒ pré™isF ge n9est p—s une solution port—˜leD don™F ƒi vous —viez été sous vinuxD vous —uriez dû é™rire un ™hemin àEl—ElinuxD tel que X fi™hier a fopen@4GhomeGm—teoGdossierGre—dmeFtxt4D 4rC4AY PPH . LIRE ET ÉCRIRE DANS DES FICHIERS Figure ITFI ! ve (™hier doit être pl—™é d—ns le même dossier que l9exé™ut—˜le fi™hier a fopen@4dossierGtestFtxt4D 4rC4AY s™iD le (™hier testFtxt est d—ns un sousEdossier —ppelé dossierF gette méthodeD que l9on —ppelle chemin relatif est plus pr—tiqueF gomme ç—D ™el— fon™tionner— peu importe l9endroit où est inst—llé votre progr—mmeF sl est —ussi possi˜le d9ouvrir un —utre (™hier n9importe où —illeurs sur le disque durF h—ns ™e ™—sD il f—ut é™rire le ™hemin ™omplet @™e qu9on —ppelle le chemin absolu A X fi™hier a fopen@4gX’’€rogr—m piles’’xotep—dCC’’re—dmeFtxt4D 4rC4AY ge ™ode ouvre le (™hier re—dmeFtxt situé d—ns g:’€rogr—m piles’xotep—dCCF J'ai dû mettre deux antislashs ’ à chaque fois comme vous l'avez remarqué.

OUVRIR ET FERMER UN FICHIER te vous re™omm—nde don™ d9utiliser des ™hemins rel—tifs plutôt que des ™hemins —˜solusF x9utilisez les ™hemins —˜solus que si votre progr—mme est f—it pour un yƒ pré™is et doit modi(er un (™hier pré™is quelque p—rt sur votre disque durF Tester l'ouverture du chier ve pointeur fi™hier devr—it ™ontenir l9—dresse de l— stru™ture de type psvi qui sert de des™ripteur de (™hierF geluiE™i — été ™h—rgé en mémoire pour vous p—r l— fon™tion fopen@AF À p—rtir de làD deux possi˜ilités X ! soit l9ouverture — réussiD et vous pouvez ™ontinuer @™9estEàEdire ™ommen™er à lire et é™rire d—ns le (™hierA Y ! soit l9ouverture — é™houé p—r™e que le (™hier n9exist—it p—s ou ét—it utilisé p—r un —utre progr—mmeF h—ns ™e ™—sD vous devez —rrêter de tr—v—iller sur le (™hierF tuste —près l9ouverture du (™hierD il f—ut impér—tivement véri(er si l9ouverture — réussi ou nonF €our f—ire ç—D ™9est très simple X si le pointeur v—ut x…vvD l9ouverture — é™houéF ƒ9il v—ut —utre ™hose que x…vvD l9ouverture — réussiF yn v— don™ suivre systém—tiquement le s™hém— suiv—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY fi™hier a fopen@4testFtxt4D 4rC4AY if @fi™hier 3a x…vvA { GG yn peut lire et é™rire d—ns le fi™hier } else { GG yn —ffi™he un mess—ge d9erreur si on veut printf@4smpossi˜le d9ouvrir le fi™hier testFtxt4AY } } return HY p—ites toujours ™el— lorsque vous ouvrez un (™hierF ƒi vous ne le f—ites p—s et que le (™hier n9existe p—sD vous risquez un pl—nt—ge du progr—mme p—r l— suiteF fclose : fermer le chier ƒi l9ouverture du (™hier — réussiD vous pouvez le lire et y é™rire @nous —llons voir sous peu ™omment f—ireAF …ne fois que vous —urez (ni de tr—v—iller —ve™ le (™hierD il f—udr— le  fermer F yn utilise pour ™el— l— fon™tion f™lose qui — pour rôle de li˜érer l— mémoireD ™9estEàEdire supprimer votre (™hier ™h—rgé d—ns l— mémoire viveF PPI .

LIRE ET ÉCRIRE DANS DES FICHIERS ƒon prototype est X int f™lose@psviB pointeurƒurpi™hierAY gette fon™tion prend un p—r—mètre X votre pointeur sur le (™hierF ille renvoie un int qui indique si elle — réussi à fermer le (™hierF get int v—ut X ! H X si l— fermeture — m—r™hé Y ! iyp X si l— fermeture — é™houéF iyp est un define situé d—ns stdioFh qui ™orrespond à un nom˜re spé™i—lD utilisé pour dire soit qu9il y — eu une erreurD soit que nous sommes —rrivés à l— (n du (™hierF h—ns le ™—s présent ™el— signi(e qu9il y — eu une erreurF e prioriD l— fermeture se p—sse toujours ˜ien X je n9—i don™ p—s l9h—˜itude de tester si le f™lose — m—r™héF †ous pouvez né—nmoins le f—ire si vous le voulezF €our fermer le (™hierD on v— don™ é™rire X f™lose@fi™hierAY eu (n—lD le s™hém— que nous —llons suivre pour ouvrir et fermer un (™hier ser— le suiv—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY fi™hier a fopen@4testFtxt4D 4rC4AY if @fi™hier 3a x…vvA { GG yn lit et on é™rit d—ns le fi™hier GG FFF } } f™lose@fi™hierAY GG yn ferme le fi™hier qui — été ouvert return HY te n9—i p—s mis le else i™i pour —0™her un mess—ge d9erreur si l9ouverture — é™houéD m—is vous pouvez le f—ire si vous le désirezF sl f—ut toujours penser à fermer son (™hier une fois que l9on — (ni de tr—v—iller —ve™F gel— permet de li˜érer de l— mémoireF ƒi vous ou˜liez de li˜érer l— mémoireD votre progr—mme risque à l— (n de prendre énormément de mémoire qu9il n9utilise plusF ƒur un petit exemple ™omme ç— ™e n9est p—s )—gr—ntD m—is sur un gros progr—mmeD ˜onjour les dégâts 3 PPP .CHAPITRE 16.

DIFFÉRENTES MÉTHODES DE LECTURE / ÉCRITURE yu˜lier de li˜érer l— mémoireD ç— —rriveF Ǘ vous —rriver— d9—illeurs très ™ert—inementF h—ns ™e ™—sD vous serez témoins de ™e que l9on —ppelle des fuites mémoire F †otre proE gr—mme se mettr— —lors à utiliser plus de mémoire que né™ess—ire s—ns que vous —rriviez à ™omprendre pourquoiF fien souventD il s9—git simplement d9un ou deux  dét—ils ™omme des petits f™lose ou˜liésF Diérentes méthodes de lecture / écriture w—inten—nt que nous —vons é™rit le ™ode qui ouvre et ferme le (™hierD nous n9—vons plus qu9à insérer le ™ode qui le lit et y é™ritF xous —llons ™ommen™er p—r voir ™omment é™rire d—ns un (™hier @™e qui est un peu plus simpleAD puis nous verrons ensuite ™omment lire d—ns un (™hierF Écrire dans le chier sl existe plusieurs fon™tions ™—p—˜les d9é™rire d—ns un (™hierF ge ser— à vous de ™hoisir ™elle qui est l— plus —d—ptée à votre ™—sF †oi™i les trois fon™tions que nous —llons étudier X ! fput™ X é™rit un ™—r—™tère d—ns le (™hier @…x ƒi…v ™—r—™tère à l— foisA Y ! fputs X é™rit une ™h—îne d—ns le (™hier Y ! fprintf X é™rit une ™h—îne  form—tée d—ns le (™hierD fon™tionnement qu—siE identique à printfF fput™ gette fon™tion é™rit un ™—r—™tère à l— fois d—ns le (™hierF ƒon prototype est X int fput™@int ™—r—™tereD psviB pointeurƒurpi™hierAY ille prend deux p—r—mètresF ! ve ™—r—™tère à é™rire @de type intD ™e qui ™omme je vous l9—i dit revient plus ou moins à utiliser un ™h—rD s—uf que le nom˜re de ™—r—™tères utilis—˜les est i™i plus gr—ndAF †ous pouvez don™ é™rire dire™tement 9e9 p—r exempleF ! ve pointeur sur le (™hier d—ns lequel é™rireF h—ns notre exempleD notre pointeur s9—ppelle fi™hierF v9—v—nt—ge de dem—nder le pointeur de (™hier à ™h—que foisD ™9est que vous pouvez ouvrir plusieurs (™hiers en même temps et don™ lire et é™rire d—ns ™h—™un de ™es (™hiersF †ous n9êtes p—s limités à un seul (™hier ouvert à l— foisF v— fon™tion retourne un intD ™9est un ™ode d9erreurF get int v—ut iyp si l9é™riture — é™houéD sinon il — une —utre v—leurF gomme le (™hier — norm—lement été ouvert —ve™ su™™èsD je n9—i p—s l9h—˜itude de tester si ™h—™un de mes fput™ — réussiD m—is vous pouvez le f—ire en™ore une fois si vous le voulezF ve ™ode suiv—nt é™rit l— lettre 9e9 d—ns testFtxt @si le (™hier existeD il est rempl—™é Y s9il n9existe p—sD il est ™rééAF sl y — tout d—ns ™e ™ode X ouvertureD test de l9ouvertureD é™riture et fermetureF PPQ .

LIRE ET ÉCRIRE DANS DES FICHIERS int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY fi™hier a fopen@4testFtxt4D 4w4AY if @fi™hier 3a x…vvA { fput™@9e9D fi™hierAY GG əriture du ™—r—™tère e f™lose@fi™hierAY } } return HY we˜ X SIUWRR ¡ yuvrez votre (™hier testFtxtF ue voyezEvous c g9est m—giqueD le (™hier ™ontient m—inE ten—nt l— lettre 9e9 ™omme le montre l— (gF ITFPF £ ¢gode   Figure ITFP ! ve (™hier ™ontient désorm—is l— lettre 9e9 fputs gette fon™tion est très simil—ire à fput™D à l— di'éren™e près qu9elle é™rit tout une ™h—îneD ™e qui est en génér—l plus pr—tique que d9é™rire ™—r—™tère p—r ™—r—™tèreF gel— ditD fput™ reste utile lorsque vous devez é™rire ™—r—™tère p—r ™—r—™tèreD ™e qui —rrive fréquemmentF €rototype de l— fon™tion X ™h—rB fputs@™onst ™h—rB ™h—ineD psviB pointeurƒurpi™hierAY ves deux p—r—mètres sont f—™iles à ™omprendreF ! ™h—ine X l— ™h—îne à é™rireF xotez que le type i™i est ™onst ™h—rB X en —jout—nt le mot ™onst d—ns le prototypeD l— fon™tion indique que pour elle l— ™h—îne ser— ™onsidérée ™omme une ™onst—nteF in un mot ™omme en ™ent X elle s9interdit de modi(er le ™ontenu de votre ™h—îneF g9est logique qu—nd on y pense X fputs doit juste lire PPR .CHAPITRE 16.

DIFFÉRENTES MÉTHODES DE LECTURE / ÉCRITURE votre ™h—îneD p—s l— modi(erF g9est don™ pour vous une inform—tion @et une sé™uritéA ™omme quoi votre ™h—îne ne su˜ir— p—s de modi(™—tionF ! pointeurƒurpi™hier X ™omme pour fput™D il s9—git de votre pointeur de type psviB sur le (™hier que vous —vez ouvertF v— fon™tion renvoie iyp s9il y — eu une erreurD sinon ™9est que ™el— — fon™tionnéF và non plusD je ne teste en génér—l p—s l— v—leur de retourF „estons l9é™riture d9une ™h—îne d—ns le (™hier X int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY fi™hier a fopen@4testFtxt4D 4w4AY if @fi™hier 3a x…vvA { fputs@4ƒ—lut les érHs’ngomment —llezEvous c4D fi™hierAY f™lose@fi™hierAY } } return HY we˜ X VRHTVU ¡ v— (gF ITFQ présente le (™hier une fois modi(é p—r le progr—mmeF £ ¢gode   Figure ITFQ ! ve (™hier ™ontient désorm—is notre ™h—îne fprintf †oi™i un —utre exempl—ire de l— fon™tion printfF gelleE™i peut être utilisée pour é™rire d—ns un (™hierF ille s9utilise de l— même m—nière que printf d9—illeursD ex™epté le f—it que vous devez indiquer un pointeur de psvi en premier p—r—mètreF ge ™ode dem—nde l9âge de l9utilis—teur et l9é™rit d—ns le (™hier @résult—t (gF ITFRA X int m—in@int —rg™D ™h—r B—rgv‘“A { PPS .

LIRE ET ÉCRIRE DANS DES FICHIERS psviB fi™hier a x…vvY int —ge a HY fi™hier a fopen@4testFtxt4D 4w4AY if @fi™hier 3a x…vvA { GG yn dem—nde l9âge printf@4uel —ge —vezEvous c 4AY s™—nf@47d4D 8—geAY GG yn l9é™rit d—ns le fi™hier fprintf@fi™hierD 4ve wonsieur qui utilise le progr—mmeD il — 7d —ns4D —geAY f™lose@fi™hierAY → } } return HY £ ¢gode we˜ X IIWHQW ¡   Figure ITFR ! əriture d—ns un (™hier —ve™ fprintf †ous pouvez —insi f—™ilement réutiliser ™e que vous s—vez de printf pour é™rire d—ns un (™hier 3 g9est pour ™ette r—ison d9—illeurs que j9utilise le plus souvent fprintf pour é™rire d—ns des (™hiersF Lire dans un chier xous pouvons utiliser qu—siment les mêmes fon™tions que pour l9é™ritureD le nom ™h—nge juste un petit peu X ! fget™ X lit un ™—r—™tère Y ! fgets X lit une ™h—îne Y ! fs™—nf X lit une ™h—îne form—téeF te v—is ™ette fois —ller un peu plus vite d—ns l9expli™—tion de ™es fon™tions X si vous —vez ™ompris ™e que j9—i é™rit plus h—utD ç— ne devr—it p—s poser de pro˜lèmeF PPT .CHAPITRE 16.

ainsi que le dixième caractère.DIFFÉRENTES MÉTHODES DE LECTURE / ÉCRITURE fget™ „out d9—˜ord le prototype X int fget™@psviB pointeurhepi™hierAY gette fon™tion retourne un int X ™9est le ™—r—™tère qui — été luF ƒi l— fon™tion n9— p—s pu lire de ™—r—™tèreD elle retourne iypF Mais comment savoir quel caractère on lit ? Si on veut lire le troisième caractère. comment doit-on faire ? in f—itD —u fur et à mesure que vous lisez un (™hierD vous —vez un  ™urseur qui —v—n™eF g9est un ™urseur virtuel ˜ien entenduD vous ne le voyez p—s à l9é™r—nF †ous pouvez im—giner que ™e ™urseur est ™omme l— ˜—rre ™lignot—nte lorsque vous éditez un (™hier sous flo™ExotesF sl indique où vous en êtes d—ns l— le™ture du (™hierF xous verrons peu —près ™omment s—voir à quelle position le ™urseur est situé d—ns le (™hier et ég—lement ™omment modi(er l— position du ™urseur @pour le remettre —u dé˜ut du (™hier p—r exempleD ou le pl—™er à un ™—r—™tère pré™isD ™omme le dixième ™—r—™tèreAF fget™ —v—n™e le ™urseur d9un ™—r—™tère à ™h—que fois que vous en lisez unF ƒi vous —pE pelez fget™ une se™onde foisD l— fon™tion lir— don™ le se™ond ™—r—™tèreD puis le troisième et —insi de suiteF †ous pouvez don™ f—ire une ˜ou™le pour lire les ™—r—™tères un p—r un d—ns le (™hierF yn v— é™rire un ™ode qui lit tous les ™—r—™tères d9un (™hier un à un et qui les é™rit à ™h—que fois à l9é™r—nF v— ˜ou™le s9—rrête qu—nd fget™ renvoie iyp @qui signi(e  ind yf pile D ™9estEàEdire  (n du (™hier AF int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY int ™—r—™teree™tuel a HY fi™hier a fopen@4testFtxt4D 4r4AY if @fi™hier 3a x…vvA { GG fou™le de le™ture des ™—r—™tères un à un do { ™—r—™teree™tuel a fget™@fi™hierAY GG yn lit le ™—r—™tère printf@47™4D ™—r—™teree™tuelAY GG yn l9—ffi™he } while @™—r—™teree™tuel 3a iypAY GG yn ™ontinue t—nt que fget™ n9— p—s → retourné iyp @fin de fi™hierA f™lose@fi™hierAY PPU .

LIRE ET ÉCRIRE DANS DES FICHIERS } } return HY we˜ X UQPTQP ¡ v— ™onsole —0™her— tout le ™ontenu du (™hierD p—r exemple X gou™ouD je suis le ™ontenu du fi™hier testFtxt 3 £ ¢gode   fgets gette fon™tion lit une ™h—îne d—ns le (™hierF Ǘ vous évite d9—voir à lire tous les ™—r—™E tères un p—r unF v— fon™tion lit au maximum une ligne @elle s9—rrête —u premier ’n qu9elle ren™ontreAF ƒi vous voulez lire plusieurs lignesD il f—udr— f—ire une ˜ou™leF †oi™i le prototype de fgets X ™h—rB fgets@™h—rB ™h—ineD int n˜reheg—r—™teresevireD psviB pointeurƒurpi™hierAY gette fon™tion dem—nde un p—r—mètre un peu p—rti™ulierD qui v— en f—it s9—vérer très pr—tique X le nom˜re de ™—r—™tères à lireF gel— dem—nde à l— fon™tion fgets de s9—rrêter de lire l— ligne si elle ™ontient plus de ˆ ™—r—™tèresF ev—nt—ge X ç— nous permet de nous —ssurer que l9on ne fer— p—s de dép—ssement de mémoire 3 in e'etD si l— ligne est trop grosse pour rentrer d—ns ™h—ineD l— fon™tion —ur—it lu plus de ™—r—™tères qu9il n9y — de pl—™eD ™e qui —ur—it pro˜—˜lement provoqué un pl—nt—ge du progr—mmeF xous —llons d9—˜ord voir ™omment lire une ligne —ve™ fgets @nous verrons ensuite ™omment lire tout le (™hierAF €our ™el—D on ™rée une ™h—îne su0s—mment gr—nde pour sto™ker le ™ontenu de l— ligne qu9on v— lire F †ous —llez voir là tout l9intérêt d9utiliser un define pour dé(nir l— t—ille du t—˜le—u X 2 5define „esvvi•weˆ IHHH GG „—˜le—u de t—ille IHHH int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY ™h—r ™h—ine‘„esvvi•weˆ“ a 44Y GG gh—îne vide de t—ille „esvvi•weˆ fi™hier a fopen@4testFtxt4D 4r4AY if @fi™hier 3a x…vvA { fgets@™h—ineD „esvvi•weˆD fi™hierAY GG yn lit m—ximum „esvvi•weˆ 2. car on ne peut pas en être sûr à 100 %. PPV .CHAPITRE 16. Du moins on l'espère.

DIFFÉRENTES MÉTHODES DE LECTURE / ÉCRITURE → ™—r—™tères du fi™hierD on sto™ke le tout d—ns 4™h—ine4 printf@47s4D ™h—ineAY GG yn —ffi™he l— ™h—îne } f™lose@fi™hierAY } return HY we˜ X VQHWWP ¡ ve résult—t est le même que pour le ™ode de tout à l9heureD à s—voir que le ™ontenu s9é™rit d—ns l— ™onsole X gou™ouD je suis le ™ontenu du fi™hier testFtxt 3 £ ¢gode   v— di'éren™eD ™9est qu9i™i on ne f—it p—s de ˜ou™leF yn —0™he toute l— ™h—îne d9un ™oupF †ous —urez sûrement rem—rqué m—inten—nt l9intérêt que peut —voir un 5define d—ns son ™ode pour dé(nir l— t—ille m—xim—le d9un t—˜le—u p—r exempleF in e'etD „esvvi•weˆ est i™i utilisé à deux endroits du ™ode X ! une première fois pour dé(nir l— t—ille du t—˜le—u à ™réer Y ! une —utre fois d—ns le fgets pour limiter le nom˜re de ™—r—™tères à lireF v9—v—nt—ge i™iD ™9est que si vous vous rendez ™ompte que l— ™h—îne n9est p—s —ssez gr—nde pour lire le (™hierD vous n9—vez qu9à ™h—nger l— ligne du define et re™ompilerF gel— vous évite d9—voir à ™her™her tous les endroits du ™ode qui indiquent l— t—ille du t—˜le—uF ve prépro™esseur rempl—™er— tous les „esvvi•weˆ d—ns le ™ode p—r leur nouvelle v—leurF gomme je vous l9—i ditD fgets lit —u m—ximum toute une ligne à l— foisF ille s9—rrête de lire l— ligne si elle dép—sse le nom˜re m—ximum de ™—r—™tères que vous —utorisezF yui m—is voilà X pour le momentD on ne s—it lire qu9une seule ligne à l— fois —ve™ fgetsF gomment di—˜le lire tout le (™hier c v— réponse est simple X —ve™ une ˜ou™le 3 v— fon™tion fgets renvoie x…vv si elle n9est p—s p—rvenue à lire ™e que vous —vez dem—ndéF v— ˜ou™le doit don™ s9—rrêter dès que fgets se met à renvoyer x…vvF yn n9— plus qu9à f—ire un while pour ˜ou™ler t—nt que fgets ne renvoie p—s x…vv X 5define „esvvi•weˆ IHHH int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY ™h—r ™h—ine‘„esvvi•weˆ“ a 44Y fi™hier a fopen@4testFtxt4D 4r4AY if @fi™hier 3a x…vvA { while @fgets@™h—ineD „esvvi•weˆD fi™hierA 3a x…vvA GG yn lit le fi™hier PPW .

LIRE ET ÉCRIRE DANS DES FICHIERS → t—nt qu9on ne reçoit p—s d9erreur @x…vvA { printf@47s4D ™h—ineAY GG yn —ffi™he l— ™h—îne qu9on vient de lire } } f™lose@fi™hierAY } return HY we˜ X RWWUWQ ¡ ge ™ode sour™e lit et —0™he tout le ™ontenu de mon (™hierD ligne p—r ligneF v— ligne de ™ode l— plus intéress—nte est ™elle du while X while @fgets@™h—ineD „esvvi•weˆD fi™hierA 3a x…vvA £ ¢gode   v— ligne du while f—it deux ™hoses X elle lit une ligne d—ns le (™hier et véri(e si fgets ne renvoie p—s x…vvF ille peut don™ se tr—duire ™omme ™e™i X  vire une ligne du (™hier t—nt que nous ne sommes p—s —rrivés à l— (n du (™hier F fs™—nf g9est le même prin™ipe que l— fon™tion s™—nfD là en™oreF gette fon™tion lit d—ns un (™hier qui doit —voir été é™rit d9une m—nière pré™iseF ƒupposons que votre (™hier ™ontienne trois nom˜res sép—rés p—r un esp—™eD qui sont p—r exemple les trois plus h—uts s™ores o˜tenus à votre jeu X IS PH QHF †ous voudriez ré™upérer ™h—™un de ™es nom˜res d—ns une v—ri—˜le de type intF v— fon™tion fs™—nf v— vous permettre de f—ire ç— r—pidementF int m—in@int —rg™D ™h—r B—rgv‘“A { psviB fi™hier a x…vvY int s™ore‘Q“ a {H}Y GG „—˜le—u des Q meilleurs s™ores fi™hier a fopen@4testFtxt4D 4r4AY if @fi™hier 3a x…vvA { fs™—nf@fi™hierD 47d 7d 7d4D 8s™ore‘H“D 8s™ore‘I“D 8s™ore‘P“AY printf@4ves meilleurs s™ores sont X 7dD 7d et 7d4D s™ore‘H“D s™ore‘I“D → s™ore‘P“AY } f™lose@fi™hierAY PQH .CHAPITRE 16.

cela permet d'aller plus vite pour récupérer chacune des valeurs. les combiner. Se déplacer dans un chier te vous —i p—rlé d9une espè™e de  ™urseur virtuel tout à l9heureF xous —llons l9étudier m—inten—nt plus en dét—ilsF gh—que fois que vous ouvrez un (™hierD il existe en e'et un ™urseur qui indique votre position d—ns le (™hierF †ous pouvez im—giner que ™9est ex—™tement ™omme le ™urseur de votre éditeur de texte @tel flo™ExotesAF sl indique où vous êtes d—ns le (™hierD et don™ où vous —llez é™rireF in résuméD le système de ™urseur vous permet d9—ller lire et é™rire à une position pré™ise d—ns le (™hierF sl existe trois fon™tions à ™onn—ître X ! ftell X indique à quelle position vous êtes —™tuellement d—ns le (™hier Y ! fseek X positionne le ™urseur à un endroit pré™is Y ! rewind X remet le ™urseur —u dé˜ut du (™hier @™9est équiv—lent à dem—nder à l— fon™tion fseek de positionner le ™urseur —u dé˜utAF ftell : position dans le chier gette fon™tion est très simple à utiliserF ille renvoie l— position —™tuelle du ™urseur sous l— forme d9un long X long ftell@psviB pointeurƒurpi™hierAY ve nom˜re renvoyé indique don™ l— position du ™urseur d—ns le (™hierF PQI . Si votre chier est écrit d'une façon bien précise. je ne vous avais fait mettre qu'un seul 7d entre guillemets pour la fonction s™—nf.SE DÉPLACER DANS UN FICHIER return HY } £   ¢gode we˜ X SQHSTI ¡ ves meilleurs s™ores sont X ISD PH et QH gomme vous le voyezD l— fon™tion fs™—nf —ttend trois nom˜res sép—rés p—r un esp—™e @47d 7d 7d4AF ille les sto™ke i™i d—ns notre t—˜le—u de trois ˜lo™sF yn —0™he ensuite ™h—™un des nom˜res ré™upérésF Jusqu'ici. Vous découvrez aujourd'hui qu'on peut en mettre plusieurs.

CHAPITRE 16. À moins de coder soi-même une fonction qui lit les caractères d'après pour s'en souvenir avant de les écraser ! PQP . LIRE ET ÉCRIRE DANS DES FICHIERS fseek : se positionner dans le chier ve prototype de fseek est le suiv—nt X int fseek@psviB pointeurƒurpi™hierD long depl—™ementD int origineAY v— fon™tion fseek permet de dépl—™er le ™urseur d9un ™ert—in nom˜re de ™—r—™tères @indiqué p—r depl—™ementA à p—rtir de l— position indiquée p—r origineF ! ve nom˜re depl—™ement peut être un nom˜re positif @pour se dépl—™er en —v—ntAD nul @a HA ou nég—tif @pour se dépl—™er en —rrièreAF ! u—nt —u nom˜re origineD vous pouvez mettre ™omme v—leur l9une des trois ™onst—ntes @génér—lement des defineA listées ™iEdessous X ! ƒiiu•ƒi„ X indique le dé˜ut du (™hier Y ! ƒiiu•g…‚ X indique l— position —™tuelle du ™urseur Y ! ƒiiu•ixh X indique l— (n du (™hierF †oi™i quelques exemples pour ˜ien ™omprendre ™omment on jongle —ve™ depl—™ement et origineF ! ve ™ode suiv—nt pl—™e le ™urseur deux ™—r—™tères après le dé˜ut X fseek@fi™hierD PD ƒiiu•ƒi„AY ! ve ™ode suiv—nt pl—™e le ™urseur qu—tre ™—r—™tères avant l— position ™our—nte X fseek@fi™hierD ERD ƒiiu•g…‚AY ‚em—rquez que depl—™ement est nég—tif ™—r on se dépl—™e en —rrièreF ! ve ™ode suiv—nt pl—™e le ™urseur à l— (n du (™hier X fseek@fi™hierD HD ƒiiu•ixhAY ƒi vous é™rivez —près —voir f—it un fseek qui mène à l— (n du (™hierD ™el— —jouter— vos inform—tions à l— suite d—ns le (™hier @le (™hier ser— ™omplétéAF in rev—n™heD si vous pl—™ez le ™urseur —u dé˜ut et que vous é™rivezD ™el— é™r—ser— le texte qui se trouv—it làF sl n9y — p—s de moyen d9 insérer de texte d—ns le (™hier F 3 Mais comment puis-je savoir à quelle position je dois aller lire et écrire dans le chier ? g9est à vous de le gérerF ƒi ™9est un (™hier que vous —vez vousEmêmes é™ritD vous s—vez ™omment il est ™onstruitF †ous s—vez don™ où —ller ™her™her vos inform—tions X p—r exemple les meilleurs s™ores sont en position HD les noms des derniers joueurs sont en position SHD et™F xous tr—v—illerons sur un „€ un peu plus t—rd d—ns lequel vous ™omprendrezD si ™e n9est p—s déjà le ™—sD ™omment on f—it pour —ller ™her™her l9inform—tion qui nous intéresseF 3.

on l'utilise plutôt pour se déplacer dans des chiers ouverts en mode binaire. Quand on lit et écrit dans un chier en mode texte. on le fait généralement caractère par caractère. En général. rewind : retour au début gette fon™tion est équiv—lente à utiliser fseek pour nous renvoyer à l— position H d—ns le (™hierF void rewind@psviB pointeurƒurpi™hierAY v9utilis—tion est —ussi simple que le prototypeF †ous n9—vez p—s ˜esoin d9expli™—tion supplément—ire 3 Renommer et supprimer un chier xous terminerons ™e ™h—pitre en dou™eur p—r l9étude de deux fon™tions très simples X ! ren—me X renomme un (™hier Y ! remove X supprime un (™hierF v— p—rti™ul—rité de ™es fon™tions est qu9elles ne né™essitent p—s de pointeur de (™hier pour fon™tionnerF sl su0r— simplement d9indiquer le nom du (™hier à renommer ou supprimerF rename : renommer un chier †oi™i le prototype de ™ette fon™tion X int ren—me@™onst ™h—rB —n™ienxomD ™onst ™h—rB nouve—uxomAY v— fon™tion renvoie H si elle — réussi à renommerD sinon elle renvoie une v—leur di'érente de HF istEil né™ess—ire de vous donner un exemple c in voi™i un X int m—in@int —rg™D ™h—r B—rgv‘“A { ren—me@4testFtxt4D 4test•renommeFtxt4AY } return HY PQQ . La seule chose qu'on se permet en mode texte avec fseek c'est de revenir au début ou de se placer à la n.RENOMMER ET SUPPRIMER UN FICHIER x9ou˜liez p—s que ™9est vous qui dé(nissez ™omment votre (™hier est ™onstruitF g9est don™ à vous de dire X  je pl—™e le s™ore du meilleur joueur sur l— première ligneD ™elui du se™ond meilleur joueur sur l— se™onde ligneD et™F La fonction fseek peut se comporter bizarrement sur des chiers ouverts en mode texte.

PQR . complexe et ne pas réussir. À moins de faire appel à des outils spéciques de récupération de chiers sur le disque. mais l'opération peut être longue. il est littéralement supprimé du disque dur. LIRE ET ÉCRIRE DANS DES FICHIERS remove : supprimer un chier gette fon™tion supprime un (™hier s—ns dem—nder son reste X int remove@™onst ™h—rB fi™hiereƒupprimerAY Faites très attention en utilisant cette fonction ! Elle supprime le chier indiqué sans demander de conrmation ! Le chier n'est pas mis dans la corbeille.CHAPITRE 16. 4 gette fon™tion tom˜e à pi™ pour l— (n du ™h—pitreD je n9—i justement plus ˜esoin du (™hier testFtxtD je peux don™ me permettre de le supprimer X int m—in@int —rg™D ™h—r B—rgv‘“A { remove@4testFtxt4AY } return HY 4. Il n'est pas possible de récupérer un tel chier supprimé .

je vous recommande d'aller relire le chapitre correspondant avant de commencer. jusqu'ici. la taille de nos tableaux était xée  en dur  dans le code source. vous allez pouvoir créer des tableaux de façon bien plus exible ! Il est impératif de bien savoir manipuler les pointeurs pour pouvoir lire ce chapitre ! Si vous avez encore des doutes sur les pointeurs. Après lecture de ce chapitre. Un des principaux intérêts de l'allocation dynamique est de permettre à un programme de réserver la place nécessaire au stockage d'un tableau en mémoire dont il ne connaissait pas la taille avant la compilation. C'était la méthode simple.Chapitre 17 Diculté : L'allocation dynamique T outes les variables que nous avons créées jusqu'ici étaient construites automatiquement par le compilateur du langage C. Il existe cependant une façon plus manuelle de créer des variables que l'on appelle l'allocation dynamique. En eet. PQS .

mais c'est tout dans son intérêt parce que c'est l'OS qui contrôle la mémoire ! PQT . L'histoire ne précise pas si le programme dit vraiment  merci  à l'OS.CHAPITRE 17. L'ALLOCATION DYNAMIQUE u—nd on dé™l—re une v—ri—˜leD on dit qu9on demande à allouer de la mémoire X int monxom˜re a HY vorsque le progr—mme —rrive à une ligne ™omme ™elleE™iD il se p—sse en f—it les ™hoses suiv—ntes X IF votre progr—mme dem—nde —u système d9exploit—tion @‡indowsD vinuxD w—™ yƒF F FA l— permission d9utiliser un peu de mémoire Y PF le système d9exploit—tion répond à votre progr—mme en lui indiqu—nt où il peut sto™ker ™ette v—ri—˜le @il lui donne l9—dresse qu9il lui — réservéeA Y QF lorsque l— fon™tion est terminéeD l— v—ri—˜le est —utom—tiquement supprimée de l— mémoireF †otre progr—mme dit —u système d9exploit—tion X  te n9—i plus ˜esoin de l9esp—™e en mémoire que tu m9—v—is réservé à telle —dresseD mer™i 3 F tusqu9i™iD les ™hoses ét—ient —utom—tiquesF vorsqu9on dé™l—r—it une v—ri—˜leD le système d9exploit—tion ét—it —utom—tiquement —ppelé p—r le progr—mmeF ue diriezEvous de f—ire ™el— m—nuellement c xon p—s p—r pur pl—isir de f—ire quelque ™hose de ™ompliqué @même si ™9est tent—nt 3AD m—is plutôt p—r™e que nous —llons p—rfois être o˜ligés de pro™éder ™omme ™el—F h—ns ™e ™h—pitreD nous —llons X ! étudier le fon™tionnement de l— mémoire @ouiD en™ore 3A pour dé™ouvrir l— t—ille que prend une v—ri—˜le en fon™tion de son type Y ! puis —tt—quer le sujet luiEmême X nous verrons ™omment dem—nder m—nuellement de l— mémoire —u système d9exploit—tionF yn fer— ™e qu9on —ppelle de l9—llo™—tion dyn—mique de mémoire Y ! en(nD dé™ouvrir l9intérêt de f—ire une —llo™—tion dyn—mique de mémoire en —ppren—nt à ™réer un t—˜le—u dont l— t—ille n9est ™onnue qu9à l9exé™ution du progr—mmeF 1 La taille des variables ƒelon le type de v—ri—˜le que vous dem—ndez de ™réer @™h—rD intD dou˜leD flo—tF F FAD vous —vez ˜esoin de plus ou moins de mémoireF in e'etD pour sto™ker un nom˜re ™ompris entre EIPV et IPU @un ™h—rAD on n9— ˜esoin que d9un o™tet en mémoireF g9est tout petitF in rev—n™heD un int o™™upe génér—lement R o™tets en mémoireF u—nt —u dou˜leD il o™™upe V o™tetsF ve pro˜lème estF F F que ™e n9est p—s toujours le ™—sF gel— dépend des m—™hines X peutE être que ™hez vous un int o™™upe V o™tetsD qui s—it c xotre o˜je™tif i™i est de véri(er quelle t—ille o™™upe ™h—™un des types sur votre ordin—teurF sl y — un moyen très f—™ile pour s—voir ™el— X utiliser l9opér—teur sizeof@AF gontr—iE rement —ux —pp—ren™esD ™e n9est p—s une fon™tion m—is une fon™tionn—lité de ˜—se du 1.

. cela ne sert plus vraiment car la mémoire d'un ordinateur est très grande . à des robots. . On cherchait à utiliser le minimum de mémoire possible en utilisant le type le plus adapté. 2 Peut-on acher la taille d'un type personnalisé qu'on a créé (une structure) ? yui 3 sizeof m—r™he —ussi sur les stru™tures 3 typedef stru™t goordonnees goordonneesY stru™t goordonnees 2. au nal ! Avoir de nombreux types diérents était utile à une époque où l'on n'avait pas beaucoup de mémoire dans nos ordinateurs. Aujourd'hui. qui est ici équivalent au type. etc. le type long est équivalent à un type appelé long int.LA TAILLE DES VARIABLES l—ng—ge gF †ous devez juste indiquer entre p—renthèses le type que vous voulez —n—lyserF €our ™onn—ître l— t—ille d9un intD on devr— don™ é™rire X sizeof@intA À l— ™ompil—tionD ™el— ser— rempl—™é p—r un nom˜re X le nom˜re d9o™tets que prend int en mémoireF ghez moiD sizeof@intA v—ut RD ™e qui signi(e que int o™™upe R o™tetsF ghez vousD ™9est pro˜—˜lement l— même v—leurD m—is ™e n9est p—s une règleF „estez pour voirD en —0™h—nt l— v—leur à l9—ide d9un printf p—r exemple X printf@4™h—r X 7d o™tets’n4D sizeof@™h—rAAY printf@4int X 7d o™tets’n4D sizeof@intAAY printf@4long X 7d o™tets’n4D sizeof@longAAY printf@4dou˜le X 7d o™tets’n4D sizeof@dou˜leAAY ghez moiD ™el— —0™he X ™h—r X I o™tets int X R o™tets long X R o™tets dou˜le X V o™tets te n9—i p—s mis tous les types que nous ™onn—issonsD je vous l—isse le soin de tester vousEmêmes l— t—ille des —utres typesF †ous rem—rquerez que long et int o™™upent l— même pl—™e en mémoireF gréer un long revient don™ i™i ex—™tement à ™réer un intD ™el— prend R o™tets d—ns l— mémoireF En fait. Bref. Je pense par exemple aux programmes destinés à des téléphones portables. En revanche. int. tous ces types ont encore de l'intérêt si vous créez des programmes pour de l'informatique embarquée où la mémoire disponible est plus faible. PQU . ça fait beaucoup de noms diérents pour pas grand-chose.

CHAPITRE 17. il prend 400 octets ? PQV . L'ALLOCATION DYNAMIQUE { }Y int xY int yY int m—in@int —rg™D ™h—r B—rgv‘“A { printf@4goordonnees X 7d o™tets’n4D sizeof@goordonneesAAY } return HY goordonnees X V o™tets €lus une stru™ture ™ontient de sousEv—ri—˜lesD plus elle prend de mémoireF „erri˜lement logiqueD n9estE™e p—s c Une nouvelle façon de voir la mémoire tusqu9i™iD mes s™hém—s de mémoire ét—ient en™ore —ssez impré™isF yn v— en(n pouvoir les rendre vr—iment pré™is et ™orre™ts m—inten—nt qu9on ™onn—ît l— t—ille de ™h—™un des types de v—ri—˜lesF ƒi on dé™l—re une v—ri—˜le de type int X int nom˜re a IVY F F F et que sizeof@intA indique R o™tets sur notre ordin—teurD —lors l— v—ri—˜le o™™uper— R o™tets en mémoire 3 ƒupposons que l— v—ri—˜le nom˜re soit —llouée à l9—dresse ITHH en mémoireF yn —ur—it —lors le s™hém— de l— (gF IUFIF s™iD on voit ˜ien que notre v—ri—˜le nom˜re de type int qui v—ut IV o™™upe R o™tets d—ns l— mémoireF ille ™ommen™e à l9—dresse ITHH @™9est son —dresseA et termine à l9—dresse ITHQF v— pro™h—ine v—ri—˜le ne pourr— don™ être sto™kée qu9à p—rtir de l9—dresse ITHR 3 ƒi on —v—it f—it l— même ™hose —ve™ un ™h—rD on n9—ur—it —lors o™™upé qu9un seul o™tet en mémoire @(gF IUFPAF sm—ginez m—inten—nt un t—˜le—u de int 3 gh—que  ™—se du t—˜le—u o™™uper— R o™tetsF ƒi notre t—˜le—u f—it IHH ™—ses X int t—˜le—u‘IHH“Y on o™™uper— —lors en ré—lité R B IHH a RHH o™tets en mémoireF Même si le tableau est vide.

LA TAILLE DES VARIABLES Figure IUFI ! …n int o™™up—nt R o™tets en mémoire Figure IUFP ! …n ™h—r o™™up—nt I o™tet en mémoire PQW .

de toute façon.CHAPITRE 17. PRH . vous devriez avoir inclus cette bibliothèque dans tous vos programmes. Si vous avez suivi mes conseils. L'ALLOCATION DYNAMIQUE fien sûr 3 v— pl—™e en mémoire est réservéeD —u™un —utre progr—mme n9— le droit d9y touE ™her @à p—rt le vôtreAF …ne fois qu9une v—ri—˜le est dé™l—réeD elle prend immédi—tement de l— pl—™e en mémoireF xotez que si on ™rée un t—˜le—u de type goordonnees X goordonnees t—˜le—u‘IHH“Y F F F on utiliser— ™ette fois X V B IHH a VHH o™tets en mémoireF sl est import—nt de ˜ien ™omprendre ™es petits ™—l™uls pour l— suite du ™h—pitreF Allocation de mémoire dynamique introns m—inten—nt d—ns le vif du sujetF te vous r—ppelle notre o˜je™tif X —pprendre à dem—nder de l— mémoire m—nuellementF yn v— —voir ˜esoin d9in™lure l— ˜i˜liothèque `stdli˜Fhb F gette ˜i˜liothèque ™ontient deux fon™tions dont nous —llons —voir ˜esoin X ! m—llo™ @ wemory evvyg—tion D ™9estEàEdire  ello™—tion de mémoire A X dem—nde —u système d9exploit—tion l— permission d9utiliser de l— mémoire Y ! free @ vi˜érer A X permet d9indiquer à l9yƒ que l9on n9— plus ˜esoin de l— mémoire qu9on —v—it dem—ndéeF v— pl—™e en mémoire est li˜éréeD un —utre progr—mme peut m—inten—nt s9en servir —u ˜esoinF u—nd vous f—ites une —llo™—tion m—nuelle de mémoireD vous devez toujours suivre ™es trois ét—pes X 3 IF —ppeler m—llo™ pour dem—nder de l— mémoire Y PF véri(er l— v—leur retournée p—r m—llo™ pour s—voir si l9yƒ — ˜ien réussi à —llouer l— mémoire Y QF une fois qu9on — (ni d9utiliser l— mémoireD on doit l— li˜érer —ve™ freeF ƒi on ne le f—it p—sD on s9expose à des fuites de mémoireD ™9estEàEdire que votre progr—mme risque —u (n—l de prendre ˜e—u™oup de mémoire —lors qu9il n9— en ré—lité plus ˜esoin de tout ™et esp—™eF ges trois ét—pes vous r—ppellentEelles le ™h—pitre sur les (™hiers c illes devr—ient 3 ve prin™ipe est ex—™tement le même qu9—ve™ les (™hiers X on —lloueD on véri(e si l9—llo™—tion — m—r™héD on utilise l— mémoireD puis on l— li˜ère qu—nd on — (ni de l9utiliserF malloc : demande d'allocation de mémoire ve prototype de l— fon™tion m—llo™ est —ssez ™omiqueD vous —llez voir X 3.

ALLOCATION DE MÉMOIRE DYNAMIQUE voidB m—llo™@size•t nom˜rey™tetsxe™ess—iresAY v— fon™tion prend un p—r—mètre X le nom˜re d9o™tets à réserverF einsiD il su0r— d9é™rire sizeof@intA d—ns ™e p—r—mètre pour réserver su0s—mment d9esp—™e pour sto™ker un intF w—is ™9est surtout ™e que l— fon™tion renvoie qui est ™urieux X elle renvoie unF F F voidB 3 ƒi vous vous souvenez du ™h—pitre sur les fon™tionsD je vous —v—is dit que void signi(—it  vide et qu9on utilis—it ™e type pour indiquer que l— fon™tion ne retourn—it —u™une v—leurF elors i™iD on —ur—it une fon™tion qui retourne unF F F  pointeur sur vide c in voilà une ˜ien ˜onne 3 ges progr—mmeurs ont dé™idément un sens de l9humour très développéF ‚—ssurezEvousD il y — une r—isonF in f—itD ™ette fon™tion renvoie un pointeur indiqu—nt l9—dresse que l9yƒ — réservée pour votre v—ri—˜leF ƒi l9yƒ — trouvé de l— pl—™e pour vous à l9—dresse ITHHD l— fon™tion renvoie don™ un pointeur ™onten—nt l9—dresse ITHHF ve pro˜lèmeD ™9est que l— fon™tion m—llo™ ne s—it p—s quel type de v—ri—˜le vous ™her™hez à ™réerF in e'etD vous ne lui donnez qu9un p—r—mètre X le nom˜re d9o™tets en mémoire dont vous —vez ˜esoinF ƒi vous dem—ndez R o™tetsD ç— pourr—it —ussi ˜ien être un int qu9un long p—r exemple 3 gomme m—llo™ ne s—it p—s quel type elle doit retournerD elle renvoie le type voidBF ge ser— un pointeur sur n'importe quel typeF yn peut dire que ™9est un pointeur universelF €—ssons à l— pr—tiqueF ƒi je veux m9—muser @hum 3A à ™réer m—nuellement une v—ri—˜le de type int en mémoireD je devr—is indiquer à m—llo™ que j9—i ˜esoin de sizeof@intA o™tets en mémoireF te ré™upère le résult—t du m—llo™ d—ns un pointeur sur intF intB memoireellouee a x…vvY GG yn ™rée un pointeur sur int memoireellouee a m—llo™@sizeof@intAAY GG v— fon™tion m—llo™ ins™rit d—ns notre → pointeur l9—dresse qui — été reservéeF À l— (n de ™e ™odeD memoireellouee est un pointeur ™onten—nt une —dresse qui vous — été réservée p—r l9yƒD p—r exemple l9—dresse ITHH pour reprendre mes s™hém—s pré™éE dentsF Tester le pointeur v— fon™tion m—llo™ — don™ renvoyé d—ns notre pointeur memoireellouee l9—dresse qui — été réservée pour vous en mémoireF heux possi˜ilités X ! si l9—llo™—tion — m—r™héD notre pointeur ™ontient une —dresse Y ! si l9—llo™—tion — é™houéD notre pointeur ™ontient l9—dresse x…vvF sl est peu pro˜—˜le qu9une —llo™—tion é™houeD m—is ™el— peut —rriverF sm—ginez que vous dem—ndiez à utiliser QR qo de mémoire viveD il y — très peu de ™h—n™es que l9yƒ vous réponde f—vor—˜lementF PRI .

Cela correspond en fait au return du main().CHAPITRE 17. L'ALLOCATION DYNAMIQUE sl est né—nmoins re™omm—ndé de toujours tester si l9—llo™—tion — m—r™héF yn v— f—ire ™e™i X si l9—llo™—tion — é™houéD ™9est qu9il n9y —v—it plus de mémoire de li˜re @™9est un ™—s ™ritiqueAF h—ns un tel ™—sD le mieux est d9—rrêter immédi—tement le progr—mme p—r™e queD de toute m—nièreD il ne pourr— p—s ™ontinuer ™onven—˜lementF yn v— utiliser une fon™tion st—nd—rd qu9on n9—v—it p—s en™ore vue jusqu9i™i X exit@AF ille —rrête immédi—tement le progr—mmeF ille prend un p—r—mètre X l— v—leur que le progr—mme doit retourner F 4 int m—in@int —rg™D ™h—r B—rgv‘“A { intB memoireellouee a x…vvY memoireellouee a m—llo™@sizeof@intAAY if @memoireellouee aa x…vvA GG ƒi l9—llo™—tion — é™houé { exit@HAY GG yn —rrête immédi—tement le progr—mme } GG yn peut ™ontinuer le progr—mme norm—lement sinon } return HY ƒi le pointeur est di'érent de x…vvD le progr—mme peut ™ontinuerD sinon il f—ut —0™her un mess—ge d9erreur ou même mettre (n —u progr—mmeD p—r™e qu9il ne pourr— p—s ™ontinuer ™orre™tement s9il n9y — plus de pl—™e en mémoireF free : libérer de la mémoire „out ™omme on utilis—it l— fon™tion f™lose pour fermer un (™hier dont on n9—v—it plus ˜esoinD on v— utiliser l— fon™tion free pour li˜érer l— mémoire dont on ne se sert plusF void free@voidB pointeurAY v— fon™tion free — juste ˜esoin de l9—dresse mémoire à li˜érerF yn v— don™ lui envoyer notre pointeurD ™9estEàEdire memoireellouee d—ns notre exempleF †oi™i le s™hém— ™omE plet et (n—lD ressem˜l—nt à s9y méprendre à ™e qu9on — vu d—ns le ™h—pitre sur les (™hiers X int m—in@int —rg™D ™h—r B—rgv‘“A { intB memoireellouee a x…vvY memoireellouee a m—llo™@sizeof@intAAY if @memoireellouee aa x…vvA GG yn vérifie si l— mémoire — été —llouée 4. PRP .

ALLOCATION DE MÉMOIRE DYNAMIQUE { } exit@HAY GG irreur X on —rrête tout 3 GG yn peut utiliser i™i l— mémoire free@memoireelloueeAY GG yn n9— plus ˜esoin de l— mémoireD on l— li˜ère } return HY Exemple concret d'utilisation yn v— progr—mmer quelque ™hose qu9on — —ppris à f—ire il y — longtemps X dem—nder l9âge de l9utilis—teur et le lui —0™herF v— seule di'éren™e —ve™ ™e qu9on f—is—it —v—ntD ™9est qu9i™i l— v—ri—˜le v— être —llouée m—nuellement @on dit —ussi dynamiquement A plutôt qu9—utom—tiquement ™omme —up—r—v—ntF elors ouiD du ™oupD le ™ode est un peu plus ™ompliquéF w—is f—ites l9e'ort de ˜ien le ™omprendreD ™9est import—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { intB memoireellouee a x…vvY memoireellouee a m—llo™@sizeof@intAAY GG ello™—tion de l— mémoire if @memoireellouee aa x…vvA { exit@HAY } GG …tilis—tion de l— mémoire printf@4uel —ge —vezEvous c 4AY s™—nf@47d4D memoireelloueeAY printf@4†ous —vez 7d —ns’n4D BmemoireelloueeAY free@memoireelloueeAY GG vi˜ér—tion de mémoire } return HY £   ¢gode we˜ X PWRUUR ¡ uel —ge —vezEvous c QI †ous —vez QI —ns PRQ .

Tandis que pour indiquer l'adresse. Pour obtenir la valeur de la variable. Si c'est votre cas. il faut placer une étoile devant : Bmemoireellouee (regardez le printf). on a juste besoin d'écrire le nom du pointeur memoireellouee (regardez le s™—nf). ‚evenons à notre ™odeF yn y — —lloué dyn—miquement une v—ri—˜le de type intF eu (n—lD ™e qu9on — é™rit revient ex—™tement —u même que d9utiliser l— méthode  —utoE m—tique qu9on ™onn—ît ˜ien m—inten—nt X int m—in@int —rg™D ™h—r B—rgv‘“A { int m—†—ri—˜le a HY GG ello™—tion de l— mémoire @—utom—tiqueA GG …tilis—tion de l— mémoire printf@4uel —ge —vezEvous c 4AY s™—nf@47d4D 8m—†—ri—˜leAY printf@4†ous —vez 7d —ns’n4D m—†—ri—˜leAY return HY } GG vi˜ér—tion de l— mémoire @—utom—tique à l— fin de l— fon™tionA uel —ge —vezEvous c QI †ous —vez QI —ns in résuméD il y — deux f—çons de ™réer une v—ri—˜leD ™9estEàEdire d9—llouer de l— mémoireF ƒoit on le f—it X ! —utom—tiquement X ™9est l— méthode que vous ™onn—issez et qu9on — utilisée jusqu9i™i Y ! m—nuellement @dynamiquement A X ™9est l— méthode que je vous enseigne d—ns ™e ™h—pitreF Je trouve la méthode dynamique compliquée et inutile ! …n peu plus ™ompliquéeF F F ™ertesF w—is inutileD non 3 xous sommes p—rfois o˜ligés d9—llouer m—nuellement de l— mémoireD ™omme nous —llons le voir m—inten—ntF PRR . L'ALLOCATION DYNAMIQUE Attention : comme memoireellouee est un pointeur. on met généralement du temps à s'y faire et il est probable que vous confondiez encore. Toutefois. on ne l'utilise pas de la même manière qu'une vraie variable. vous devez relire le chapitre sur les pointeurs. qui est fondamental.CHAPITRE 17. Tout cela a été expliqué dans le chapitre sur les pointeurs.

il est recommandé de ne pas l'utiliser ! v9—v—nt—ge de l9—llo™—tion dyn—miqueD ™9est qu9elle nous permet de ™réer un t—˜le—u qui — ex—™tement l— t—ille de l— v—ri—˜le nom˜rehemisD et ™el— grâ™e à un ™ode qui fon™tionner— p—rtout 3 yn v— dem—nder —u m—llo™ de nous réserver nom˜rehemis B sizeof@intA o™tets en mémoire X —mis a m—llo™@nom˜rehemis B sizeof@intAAY ge ™ode permet de ™réer un t—˜le—u de type int qui — une t—ille ™orrespond—nt ex—™E tement —u nom˜re d9—mis 3 †oi™i ™e que f—it le progr—mme d—ns l9ordre X PRS .ALLOCATION DYNAMIQUE D'UN TABLEAU Allocation dynamique d'un tableau €our le momentD on — utilisé l9—llo™—tion dyn—mique uniquement pour ™réer une petite v—ri—˜leF yr en génér—lD on ne se sert p—s de l9—llo™—tion dyn—mique pour ™el—F yn utilise l— méthode —utom—tique qui est plus simpleF u—nd —EtEon ˜esoin de l9—llo™—tion dyn—miqueD me direzEvous c ve plus souventD on s9en sert pour ™réer un t—˜le—u dont on ne ™onn—ît p—s l— t—ille —v—nt l9exé™ution du progr—mmeF sm—ginons p—r exemple un progr—mme qui sto™ke l9âge de tous les —mis de l9utilis—teur d—ns un t—˜le—uF †ous pourriez ™réer un t—˜le—u de int pour sto™ker les âgesD ™omme ™e™i X int —geemis‘IS“Y w—is qui vous dit que l9utilis—teur — IS —mis c €eutEêtre qu9il en — plus que ç— 3 vorsque vous é™rivez le ™ode sour™eD vous ne ™onn—issez p—s l— t—ille que vous devez donner à votre t—˜le—uF †ous ne le s—urez qu9à l9exé™utionD lorsque vous dem—nderez à l9utilis—teur ™om˜ien il — d9—misF v9intérêt de l9—llo™—tion dyn—mique est là X on v— dem—nder le nom˜re d9—mis à l9utiliE s—teurD puis on fer— une —llo™—tion dyn—mique pour ™réer un t—˜le—u —y—nt ex—™tement l— t—ille né™ess—ire @ni trop petitD ni trop gr—ndAF ƒi l9utilis—teur — IS —misD on ™réer— un t—˜le—u de IS int Y s9il en — PVD on ™réer— un t—˜le—u de PV intD et™F gomme je vous l9—i —pprisD il est interdit en g de ™réer un t—˜le—u en indiqu—nt s— t—ille à l9—ide d9une v—ri—˜le X int —mis‘nom˜rehemis“Y Ce code fonctionne peut-être sur certains compilateurs mais uniquement dans des cas précis.

L'ALLOCATION DYNAMIQUE IF PF QF RF SF dem—nder à l9utilis—teur ™om˜ien il — d9—mis Y ™réer un t—˜le—u de int —y—nt une t—ille ég—le à son nom˜re d9—mis @vi— m—llo™A Y dem—nder l9âge de ™h—™un de ses —mis un à unD qu9on sto™ke d—ns le t—˜le—u Y —0™her l9âge des —mis pour montrer qu9on — ˜ien mémorisé tout ™el— Y à l— (nD puisqu9on n9— plus ˜esoin du t—˜le—u ™onten—nt l9âge des —misD le li˜érer —ve™ l— fon™tion freeF int m—in@int —rg™D ™h—r B—rgv‘“A { int nom˜rehemis a HD i a HY intB —geemis a x…vvY GG ge pointeur v— servir de t—˜le—u —près l9—ppel du → m—llo™ GG yn dem—nde le nom˜re d9—mis à l9utilis—teur printf@4gom˜ien d9—mis —vezEvous c 4AY s™—nf@47d4D 8nom˜rehemisAY if @nom˜rehemis b HA GG sl f—ut qu9il —it —u moins un —mi @je le pl—ins un peu sinon XpA { —geemis a m—llo™@nom˜rehemis B sizeof@intAAY GG yn —lloue de l— mémoire → pour le t—˜le—u if @—geemis aa x…vvA GG yn vérifie si l9—llo™—tion — m—r™hé ou non { exit@HAY GG yn —rrête tout } → GG yn dem—nde l9âge des —mis un à un for @i a H Y i ` nom˜rehemis Y iCCA { printf@4uel —ge — l9—mi numero 7d c 4D i C IAY s™—nf@47d4D 8—geemis‘i“AY } GG yn —ffi™he les âges sto™kés un à un printf@4’n’n†os —mis ont les —ges suiv—nts X’n4AY for @i a H Y i ` nom˜rehemis Y iCCA { printf@47d —ns’n4D —geemis‘i“AY } GG yn li˜ère l— mémoire —llouée —ve™ m—llo™D on n9en — plus ˜esoin free@—geemisAY } } return HY £ ¢gode we˜ X RPQQSH ¡   PRT .CHAPITRE 17.

ALLOCATION DYNAMIQUE D'UN TABLEAU gom˜ien d9—mis —vezEvous c S uel —ge — l9—mi numero I c IT uel —ge — l9—mi numero P c IV uel —ge — l9—mi numero Q c PH uel —ge — l9—mi numero R c PT uel —ge — l9—mi numero S c PU †os —mis ont les —ges suiv—nts X IT —ns IV —ns PH —ns PT —ns PU —ns ge progr—mme est tout à f—it inutile X il dem—nde les âges et les —0™he ensuiteF t9—i ™hoisi de f—ire ™el— ™—r ™9est un exemple  simple @en(nD si vous —vez ™ompris le m—llo™AF te vous r—ssure X d—ns l— suite du ™oursD nous —urons l9o™™—sion d9utiliser le m—llo™ pour des ™hoses ˜ien plus intéress—ntes que le sto™k—ge de l9âge de ses —mis 3 En résumé ! …ne v—ri—˜le o™™upe plus ou moins d9esp—™e en mémoire en fon™tion de son typeF ! yn peut ™onn—ître le nom˜re d9o™tets o™™upés p—r un type à l9—ide de l9opér—teur sizeof@AF ! v9—llo™—tion dyn—mique ™onsiste à réserver m—nuellement de l9esp—™e en mémoire pour une v—ri—˜le ou un t—˜le—uF ! v9—llo™—tion est e'e™tuée —ve™ m—llo™@A et il ne f—ut surtout p—s ou˜lier de li˜érer l— mémoire —ve™ free@A dès qu9on n9en — plus ˜esoinF ! v9—llo™—tion dyn—mique permet not—mment de ™réer un t—˜le—u dont l— t—ille est déterminée p—r une v—ri—˜le —u moment de l9exé™utionF PRU .

CHAPITRE 17. L'ALLOCATION DYNAMIQUE PRV .

chiers. . quoi que vous en disiez. tableaux. . C'est un grand classique des jeux de lettres dans lequel il faut deviner un mot caché lettre par lettre. Au menu : pointeurs. que des bonnes choses ! PRW . bref. C'est d'autant plus essentiel pour vous car vous venez de découvrir de nombreux concepts théoriques et. vous ne les aurez jamais vraiment compris tant que vous n'aurez pas pratiqué. chaînes de caractères.Chapitre 18 Diculté : TP : réalisation d'un Pendu J e ne le répéterai jamais assez : pratiquer est essentiel. Le Pendu aura donc la forme d'un jeu en console en langage C. je vous propose de réaliser un Pendu. Pour ce TP. L'objectif est de vous faire manipuler tout ce que vous avez appris jusqu'ici.

il y aurait normalement le dessin d'un bonhomme qui se fait pendre au fur et à mesure que l'on fait des erreurs. À p—rtir de làD deux possi˜ilités X ! l— lettre se trouve e'e™tivement d—ns le mot X d—ns ™e ™—sD on dévoile le mot —ve™ les lettres qu9on — déjà trouvées Y ! l— lettre ne se trouve p—s d—ns le mot @™9est le ™—s i™iD ™—r e n9est p—s d—ns ‚y…qiA X on indique —u joueur que l— lettre ne s9y trouve p—s et on diminue le nom˜re de ™oups rest—ntsF u—nd il ne nous reste plus de ™oups @H ™oupAD le jeu est terminé et on — perduF Dans un  vrai  Pendu.CHAPITRE 18. En console. on va donc se contenter d'acher une simple phrase comme  Il vous reste X coups avant une mort certaine . Mais vous pouvez changer ce nombre maximal pour corser la diculté. je ne m'en suis pas servi). bien sûr ! PSH . TP : RÉALISATION D'UN PENDU Les consignes te tiens à ™e qu9on se mette ˜ien d9—™™ord sur les règles du €endu à ré—liserF te v—is don™ vous donner i™i les ™onsignesD ™9estEàEdire vous expliquer ™omment doit fon™tionner pré™isément le jeu que vous —llez ™réerF „out le monde ™onn—ît le €enduD n9estE™e p—s c ellezD un petit r—ppel ne peut p—s f—ire de m—l X le ˜ut du €endu est de retrouver un mot ™—™hé en moins de IH ess—is F 1 Déroulement d'une partie ƒupposons que le mot ™—™hé soit ‚y…qiF †ous proposez une lettre à l9ordin—teurD p—r exemple l— lettre eF v9ordin—teur véri(e si ™ette lettre se trouve d—ns le mot ™—™héF Rappelez-vous : il y a une fonction toute prête dans stringFh pour rechercher une lettre dans un mot ! Notez que vous n'êtes cependant pas obligés de l'utiliser (personnellement. ce serait un peu trop dicile de dessiner un bonhomme qui se fait pendre rien qu'avec du texte. ƒupposons m—inten—nt que le joueur t—pe l— lettre qF gelleE™i se trouve d—ns le mot ™—™héD don™ on ne diminue p—s le nom˜re de ™oups rest—nts —u joueurF yn —0™he le mot se™ret —ve™ les lettres qu9on — déjà dé™ouvertesD ™9estEàEdire quelque ™hose ™omme ç— X wot se™ret X BBBqB ƒi ensuite on t—pe un ‚D ™omme l— lettre s9y trouveD on l9—joute à l— liste des lettres trouvées et on —0™he à nouve—u le mot —ve™ les lettres déjà dé™ouvertes X wot se™ret X ‚BBqB 1.

LES CONSIGNES Le cas des lettres multiples h—ns ™ert—ins motsD une même lettre peut —pp—r—ître deux ou trois foisD voire plus 3 €—r exempleD il y — deux  d—ns €…vi Y de mêmeD il y — trois i d—ns iviwix„F ue f—itEon d—ns un ™—s ™omme ç— c ves règles du €endu sont ™l—ires X si le joueur t—pe l— lettre iD toutes les lettres i du mot iviwix„ doivent être dé™ouvertes d9un seul ™oup X wot se™ret X iBiBiBB sl ne f—ut don™ p—s —voir à t—per trois fois l— lettre i pour que tous les i soient dé™ouvertsF Exemple d'une partie complète †oi™i à quoi devr—it ressem˜ler une p—rtie ™omplète en ™onsole lorsque votre progr—mme ser— terminé X fienvenue d—ns le €endu 3 sl vous reste IH ™oups — jouer uel est le mot se™ret c BBBBBB €roposez une lettre X i sl vous reste W ™oups — jouer uel est le mot se™ret c BBBBBB €roposez une lettre X e sl vous reste W ™oups — jouer uel est le mot se™ret c BeBBBB €roposez une lettre X y sl vous reste W ™oups — jouer uel est le mot se™ret c BeBByB €roposez une lettre X it —insi de suite jusqu9à ™e que le joueur —it dé™ouvert 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 se™ret c weBByx €roposez une lettre X ‚ q—gne 3 ve mot se™ret et—it ˜ien X we‚‚yx PSI .

TP : RÉALISATION D'UN PENDU Saisie d'une lettre en console v— le™ture d9une lettre d—ns l— ™onsole est plus ™ompliquée qu9il n9y p—r—îtF sntuitiveE mentD pour ré™upérer un ™—r—™tèreD vous devriez —voir pensé à X s™—nf@47™4D 8m—vettreAY it e'e™tivementD ™9est ˜ienF 7™ indique que l9on —ttend un ™—r—™tèreD qu9on sto™ker— d—ns m—vettre @une v—ri—˜le de type ™h—rAF „out se p—sse très ˜ienF F F t—nt qu9on ne ref—it p—s un s™—nfF in e'etD vous pouvez tester le ™ode suiv—nt X int m—in@int —rg™D ™h—rB —rgv‘“A { ™h—r m—vettre a HY s™—nf@47™4D 8m—vettreAY printf@47™4D m—vettreAY s™—nf@47™4D 8m—vettreAY printf@47™4D m—vettreAY } return HY xorm—lementD ™e ™ode est ™ensé vous dem—nder une lettre et vous l9—0™herD et ™el— deux foisF „estezF ue se p—sseEtEil c †ous entrez une lettreD d9—™™ordD m—isF F F le progr—mme s9—rrête de suite —prèsD il ne vous dem—nde p—s l— se™onde lettre 3 yn dir—it qu9il ignore le se™ond s™—nfF Que s'est-il passé ? in f—itD qu—nd vous entrez du texte en ™onsoleD tout ™e que vous t—pez est sto™ké quelque p—rt en mémoireD y compris l'appui sur la touche Entrée @’nAF einsiD l— première fois que vous entrez une lettre @p—r exemple eA puis que vous —ppuyez sur EntréeD ™9est l— lettre e qui est renvoyée p—r le s™—nfF w—is l— se™onde foisD s™—nf renvoie le ’n ™orrespond—nt à l— tou™he Entrée que vous —viez pressée —up—r—v—nt 3 €our éviter ™el—D le mieux ™9est de ™réer notre propre petite fon™tion lireg—r—™tere@A X ™h—r lireg—r—™tere@A { ™h—r ™—r—™tere a HY ™—r—™tere a get™h—r@AY GG yn lit le premier ™—r—™tère PSP .CHAPITRE 18.

LES CONSIGNES ™—r—™tere a toupper@™—r—™tereAY GG yn met l— lettre en m—jus™ule si elle ne l9est p—s déjà GG yn lit les —utres ™—r—™tères mémorisés un à un jusqu9—u ’n @pour les eff—™erA while @get™h—r@A 3a 9’n9A Y return ™—r—™tereY GG yn retourne le premier ™—r—™tère qu9on — lu → → } we˜ X UTRITV ¡ gette fon™tion utilise get™h—r@A qui est une fon™tion de stdio qui revient ex—™tement à é™rire s™—nf@47™4D 8lettreAYF v— fon™tion get™h—r renvoie le ™—r—™tère que le joueur — t—péF eprèsD j9utilise une fon™tion st—nd—rd qu9on n9— p—s eu l9o™™—sion d9étudier d—ns le ™ours X toupper@AF gette fon™tion tr—nsforme l— lettre indiquée en m—jus™uleF gomme ç—D le jeu fon™tionner— même si le joueur t—pe des lettres minus™ulesF sl f—udr— in™lure ™typeFh pour pouvoir utiliser ™ette fon™tion @ne l9ou˜liez p—s 3AF †ient ensuite l— p—rtie l— plus intéress—nte X ™elle où je vide les —utres ™—r—™tères qui —ur—ient pu —voir été t—pésF in e'etD en r—ppel—nt get™h—r on prend le ™—r—™tère suiv—nt que l9utilis—teur — t—pé @p—r exemple l9Entrée ’nAF ge que je f—is est simple et tient en une ligne X j9—ppelle l— fon™tion get™h—r en ˜ou™le jusqu9à tom˜er sur le ™—r—™tère ’nF v— ˜ou™le s9—rrête —lorsD ™e qui signi(e qu9on —  lu tous les —utres ™—r—™tèresD ils ont don™ été vidés de l— mémoireF yn dit qu9on vide le buerF Pourquoi y a-t-il un point-virgule à la n du while et pourquoi ne voit-on pas d'accolades ? £ ¢gode   in f—itD je f—is une ˜ou™le qui ne ™ontient p—s d9instru™tions @l— seule instru™tionD ™9est le get™h—r entre les p—renthèsesAF ves —™™ol—des ne sont p—s né™ess—ires vu que je n9—i rien d9—utre à f—ire qu9un get™h—rF te mets don™ un pointEvirgule pour rempl—™er les —™™ol—desF ge pointEvirgule signi(e  ne rien f—ire à ™h—que p—ss—ge d—ns l— ˜ou™le F g9est un peu p—rti™ulier je le re™onn—isD m—is ™9est une te™hnique à ™onn—îtreD te™hnique qu9utilisent les progr—mmeurs pour f—ire des ˜ou™les très ™ourtes et très simplesF hitesEvous que le while —ur—it —ussi pu être é™rit ™omme ™e™i X while @get™h—r@A 3a 9’n9A { } sl n9y — rien entre —™™ol—desD ™9est volont—ireD vu qu9on n9— rien d9—utre à f—ireF w— te™hnique ™onsist—nt à pl—™er juste un pointEvirgule est simplement plus ™ourte que ™elle des —™™ol—desF PSQ .

TP : RÉALISATION D'UN PENDU in(nD l— fon™tion lireg—r—™tere retourne le premier ™—r—™tère qu9elle — lu X l— v—ri—˜le ™—r—™tereF En résuméD pour ré™upérer une lettre d—ns votre ™odeD vous n9utiliserez p—s X s™—nf@47™4D 8m—vettreAY F F F vous utiliserez à l— pl—™e notre superEfon™tion X m—vettre a lireg—r—™tere@AY Dictionnaire de mots h—ns un premier temps pour vos testsD je v—is vous dem—nder de (xer le mot se™ret dire™tement d—ns votre ™odeF †ous é™rirez don™ p—r exemple X ™h—r motƒe™ret‘“ a 4we‚‚yx4Y elors ouiD ˜ien sûrD le mot se™ret ser— toujours le même si on l—isse ç— ™omme ç—D ™e qui n9est p—s très rigoloF te vous dem—nde de f—ire ™omme ç— d—ns un premier temps pour ne p—s mél—nger les pro˜lèmesF in e'etD une fois que votre jeu de €endu fon™tionner— ™orre™tement @et seulement à p—rtir de ™e momentElàAD vous —tt—querez l— se™onde ph—se X l— ™ré—tion du di™tionn—ire de motsF Qu'est-ce que c'est. le  dictionnaire de mots  ? g9est un (™hier qui ™ontiendr— de nom˜reux mots pour votre jeu de €enduF sl doit y —voir un mot p—r ligneF ixemple X wesƒyx fvi… e†syx ˆ‰vy€ryxi efisvvi swwi…fvi qy…‚hsx xisqi i‚y À ™h—que nouvelle p—rtieD votre progr—mme devr— ouvrir ™e (™hier et prendre un des mots —u h—s—rd d—ns l— listeF qrâ™e à ™ette te™hniqueD vous —urez un (™hier à p—rt que vous pourrez éditer t—nt que vous voudrez pour —jouter des mots se™rets possi˜les pour le €enduF PSR .CHAPITRE 18.

le ê. dans le mode d'emploi du jeu par exemple. Si on doit commencer à tester le é. le è. En eet. dans le Pendu on ne fait pas la distinction entre les majuscules et les minuscules.LES CONSIGNES Vous aurez remarqué que depuis le début je fais exprès d'écrire tous les mots du jeu en majuscules. on fait exprès d'ignorer les accents pour simplier le jeu . Ou ajouter 1 à ce nombre si vous êtes malins plutôt que de tout recompter. Vous devrez donc écrire vos mots dans le dictionnaire entièrement en majuscules et sans accents. À vous de prévenir le joueur. Par ailleurs. . PSS . . on n'a pas ni ! 3. 2 ve pro˜lème qui se poser— r—pidement à vous ser— de s—voir ™om˜ien il y — de mots d—ns le di™tionn—ireF in e'etD si vous voulez ™hoisir un mot —u h—s—rdD il f—udr— tirer —u sort un nom˜re entre H et ˆD et vous ne s—vez p—s — priori ™om˜ien de mots ™ontient votre (™hierF €our résoudre le pro˜lèmeD il y — deux solutionsF †ous pouvez indiquer sur l— première ligne du (™hier le nom˜re de mots qu9il ™ontient X Q wesƒyx fvi… e†syx gepend—nt ™ette te™hnique est ennuyeuseD ™—r il f—udr— re™ompter m—nuellement le nom˜re de mots à ™h—que fois que vous en —jouterez un F eussi je vous propose plutôt de ™ompter —utom—tiquement le nom˜re de mots en lis—nt une première fois le (™hier —ve™ votre progr—mmeF €our s—voir ™om˜ien il y — de motsD ™9est simple X vous ™omptez le nom˜re de ’n @retours à l— ligneA d—ns le (™hierF …ne fois que vous —urez lu le (™hier une première fois pour ™ompter les ’nD vous ferez un rewind pour revenir —u dé˜utF †ous n9—urez —lors plus qu9à tirer un nom˜re —u sort p—rmi le nom˜re de mots que vous —vez ™omptésD puis à vous rendre —u mot que vous —vez ™hoisi et à le sto™ker d—ns une ™h—îne en mémoireF te vous l—isse un peu ré)é™hir à tout ™el—D je ne v—is p—s trop vous —ider qu—nd mêmeD sinon ç— ne ser—it plus un „€ 3 ƒ—™hez que vous —vez —™quis toutes les ™onn—iss—n™es qu9il f—ut d—ns les ™h—pitres pré™édentsD vous êtes don™ p—rf—itement ™—p—˜les de ré—liser ™e jeuF Ǘ v— prendre plus ou moins de temps et ™9est moins f—™ile qu9il n9y p—r—îtD m—is en vous org—nis—nt ™orre™tement @et en ™ré—nt su0s—mment de fon™tionsAD vous y —rriverezF fon ™our—geD et surtout X perEséEvéErez 3 3 2. le mieux est donc de se dire dès le début :  tous mes mots seront en majuscules . mais ça reste quand même une solution un peu bancale. qu'il est censé entrer des lettres majuscules et non des minuscules. le ë.

CHAPITRE 18.  ESPÈCE DE PROGRAMME DE ***** TU VAS TE METTRE À MARCHER. PST . OUI OU NON ! ? . TP : RÉALISATION D'UN PENDU La solution (1 : le code du jeu) ƒi vous lisez ™es lignesD ™9est soit que vous —vez terminé le progr—mmeD soit que vous n9—rrivez p—s à le terminerF t9—i personnellement mis plus de temps que je ne le pens—is pour ré—liser ™e petit jeu —pp—remment tout ˜êteF g9est souvent ™omme ç— X on se dit  ˜—h ™9est f—™ile —lors qu9en f—itD il y — plusieurs ™—s à gérerF te persiste toutefois à dire que vous êtes tous ™—p—˜les de le f—ireF sl vous f—udr— plus ou moins de temps @quelques minutesD quelques heuresD quelques jours cAD m—is ç— n9— j—m—is été une ™ourseF te préfère que vous y p—ssiez ˜e—u™oup de temps et que vous y —rriviezD plutôt que vous n9ess—yiez que S minutes et que vous reg—rdiez l— solutionF x9—llez p—s ™roire que j9—i é™rit le progr—mme d9une tr—iteF woi —ussiD ™omme vousD j9y suis —llé p—s à p—sF t9—i ™ommen™é p—r f—ire quelque ™hose de très simpleD puis petit à petit j9—i —mélioré le ™ode pour —rriver —u résult—t (n—lF t9—i f—it plusieurs erreurs en ™od—nt X j9—i ou˜lié à un moment d9initi—liser une v—ri—˜le ™orre™tementD j9—i ou˜lié d9é™rire le prototype d9une fon™tion ou en™ore de supprimer une v—ri—˜le qui ne serv—it plus d—ns mon ™odeF t9—i même ! je l9—voue ! ou˜lié un ˜ête pointEvirgule à un moment à l— (n d9une instru™tionF „out ç— pour dire quoi c ue je ne suis p—s inf—illi˜le et que je vis à peu près les mêmes frustr—tions que vous F te v—is vous présenter l— solution en deux tempsF IF h9—˜ord je v—is vous montrer ™omment j9—i f—it le ™ode du jeu luiEmêmeD en (x—nt le mot ™—™hé dire™tement d—ns le ™odeF t9—i ™hoisi le mot we‚‚yx ™—r il me permet de tester si je gère ˜ien les lettres en dou˜leD ™omme le ‚ i™iF PF insuiteD je vous montrer—i ™omment d—ns un se™ond temps j9—i —jouté l— gestion du di™tionn—ire de mots pour tirer —u sort un mot se™ret pour le joueurF fien sûrD je pourr—is vous montrer tout le ™ode d9un ™oup m—isF F F ç— fer—it ˜e—u™oup à l— foisD et nom˜re d9entre vous n9—ur—ient p—s le ™our—ge de se pen™her sur le ™odeF te v—is ess—yer de vous expliquer p—s à p—s mon r—isonnementF ‚etenez que ™e qui ™ompteD ™e n9est p—s le résult—tD m—is l— f—çon dont on ré)é™hitF 4 Analyse de la fonction main gomme tout le monde le s—itD tout ™ommen™e p—r un m—inF yn n9ou˜lie p—s d9in™lure les ˜i˜liothèques stdioD stdli˜ et ™type @pour l— fon™tion toupper@AA dont on —ur— ˜esoin X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb 4.

LA SOLUTION (1 : LE CODE DU JEU) 5in™lude `™typeFhb int m—in@int —rg™D ™h—rB —rgv‘“A { } return HY ykD jusqueElà tout le monde devr—it suivreF xotre m—in v— gérer l— plup—rt du jeu et f—ire —ppel à quelquesEunes de nos fon™tions qu—nd il en —ur— ˜esoinF gommençons p—r dé™l—rer les v—ri—˜les né™ess—ires X 5 5in™lude `stdioFhb 5in™lude `stdli˜Fhb 5in™lude `™typeFhb int m—in@int —rg™D ™h—rB —rgv‘“A { ™h—r lettre a HY GG ƒto™ke l— lettre proposée p—r l9utilis—teur @retour du → s™—nfA ™h—r motƒe™ret‘“ a 4we‚‚yx4Y GG g9est le mot à trouver int lettre„rouvee‘T“ a {H}Y GG „—˜le—u de ˜ooléensF gh—que ™—se ™orrespond → à une lettre du mot se™retF H a lettre non trouvéeD I a lettre trouvée int ™oups‚est—nts a IHY GG gompteur de ™oups rest—nts @H a mortA int i a HY GG …ne petite v—ri—˜le pour p—r™ourir les t—˜le—ux } return HY t9—i volont—irement é™rit une dé™l—r—tion de v—ri—˜le p—r ligne —insi que plusieurs ™omE ment—ires pour que vous ™ompreniez l9intérêt de ™h—que v—ri—˜leF in pr—tiqueD vous n9—urez p—s for™ément ˜esoin de mettre tous ™es ™omment—ires et vous pourrez grouper plusieurs dé™l—r—tions de v—ri—˜les sur l— même ligneF te pense que l— plup—rt de ™es v—ri—˜les sem˜lent logiques X l— v—ri—˜le lettre sto™ke l— lettre que l9utilis—teur t—pe à ™h—que foisD motƒe™ret le mot à trouverD ™oups‚est—nts le nom˜re de ™oupsD et™F v— v—ri—˜le i est une petite v—ri—˜le que j9utilise pour p—r™ourir mes t—˜le—ux —ve™ des forF ille n9est don™ p—s extrêmement import—nte m—is né™ess—ire si on veut f—ire nos ˜ou™lesF in(nD l— v—ri—˜le à l—quelle il f—ll—it penserD ™elle qui f—it l— di'éren™eD ™9est mon t—˜le—u de ˜ooléens lettre„rouveeF †ous rem—rquerez que je lui —i donné pour t—ille le nom˜re de lettres du mot se™ret @TAF ge n9est p—s un h—s—rd X ™h—que ™—se de ™e t—˜le—u de ˜ooléens représente une lettre du mot se™retF einsiD l— première ™—se représente l— première lettreD l— se™onde l— se™onde lettreD et™F ves ™—ses du t—˜le—u sont —u dép—rt initi—lisées à HD ™e qui signi(e  vettre non trouvée F eu fur et à mesure de l9—v—n™ement 5. il y en avait un peu moins la première fois que j'ai écrit le code ! PSU . Rassurez-vous. je n'ai pas pensé de suite à toutes ces variables.

TP : RÉALISATION D'UN PENDU du jeuD ™e t—˜le—u ser— modi(éF €our ™h—que lettre du mot se™ret trouvéeD l— ™—se ™orrespond—nte du t—˜le—u lettre„rouvee ser— mise à IF €—r exempleD si à un moment du jeu j9—i l9—0™h—ge wB‚‚BxD ™9est que mon t—˜le—u d9int — les v—leurs IHIIHI @I pour ™h—que lettre qui — été trouvéeAF sl est —insi f—™ile de s—voir qu—nd on — g—gné X il su0t de véri(er si le t—˜le—u de ˜ooléens ne ™ontient que des IF in rev—n™heD on — perdu si le ™ompteur ™oups‚est—nts tom˜e à HF €—ssons à l— suite X printf@4fienvenue d—ns le €endu 3’n’n4AY g9est un mess—ge de ˜ienvenueD il n9y — rien de ˜ien p—lpit—ntF in rev—n™heD l— ˜ou™le prin™ip—le du jeu est plus intéress—nte X while @™oups‚est—nts b H 88 3g—gne@lettre„rouveeAA { ve jeu ™ontinue t—nt qu9il reste des ™oups @™oups‚est—nts b HA et t—nt qu9on n9— p—s g—gnéF ƒi on n9— plus de ™oups à jouerD ™9est qu9on — perduF ƒi on — g—gnéD ™9estF F F qu9on — g—gnéF h—ns les deux ™—sD il f—ut —rrêter le jeuD don™ —rrêter l— ˜ou™le du jeu qui redem—nde à ™h—que fois une nouvelle lettreF g—gne est une fon™tion qui —n—lyse le t—˜le—u lettre„rouveeF ille renvoie  vr—i @IA si le joueur — g—gné @le t—˜le—u lettre„rouvee ne ™ontient que des IAD  f—ux @HA si le joueur n9— p—s en™ore g—gnéF te ne vous explique p—s i™i le fon™tionnement de ™ette fon™tion en dét—ilD on verr— ™el— plus t—rdF €our le momentD vous —vez juste ˜esoin de s—voir ™e que f—it l— fon™tionF v— suite X printf@4’n’nsl vous reste 7d ™oups — jouer4D ™oups‚est—ntsAY printf@4’nuel est le mot se™ret c 4AY GB yn —ffi™he le mot se™ret en m—squ—nt les lettres non trouvées ixemple X BeBByx BG for @i a H Y i ` T Y iCCA { if @lettre„rouvee‘i“A GG ƒi on — trouvé l— lettre n¦ i printf@47™4D motƒe™ret‘i“AY GG yn l9—ffi™he else printf@4B4AY GG ƒinonD on —ffi™he une étoile pour les lettres → non trouvées } yn —0™he à ™h—que ™oup le nom˜re de ™oups rest—nts —insi que le mot se™ret @m—squé p—r des B pour les lettres non trouvéesAF v9—0™h—ge du mot se™ret m—squé p—r des B se f—it grâ™e à une ˜ou™le forF yn —n—lyse ™h—que lettre pour s—voir si elle — été trouvée @if lettre„rouvee‘i“AF ƒi ™9est le ™—sD on —0™he l— lettreF ƒinonD on —0™he une B de rempl—™ement pour m—squer l— lettreF PSV .CHAPITRE 18.

v— ˜ou™le prin™ip—le du jeu s9—rrête làF yn re™ommen™e don™ —u dé˜ut de l— ˜ou™le et on véri(e s9il reste des ™oups à jouer et si on n9— p—s déjà g—gnéF vorsqu9on sort de l— ˜ou™le prin™ip—le du jeuD il reste à —0™her si on — g—gné ou non —v—nt que le progr—mme ne s9—rrête X if @g—gne@lettre„rouveeAA printf@4’n’nq—gne 3 ve mot se™ret et—it ˜ien X 7s4D motƒe™retAY else printf@4’n’n€erdu 3 ve mot se™ret et—it X 7s4D motƒe™retAY return HY } yn f—it —ppel à l— fon™tion g—gne pour véri(er si on — g—gnéF ƒi ™9est le ™—sD —lors on —0™he le mess—ge  q—gné 3 Y sinonD ™9est qu9on n9—v—it plus de ™oups à jouerD on — été penduF PSW .LA SOLUTION (1 : LE CODE DU JEU) w—inten—nt qu9on — —0™hé ™e qu9il f—ll—itD on v— dem—nder —u joueur de s—isir une lettre X printf@4’n€roposez une lettre X 4AY lettre a lireg—r—™tere@AY te f—is —ppel à notre fon™tion lireg—r—™tere@AF gelleE™i lit le premier ™—r—™tère t—péD le met en m—jus™ule et vide le ˜u'erD ™9estEàEdire qu9elle vide les —utres ™—r—™tères qui —ur—ient pu persister d—ns l— mémoireF GG ƒi ™e n9ét—it €eƒ l— ˜onne lettre if @3re™her™hevettre@lettreD motƒe™retD lettre„rouveeAA { ™oups‚est—ntsEEY GG yn enlève un ™oup —u joueur } } yn véri(e si l— lettre entrée se trouve d—ns motƒe™retF yn f—it —ppel pour ™el— à une fon™tion m—ison —ppelée re™her™hevettreF xous verrons peu —près le ™ode de ™ette fon™tionF €our le momentD tout ™e que vous —vez ˜esoin de s—voirD ™9est que ™ette fon™tion renvoie  vr—i si l— lettre se trouve d—ns le motD  f—ux si elle ne s9y trouve p—sF won ifD vous l9—urez rem—rquéD ™ommen™e p—r un point d9ex™l—m—tion 3 qui signi(e  non F v— ™ondition se lit don™  ƒi l— lettre n9— p—s été trouvée F ue f—itEon si l— lettre n9— p—s été trouvée c yn diminue le nom˜re de ™oups rest—ntsF Notez que la fonction re™her™hevettre met aussi à jour le tableau de booléens lettre„rouvee. Elle met des 1 dans les cases des lettres qui ont été trouvées.

TP : RÉALISATION D'UN PENDU Analyse de la fonction gagne †oyons m—inten—nt le ™ode de l— fon™tion g—gne X int g—gne@int lettre„rouvee‘“A { int i a HY int joueurq—gne a IY for @i a H Y i ` T Y iCCA { if @lettre„rouvee‘i“ aa HA joueurq—gne a HY } } return joueurq—gneY gette fon™tion prend le t—˜le—u de ˜ooléens lettre„rouvee pour p—r—mètreF ille renE voie un ˜ooléen X  vr—i si on — g—gnéD  f—ux si on — perduF ve ™ode de ™ette fon™tion est plutôt simpleD vous devriez tous le ™omprendreF yn p—rE ™ourt lettre„rouvee et on véri(e si …xi des ™—ses v—ut  f—ux @HAF ƒi une des lettres n9— p—s en™ore été trouvéeD ™9est qu9on — perdu X on met —lors le ˜ooléen joueurq—gne à  f—ux @HAF ƒinonD si toutes les lettres ont été trouvéesD le ˜ooléen v—ut  vr—i @IA et l— fon™tion renverr— don™  vr—i F Analyse de la fonction rechercheLettre v— fon™tion re™her™hevettre — deux missions X ! renvoyer un ˜ooléen indiqu—nt si l— lettre se trouv—it ˜ien d—ns le mot se™ret Y ! mettre à jour @à IA les ™—ses du t—˜le—u lettre„rouvee ™orrespond—nt —ux positions de l— lettre qui — été trouvéeF int re™her™hevettre@™h—r lettreD ™h—r motƒe™ret‘“D int lettre„rouvee‘“A { int i a HY int ˜onnevettre a HY GG yn p—r™ourt motƒe™ret pour vérifier si l— lettre proposée y est for @i a H Y motƒe™ret‘i“ 3a 9’H9 Y iCCA { if @lettre aa motƒe™ret‘i“A GG ƒi l— lettre y est { ˜onnevettre a IY GG yn mémorise que ™9ét—it une ˜onne lettre lettre„rouvee‘i“ a IY GG yn met à I l— ™—se du t—˜le—u de ˜ooléens → ™orrespond—nt à l— lettre —™tuelle } PTH .CHAPITRE 18.

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE) } } return ˜onnevettreY yn p—r™ourt don™ l— ™h—îne motƒe™ret ™—r—™tère p—r ™—r—™tèreF À ™h—que foisD on véri(e si l— lettre que le joueur — proposée est une lettre du motF ƒi l— lettre ™orrespondD —lors on f—it deux ™hoses X ! on ™h—nge l— v—leur du ˜ooléen ˜onnevettre à ID pour que l— fon™tion retourne I ™—r l— lettre se trouv—it e'e™tivement d—ns motƒe™ret Y ! on met à jour le t—˜le—u lettre„rouvee à l— position —™tuelle pour indiquer que ™ette lettre — été trouvéeF v9—v—nt—ge de ™ette te™hniqueD ™9est qu9—insi on p—r™ourt tout le t—˜le—u @on ne s9—rrête p—s à l— première lettre trouvéeAF gel— nous permet de ˜ien mettre à jour le t—˜le—u lettre„rouveeD —u ™—s où une lettre ser—it présente en plusieurs exempl—ires d—ns le mot se™retD ™omme ™9est le ™—s pour les deux ‚ de we‚‚yxF La solution (2 : la gestion du dictionnaire) xous —vons f—it le tour des fon™tionn—lités de ˜—se de notre progr—mmeF sl ™ontient tout ™e qu9il f—ut pour gérer une p—rtieD m—is il ne s—it p—s séle™tionner un mot —u h—s—rd d—ns un di™tionn—ire de motsF †ous pouvez voir à quoi ressem˜le mon ™ode sour™e —u ™omplet à ™e st—de de son é™riture sur le we˜F te ne l9—i p—s pl—™é i™i ™—r il prend déjà plusieurs p—ges et fer—it dou˜lon —ve™ le ™ode sour™e (n—l ™omplet que vous verrez un peu plus ˜—sF £   gode we˜ X QHHSQP ¡ ¢ ev—nt d9—ller plus loinD l— première ™hose à f—ire m—inten—nt est de ™réer ™e f—meux di™tionn—ire de motsF wême s9il est ™ourt ™e n9est p—s gr—veD il ™onviendr— pour les testsF te v—is don™ ™réer un (™hier di™oFtxt dans le même répertoire que mon projetF €our le momentD j9y mets les mots suiv—nts X 6 wesƒyx fvi… e†syx ˆ‰vy€ryxi efisvvi swwi…fvi qy…‚hsx xisqi i‚y 6. Donc sans la gestion du dictionnaire. PTI .

PTP .CHAPITRE 18. Du moins. TP : RÉALISATION D'UN PENDU …ne fois que j9—ur—i terminé de ™oder le progr—mmeD je reviendr—i ˜ien sûr sur ™e di™tionE n—ire et j9y —jouter—i évidemment des tooonnes de mots tordus ™omme ˆ‰vy€ryxiD ou à r—llonge ™omme ex„sgyxƒ„s„…„syxxivviwix„F w—is pour le momentD retournons à nos instru™tionsF Préparation des nouveaux chiers v— le™ture du  di™o v— dem—nder p—s m—l de lignes de ™ode F te prends don™ les dev—nts en —jout—nt un nouve—u (™hier à mon projet X di™oF™ @qui ser— ™h—rgé de l— le™ture du di™oAF h—ns l— fouléeD je ™rée le di™oFh qui ™ontiendr— les prototypes des fon™tions ™ontenues d—ns di™oF™F h—ns di™oF™D je ™ommen™e p—r in™lure les ˜i˜liothèques dont j9—ur—i ˜esoin —insi que mon di™oFhF e prioriD ™omme souventD j9—ur—i ˜esoin de stdio et stdli˜ i™iF in plus de ™el—D je v—is être —mené à pio™her un nom˜re —u h—s—rd d—ns le di™oD je v—is don™ in™lure timeFh ™omme on l9—v—it f—it pour notre premier projet  €lus ou woins F te v—is —ussi —voir ˜esoin de stringFh pour f—ire un strlen vers l— (n de l— fon™tion X 7 5in™lude 5in™lude 5in™lude 5in™lude `stdioFhb `stdli˜Fhb `timeFhb `stringFhb 5in™lude 4di™oFh4 La fonction piocherMot gette fon™tion v— prendre un p—r—mètre X un pointeur sur l— zone en mémoire où elle pourr— é™rire le motF ge pointeur ser— fourni p—r le m—in@AF v— fon™tion renverr— un int qui ser— un ˜ooléen X I a tout s9est ˜ien p—sséD H a il y — eu une erreurF †oi™i le dé˜ut de l— fon™tion X int pio™herwot@™h—r Bmot€io™heA { psviB di™o a x…vvY GG ve pointeur de fi™hier qui v— ™ontenir notre fi™hier int nom˜rewots a HD numwotghoisi a HD i a HY int ™—r—™terevu a HY te dé(nis quelques v—ri—˜les qui me seront indispens—˜lesF gomme pour le m—in@AD je n9—i p—s pensé à mettre toutes ™es v—ri—˜les dès le dé˜utD il y en — ™ert—ines que j9—i —joutées p—r l— suite lorsque je me suis rendu ™ompte que j9en —v—is ˜esoinF ves noms des v—ri—˜les p—rlent d9euxEmêmesF yn — notre pointeur sur (™hier di™o dont on v— se servir pour lire le (™hier di™oFtxtD des v—ri—˜les tempor—ires qui vont sto™ker les ™—r—™tèresD et™F xotez que j9utilise i™i un int pour sto™ker un ™—r—™tère 7. j'en ai le pressentiment.

PTQ . Rappelez-vous que le chier contient un mot par ligne.LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE) @™—r—™terevuA ™—r l— fon™tion fget™ que je v—is utiliser renvoie un intF sl est don™ préfér—˜le de sto™ker le résult—t d—ns un intF €—ssons à l— suite X di™o a fopen@4di™oFtxt4D 4r4AY GG yn ouvre le di™tionn—ire en le™ture seule GG yn vérifie si on — réussi à ouvrir le di™tionn—ire if @di™o aa x…vvA GG ƒi on n9— €eƒ réussi à ouvrir le fi™hier { printf@4’nsmpossi˜le de ™h—rger le di™tionn—ire de mots4AY return HY GG yn retourne H pour indiquer que l— fon™tion — é™houé GG À l— le™ture du returnD l— fon™tion s9—rrête immédi—tementF } te n9—i p—s gr—ndE™hose à —jouter i™iF t9ouvre le (™hier di™oFtxt en le™ture seule @4r4A et je véri(e si j9—i réussi en test—nt si di™o v—ut x…vv ou nonF ƒi di™o v—ut x…vvD le (™hier n9— p—s pu être ouvert @(™hier introuv—˜le ou utilisé p—r un —utre progr—mmeAF h—ns ™e ™—sD j9—0™he une erreur et je f—is un return HF €ourquoi un return là c in f—itD l9instru™tion return ™omm—nde l9—rrêt de l— fon™tionF ƒi le di™o n9— p—s pu être ouvertD l— fon™tion s9—rrête là et l9ordin—teur n9ir— p—s lire plus loinF yn retourne H pour indiquer —u m—in que l— fon™tion — é™houéF h—ns l— suite de l— fon™tionD on suppose don™ que le (™hier — ˜ien été ouvertF GG yn ™ompte le nom˜re de mots d—ns le fi™hier @il suffit de ™ompter les → entrées ’n do { ™—r—™terevu a fget™@di™oAY if @™—r—™terevu aa 9’n9A nom˜rewotsCCY } while@™—r—™terevu 3a iypAY vàD on p—r™ourt tout le (™hier à ™oups de fget™ @™—r—™tère p—r ™—r—™tèreAF yn ™ompte le nom˜re de ’n @entréesA qu9on déte™teF À ™h—que fois qu9on tom˜e sur un ’nD on in™réE mente l— v—ri—˜le nom˜rewotsF qrâ™e à ™e ˜out de ™odeD on o˜tient d—ns nom˜rewots le nom˜re de mots d—ns le (™hier F 8 numwotghoisi a nom˜reele—toire@nom˜rewotsAY GG yn pio™he un mot —u h—s—rd s™iD je f—is —ppel à une fon™tion de mon ™ru qui v— génèrer un nom˜re —lé—toire entre I et nom˜rewots @le p—r—mètre qu9on envoie à l— fon™tionAF g9est une fon™tion toute simple que j9—i pl—™ée —ussi d—ns di™oF™ @je vous l— dét—iller—i tout à l9heureAF frefD elle renvoie un nom˜re @™orrespond—nt à un numéro de ligne du (™hierA —u h—s—rd qu9on sto™ke d—ns numwotghoisiF 8.

CHAPITRE 18. TP : RÉALISATION D'UN PENDU GG yn re™ommen™e à lire le fi™hier depuis le dé˜utF yn s9—rrête lorsqu9on est → —rrivé —u ˜on mot rewind@di™oAY while @numwotghoisi b HA { ™—r—™terevu a fget™@di™oAY if @™—r—™terevu aa 9’n9A numwotghoisiEEY } w—inten—nt qu9on — le numéro du mot qu9on veut pio™herD on rep—rt —u dé˜ut grâ™e à un —ppel à rewind@AF yn p—r™ourt là en™ore le (™hier ™—r—™tère p—r ™—r—™tère en ™ompt—nt les ’nF gette foisD on dé™rémente l— v—ri—˜le numwotghoisiF ƒi p—r exemple on — ™hoisi le mot numéro SD à ™h—que entrée l— v—ri—˜le v— être dé™rémentée de IF ille v— don™ v—loir SD puis RD QD PD IF F F et HF vorsque l— v—ri—˜le v—ut HD on sort du whileD l— ™ondition numwotghoisi b H n9ét—nt plus remplieF ge ˜out de ™odeD que vous devez impér—tivement ™omprendreD vous montre don™ ™omE ment on p—r™ourt un (™hier pour se pl—™er à l— position voulueF ge n9est p—s ˜ien ™ompliquéD m—is ™e n9est p—s non plus  évident F essurezEvous don™ de ˜ien ™omE prendre ™e que je f—is làF w—inten—ntD on devr—it —voir un ™urseur positionné juste dev—nt le mot se™ret qu9on — ™hoisi de pio™herF yn v— le sto™ker d—ns mot€io™he @le p—r—mètre que l— fon™tion reçoitA grâ™e à un simple fgets qui v— lire le mot X GB ve ™urseur du fi™hier est positionné —u ˜on endroitF yn n9— plus qu9à f—ire un fgets qui lir— l— ligne BG fgets@mot€io™heD IHHD di™oAY GG yn vire le ’n à l— fin mot€io™he‘strlen@mot€io™heA E I“ a 9’H9Y yn dem—nde —u fgets de ne p—s lire plus de IHH ™—r—™tères @™9est l— t—ille du t—˜le—u mot€io™heD qu9on — dé(ni d—ns le m—inAF x9ou˜liez p—s que fgets lit toute une ligneD y ™ompris le ’nF gomme on ne veut p—s g—rder ™e ’n d—ns le mot (n—lD on le supprime en le rempl—ç—nt p—r un ’HF gel— —ur— pour e'et de ™ouper l— ™h—îne juste —v—nt le ’nF itF F F voilà qui est f—it 3 yn — é™rit le mot se™ret d—ns l— mémoire à l9—dresse de mot€io™heF yn n9— plus qu9à fermer le (™hierD à retourner I pour que l— fon™tion s9—rrête et pour dire que tout s9est ˜ien p—ssé X f™lose@di™oAY } return IY GG „out s9est ˜ien p—sséD on retourne I €—s ˜esoin de plus pour l— fon™tion pio™herwot 3 PTR .

Notez que j'ai fait tout ça en une ligne. bien que peut-être parfois moins lisible. PTS . c'est tout à fait possible.c †oi™i le (™hier di™oF™ en entier X GB teu du €endu di™oF™ EEEEEE ges fon™tions pio™hent —u h—s—rd un mot d—ns un fi™hier di™tionn—ire pour le jeu du €endu BG 9.h sl s9—git juste des prototypes des fon™tionsF †ous rem—rquerez qu9il y — l—  prote™tion 5ifndef que je vous —v—is dem—ndé d9in™lure d—ns tous vos (™hiers Fh @revoyez le ™h—pitre sur le prépro™esseur —u ˜esoinAF 5ifndef hip•hsgy 5define hip•hsgy int pio™herwot@™h—r Bmot€io™heAY int nom˜reele—toire@int nom˜rew—xAY 5endif £ ¢gode we˜ X SRRHIW ¡   Le chier dico.LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE) La fonction nombreAleatoire g9est l— fon™tion dont j9—v—is promis de vous p—rler tout à l9heureF yn tire un nom˜re —u h—s—rd et on le renvoie X int nom˜reele—toire@int nom˜rew—xA { sr—nd@time@x…vvAAY return @r—nd@A 7 nom˜rew—xAY } v— première ligne initi—lise le génér—teur de nom˜res —lé—toiresD ™omme on — —ppris à le f—ire d—ns le premier „€  €lus ou woins F v— se™onde ligne prend un nom˜re —u h—s—rd entre H et nom˜rew—x et le renvoie F 9 Le chier dico.

TP : RÉALISATION D'UN PENDU 5in™lude 5in™lude 5in™lude 5in™lude `stdioFhb `stdli˜Fhb `timeFhb `stringFhb 5in™lude 4di™oFh4 int pio™herwot@™h—r Bmot€io™heA { psviB di™o a x…vvY GG ve pointeur de fi™hier qui v— ™ontenir notre fi™hier int nom˜rewots a HD numwotghoisi a HD i a HY int ™—r—™terevu a HY di™o a fopen@4di™oFtxt4D 4r4AY GG yn ouvre le di™tionn—ire en le™ture seule GG yn vérifie si on — réussi à ouvrir le di™tionn—ire if @di™o aa x…vvA GG ƒi on n9— €eƒ réussi à ouvrir le fi™hier { printf@4’nsmpossi˜le de ™h—rger le di™tionn—ire de mots4AY return HY GG yn retourne H pour indiquer que l— fon™tion — é™houé GG À l— le™ture du returnD l— fon™tion s9—rrête immédi—tementF } GG yn ™ompte le nom˜re de mots d—ns le fi™hier @il suffit de ™ompter les GG entrées ’n do { ™—r—™terevu a fget™@di™oAY if @™—r—™terevu aa 9’n9A nom˜rewotsCCY } while@™—r—™terevu 3a iypAY numwotghoisi a nom˜reele—toire@nom˜rewotsAY GG yn pio™he un mot —u h—s—rd → GG yn re™ommen™e à lire le fi™hier depuis le dé˜utF yn s9—rrête lorsqu9on est —rrivé —u ˜on mot rewind@di™oAY while @numwotghoisi b HA { ™—r—™terevu a fget™@di™oAY if @™—r—™terevu aa 9’n9A numwotghoisiEEY } GB ve ™urseur du fi™hier est positionné —u ˜on endroitF yn n9— plus qu9à f—ire un fgets qui lir— l— ligne BG fgets@mot€io™heD IHHD di™oAY GG yn vire le ’n à l— fin mot€io™he‘strlen@mot€io™heA E I“ a 9’H9Y PTT .CHAPITRE 18.

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE) f™lose@di™oAY } return IY GG „out s9est ˜ien p—sséD on retourne I int nom˜reele—toire@int nom˜rew—xA { sr—nd@time@x…vvAAY return @r—nd@A 7 nom˜rew—xAY } £ ¢gode we˜ X QTTQQR ¡   Il va falloir modier le main ! w—inten—nt que le (™hier di™oF™ est prêtD on retourne d—ns le m—in@A pour l9—d—pter un petit peu —ux quelques ™h—ngements qu9on vient de f—ireF héjàD on ™ommen™e p—r in™lure di™oFh si on veut pouvoir f—ire —ppel —ux fon™tions de di™oF™F he plusD on v— —ussi in™lure stringFh ™—r on v— devoir f—ire un strlen X 5in™lude `stringFhb 5in™lude 4di™oFh4 €our ™ommen™erD les dé(nitions de v—ri—˜les vont un peu ™h—ngerF héjàD on n9initi—lise plus l— ™h—îne motƒe™retD on ™rée juste un gr—nd t—˜le—u de ™h—r @IHH ™—sesAF u—nt —u t—˜le—u lettre„rouveeF F F s— t—ille dépendr— de l— longueur du mot se™ret qu9on —ur— pio™héF gomme on ne ™onn—ît p—s en™ore ™ette t—illeD on ™rée un simple pointeurF „out à l9heureD on fer— un m—llo™ et pointer ™e pointeur vers l— zone mémoire qu9on —ur— —llouéeF ge™i est un exemple p—rf—it de l9—˜solue né™essité de l9—llo™—tion dyn—mique X on ne ™onn—ît p—s l— t—ille du t—˜le—u —v—nt l— ™ompil—tionD on est don™ o˜ligé de ™réer un pointeur et de f—ire un m—llo™F te ne dois p—s ou˜lier de li˜érer l— mémoire ensuite qu—nd je n9en —i plus ˜esoinD d9où l— présen™e d9un free@A à l— (n du m—inF yn v— —ussi —voir ˜esoin d9une v—ri—˜le t—illewot qui v— sto™kerF F F l— t—ille du motF in e'etD si vous reg—rdez le m—in@A tel qu9il ét—it d—ns l— première p—rtieD on suppos—it que le mot f—is—it T ™—r—™tères p—rtout @et ™9ét—it vr—i ™—r we‚‚yx ™omporte T lettresAF w—is m—inten—nt que le mot peut ™h—nger de t—illeD il v— f—lloir être ™—p—˜le de s9—d—pter à tous les mots 3 †oi™i don™ les dé(nitions de v—ri—˜les du m—in en version (n—le X int m—in@int —rg™D ™h—rB —rgv‘“A { ™h—r lettre a HY GG ƒto™ke l— lettre proposée p—r l9utilis—teur @retour du → s™—nfA PTU .

TP : RÉALISATION D'UN PENDU ™h—r motƒe™ret‘IHH“ a {H}Y GG ge ser— le mot à trouver int Blettre„rouvee a x…vvY GG …n t—˜le—u de ˜ooléensF gh—que ™—se ™orrespond → à une lettre du mot se™retF H a lettre non trouvéeD I a lettre trouvée int ™oups‚est—nts a IHY GG gompteur de ™oups rest—nts @H a mortA int i a HY GG …ne petite v—ri—˜le pour p—r™ourir les t—˜le—ux int t—illewot a HY g9est prin™ip—lement le dé˜ut du m—in qui v— ™h—ngerD don™ —n—lysonsEle de plus près X if @3pio™herwot@motƒe™retAA exit@HAY yn f—it d9—˜ord —ppel à pio™herwot dire™tement d—ns le ifF pio™herwot v— pl—™er d—ns motƒe™ret le mot qu9elle —ur— pio™héF he plusD pio™herwot v— renvoyer un ˜ooléen pour nous dire si l— fon™tion — réussi ou é™houéF ve rôle du if est d9—n—lyser ™e ˜ooléenF ƒi ç— n9— €eƒ m—r™hé @le 3 permet d9exprimer l— nég—tionAD —lors on —rrête tout @exit@HAAF t—illewot a strlen@motƒe™retAY yn sto™ke l— t—ille du motƒe™ret d—ns t—illewot ™omme je vous l9—i dit tout à l9heureF lettre„rouvee a m—llo™@t—illewot B sizeof@intAAY GG yn —lloue dyn—miquement le → t—˜le—u lettre„rouvee @dont on ne ™onn—iss—it p—s l— t—ille —u dép—rtA if @lettre„rouvee aa x…vvA exit@HAY w—inten—nt on doit —llouer l— mémoire pour le t—˜le—u lettre„rouveeF yn lui donne l— t—ille du mot @t—illewotAF yn véri(e ensuite si le pointeur n9est p—s x…vvF ƒi ™9est le ™—sD ™9est que l9—llo™—tion — é™houéF h—ns ™e ™—sD on —rrête immédi—tement le progr—mme @on f—it —ppel à exit@AAF ƒi les lignes suiv—ntes sont luesD ™9est don™ que tout s9est ˜ien p—sséF †oilà tous les prép—r—tifs qu9il vous f—ll—it f—ire i™iF t9—i dû ensuite modi(er le reste du (™hier m—inF™ pour rempl—™er tous les nom˜res T @l9—n™ienne longueur de we‚‚yx qu9on —v—it (xéeA p—r l— v—ri—˜le t—illewotF €—r exemple X for @i a H Y i ` t—illewot Y iCCA lettre„rouvee‘i“ a HY ge ™ode met toutes les ™—ses du t—˜le—u lettre„rouvee à HD en s9—rrêt—nt lorsqu9on — p—r™ouru t—illewot ™—sesF t9—i dû —ussi rem—nier le prototype de l— fon™tion g—gne pour —jouter l— v—ri—˜le t—illewotF ƒ—ns ™el—D l— fon™tion n9—ur—it p—s su qu—nd —rrêter s— ˜ou™leF †oi™i le (™hier m—inF™ (n—l en entier X PTV .CHAPITRE 18.

LA SOLUTION (2 : LA GESTION DU DICTIONNAIRE) GB teu du €endu m—inF™ EEEEEE pon™tions prin™ip—les de gestion du jeu BG 5in™lude 5in™lude 5in™lude 5in™lude `stdioFhb `stdli˜Fhb `™typeFhb `stringFhb 5in™lude 4di™oFh4 int g—gne@int lettre„rouvee‘“D long t—illewotAY int re™her™hevettre@™h—r lettreD ™h—r motƒe™ret‘“D int lettre„rouvee‘“AY ™h—r lireg—r—™tere@AY int m—in@int —rg™D ™h—rB —rgv‘“A { ™h—r lettre a HY GG ƒto™ke l— lettre proposée p—r l9utilis—teur @retour du → s™—nfA ™h—r motƒe™ret‘IHH“ a {H}Y GG ge ser— le mot à trouver int Blettre„rouvee a x…vvY GG …n t—˜le—u de ˜ooléensF gh—que ™—se ™orrespond → à une lettre du mot se™retF H a lettre non trouvéeD I a lettre trouvée long ™oups‚est—nts a IHY GG gompteur de ™oups rest—nts @H a mortA long i a HY GG …ne petite v—ri—˜le pour p—r™ourir les t—˜le—ux long t—illewot a HY printf@4fienvenue d—ns le €endu 3’n’n4AY if @3pio™herwot@motƒe™retAA exit@HAY t—illewot a strlen@motƒe™retAY → lettre„rouvee a m—llo™@t—illewot B sizeof@intAAY GG yn —lloue dyn—miquement le t—˜le—u lettre„rouvee @dont on ne ™onn—iss—it p—s l— t—ille —u dép—rtA if @lettre„rouvee aa x…vvA exit@HAY for @i a H Y i ` t—illewot Y iCCA lettre„rouvee‘i“ a HY GB yn ™ontinue à jouer t—nt qu9il reste —u moins un ™oup à jouer ou qu9on n9— p—s g—gné BG while @™oups‚est—nts b H 88 3g—gne@lettre„rouveeD t—illewotAA { PTW .

CHAPITRE 18. TP : RÉALISATION D'UN PENDU printf@4’n’nsl vous reste 7ld ™oups — jouer4D ™oups‚est—ntsAY printf@4’nuel est le mot se™ret c 4AY GB yn —ffi™he le mot se™ret en m—squ—nt les lettres non trouvées ixemple X BeBByx BG for @i a H Y i ` t—illewot Y iCCA { if @lettre„rouvee‘i“A GG ƒi on — trouvé l— lettre n¦ i printf@47™4D motƒe™ret‘i“AY GG yn l9—ffi™he else printf@4B4AY GG ƒinonD on —ffi™he une étoile pour les lettres non trouvées } printf@4’n€roposez une lettre X 4AY lettre a lireg—r—™tere@AY GG ƒi ™e n9ét—it €eƒ l— ˜onne lettre if @3re™her™hevettre@lettreD motƒe™retD lettre„rouveeAA { ™oups‚est—ntsEEY GG yn enlève un ™oup —u joueur } → } if @g—gne@lettre„rouveeD t—illewotAA printf@4’n’nq—gne 3 ve mot se™ret et—it ˜ien X 7s4D motƒe™retAY else printf@4’n’n€erdu 3 ve mot se™ret et—it X 7s4D motƒe™retAY → free@lettre„rouveeAY GG yn li˜ère l— mémoire —llouée m—nuellement @p—r m—llo™A return HY } ™h—r lireg—r—™tere@A { ™h—r ™—r—™tere a HY ™—r—™tere a get™h—r@AY GG yn lit le premier ™—r—™tère ™—r—™tere a toupper@™—r—™tereAY GG yn met l— lettre en m—jus™ule si elle ne → l9est p—s déjà GG yn lit les —utres ™—r—™tères mémorisés un à un jusqu9—u ’n while @get™h—r@A 3a 9’n9A Y } return ™—r—™tereY GG yn retourne le premier ™—r—™tère qu9on — lu int g—gne@int lettre„rouvee‘“D long t—illewotA PUH .

IDÉES D'AMÉLIORATION { long i a HY int joueurq—gne a IY for @i a H Y i ` t—illewot Y iCCA { if @lettre„rouvee‘i“ aa HA joueurq—gne a HY } } return joueurq—gneY int re™her™hevettre@™h—r lettreD ™h—r motƒe™ret‘“D int lettre„rouvee‘“A { long i a HY int ˜onnevettre a HY GG yn p—r™ourt motƒe™ret pour vérifier si l— lettre proposée y est for @i a H Y motƒe™ret‘i“ 3a 9’H9 Y iCCA { if @lettre aa motƒe™ret‘i“A GG ƒi l— lettre y est { ˜onnevettre a IY GG yn mémorise que ™9ét—it une ˜onne lettre lettre„rouvee‘i“ a IY GG yn met à I l— ™—se du t—˜le—u de ˜ooléens → ™orrespond—nt à l— lettre —™tuelle } } } return ˜onnevettreY £ ¢gode we˜ X IHSSSH ¡   Idées d'amélioration Télécharger le projet €our ™ommen™erD je vous invite à télé™h—rger le projet ™omplet du €enduF £   ¢gode we˜ X SVUSRS ¡ ƒi vous êtes sous vinux ou sous w—™D supprimez le (™hier di™oFtxt et re™réezEen unF ves (™hiers sont enregistrés de m—nière di'érente sous ‡indows X don™ si vous utilisez le mienD vous risquez d9—voir des ˜ugsF x9ou˜liez p—s qu9il f—ut qu9il y —it une Entrée —près ™h—que mot du di™tionn—ireF €ensez en p—rti™ulier à mettre une Entrée —près le dernier mot de l— listeF gel— v— vous permettre de tester p—r vousEmêmes le fon™tionnement du projetD de PUI .

CHAPITRE 18. À coups de printf bien sûr : on est en console. TP : RÉALISATION D'UN PENDU pro™éder à des —mélior—tions personnellesD et™F fien entenduD le mieux ser—it que vous —yez déjà réussi le €endu p—r vousEmêmes et que vous n9—yez même p—s ˜esoin de voir mon projet pour voir ™omment j9—i f—it m—isF F F je suis ré—listeD je s—is que ™e „€ — dû être —ssez déli™—t pour ˜on nom˜re d9entre vousF †ous trouverez d—ns ™e Fzip les (™hiers F™ et Fh —insi que le (™hier F™˜p du projetF g9est un projet f—it sous gode: :flo™ksF ƒi vous utilisez un —utre shiD p—s de p—niqueF †ous ™réez un nouve—u projet ™onsole et vous y —joutez m—nuellement les F™ et Fh que vous trouverez d—ns le FzipF †ous trouverez —ussi l9exé™ut—˜le @Fexe ‡indowsA —insi qu9un di™tionn—ire @di™oFtxtAF Améliorez le Pendu ! wine de rienD le €endu est déjà —ssez évolué ™omme ç—F yn — un jeu qui lit un (™hier de di™tionn—ire et qui prend à ™h—que fois un mot —u h—s—rdF †oi™i qu—nd même quelques idées d9—mélior—tion que je vous invite à implémenterF ! e™tuellementD on ne vous propose de jouer qu9une foisF sl ser—it ˜ien de pouvoir ˜ou™ler à nouve—u à l— (n du m—in pour lancer une nouvelle partie si le joueur le désireF ! †ous pourriez ™réer un mode deux joueurs d—ns lequel le premier joueur entre un mot que le deuxième joueur doit devinerF ! ge n9est p—s utile @don™ ™9est indispens—˜leA X pourquoi ne p—s dessiner un bonhomme qui se fait pendre à ™h—que fois que l9on f—it une erreur c €renez ˜ien le temps de ™omprendre ™e „€ et —méliorezEle —u m—ximumF sl f—ut que vous soyez ™—p—˜les de ref—ire ™e petit jeu de €endu les yeux fermés 3 ellezD ™our—geF 10 10. rappelez-vous ! PUP .

qu'est-ce qui vous garantit qu'il ne va pas vous répondre  Je m'appelle François je vais bien merci  ? Le but de ce chapitre est de vous faire découvrir les problèmes que l'on peut rencontrer en utilisant la fonction s™—nf et de vous montrer une alternative plus sûre avec la fonction fgets.Chapitre 19 Diculté : La saisie de texte sécurisée L a saisie de texte est un des aspects les plus délicats du langage C. Vous vous dites : quoi de plus simple et de plus naturel ? Eh bien gurez-vous que non. en fait. PUQ . Ceux qui vont utiliser votre programme sont des humains. que vous avez vue au début du cours. Vous connaissez la fonction s™—nf. c'est tout sauf simple. Tout humain qui se respecte fait des erreurs et peut avoir des comportements inattendus. Si vous lui demandez :  Quel âge avez-vous ? .

la fonction lira toute seule le mot  Dupont  qui était resté en attente dans la mémoire. LA SAISIE DE TEXTE SÉCURISÉE Les limites de la fonction scanf v— fon™tion s™—nf@AD que je vous —i présentée dès le dé˜ut du ™ours de gD est une fon™tion à dou˜le tr—n™h—nt X ! elle est f—™ile à utiliser qu—nd on dé˜ute @™9est pour ç— que je vous l9—i présentéeAF F F ! F F F m—is son fon™tionnement interne est ™omplexe et elle peut même être d—ngereuse d—ns ™ert—ins ™—sF g9est un peu ™ontr—di™toireD n9estE™e p—s c in f—itD s™—nf a l'air f—™ile à utiliserD m—is elle ne l9est p—s en pr—tiqueF te v—is vous montrer ses limites p—r deux exemples ™on™retsF Entrer une chaîne de caractères avec des espaces ƒupposons qu9on dem—nde une ™h—îne de ™—r—™tères à l9utilis—teurD m—is que ™eluiE™i insère un esp—™e d—ns s— ™h—îne X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r nom‘PH“ a {H}Y printf@4uel est votre nom c 4AY s™—nf@47s4D nomAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY } return HY   £ ¢gode we˜ X IISUPW ¡ uel est votre nom c te—n hupont eh 3 †ous vous —ppelez don™ te—n 3 Pourquoi le  Dupont  a disparu ? €—r™e que l— fon™tion s™—nf s9—rrête si elle tom˜e —u ™ours de s— le™ture sur un esp—™eD une t—˜ul—tion ou une entréeF †ous ne pouvez don™ p—s ré™upérer l— ™h—îne si ™elleE™i ™omporte un esp—™eF En fait. La prochaine fois qu'on appellera s™—nf.CHAPITRE 19. PUR . le mot 4hupont4 se trouve toujours en mémoire. dans ce qu'on appelle le buer .

Attention.LES LIMITES DE LA FONCTION SCANF yn peut utiliser l— fon™tion s™—nf de telle sorte qu9elle lise les esp—™esD m—is ™9est —ssez ™ompliquéF ƒi vous voulez —pprendre à ˜ien vous servir de s™—nfD on peut trouver des ™ours très dét—illés sur  le we˜ F £ ¢gode we˜ X RVTRRH ¡ 1 Entrer une chaîne de caractères trop longue sl y — un —utre pro˜lèmeD ˜e—u™oup plus gr—ve en™ore X ™elui du dépassement de mémoireF h—ns le ™ode que nous venons de voirD il y — l— ligne suiv—nte X ™h—r nom‘S“ a {H}Y †ous voyez que j9—i —lloué S ™—ses pour mon t—˜le—u de ™h—r —ppelé nomF gel— signi(e qu9il y — l— pl—™e d9é™rire R ™—r—™tèresD le dernier ét—nt toujours réservé —u ™—r—™tère de (n de ™h—îne ’HF ‚evoyez —˜solument le ™ours sur les ™h—înes de ™—r—™tères @p—ge ITWA si vous —vez ou˜lié tout ™el—F v— (gF IWFI vous présente l9esp—™e qui — été —lloué pour nomF Figure IWFI ! ello™—tion de mémoire ue se p—sseEtEil si vous é™rivez plus de ™—r—™tères qu9il n9y — d9esp—™e prévu pour les sto™ker c uel est votre nom c €—tri™e eh 3 †ous vous —ppelez don™ €—tri™e 3 e prioriD il ne s9est rien p—sséF it pourt—ntD ™e que vous voyez là est un vérit—˜le ™—u™hem—r de progr—mmeur 3 yn dit qu9on vient de f—ire un dépassement de mémoireD —ussi —ppelé buer overow en —ngl—isF gomme vous le voyez sur l— (gF IWFPD on —v—it —lloué S ™—ses pour sto™ker le nomD m—is en f—it il en f—ll—it VF u9— f—it l— fon™tion s™—nf c ille — ™ontinué à é™rire à l— suite en mémoire ™omme si de rien n9ét—it 3 ille — é™rit d—ns des zones mémoire qui n9ét—ient p—s prévues pour ™el—F ves ™—r—™tères en trop ont  é™r—sé d9—utres inform—tions en mémoireF g9est ™e qu9on —ppelle un buer overow @(gF IWFQAF 1. PUS . c'est assez dicile.

PUT . LA SAISIE DE TEXTE SÉCURISÉE Figure IWFP ! hép—ssement d—ns l— mémoire Figure IWFQ ! ve ˜u'er over)ow En quoi cela est-il dangereux ? ƒ—ns entrer d—ns les dét—ilsD ™—r on pourr—it en p—rler pend—nt SH p—ges s—ns —voir (ni D il f—ut s—voir que si le progr—mme ne ™ontrôle p—s ™e genre de ™—sD l9utilis—teur peut é™rire ™e qu9il veut à l— suite en mémoireF in p—rti™ulierD il peut insérer du ™ode en mémoire et f—ire en sorte qu9il soit exé™uté p—r le progr—mmeF g9est l9attaque par buer overowD une —tt—que de pir—te ™élè˜re m—is di0™ile à ré—liserF ve ˜ut de ™e ™h—pitre ser— de sé™uriser l— s—isie de nos donnéesD en empê™h—nt l9utilis—E teur de f—ire dé˜order et de provoquer un ˜u'er over)owF fien sûrD on pourr—it —llouer un très gr—nd t—˜le—u @IH HHH ™—r—™tèresAD m—is ç— ne ™h—nger—it rien —u pro˜lème X une personne qui veut f—ire dép—sser de l— mémoire n9—ur— qu9à envoyer plus de IH HHH ™—r—™tères et son —tt—que m—r™her— tout —ussi ˜ienF eussi ˜ête que ™el— puisse p—r—îtreD tous les progr—mmeurs n9ont p—s toujours f—it —ttention à ™el—F ƒ9ils —v—ient f—it les ™hoses proprement depuis le dé˜utD une ˜onne p—rtie des f—illes de sé™urité dont on entend p—rler en™ore —ujourd9hui ne ser—it j—m—is —pp—rue 3 2 Récupérer une chaîne de caractères sl existe plusieurs fon™tions st—nd—rds en g qui permettent de ré™upérer une ™h—îne de texteF rormis l— fon™tion s™—nf @trop ™ompliquée pour être étudiée i™iAD il existe X ! gets X une fon™tion qui lit toute une ™h—îne de ™—r—™tèresD m—is très d—ngereuse ™—r elle ne permet p—s de ™ontrôler les ˜u'er over)ow 3 2.CHAPITRE 19. vous pouvez lire l'article  Dépassement de tampon  de Wikipédia (code web : 251507). Attention c'est quand même assez compliqué. Si l'attaque par buer overow vous intéresse.

RÉCUPÉRER UNE CHAÎNE DE CARACTÈRES X l9équiv—lent de gets m—is en version sé™uriséeD permett—nt de ™ontrôler le nom˜re de ™—r—™tères é™rits en mémoireF †ous l9—urez ™ompris X ˜ien que ™e soit une fon™tion st—nd—rd du gD gets est très d—ngereuseF „ous les progr—mmes qui l9utilisent sont sus™epti˜les d9être vi™times de ˜u'er over)owF xous —llons don™ voir ™omment fon™tionne fgets et ™omment on peut l9utiliser en pr—tique d—ns nos progr—mmes en rempl—™ement de s™—nfF fgets ! La fonction fgets ve prototype de l— fon™tion fgetsD situé d—ns stdioFhD est le suiv—nt X ™h—r Bfgets@ ™h—r BstrD int numD psvi Bstre—m AY sl est import—nt de ˜ien ™omprendre ™e prototypeF ves p—r—mètres sont les suiv—ntsF ! str X un pointeur vers un t—˜le—u —lloué en mémoire où l— fon™tion v— pouvoir é™rire le texte entré p—r l9utilis—teurF ! num X l— t—ille du t—˜le—u str envoyé en premier p—r—mètreF xotez que si vous —vez —lloué un t—˜le—u de IH ™h—rD fgets lir— W ™—r—™tères —u m—ximum @il réserve toujours un ™—r—™tère d9esp—™e pour pouvoir é™rire le ’H de (n de ™h—îneAF ! stre—m X un pointeur sur le (™hier à lireF h—ns notre ™—sD le  (™hier à lire est l9entrée st—nd—rdD ™9estEàEdire le ™l—vierF €our dem—nder à lire l9entrée st—nd—rdD on enverr— le pointeur stdinD qui est —utom—tiquement dé(ni d—ns les he—ders de l— ˜i˜liothèque st—nd—rd du g pour représenter le ™l—vierF „outefoisD il est —ussi possi˜le d9utiliser fgets pour lire des (™hiersD ™omme on — pu le voir d—ns le ™h—pitre sur les (™hiersF v— fon™tion fgets retourne le même pointeur que str si l— fon™tion s9est déroulée s—ns erreurD ou x…vv s9il y — eu une erreurF sl su0t don™ de tester si l— fon™tion — renvoyé x…vv pour s—voir s9il y — eu une erreurF „estons 3 5in™lude `stdioFhb 5in™lude `stdli˜Fhb int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r nom‘IH“Y printf@4uel est votre nom c 4AY fgets@nomD IHD stdinAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY } return HY £ ¢gode we˜ X UTWWVU ¡ PUU   .

LA SAISIE DE TEXTE SÉCURISÉE uel est votre nom c w—teo eh 3 †ous vous —ppelez don™ w—teo 3 Ǘ fon™tionne très ˜ienD à un dét—il près X qu—nd vous pressez  intrée D fgets ™onserve le ’n ™orrespond—nt à l9—ppui sur l— tou™he  intrée F gel— se voit d—ns l— ™onsole ™—r il y — un s—ut à l— ligne —près  w—teo d—ns mon exempleF yn ne peut rien f—ire pour empê™her fgets d9é™rire le ™—r—™tère ’nD l— fon™tion est f—ite ™omme ç—F in rev—n™heD rien ne nous interdit de ™réer notre propre fon™tion de s—isie qui v— —ppeler fgets et supprimer —utom—tiquement à ™h—que fois les ’n 3 Créer sa propre fonction de saisie utilisant fgets sl n9est p—s très di0™ile de ™réer s— propre petite fon™tion de s—isie qui v— f—ire quelques ™orre™tions à ™h—que fois pour nousF xous —ppellerons ™ette fon™tion lireF ille renverr— I si tout s9est ˜ien p—sséD H s9il y — eu une erreurF Éliminer le saut de ligne ’n v— fon™tion lire v— —ppeler fgets etD si tout s9est ˜ien p—sséD elle v— re™her™her le ™—r—™tère ’n à l9—ide de l— fon™tion str™hr que vous devriez déjà ™onn—îtreF ƒi un ’n est trouvéD elle le rempl—™e p—r un ’H @(n de ™h—îneA pour éviter de ™onserver une  intrée F †oi™i le ™odeD ™ommenté p—s à p—s X 5in™lude `stdioFhb 5in™lude `stdli˜Fhb 5in™lude `stringFhb GG €enser à in™lure stringFh pour str™hr@A int lire@™h—r B™h—ineD int longueurA { ™h—r Bpositionintree a x…vvY GG yn lit le texte s—isi —u ™l—vier if @fgets@™h—ineD longueurD stdinA 3a x…vvA GG €—s d9erreur de s—isie c { positionintree a str™hr@™h—ineD 9’n9AY GG yn re™her™he l94intrée4 if @positionintree 3a x…vvA GG ƒi on — trouvé le retour à l— ligne { Bpositionintree a 9’H9Y GG yn rempl—™e ™e ™—r—™tère p—r ’H } return IY GG yn renvoie I si l— fon™tion s9est déroulée s—ns erreur } else { PUV .CHAPITRE 19.

RÉCUPÉRER UNE CHAÎNE DE CARACTÈRES return HY GG yn renvoie H s9il y — eu une erreur } } we˜ X SIWQIV ¡ †ous noterez que je me permets d9—ppeler l— fon™tion fgets dire™tement d—ns un ifF Ǘ m9évite d9—voir à ré™upérer l— v—leur de fgets d—ns un pointeur juste pour tester si ™eluiE™i est x…vv ou nonF À p—rtir du premier ifD je s—is si fgets s9est ˜ien déroulée ou s9il y — eu un pro˜lème @l9utilis—teur — rentré plus de ™—r—™tères qu9il n9ét—it —utoriséAF ƒi tout s9est ˜ien p—sséD je peux —lors p—rtir à l— re™her™he du ’n —ve™ str™hr et rempl—™er ™et ’n p—r un ’H @(gF IWFRAF £ ¢gode   Figure IWFR ! ‚empl—™ement du s—ut de ligne ge s™hém— montre que l— ™h—îne é™rite p—r fgets ét—it  w—teo’n’H F xous —vons rempl—™é le ’n p—r un ’HD ™e qui — donné —u (n—l X  w—teo’H’H F ge n9est p—s gr—ve d9—voir deux ’H d9—0léeF v9ordin—teur s9—rrête —u premier ’H qu9il ren™ontre et ™onsidère que l— ™h—îne de ™—r—™tères s9—rrête làF ve résult—t c ih ˜ien ç— m—r™heF int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r nom‘IH“Y printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY } return HY uel est votre nom c w—teo eh 3 †ous vous —ppelez don™ w—teo 3 Vider le buer xous ne sommes p—s en™ore —u ˜out de nos ennuisF xous n9—vons p—s étudié ™e qui se p—ss—it si l9utilis—teur tent—it de mettre plus de ™—r—™tères qu9il n9y —v—it de pl—™e 3 PUW .

LA SAISIE DE TEXTE SÉCURISÉE uel est votre nom c te—n idou—rd el˜ert Ier eh 3 †ous vous —ppelez don™ te—n idou 3 v— fon™tion fgets ét—nt sé™uriséeD elle s9est —rrêtée de lire —u ˜out du We ™—r—™tère ™—r nous —vions —lloué un t—˜le—u de IH ™h—r @il ne f—ut p—s ou˜lier le ™—r—™tère de (n de ™h—îne ’H qui o™™upe l— IHe positionAF ve pro˜lèmeD ™9est que le reste de l— ™h—îne qui n9— p—s pu être luD à s—voir  —rd el˜ert Ier D n9— p—s disp—ru 3 sl est toujours d—ns le buerF ve ˜u'er est une sorte de zone mémoire qui reçoit dire™tement l9entrée ™l—vier et qui sert d9intermédi—ire entre le ™l—vier et votre t—˜le—u de sto™k—geF in gD on dispose d9un pointeur vers le ˜u'erD ™9est ™e f—meux stdin dont je vous p—rl—is un peu plus tôtF te ™rois qu9un petit s™hém— ne ser— p—s de refus pour mettre les idées —u ™l—ir @(gF IWFSAF Figure IWFS ! ve™ture du ˜u'er du ™l—vier vorsque l9utilis—teur t—pe du texte —u ™l—vierD le système d9exploit—tion @‡indowsD p—r exempleA ™opie dire™tement le texte t—pé d—ns le ˜u'er stdinF ge ˜u'er est là pour re™evoir tempor—irement l9entrée du ™l—vierF ve rôle de l— fon™tion fgets est justement d9extr—ire du ˜u'er les ™—r—™tères qui s9y trouvent et de les ™opier d—ns l— zone mémoire que vous lui indiquez @votre t—˜le—u ™h—ineAF eprès —voir e'e™tué son tr—v—il de ™opieD fgets enlève du ˜u'er tout ™e qu9elle — pu ™opierF ƒi tout s9est ˜ien p—sséD fgets — don™ pu ™opier tout le ˜u'er d—ns votre ™h—îneD et —insi le ˜u'er se retrouve vide à l— (n de l9exé™ution de l— fon™tionF w—is si l9utilis—teur entre PVH .CHAPITRE 19.

RÉCUPÉRER UNE CHAÎNE DE CARACTÈRES ˜e—u™oup de ™—r—™tèresD et que l— fon™tion fgets ne peut ™opier qu9une p—rtie d9entre eux @p—r™e que vous —vez —lloué un t—˜le—u de IH ™h—r seulementAD seuls les ™—r—™tères lus seront supprimés du ˜u'erF „ous ™eux qui n9—uront p—s été lus y resteront 3 „estons —ve™ une longue ™h—îne X int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r nom‘IH“Y printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY } return HY uel est votre nom c te—n idou—rd el˜ert Ier eh 3 †ous vous —ppelez don™ te—n idou 3 v— fon™tion fgets n9— pu ™opier que les W premiers ™—r—™tères ™omme prévuF ve proE ˜lèmeD ™9est que les —utres se trouvent toujours d—ns le ˜u'er @(gF IWFTA 3 Figure IWFT ! ve™ture du ˜u'er du ™l—vier —ve™ dé˜ordement gel— signi(e que si vous f—ites un —utre fgets ensuiteD ™eluiE™i v— —ller ré™upérer ™e qui ét—it resté en mémoire d—ns le ˜u'er 3 „estons ™e ™ode X PVI .

LA SAISIE DE TEXTE SÉCURISÉE int m—in@int —rg™D ™h—r B—rgv‘“A { ™h—r nom‘IH“Y printf@4uel est votre nom c 4AY lire@nomD IHAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY lire@nomD IHAY printf@4eh 3 †ous vous —ppelez don™ 7s 3’n’n4D nomAY } return HY xous —ppelons deux fois l— fon™tion lireF €ourt—ntD vous —llez voir qu9on ne vous l—isse p—s t—per deux fois votre nom X en e'etD l— fon™tion fgets ne dem—nde p—s à l9utilis—teur de t—per du texte l— se™onde fois ™—r elle trouve du texte à ré™upérer d—ns le ˜u'er 3 uel est votre nom c te—n idou—rd el˜ert Ier eh 3 †ous vous —ppelez don™ te—n idou 3 eh 3 †ous vous —ppelez don™ —rd el˜er 3 ƒi l9utilis—teur t—pe trop de ™—r—™tèresD l— fon™tion fgets nous protège ™ontre le dé˜orE dement de mémoireD m—is il reste toujours des tr—™es du texte en trop d—ns le ˜u'erF sl f—ut vider le ˜u'erF yn v— don™ —méliorer notre petite fon™tion lire et —ppeler " si ˜esoin est " une sousEfon™tion viderfuffer pour f—ire en sorte que le ˜u'er soit vidé si on — rentré trop de ™—r—™tères X void viderfuffer@A { int ™ a HY while @™ 3a 9’n9 88 ™ 3a iypA { ™ a get™h—r@AY } } int lire@™h—r B™h—ineD int longueurA { ™h—r Bpositionintree a x…vvY if @fgets@™h—ineD longueurD stdinA 3a x…vvA { positionintree a str™hr@™h—ineD 9’n9AY if @positionintree 3a x…vvA { Bpositionintree a 9’H9Y } PVP .CHAPITRE 19.

CONVERTIR LA CHAÎNE EN NOMBRE else { viderfuffer@AY } return IY } } else { viderfuffer@AY return HY } we˜ X RTVWTU ¡ v— fon™tion lire —ppelle viderfuffer d—ns deux ™—s X ! si l— ™h—îne ét—it trop longue @on le s—it p—r™e qu9on n9— p—s trouvé de ™—r—™tère ’n d—ns l— ™h—îne ™opiéeA Y ! s9il y — eu une erreur @peu importe l—quelleAD il f—ut vider là —ussi le ˜u'er p—r sé™urité pour qu9il n9y —it plus rienF v— fon™tion viderfuffer est ™ourte m—is denseF ille lit d—ns le ˜u'er ™—r—™tère p—r ™—r—™tère grâ™e à get™h—rF gette fon™tion renvoie un int F yn se ™ontente de ré™upérer ™e int d—ns l— v—ri—˜le tempor—ire ™F yn ˜ou™le t—nt qu9on n9— p—s ré™upéré le ™—r—™tère ’n ou le sym˜ole iyp @(n de (™hierAD qui signi(ent tous deux  vous êtes —rrivé à l— (n du ˜u'er F yn s9—rrête don™ de ˜ou™ler dès que l9on tom˜e sur l9un de ™es deux ™—r—™tèresF g9est un peu ™ompliqué —u premier —˜ord et —ssez te™hniqueD m—is ç— f—it son tr—E v—ilF x9hésitez p—s à relire ™es expli™—tions plusieurs fois si né™ess—ire pour ™omprendre ™omment ç— fon™tionneF 3 £ ¢gode   Convertir la chaîne en nombre xotre fon™tion lire est m—inten—nt e0™—™e et ro˜usteD m—is elle ne s—it lire que du texteF †ous devez vous dem—nder X  w—is ™omment f—itEon pour ré™upérer un nom˜re c in f—itD lire est une fon™tion de ˜—seF eve™ fgetsD vous ne pouvez ré™upérer que du texteD m—is il existe d9—utres fon™tions qui permettent de ™onvertir ensuite un texte en nom˜reF strtol : convertir une chaîne en long ve prototype de l— fon™tion strtol est un peu p—rti™ulier X 3. Et non un char. peu importe. allez savoir pourquoi. PVQ .

CHAPITRE 19. LA SAISIE DE TEXTE SÉCURISÉE long strtol@ ™onst ™h—r Bst—rtD ™h—r BBendD int ˜—se AY v— fon™tion lit l— ™h—îne de ™—r—™tères que vous lui envoyez @st—rtA et ess—ie de l— ™onvertir en long en utilis—nt l— ˜—se indiquée @génér—lementD on tr—v—ille en ˜—se IH ™—r on utilise IH ™hi'res di'érents de H à WD don™ vous mettrez IHAF ille retourne le nom˜re qu9elle — réussi à lireF u—nt —u pointeur de pointeur endD l— fon™tion s9en sert pour renvoyer l— position du premier ™—r—™tère qu9elle — lu et qui n9ét—it p—s un nom˜reF yn ne s9en servir— p—sD on peut don™ lui envoyer x…vv pour lui f—ire ™omprendre qu9on ne veut rien ré™upérerF v— ™h—îne doit ™ommen™er p—r un nom˜reD tout le reste est ignoréF ille peut être pré™édée d9esp—™esF uelques exemples d9utilis—tion pour ˜ien ™omprendre le prin™ipe X long iY i a strtol@ 4IRV4D x…vvD IH AY GG i a IRV i a strtol@ 4IRVFPIS4D x…vvD IH AY GG i a IRV i a strtol@ 4 IRVFPIS4D x…vvD IH AY GG i a IRV i a strtol@ 4 IRVCQR4D x…vvD IH AY GG i a IRV i a strtol@ 4 IRV feuilles mortes4D x…vvD IH AY GG i a IRV i a strtol@ 4 sl y — IRV feuilles mortes4D x…vvD IH AY GG i a H @erreur X l— → ™h—îne ne ™ommen™e p—s p—r un nom˜reA „outes les ™h—înes qui ™ommen™ent p—r un nom˜re @ou éventuellement p—r des esp—™es suivis d9un nom˜reA seront ™onverties en long jusqu9à l— première lettre ou —u premier ™—r—™tère inv—lide @FD CD et™FAF v— dernière ™h—îne de l— liste ne ™ommenç—nt p—s p—r un nom˜reD elle ne peut p—s être ™onvertieF v— fon™tion strtol renverr— don™ HF yn peut ™réer une fon™tion lirevong qui v— —ppeler notre première fon™tion lire @qui lit du texteA et ensuite ™onvertir le texte s—isi en nom˜re X long lirevong@A { ™h—r nom˜re„exte‘IHH“ a {H}Y GG IHH ™—ses devr—ient suffire if @lire@nom˜re„exteD IHHAA { GG ƒi le™ture du texte okD ™onvertir le nom˜re en long et le retourner return strtol@nom˜re„exteD x…vvD IHAY } else { GG ƒi pro˜lème de le™tureD renvoyer H return HY } } £ ¢gode we˜ X PPHVHW ¡   PVR .

PVS . Ça se voit que ça a été codé par des Anglais.CONVERTIR LA CHAÎNE EN NOMBRE †ous pouvez tester d—ns un m—in très simple X int m—in@int —rg™D ™h—r B—rgv‘“A { long —ge a HY printf@4uel est votre —ge c 4AY —ge a lirevong@AY printf@4eh 3 †ous —vez don™ 7d —ns 3’n’n4D —geAY } return HY uel est votre —ge c IV eh 3 †ous —vez don™ IV —ns 3 strtod : convertir une chaîne en double v— fon™tion strtod est identique à strtolD à l— di'éren™e près qu9elle ess—ie de lire un nom˜re dé™im—l et renvoie un dou˜le X dou˜le strtod@ ™onst ™h—r Bst—rtD ™h—r BBend AY †ous noterez que le troisième p—r—mètre ˜—se — disp—ru i™iD m—is il y — toujours le pointeur de pointeur end qui ne nous sert à rienF gontr—irement à strtolD l— fon™tion prend ™ette fois en ™ompte le  point dé™im—lF ettentionD en rev—n™he X elle ne ™onn—ît p—s l— virgule F À vous de jouer 3 ərivez l— fon™tion lirehou˜leF †ous ne devriez —voir —u™un m—l à le f—ireD ™9est ex—™tement ™omme lirevong à p—rt que ™ette foisD on —ppelle strtod et on retourne un dou˜leF †ous devriez —lors pouvoir f—ire ™e™i d—ns l— ™onsole X 4 gom˜ien pesezEvous c TUFR eh 3 †ous pesez don™ TUFRHHHHH kg 3 iss—yez ensuite de modi(er votre fon™tion lirehou˜le pour qu9elle —™™epte —ussi le sym˜ole virgule ™omme sép—r—teur dé™im—lF v— te™hnique est simple X rempl—™ez l— virgule p—r un point d—ns l— ™h—îne de texte lue @grâ™e à l— fon™tion de re™her™he str™hrAD puis envoyez l— ™h—îne modi(ée à strtodF En résumé ! v— fon™tion s™—nfD ˜ien qu9en —pp—ren™e simple d9utilis—tionD est en f—it très ™omplexe et nous oppose ™ert—ines limitesF yn ne peut p—sD p—r exempleD é™rire plusieurs mots 4.

CHAPITRE 19. LA SAISIE DE TEXTE SÉCURISÉE à l— fois f—™ilementF ! …n buer overow survient lorsqu9on dép—sse l9esp—™e réservé en mémoireD p—r exemple si l9utilis—teur entre IH ™—r—™tères —lors qu9on n9—v—it réservé que S ™—ses en mémoireF ! v9idé—l est de f—ire —ppel à l— fon™tion fgets pour ré™upérer du texte s—isi p—r l9utilis—teurF ! sl f—ut en rev—n™he éviter à tout prix d9utiliser l— fon™tion gets qui n9o're p—s de prote™tion ™ontre le ˜u'er over)owF ! †ous pouvez é™rire votre propre fon™tion de s—isie du texte qui f—it —ppel à fgets ™omme on l9— f—it —(n d9—méliorer son fon™tionnementF PVT .

Troisième partie Création de jeux 2D en SDL PVU .

.

quand on débute. nous allons nous faire plaisir et pratiquer grâce à une bibliothèque que l'on appelle la SDL. vous avez appris à programmer en C ! . Vous avez déjà découvert la plupart des fonctionnalités du langage C. on n'a en général pas le sentiment de savoir programmer tant qu'on n'est pas  sorti  de la console. Nous allons dans ce premier chapitre en apprendre plus sur cette bibliothèque et découvrir comment l'installer.Chapitre 20 Diculté : Installation de la SDL À partir de maintenant. bien qu'il y ait toujours des petits détails complexes et croustillants à découvrir. La SDL est une bibliothèque particulièrement utilisée pour créer des jeux en 2D. ni la théorie : nous allons enn passer au concret ! Dans cette nouvelle et importante partie. Ce livre pourrait donc s'arrêter là en annonçant èrement :  C'est bon. Pourtant. PVW .

si vous voulez. par exemple. tiens c'est curieux ! PWH . Si vous voulez tout savoir sur la bibliothèque standard. Non ? Ah bon. Nous n'avons pas étudié la bibliothèque standard dans son intégralité mais nous en avons vu un assez gros morceau. si vous aimez la console on peut continuer longtemps. INSTALLATION DE LA SDL yn dit que l— ƒhv est une  ˜i˜liothèque tier™e F sl f—ut s—voir qu9il existe deux types de ˜i˜liothèquesF ! La bibliothèque standard X ™9est l— ˜i˜liothèque de ˜—se qui fon™tionne sur tous les yƒ @d9où le mot  st—nd—rd A et qui permet de f—ire des ™hoses très ˜—siques ™omme des printfF ille — été —utom—tiquement inst—llée lorsque vous —vez télé™h—rgé votre shi et votre ™ompil—teurF eu long des p—rties s et ssD nous —vons uniquement utilisé l— ˜i˜liothèque st—nd—rd @stdli˜FhD stdioFhD stringFhD timeFhF F FAF ! Les bibliothèques tierces X ™e sont des ˜i˜liothèques qui ne sont p—s inst—llées p—r déf—utF †ous devez les télé™h—rger sur snternet et les inst—ller sur votre ordin—E teurF gontr—irement à l— ˜i˜liothèque st—nd—rdD qui est rel—tivement simple et qui ™ontient —ssez peu de fon™tionsD il existe des milliers de ˜i˜liothèques tier™es é™rites p—r d9—utres progr—mmeursF gert—ines sont ˜onnesD d9—utres moinsD ™ert—ines sont p—y—ntesD d9—utres gr—tuitesD et™F l9idé—l ét—nt de trouver des ˜i˜liothèques de ˜onne qu—lité et gr—tuites à l— fois 3 te ne peux p—s f—ire un ™ours pour toutes les ˜i˜liothèques tier™es qui existentF wême en y p—ss—nt toute m— vie PRh G PRD je ne pourr—is p—s 3 t9—i don™ f—it le ™hoix de vous présenter une et une seule ˜i˜liothèque é™rite en g et don™ utilis—˜le p—r des progr—mmeurs en l—ng—ge g tels que vousF gette ˜i˜liothèque — pour nom SDLF €ourquoi —iEje ™hoisi ™ette ˜i˜liothèque plutôt qu9une —utre c ue permetEelle de f—ire c eut—nt de questions —uxquelles je v—is ™omE men™er p—r répondreF 1 Pourquoi avoir choisi la SDL ? Choisir une bibliothèque : pas facile ! gomme je vous l9—i dit à l9inst—ntD il existe des milliers et des milliers de ˜i˜liothèques à télé™h—rgerF gert—ines d9entre elles sont simplesD d9—utres plus ™omplexesF gert—ines sont tellement grosses que même tout un ™ours ™omme ™elui que vous êtes en tr—in de lire ne su0r—it p—s 3 p—ire un ™hoix est don™ durF he plusD ™9est l— première ˜i˜liothèque que vous —llez —pprendre à utiliser @si on ne ™ompte p—s l— ˜i˜liothèque st—nd—rdAD il v—ut don™ mieux ™ommen™er p—r une ˜i˜liothèque simpleF t9—i r—pidement ™onst—té que l— m—jorité de mes le™teurs souh—it—it dé™ouvrir ™omment ouvrir des fenêtresD ™réer des jeuxD et™F u—nt à moiD non seulement j9—i ˜ien envie de vous montrer ™omment on peut f—ire tout ç—D m—is en plus je tiens —˜solument à vous f—ire pr—tiquerF in e'etD nous —vons ˜ien f—it quelques „€ d—ns les p—rties s et ssD m—is 2 1.CHAPITRE 20. en tapant  C standard library . 2. . . Enn. et vous aurez la liste des prototypes ainsi qu'une brève explication de chacune des fonctions. faites une recherche sur Google.

Tout est relatif. il est possible de les utiliser en C++ ainsi que dans d'autres langages.POURQUOI AVOIR CHOISI LA SDL ? ™e n9est p—s —ssezF g9est en forge—nt que l9on devient forgeronD et ™9est en progr—mm—nt que euhF F F frefD vous m9—vez ™ompris 3 te suis don™ p—rti pour vous à l— re™her™he d9une ˜i˜liothèque à l— fois simple et puiss—nte pour que vous puissiez r—pidement ré—liser vos rêves les plus fous @presqueA s—ns douleur F 3 La SDL est un bon choix ! xous —llons étudier l— ˜i˜liothèque ƒhv @(gF PHFIAF €ourquoi ™elleE™i et non p—s une —utre c Figure PHFI ! vogo de l— ƒhv ! g9est une bibliothèque écrite en CD elle peut don™ être utilisée p—r des progr—mE meurs en g tels que vous F ! g9est une bibliothèque libre et gratuite X ™el— vous éviter— d9—voir à investir pour lire l— suite du livreF gontr—irement à ™e que l9on pourr—it penserD trouver des ˜i˜liothèques li˜res et gr—tuites n9est p—s très di0™ileD il en existe ˜e—u™oup —ujourd9huiF …ne ˜i˜liothèque li˜re est tout simplement une ˜i˜liothèque dont vous pouvez o˜tenir le ™ode sour™eF in ™e qui nous ™on™erneD voir le ™ode sour™e de l— ƒhv ne nous intéresser— p—sF „outefoisD le f—it que l— ˜i˜liothèque soit li˜re vous g—r—ntit plusieurs ™hosesD not—mment s— pérennité @si le développeur prin™ip—l —rrête de s9en o™™uperD d9—utres personnes pourront l— ™ontinuer à s— pl—™eA —insi que s— gr—tuité le plus souventF v— ˜i˜liothèque ne risque don™ p—s de disp—r—ître du jour —u lendem—inF ! Vous pouvez réaliser des programmes commerciaux et propriétaires avecF gertesD ™9est peutEêtre un peu trop vouloir —nti™iperD m—is —ut—nt ™hoisir une ˜i˜lioE thèque gr—tuite qui vous l—isse un m—ximum de li˜ertésF in e'etD il existe deux types de ˜i˜liothèques li˜res X ! les ˜i˜liothèques sous license GPL X elles sont gr—tuites et vous pouvez —voir le ™ode sour™eD m—is vous êtes o˜ligés en ™ontrep—rtie de fournir le ™ode sour™e des progr—mmes que vous ré—lisez —ve™ Y ! les ˜i˜liothèques sous license LGPL X ™9est l— même ™hoseD s—uf que ™ette fois vous n9êtes p—s o˜ligés de fournir le ™ode sour™e de vos progr—mmesF †ous pouvez don™ ré—liser des progr—mmes propriét—ires —ve™F 4 3. PWI . Notez que comme la plupart des bibliothèques écrites en C. bien sûr ! 4.

Il faudrait néanmoins faire quelques petites adaptations et peut-être utiliser un compilateur spécial. etc. Vous pourrez ainsi obtenir des conseils de programmeurs plus expérimentés que vous. Nous n'en parlerons pas ici. c'est vous qui choisirez de réaliser des programmes libres ou propriétaires. c'est surtout une question de mentalité. menus. PWP . INSTALLATION DE LA SDL Bien qu'il soit possible juridiquement de ne pas diuser votre code source. 6. je vous invite à vous renseigner plutôt sur GTK+. je vous invite à le faire quand même. Je ne rentrerai pas dans le débat ici. pas plus que je ne prendrai position : on peut tirer du bon comme du mauvais dans chacun de ces deux types de programmes. Si vous souhaitez développer des interfaces graphiques classiques sous forme de fenêtres (boutons.CHAPITRE 20. Après.). ! g9est une bibliothèque multi-plates-formesF ue vous soyez sous ‡indowsD w—™ ou vinuxD l— ƒhv fon™tionner— ™hez vousF g9est même d9—illeurs ™e qui f—it que ™ette ˜i˜liothèque est impressionn—nte —ux yeux des progr—mmeurs X elle fon™tionne sur un très gr—nd nom˜re de systèmes d9exploit—tionF sl y — ‡indowsD w—™ et vinux ™ertesD m—is elle peut —ussi fon™tionner sur et—riD emig—D ƒym˜i—nD hre—m™—stD et™F in ™l—irD vos progr—mmes pourr—ient très ˜ien fon™tionner sur de vieilles m—™hines ™omme l9et—ri 3 ! in(nD l— ˜i˜liothèque permet de faire des choses amusantesF te ne dis p—s qu9une ˜i˜liothèque m—thém—tique ™—p—˜le de résoudre des équ—tions du qu—trième degré n9est p—s intéress—nteD m—is je tiens à ™e que ™e ™ours soit ludique —ut—nt que possi˜le —(n de vous motiver à progr—mmerF v— ƒhv n9est p—s une ˜i˜liothèque spé™i—lement ™onçue pour ™réer des jeux vidéoF te l9—dmetsD l— plup—rt des progr—mmes utilis—nt l— ƒhv sont des jeux vidéoD m—is ™el— ne veut p—s dire que vous êtes for™ément o˜ligés d9en ™réerF e prioriD tout est possi˜le —ve™ plus ou moins de tr—v—ilD j9—i déjà eu l9o™™—sion de voir des éditeurs de texte développés à l9—ide de l— ƒhvD ˜ien qu9il y —it plus —d—pté F 5 6 Les possibilités oertes par la SDL v— ƒhv est une ˜i˜liothèque ˜—s nive—uF †ous vous souvenez de ™e que je vous —v—is dit —u tout dé˜ut du ™ours à propos des l—ng—ges h—ut nive—u et ˜—s nive—u c ih ˜ien ç— s9—pplique —ussi —ux ˜i˜liothèquesF ! Une bibliothèque bas niveau X ™9est une ˜i˜liothèque dispos—nt de fon™tions très ˜—siquesF sl y — en génér—l peu de fon™tions ™—r on peut tout f—ire —ve™ ellesF gomme les fon™tions restent ˜—siquesD elles sont très r—pidesF ves progr—mmes ré—lisés à l9—ide d9une telle ˜i˜liothèque sont don™ en génér—l ™e qui se f—it de plus r—pideF ! Une bibliothèque haut niveau X elle possède ˜e—u™oup de fon™tions ™—p—˜les d9exé™uter de nom˜reuses —™tionsF gel— l— rend plus simple d9utilis—tionF „outefoisD une ˜i˜liothèque de ™e genre est génér—lement  grosse D don™ plus di0™ile à étudier et à ™onn—ître intégr—lementF in outreD elle est souvent plus lente qu9une ˜i˜liothèque ˜—s nive—u @˜ien que p—rfoisD ç— ne soit p—s vr—iment visi˜leAF fien entenduD il f—ut nu—n™erF yn ne peut p—s dire  une ˜i˜liothèque ˜—s nive—u est mieux qu9une ˜i˜liothèque h—ut nive—u ou l9inverseF gh—™un des deux types présente 5. Cela vous permettra de vous améliorer.

POURQUOI AVOIR CHOISI LA SDL ? des qu—lités et des déf—utsF v— ƒhv que nous —llons étudier f—it plutôt p—rtie des ˜i˜liothèques ˜—s nive—uF sl f—ut don™ retenir que l— ƒhv propose surtout des fon™tions ˜—siquesF †ous —vez p—r exemple l— possi˜ilité de dessiner pixel p—r pixelD de dessiner des re™t—ngles ou en™ore d9—0™her des im—gesF g9est toutD et ™9est su0s—ntF ! in f—is—nt ˜ouger une im—geD vous pouvez f—ire se dépl—™er un personn—geF ! in —0™h—nt plusieurs im—ges d9—0léeD vous pouvez ™réer une —nim—tionF ! in ™om˜in—nt plusieurs im—ges ™ôte à ™ôteD vous pouvez ™réer un vérit—˜le jeuF €our vous donner une idée de jeu ré—lis—˜le —ve™ l— ƒhvD s—™hez que l9ex™ellent  giviE liz—tion X g—ll to power — été —d—pté pour vinux à l9—ide de l— ˜i˜liothèque ƒhv @(gF PHFPAF Figure PHFP ! ve jeu giviliz—tion X g—ll to power utilise l— ƒhv ge qu9il f—ut ˜ien ™omprendreD ™9est qu9en f—it tout dépend de vous et éventuellement de votre équipeF †ous pouvez f—ire des jeux en™ore plus ˜e—ux si vous —vez un gr—phiste doué sous l— m—inF v— seule limite de l— ƒhvD ™9est l— PhF ille n9est en e'et p—s ™onçue pour l— QhF †oi™i une liste de jeux que l9on peut p—rf—itement ™on™evoir en ƒhv @™e n9est qu9une petite listeD tout est possi˜le — priori t—nt que ç— reste de l— PhA X ! g—sseE˜riques Y ! fom˜erm—n Y ! „etris Y ! jeux de pl—teEforme X ƒuper w—rio frosD ƒoni™D ‚—ym—nF F F ! ‚€q Ph X eld—D les premiers pin—l p—nt—syD et™F PWQ .

CHAPITRE 20. INSTALLATION DE LA SDL

sl m9est impossi˜le de f—ire une liste ™omplèteD l— seule limite i™i ét—nt l9im—gin—tionF t9—i d9—illeurs vu un des le™teurs de ™e ™ours ré—liser un ™roisement osé entre un ™—sseE ˜riques et un „etrisF ‚edes™endons sur „erre et reprenons le (l de ™e ™oursF xous —llons m—inten—nt inst—ller l— ƒhv sur notre ordin—teur —v—nt d9—ller plus loinF

Téléchargement de la SDL
ve site de l— ƒhv @wwwFli˜sdlForgA devr—it ˜ientôt devenir in™ontourn—˜le pour vousF vàE˜—sD vous trouverez tout ™e dont vous —vez ˜esoinD en p—rti™ulier l— ˜i˜liothèque elleEmême à télé™h—rger —insi que s— do™ument—tionF   £ ¢gode we˜ X RVHUPR ¡ ƒur le site de l— ƒhvD rendezEvous d—ns le menu à g—u™heD se™tion hownlo—dF „élé™h—rgez l— version de l— ƒhv l— plus ré™ente que vous voyez F v— p—ge de télé™h—rgement est sép—rée en plusieurs p—rtiesF ! Source code X vous pouvez télé™h—rger le ™ode sour™e de l— ƒhvF gomme je vous l9—i ditD le ™ode sour™e ne nous intéresse p—sF te s—is que vous êtes ™urieux et que vous voudriez s—voir ™omment ™9est f—it à l9intérieurD m—is —™tuellement ç— ne vous —pporter— rienF €ireD ç— vous em˜rouiller— et ™e n9est p—s le ˜utF ! Runtime libraries X ™e sont les (™hiers que vous —urez ˜esoin de distri˜uer en même temps que votre exé™ut—˜le lorsque vous donnerez votre progr—mme à d9—utres personnesF ƒous ‡indowsD il s9—git tout simplement d9un (™hier ƒhvFdllF geluiE™i devr— se trouver X ! soit d—ns le même dossier que l9exé™ut—˜le @™e que je re™omm—nde A Y ! soit d—ns le dossier ™:’‡indowsF ! Development libraries X ™e sont les (™hiers F— @ou Fli˜ sous †isu—lA et Fh vous permett—nt de ™réer des progr—mmes ƒhvF ges (™hiers ne sont né™ess—ires que pour vousD le progr—mmeurF †ous n9—urez don™ p—s à les distri˜uer —ve™ votre progr—mme une fois qu9il ser— (niF ƒi vous êtes sous ‡indowsD on vous propose trois versions dépend—nt de votre ™ompil—teur X ! †gT X pour ™eux qui utilisent †isu—l ƒtudio p—y—nt d—ns une vieille version @™e qui — peu de ™h—n™es de vous ™on™ernerA Y vous y trouverez des (™hiers Fli˜ Y ! †gV X pour ™eux qui utilisent †isu—l ƒtudio PHHS ixpress ou ultérieur Y vous y trouverez des (™hiers Fli˜ Y ! mingwQP X pour ™eux qui utilisent gode: :flo™ks @il y —ur— don™ des (™hiers F—AF v— p—rti™ul—ritéD ™9est que les  hevelopment li˜r—ries ™ontiennent tout ™e qu9il f—ut X les Fh et F— @ou Fli˜A ˜ien sûrD m—is —ussi l— ƒhvFdll à distri˜uer —ve™ votre —ppli™—tion —insi que l— do™ument—tion de l— ƒhv 3 frefD tout ™e que vous —vez à f—ire —u (n—l est
7 8

7. SDL 1.2 au moment où j'écris ces lignes. 8. L'idéal est de toujours donner la DLL avec votre exécutable et de la laisser dans le même 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 problèmes de conits de version si vous écrasez une DLL plus récente.

PWR

CRÉER UN PROJET SDL

de télé™h—rger les  hevelopment li˜r—ries 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 do™ument—tionD ™9est l— liste ™omplète des fon™tions d9une ˜i˜liothèqueF „outes les do™ument—tions sont é™rites en —ngl—is @ouiD même les ˜i˜liothèques é™rites p—r des pr—nç—is ont leur do™ument—tion en —ngl—isAF †oilà une r—ison de plus pour progresser d—ns l— l—ngue de ƒh—kespe—re 3 v— do™ument—tion n9est p—s un ™oursD elle est en génér—l —ssez —ustèreF v9—v—nt—ge p—r r—pport à un ™oursD ™9est qu9elle est ™omplèteF ille ™ontient l— liste de toutes les fon™tionsD ™9est don™ ve référen™e du progr—mmeurF fien souventD vous ren™ontrerez des ˜i˜liothèques pour lesquelles il n9y — p—s de ™oursF †ous —urez uniquement l—  do™9 ™omme on l9—ppelleD et vous devrez être ™—p—˜les de vous dé˜rouiller —ve™ seulement ç— @même si p—rfois ™9est un peu dur de dém—rrer s—ns —ideAF …n vr—i ˜on progr—mmeur peut don™ dé™ouvrir le fon™tionnement d9une ˜i˜liothèque uniquement en lis—nt s— do™9F e prioriD vous n9—urez p—s ˜esoin de l— do™9 de l— ƒhv de suite ™—r je v—is moiEmême vous expliquer ™omment elle fon™tionneF „outefoisD ™9est ™omme pour l— ˜i˜liothèque st—nd—rd X je ne pourr—i p—s vous p—rler de toutes les fon™tionsF †ous —urez don™ ™erE t—inement ˜esoin de lire l— do™9 plus t—rdF v— do™ument—tion se trouve déjà d—ns le p—™k—ge  hevelopment li˜r—ries D m—is si vous le voulez vous pouvez l— télé™h—rger à p—rt en vous rend—nt d—ns le menu ho™ument—tion G hownlo—d—˜leF te vous re™omm—nde de pl—™er les (™hiers r„wv de l— do™ument—tion d—ns un dossier spé™i—l @intitulé p—r exemple ho™ ƒhvA et de f—ire un r—™™our™i vers le somm—ire indexFhtmlF ve ˜ut est que vous puissiez —™™éder r—pidement à l— do™ument—tion lorsque vous en —vez ˜esoinF

Créer un projet SDL
v9inst—ll—tion d9une ˜i˜liothèque est en génér—l un petit peu plus ™ompliquée que les inst—ll—tions dont vous —vez l9h—˜itudeF s™iD il n9y — p—s d9inst—lleur —utom—tique qui vous dem—nde simplement de ™liquer sur ƒuiv—nt E ƒuiv—nt E ƒuiv—nt E „erminerF in génér—lD inst—ller une ˜i˜liothèque est —ssez di0™ile pour un dé˜ut—ntF €ourt—ntD si ç— peut vous remonter le mor—lD l9inst—ll—tion de l— ƒhv est ˜e—u™oup plus simple que ˜ien d9—utres ˜i˜liothèques que j9—i eu l9o™™—sion d9utiliser @en génér—l on ne vous donne que le ™ode sour™e de l— ˜i˜liothèqueD et ™9est à vous de l— re™ompiler 3AF in f—itD le mot  inst—ller n9est peutEêtre p—s ™elui qui ™onvient le mieuxF xous n9—llons PWS

CHAPITRE 20. INSTALLATION DE LA SDL

rien inst—ller du tout X nous voulons simplement —rriver à ™réer un nouve—u projet de type ƒhv —ve™ notre shiF yrD selon l9shi que vous utilisez l— m—nipul—tion ser— un peu di'érenteF te v—is présenter l— m—nipul—tion pour ™h—™un des shi que je vous —i présentés —u dé˜ut du ™ours pour que tout le monde puisse suivreF te v—is m—inten—nt vous montrer ™omment ™réer un projet ƒhv sous ™h—™un de ™es trois shiF

Création d'un projet SDL sous Code: :Blocks
1/ Extraction des chiers de la SDL

yuvrez le (™hier ™ompressé de  hevelopment vi˜r—ries que vous —vez télé™h—rgéF ge (™hier est un Fzip pour †isu—l et un Ft—rFgz pour mingwQP @il vous f—udr— un logi™iel ™omme ‡inr—r ou UEip pour dé™ompresser le Ft—rFgzAF ve (™hier ™ompressé ™ontient plusieurs sousEdossiersF geux qui nous intéressent sont les suiv—nts X ! ˜in X ™ontient l— Fdll de l— ƒhv Y ! do™s X ™ontient l— do™ument—tion de l— ƒhv Y ! in™lude X ™ontient les Fh Y ! li˜ X ™ontient les F— @ou Fli˜ pour †isu—lAF †ous devez extr—ire tous ™es (™hiers et dossiers quelque p—rt sur votre disque durF †ous pouvez p—r exemple les pl—™er d—ns le dossier de gode: :flo™ksD d—ns un sousEdossier ƒhv @(gF PHFQAF h—ns mon ™—sD l— ƒhv ser— inst—llée d—ns le dossier X ‚etenez ˜ien le nom du dossier d—ns lequel vous l9—vez inst—lléeD vous —llez en —voir ˜esoin pour ™on(gurer gode: :flo™ksF w—inten—ntD il v— f—lloir f—ire une petite m—nipul—tion pour simpli(er l— suiteF ellez d—ns le sousEdossier in™ludeGƒhv F †ous devriez y voir de nom˜reux petits (™hiers FhF gopiezEles d—ns le dossier p—rentD ™9estEàEdire d—ns X
9

g:’€rogr—m piles’godeflo™ks’ƒhvEIFPFIQ

v— ƒhv est inst—llée 3 sl f—ut m—inten—nt ™on(gurer gode: :flo™ksF
2/ Création du projet SDL

g:’€rogr—m piles’godeflo™ks’ƒhvEIFPFIQ’in™lude

yuvrez m—inten—nt gode: :flo™ks et dem—ndez à ™réer un nouve—u projetF eu lieu de ™réer un projet gonsole eppli™—tion ™omme vous —viez l9h—˜itude de f—ireD vous —llez dem—nder à ™réer un projet de type ƒhv proje™tF v— première fenêtre de l9—ssist—nt qui —pp—r—ît ne sert à rienD ™liquez sur xextF yn vous
9. Dans mon cas, il se trouve dans C:\Program Files\CodeBlocks\SDL-1.2.13\include\SDL.

PWT

CRÉER UN PROJET SDL

Figure PHFQ ! ve dossier de l— ƒhv dézippé

dem—nde ensuite le nom de votre projet et le dossier d—ns lequel il doit être pl—™éD ™omme vous l9—vez toujours f—it @(gF PHFRAF

Figure PHFR ! essist—nt ƒhv et nom de projet

PWU

CHAPITRE 20. INSTALLATION DE LA SDL

†ient ensuite l— p—rtie où vous devez indiquer où se trouve inst—llée l— ƒhv @(gF PHFSAF

Figure PHFS ! essist—nt ƒhv et ™on(gur—tion

gliquez sur le ˜outon FFF à droiteF …ne nouvelle fenêtre un peu ™omplexe s9ouvre @(gF PHFTAF

Figure PHFT ! vo™—lis—tion de l— ƒhv

†ous devez simplement remplir le ™h—mp nommé ˜—seF sndiquez le dossier où vous —vez PWV

CRÉER UN PROJET SDL

dé™ompressé l— ƒhvF h—ns mon ™—sD ™9est X
g:’€rogr—m piles’godeflo™ks’ƒhvEIFPFIQ

gliquez sur gloseF …ne nouvelle fenêtre —pp—r—îtF g9est une fenêtreEpiège @dont je n9—i toujours p—s s—isi l9intérêtAF ille vous dem—nde un dossierF gliquez sur ennuler pour ne rien f—ireF gliquez ensuite sur xext d—ns l9—ssist—ntD puis ™hoisissez de ™ompiler en mode ‚ele—se ou he˜ug @peu importeA et en(nD ™hoisissez pinishF gode: :flo™ks v— ™réer un petit projet ƒhv de test ™ompren—nt un m—inF™ et un (™hier F˜mpF ev—nt d9ess—yer de le ™ompilerD ™opiez l— hvv de l— ƒhv d—ns le dossier de votre projetF iss—yez ensuite de ™ompiler X une fenêtre —ve™ une im—ge devr—it s9—0™herF fr—voD ç— fon™tionne 3
10

Si on vous dit  Cette application n'a pas pu démarrer car SDL.dll est introuvable , c'est que vous n'avez pas copié le chier ƒhvFdll dans le dossier de votre projet ! Il faudra penser à fournir cette Fdll en plus de votre Fexe à vos amis si vous voulez qu'ils puissent eux aussi exécuter le programme. En revanche, vous n'avez pas besoin de leur joindre les Fh et F— qui n'intéressent que vous.

†ous pouvez supprimer le F˜mp du progr—mmeD on n9en —ur— p—s ˜esoinF u—nt —u (™hier m—inF™D il est un peu longD on ne v— p—s dém—rrer —ve™ ç—F ƒupprimez tout son ™ontenu et rempl—™ezEle p—r X
5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb int m—in@int —rg™D ™h—r B—rgv‘“A { } return HY

we˜ X SUVWQH ¡ g9est en f—it un ™ode de ˜—se très simil—ire à ™eux que l9on ™onn—ît @un in™lude de stdli˜D un —utre de stdioD un m—inF F FAF v— seule ™hose qui ™h—ngeD ™9est le in™lude d9un (™hier ƒhvFhF g9est le (™hier Fh de ˜—se de l— ƒhv qui se ™h—rger— d9in™lure tous les —utres (™hiers Fh de l— ƒhvF
10. Vous devriez l'avoir copiée dans C:\Program Files\CodeBlocks\SDL-1.2.13\bin\SDL.dll.

£ ¢gode

 

PWW

CHAPITRE 20. INSTALLATION DE LA SDL

Création d'un projet SDL sous Visual C++
1/ Extraction des chiers de la SDL

ƒur le site de l— ƒhvD télé™h—rgez l— dernière version de l— ƒhvF h—ns l— se™tion  heE velopment vi˜r—ries D prenez l— version pour †isu—l gCC PHHS ƒervi™e €—™k IF yuvrez le (™hier zipF sl ™ontient l— do™9 @dossier do™sAD les Fh @dossier in™ludeAD et les Fli˜ @dossier li˜A qui sont l9équiv—lent des F— pour le ™ompil—teur de †isu—lF †ous trouverez —ussi le (™hier ƒhvFdll d—ns ™e dossier li˜F ! gopiez ƒhvFdll d—ns le dossier de votre projetF ! gopiez les Fli˜ d—ns le dossier li˜ de †isu—l gCCF €—r exemple ™hez moi il s9—git du dossier X g:’€rogr—m piles’wi™rosoft †isu—l ƒtudio V’†g’li˜F ! gopiez les Fh d—ns le dossier in™ludes de †isu—l gCCF gréez un dossier ƒhv d—ns ™e dossier in™ludes pour regrouper les Fh de l— ƒhv entre euxF ghez moiD je mets don™ les Fh d—ns X g:’€rogr—m piles’wi™rosoft †isu—l ƒtudio V’†g’in™lude’ƒhvF
2/ Création d'un nouveau projet SDL

ƒous †isu—l gCCD ™réez un nouve—u projet de type eppli™—tion ™onsole ‡inQPF eppelez votre projet testsdl p—r exempleF gliquez sur yuF …n —ssist—nt v— s9ouvrirF ellez d—ns €—r—mètres de l9—ppli™—tion et véri(ez que €rojet vide est ™o™hé @(gF PHFUAF

Figure PHFU ! go™hez €rojet

vide

ve projet est —lors ™rééF sl est videF ejoutezEy un nouve—u (™hier en f—is—nt un ™li™ droit QHH

CRÉER UN PROJET SDL

sur pi™hiers

sour™esD ejouter

G xouvel

élément

@(gF PHFVAF

Figure PHFV ! ejout d9un nouve—u (™hier

h—ns l— fenêtre qui s9ouvreD dem—ndez à ™réer un nouve—u (™hier de type pi™hier gCC @F™ppA que vous —ppellerez m—inF™F in utilis—nt l9extension F™ d—ns le nom du (™hierD †isu—l ™réer— un (™hier F™ et non un (™hier F™ppF ərivez @ou ™opiezE™ollezA le ™ode  de ˜—se mentionné pré™édemment d—ns votre nouve—u (™hier videF
3/ Conguration du projet SDL sous Visual C++

v— ™on(gur—tion du projet est un peu plus déli™—te que pour gode: :flo™ksD m—is elle reste hum—inement f—is—˜leF ellez d—ns les propriétés de votre projet X €rojet G €ropriétés de testsdlF ! h—ns l— se™tion g G gCC ab qénér—tion de ™odeD mettez le ™h—mp fi˜liothèque runtime à hvv multithre—d @GwhAF ! h—ns l— se™tion gGgCC ab ev—n™éD séle™tionnez gompil—tion sous et optez pour l— v—leur gompiler ™omme ™ode g @G„gA @sinon †isu—l vous ™ompiler— votre projet ™omme ét—nt du gCCAF ! h—ns l— se™tion Éditeur de liens ab intréeD modi(ez l— v—leur de hépend—n™es supplément—ires pour y —jouter ƒhvFli˜ ƒhvm—inFli˜F ! h—ns l— se™tion Éditeur de liens ab ƒystèmeD modi(ez l— v—leur de ƒousEsystème et mettezEl— à ‡indows @(gF PHFWAF †—lidez ensuite vos modi(™—tions en ™liqu—nt sur yu et enregistrez le toutF †ous pouvez m—inten—nt ™ompiler en —ll—nt d—ns le menu qénérer G qénérer l— solutionF ‚endezEvous d—ns le dossier de votre projet pour y trouver votre exé™ut—˜le @il ser— peutEêtre d—ns un sousEdossier he˜ugAF x9ou˜liez p—s que le (™hier ƒhvFdll doit se trouver d—ns le même dossier que l9exé™ut—˜leF hou˜leE™liquez sur votre Fexe X si tout v— ˜ienD il ne devr—it rien se p—sserF ƒinonD s9il y — une erreur ™9est pro˜—˜lement que le (™hier ƒhvFdll ne se trouve p—s d—ns le même dossierF QHI

CHAPITRE 20. INSTALLATION DE LA SDL

Figure PHFW ! gon(gur—tion de †isu—l pour l— ƒhv

Création d'un projet SDL avec Xcode (Mac OS X)
gette se™tion — été à l9origine rédigée p—r guimersV du ƒite du éroD que je remer™ie à nouve—u —u p—ss—geF gommen™ez p—r télé™h—rger l— version de l— ƒhv sur le site o0™ielF ve (™hier doit —voir l9extension FdmgF wontez @™h—rgezA ™e (™hier FdmgD prenez le dossier Ffr—mework @p—r exemple X ƒhvFfr—meworkA et pl—™ezEle d—ns le dossier X
`‚—™ine hisquebGfi˜liothèqueGpr—meworks

…n dossier Ffr—mework est un dossier ™onten—nt tous les (™hiers né™ess—iresD ™omme les ˜in—ires de l— ƒhv et les he—ders @(gF PHFIHAF

Figure PHFIH ! ves fr—meworks d—ns leur dossier

ellez d—ns l9—r™hive de l— ƒhv @ƒhvEIFPFIIFdmgAD puis d—ns le dossier develElite et QHP

CRÉER UN PROJET SDL

prenez les (™hiers ƒhvw—inFm et ƒhvw—inFhF €l—™ezEles en lieu sûrF sl v— f—lloir ré™upérer un (™hier supplément—ireD m—inten—nt X ƒhvEIFPFIPEextr—sFdmg que vous trouverez sur le site de l— ƒhvF sl est ™omposé de deux dossiers X ! „empl—tespor€roje™tfuilder ! „empl—tesporˆ™ode gopiezEles d—ns X
w—™intosh rhGheveloperGvi˜r—ryGˆ™odeG€roje™t „empl—tesG

v9—ssist—nt de ™ré—tion de nouve—u projet de ˆgode vous proposer— —lors de ™réer une ƒhv eppli™—tion @(gF PHFIIAF

Figure PHFII ! ˆgode propose de ™réer un projet ƒhv

it voilàD votre projet est ™réé 3

Et sous Linux ?
ƒi vous ™ompilez sous vinux —ve™ un shiD il f—udr— modi(er les propriétés du projet @l— m—nipul—tion ser— qu—siment l— mêmeAF ƒi vous utilisez gode: :flo™ks @qui existe —ussi en version vinuxA vous pouvez suivre l— même pro™édure que ™elle que j9—i dé™rite plus h—utF
Et pour ceux qui compilent à la main ?

sl y en — peutEêtre p—rmi vous qui ont pris l9h—˜itude de ™ompiler à l— m—in sous vinux à l9—ide d9un Makele @(™hier ™omm—nd—nt l— ™ompil—tionAF ƒi ™9est votre ™—sD je vous invite à télé™h—rger un Makele que vous pouvez utiliser pour ™ompiler des projets ƒhvF £   ¢gode we˜ X TIWSPS ¡ v— seule ™hose un peu p—rti™ulièreD ™9est l9—jout de l— ˜i˜liothèque ƒhv pour le linker @vhpveqƒAF sl f—udr— que vous —yez télé™h—rgé l— ƒhv version vinux et que vous l9—yez inst—llée d—ns le dossier de votre ™ompil—teurD de l— même m—nière qu9on le f—it sous ‡indows @dossiers in™ludeGƒhv et li˜A insuiteD vous pourrez utiliser les ™omm—ndes suiv—ntes d—ns l— ™onsole X QHQ

CHAPITRE 20. INSTALLATION DE LA SDL m—ke 5€our ™ompiler le projet m—ke ™le—n 5€our eff—™er les fi™hiers de ™ompil—tion @Fo inutilesA m—ke mrproper 5€our tout supprimer s—uf les fi™hiers sour™e En résumé ! v— ƒhv est une ˜i˜liothèque de ˜—s nive—u qui permet d9ouvrir des fenêtres et d9y f—ire des m—nipul—tions gr—phiques en PhF ! ille n9est p—s inst—llée p—r déf—utD il f—ut l— télé™h—rger et ™on(gurer votre shi pour l9utiliserF ! ille est li˜re et gr—tuiteD ™e qui vous permet de l9utiliser r—pidement et vous g—r—ntit s— pérennitéF ! sl existe des milliers d9—utres ˜i˜liothèques dont ˜e—u™oup sont de très ˜onne qu—litéF g9est l— ƒhv qui — été séle™tionnée pour l— suite de ™e ™ours pour son —spe™t ludiqueF ƒi vous souh—itez développer des interf—™es ™omplètes —ve™ menus et ˜outons p—r l— suiteD je vous invite à vous pen™her sur l— ˜i˜liothèque q„uC p—r exempleF QHR .

Celui-ci est toutefois encore très vide. Nous allons poser les bases de la programmation en C avec la SDL. Vous l'avez normalement téléchargée et vous êtes capables de créer un nouveau projet SDL valide sans aucun problème. Nous attaquons le vif du sujet dès ce chapitre. Comment charger la SDL ? Comment ouvrir une fenêtre aux dimensions désirées ? Comment dessiner à l'intérieur de la fenêtre ? Nous avons du pain sur la planche. nous avons fait un petit tour d'horizon de la SDL pour découvrir les possibilités que cette bibliothèque nous ore. Allons-y ! QHS .Chapitre 21 Diculté : Création d'une fenêtre et de surfaces D ans le chapitre précédent.

CRÉATION D'UNE FENÊTRE ET DE SURFACES Charger et arrêter la SDL …n gr—nd nom˜re de ˜i˜liothèques é™rites en g né™essitent d9être initi—lisées et fermées p—r des —ppels à des fon™tionsF v— ƒhv n9é™h—ppe p—s à l— règleF in e'etD l— ˜i˜liothèque doit ™h—rger un ™ert—in nom˜re d9inform—tions d—ns l— mémoire pour pouvoir fon™tionner ™orre™tementF ges inform—tions sont ™h—rgées en mémoire dyE n—miquement p—r des m—llo™ @ils sont très utiles i™i 3AF yrD ™omme vous le s—vezD qui dit m—llo™ ditF F F free 3 †ous devez li˜érer l— mémoire que vous —vez —llouée m—nuellement et dont vous n9—vez plus ˜esoinF ƒi vous ne le f—ites p—sD votre progr—mme v— prendre plus de pl—™e en mémoire que né™ess—ireD et d—ns ™ert—ins ™—s ç— peut être ™—rrément ™—t—strophique F †oi™i don™ les deux premières fon™tions de l— ƒhv à ™onn—ître X ! ƒhv•snit X ™h—rge l— ƒhv en mémoire @des m—llo™ y sont f—itsA Y ! ƒhv•uit X li˜ère l— ƒhv de l— mémoire @des free y sont f—itsAF v— toute première ™hose que vous devrez f—ire d—ns votre progr—mme ser— don™ un —ppel à ƒhv•snitD et l— dernière un —ppel à ƒhv•uitF 1 SDL_Init : chargement de la SDL v— fon™tion ƒhv•snit prend un p—r—mètreF †ous devez indiquer quelles p—rties de l— ƒhv vous souh—itez ™h—rgerF Ah bon. la SDL est composée de plusieurs parties ? ih oui 3 sl y — une p—rtie de l— ƒhv qui gère l9—0™h—ge à l9é™r—nD une —utre qui gère le sonD et™F v— ƒhv met à votre disposition plusieurs ™onst—ntes pour que vous puissiez indiquer quelle p—rtie vous —vez ˜esoin d9utiliser d—ns votre progr—mme @t—˜F PIFIAF ƒi vous —ppelez l— fon™tion ™omme ™e™i X ƒhv•snit@ƒhv•sxs„•†shiyAY F F F —lors le système vidéo ser— ™h—rgé et vous pourrez ouvrir une fenêtreD y dessinerD et™F in f—itD tout ™e que vous f—ites ™9est envoyer un nom˜re à ƒhv•snit à l9—ide d9une ™onst—nteF †ous ne s—vez p—s de quel nom˜re il s9—gitD et justement ™9est ç— qui est ˜ienF †ous —vez juste ˜esoin d9é™rire l— ™onst—nteD ™9est plus f—™ile à lire et à retenirF v— fon™tion ƒhv•snit reg—rder— le nom˜re qu9elle reçoit et en fon™tion de ™el—D elle s—ur— quels systèmes elle doit ™h—rgerF 1. Imaginez que vous fassiez une boucle innie de malloc sans le faire exprès : en quelques secondes.CHAPITRE 21. vous saturerez toute votre mémoire ! QHT .

C'est quelque chose que vous rencontrerez assez souvent. Retenez bien qu'on utilise la barre verticale | pour combiner les options. QHU . Dois-je utiliser ƒhv•sxs„•i†i‚‰„rsxq ? †ous n9—llez p—s utiliser ƒhv•sxs„•i†i‚‰„rsxq juste p—r™e que vous —vez ˜esoin de deux modulesD p—uvres fous 3 reureusementD on peut ™om˜iner les options à l9—ide du sym˜ole | @l— ˜—rre verti™—leAF GG gh—rgement de l— vidéo et de l9—udio ƒhv•snit@ƒhv•sxs„•†shiy | ƒhv•sxs„•e…hsyAY †ous pouvez —ussi en ™om˜iner trois s—ns pro˜lème X GG gh—rgement de l— vidéoD de l9—udio et du timer ƒhv•snit@ƒhv•sxs„•†shiy | ƒhv•sxs„•e…hsy | ƒhv•sxs„•„swi‚AY Ces  options  que l'on envoie à ƒhv•snit sont aussi appelées ags . Ça agit un peu comme une addition.CHARGER ET ARRÊTER LA SDL Constante gh—rge le système d9—0™h—ge @vidéoAF g9est l— p—rtie que nous ™h—rgerons le plus souventF ƒhv•sxs„•e…hsy gh—rge le système de sonF †ous permettr— don™ p—r exemple de jouer de l— musiqueF ƒhv•sxs„•gh‚yw gh—rge le système de ghE‚ywF †ous permettr— de m—niE puler votre le™teur de ghE‚yw ƒhv•sxs„•ty‰ƒ„sgu gh—rge le système de gestion du joysti™kF ƒhv•sxs„•„swi‚ gh—rge le système de timerF gel— vous permet de gérer le temps d—ns votre progr—mme @très pr—tiqueAF ƒhv•sxs„•i†i‚‰„rsxq gh—rge tous les systèmes listés ™iEdessus à l— foisF Table PIFI ! viste des ™onst—ntes de ™h—rgement de l— ƒhv ƒhv•sxs„•†shiy Description w—inten—ntD si vous f—ites X ƒhv•snit@ƒhv•sxs„•i†i‚‰„rsxqAY F F F vous ™h—rgez tous les sytèmes de l— ƒhvF xe f—ites ™el— que si vous —vez vr—iment ˜esoin de toutD il est inutile de sur™h—rger votre ordin—teur en ™h—rge—nt des modules dont vous ne vous servirez p—sF Supposons que je veuille charger l'audio et la vidéo seulement.

CHAPITRE 21. CRÉATION D'UNE FENÊTRE ET DE SURFACES SDL_Quit : arrêt de la SDL v— fon™tion ƒhv•uit est très simple à utiliser vu qu9elle ne prend p—s de p—r—mètre X ƒhv•uit@AY „ous les systèmes initi—lisés seront —rrêtés et li˜érés de l— mémoireF frefD ™9est un moyen de quitter l— ƒhv proprementD à f—ire à l— (n de votre progr—mmeF Canevas de programme SDL in résuméD voi™i à quoi v— ressem˜ler votre progr—mme ƒhv d—ns s— version l— plus simple X 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•snit@ƒhv•sxs„•†shiyAY GG hém—rr—ge de l— ƒhv @i™i X ™h—rgement du → système vidéoA GB v— ƒhv est ™h—rgéeF †ous pouvez mettre i™i le ™ontenu de votre progr—mme BG ƒhv•uit@AY GG errêt de l— ƒhv @li˜ér—tion de l— mémoireAF } return HY we˜ X QSUHWT ¡ fien entenduD —u™un progr—mme  sérieux ne tiendr— d—ns le m—inF ge que je f—is là est s™hém—tiqueF h—ns l— ré—litéD votre m—in ™ontiendr— ™ert—inement de nom˜reux —ppels à des fon™tions qui feront elles —ussi plusieurs —ppels à d9—utres fon™tionsF ge qui ™ompte —u (n—lD ™9est que l— ƒhv soit ™h—rgée —u dé˜ut et qu9elle soit fermée à l— (n qu—nd vous n9en —vez plus ˜esoinF £ ¢gode   Gérer les erreurs v— fon™tion ƒhv•snit renvoie une v—leur X ! EI en ™—s d9erreur Y ! H si tout s9est ˜ien p—sséF QHV .

£ ¢gode   QHW .txt tandis que sous Linux.CHARGER ET ARRÊTER LA SDL †ous n9y êtes p—s o˜ligésD m—is vous pouvez véri(er l— v—leur retournée p—r ƒhv•snitF Ǘ peut être un ˜on moyen de tr—iter les erreurs de votre progr—mme et don™ de vous —ider à les résoudreF Mais comment acher l'erreur qui s'est produite ? ix™ellente question 3 yn n9— plus de ™onsole m—inten—ntD don™ ™omment f—ire pour sto™ker et —0™her des mess—ges d9erreurs c heux possi˜ilités X ! soit on modi(e les options du projet pour qu9il —0™he à nouve—u l— ™onsoleF yn pourr— —lors f—ire des printf Y ! soit on é™rit d—ns un (™hier les erreursF yn utiliser— fprintfF t9—i ™hoisi d9é™rire d—ns un (™hierF gepend—ntD é™rire d—ns un (™hier implique de f—ire un fopenD un f™loseF F F ˜refD ™9est un peu moins f—™ile qu9un printfF reureusementD il y — une solution plus simple X utiliser l— sortie d9erreur st—nd—rdF sl y — une v—ri—˜le stderr qui est dé(nie p—r stdioFh et qui pointe vers un endroit où l9erreur peut être é™rite F gette v—ri—˜le est —utom—tiquement ™réée —u dé˜ut du progr—mme et supprimée à l— (nF †ous n9—vez don™ p—s ˜esoin de f—ire de fopen ou de f™loseF †ous pouvez don™ f—ire un fprintf sur stderr s—ns utiliser fopen ou f™lose X 2 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb int m—in@int —rg™D ™h—r B—rgv‘“A { if @ƒhv•snit@ƒhv•sxs„•†shiyA aa EIA GG hém—rr—ge de l— ƒhvF ƒi erreur X { fprintf@stderrD 4irreur d9initi—lis—tion de l— ƒhv X 7s’n4D → ƒhv•qetirror@AAY GG əriture de l9erreur exit@iˆs„•pesv…‚iAY GG yn quitte le progr—mme } ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X UIPTWH ¡ uoi de neuf d—ns ™e ™ode c 2. Généralement sous Windows. ce sera un chier stderr. l'erreur apparaîtra le plus souvent dans la console.

mais c'est plus sérieux d'utiliser ces constantes. QIH . Ouverture d'une fenêtre fon X l— ƒhv est initi—lisée et fermée ™orre™tementD m—inten—ntF v— pro™h—ine ét—peD si vous le voulez ˜ienD et je suis sûr que vous le voulez ˜ienD ™9est l9ouverture d9une fenêtre 3 €our ™ommen™er déjàD —ssurezEvous d9—voir un m—in qui ressem˜le à ™e™i X int m—in@int —rg™D ™h—r B—rgv‘“A { if @ƒhv•snit@ƒhv•sxs„•†shiyA aa EIA { fprintf@stderrD 4irreur d9initi—lis—tion de l— ƒhv4AY exit@iˆs„•pesv…‚iAY } ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY gel— devr—it être le ™—s si vous —vez ˜ien suivi le dé˜ut du ™h—pitreF €our le moment don™D on initi—lise juste l— vidéo @ƒhv•sxs„•†shiyAD ™9est tout ™e qui nous intéresseF 3. comme ici. Pour peu que vous programmiez correctement en utilisant les outils fournis.CHAPITRE 21. C'est donc ce que nous ferons à partir de maintenant. CRÉATION D'UNE FENÊTRE ET DE SURFACES ! yn é™rit d—ns stderr notre erreurF ve 7s permet de l—isser l— ƒhv indiquer les dét—ils de l9erreur X l— fon™tion ƒhv•qetirror@A renvoie en e'et l— dernière erreur de l— ƒhvF ! yn quitte en utilis—nt exit@AF tusqueElàD rien de nouve—uF „outefoisD vous —urez rem—rqué que j9utilise une ™onst—nte @iˆs„•pesv…‚iA pour indiquer l— v—leur que renvoie le progr—mmeF he plusD à l— (n j9utilise iˆs„•ƒ…ggiƒƒ —u lieu de HF u9estE™e que j9—i ™h—ngé c in f—it j9—méliore petit à petit nos ™odes sour™eF in e'etD le nom˜re qui signi(e  erreur p—r exemple peut être di'érent selon les ordin—teurs 3 gel— dépend là en™ore de l9yƒF €our p—llier ™e pro˜lèmeD stdli˜Fh nous fournit deux ™onst—ntes @des defineA X ! iˆs„•pesv…‚i X v—leur à renvoyer en ™—s d9é™he™ du progr—mme Y ! iˆs„•ƒ…ggiƒƒ X v—leur à renvoyer en ™—s de réussite du progr—mmeF in utilis—nt ™es ™onst—ntes —u lieu de nom˜resD vous êtes ™ert—ins de renvoyer une v—leur ™orre™te quel que soit l9yƒF €ourquoi c €—r™e que le (™hier stdli˜Fh ™h—nge selon l9yƒ sur lequel vous êtesD don™ les v—leurs des ™onst—ntes sont —d—ptéesF †otre ™ode sour™eD luiD n9— p—s ˜esoin d9être modi(é 3 g9est ™e qui rend le l—ng—ge g ™omE p—ti˜le —ve™ tous les yƒ F 3 Cela n'a pas de grandes conséquences pour nous pour le moment.

QII .OUVERTURE D'UNE FENÊTRE Choix du mode vidéo v— première ™hose à f—ire —près ƒhv•snit@AD ™9est indiquer le mode vidéo que vous vouE lez utiliserD ™9estEàEdire l— résolutionD le nom˜re de ™ouleurs et quelques —utres optionsF yn v— utiliser pour ™el— l— fon™tion ƒhv•ƒet†ideowode@A qui prend qu—tre p—r—mètres X ! l— l—rgeur de l— fenêtre désirée @en pixelsA Y ! l— h—uteur de l— fenêtre désirée @en pixelsA Y ! le nom˜re de ™ouleurs —0™h—˜les @en ˜its G pixelA Y ! des options @des ags AF €our l— l—rgeur et l— h—uteur de l— fenêtreD je ™rois que je ne v—is p—s vous f—ire l9—'ront de vous expliquer ™e que ™9estF €—r ™ontreD les deux p—r—mètres suiv—nts sont plus intéress—ntsF ! Le nombre de couleurs X ™9est le nom˜re m—xim—l de ™ouleurs —0™h—˜les d—ns votre fenêtreF ƒi vous jouez —ux jeux vidéoD vous devriez —voir l9h—˜itude de ™el—F …ne v—leur de QP ˜its G pixel permet d9—0™her des milli—rds de ™ouleurs @™9est le m—ximumAF g9est ™ette v—leur que nous utiliserons le plus souvent ™—r désorm—is tous les ordin—teurs gèrent les ™ouleurs en QP ˜its F ! Les options X ™omme pour ƒhv•snit on doit utiliser des )—gs pour dé(nir des optionsF †oi™i les prin™ip—ux )—gs que vous pouvez utiliser @et ™om˜iner —ve™ le sym˜ole |AF ! ƒhv•r‡ƒ…‚pegi X les données seront ™h—rgées d—ns l— mémoire vidéoD ™9estEàEdire d—ns l— mémoire de votre ™—rte QhF ev—nt—ge X ™ette mémoire est plus r—pideF héf—ut X il y — en génér—l moins d9esp—™e d—ns ™ette mémoire que d—ns l9—utre @ƒhv•ƒ‡ƒ…‚pegiAF ! ƒhv•ƒ‡ƒ…‚pegi X les données seront ™h—rgées d—ns l— mémoire système @™9estEàE dire l— ‚ewD — prioriAF ev—nt—ge X il y — ˜e—u™oup d9esp—™e d—ns ™ette mémoireF héf—ut X ™9est moins r—pide et moins optimiséF ! ƒhv•‚iƒsefvi X l— fenêtre ser— redimensionn—˜leF €—r déf—ut elle ne l9est p—sF ! ƒhv•xyp‚ewi X l— fenêtre n9—ur— p—s de ˜—rre de titre ni de ˜ordureF ! ƒhv•p…vvƒg‚iix X mode plein é™r—nF h—ns ™e modeD —u™une fenêtre n9est ouverteF †otre progr—mme prendr— toute l— pl—™e à l9é™r—nD en ™h—nge—nt —utom—tiquement l— résolution de ™eluiE™i —u ˜esoinF ! ƒhv•hy…fvif…p X mode double bueringF g9est une te™hnique très utilisée d—ns les jeux PhD et qui permet de f—ire en sorte que les dépl—™ements des o˜jets à l9é™r—n soient )uidesD sinon ç— s™intille et ™9est —ssez l—idF te vous expliquer—i les dét—ils de ™ette te™hnique très intéress—nte plus loinF hon™D si je f—is X 4 ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY F F F ™el— ouvre une fenêtre de t—ille TRH x RVH en QP ˜its G pixel @milli—rds de ™ouleursA qui ser— ™h—rgée en mémoire vidéo @™9est l— plus r—pideD on préfèrer— utiliser ™elleElàAF 4. Cela peut être utile surtout si vous faites un programme pour un petit appareil genre PDA ou téléphone portable. Sachez aussi que vous pouvez mettre des valeurs plus faibles comme 16 bits / pixel (65536 couleurs). ou 8 bits / pixel (256 couleurs).

QIP . . . 6.CHAPITRE 21. 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 précautions nécessaires et gérer les erreurs. CRÉATION D'UNE FENÊTRE ET DE SURFACES eutre exempleD si je f—is X ƒhv•ƒet†ideowode@RHHD QHHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•‚iƒsefvi | ƒhv•hy…fvif…pAY F F F ™el— ouvre une fenêtre redimensionn—˜le de t—ille initi—le RHH x QHH @QP ˜its G pixelA en mémoire vidéoD —ve™ le dou˜le ˜u'ering —™tivéF †oi™i un premier ™ode sour™e très simple que vous pouvez ess—yer X 5 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X IWRHRW ¡ „estezF ue se p—sseEtEil c v— fenêtre —pp—r—ît et disp—r—ît à l— vitesse de l— lumièreF in e'etD l— fon™tion ƒhv•ƒet†ideowode est immédi—tement suivie de ƒhv•uitD don™ tout s9—rrête immédi—tementF £ ¢gode   Mettre en pause le programme Comment faire en sorte que la fenêtre se maintienne ? sl f—ut f—ire ™omme le font tous les progr—mmesD que ™e soit des jeux vidéo ou —utre X une ˜ou™le in(nieF in e'etD à l9—ide d9une ˜ête ˜ou™le in(nie on empê™he notre progr—mme de s9—rrêterF ve pro˜lème est que ™ette solution est trop e0™—™e ™—r du ™oupD il n9y — p—s de moyen d9—rrêter le progr—mme F †oi™i un ™ode qui fon™tionne m—is à ne pas testerD je vous le donne juste à titre expli™—tif X 6 5. À part un bon vieux CTRL + ALT + SUPPR à la rigueur mais c'est. brutal.

OUVERTURE D'UNE FENÊTRE int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY while@IAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY †ous re™onn—issez le while@IAY X ™9est l— ˜ou™le in(nieF gomme I signi(e  vr—i @r—ppelezEvous les ˜ooléensAD l— ˜ou™le est toujours vr—ie et tourne en rond indé(niment s—ns qu9il y —it moyen de l9—rrêterF ge n9est don™ p—s une très ˜onne solutionF €our mettre en p—use notre progr—mme —(n de pouvoir —dmirer notre ˜elle fenêtre s—ns f—ire de ˜ou™le intermin—˜leD on v— utiliser une petite fon™tion à moiD l— fon™tion p—use@A X void p—use@A { int ™ontinuer a IY ƒhv•ivent eventY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY } } } we˜ X ISUUPP ¡ te ne vous explique p—s le dét—il de ™ette fon™tion pour le momentF g9est volont—ireD ™—r ™el— f—it —ppel à l— gestion des événements que je vous expliquer—i seulement d—ns un pro™h—in ™h—pitreF ƒi je vous explique tout à l— fois m—inten—ntD vous risquez de tout mél—nger 3 p—ites don™ pour l9inst—nt ™on(—n™e à m— fon™tion de p—useD nous ne t—rderons p—s à l9expliquerF †oi™i un ™ode sour™e ™omplet et ™orre™t que vous pouvez @en(n 3A tester X 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb £ ¢gode   QIQ .

CHAPITRE 21. CRÉATION D'UNE FENÊTRE ET DE SURFACES void p—use@AY int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•snit@ƒhv•sxs„•†shiyAY GG sniti—lis—tion de l— ƒhv ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY GG yuverture de l— fenêtre p—use@AY GG wise en p—use du progr—mme ƒhv•uit@AY GG errêt de l— ƒhv } return iˆs„•ƒ…ggiƒƒY GG permeture du progr—mme void p—use@A { int ™ontinuer a IY ƒhv•ivent eventY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY } } } we˜ X WIVTUI ¡ †ous rem—rquerez que j9—i mis le prototype de m— fon™tion p—use@A en h—ut pour tout vous présenter sur un seul (™hierF te f—is —ppel à l— fon™tion p—use@A qui f—it une ˜ou™le in(nie un peu plus intelligente que tout à l9heureF gette ˜ou™le s9—rrêter— en e'et si vous ™liquez sur l— ™roix pour fermer l— fenêtre 3 v— (gF PIFI vous donne une idée de ™e à quoi devr—it ressem˜ler l— fenêtre que vous —vez sous les yeux @i™iD une fenêtre TRH x RVHAF €(ou 3 xous y sommes en(n —rrivés 3 ƒi vous voulezD vous pouvez mettre le )—g  redimensionn—˜le pour —utoriser le redimensionnement de votre fenêtreF „outefoisD d—ns l— plup—rt des jeux on préfère —voir une fenêtre de t—ille (xe @™9est plus simple à gérer 3AD nous g—rderons don™ notre fenêtre (xe pour le momentF QIR £ ¢gode   .

vous ne pourrez pas fermer le programme et vous serez alors obligés d'utiliser la commande g„‚v C ev„ C ƒ…€€‚. Attendez d'apprendre à manipuler les événements SDL (dans quelques chapitres) et vous pourrez alors coder un moyen de sortir de votre programme avec une technique un peu moins brutale que le g„‚v C ev„ C ƒ…€€‚. Changer le titre de la fenêtre €our le momentD notre fenêtre — un titre p—r déf—ut X @ƒhv•—pp sur l— (gF PIFIAF ue diriezEvous de ™h—nger ™el— c g9est extrêmement simpleD il su0t d9utiliser l— fon™tion ƒhv•‡w•ƒetg—ptionF gette fon™tion prend deux p—r—mètresF ve premier est le titre que vous voulez donner à l— fenêtreD le se™ond est le titre que vous voulez donner à l9i™ôneF gontr—irement à ™e qu9on pourr—it ™roireD donner un titre à l9i™ône ne ™orrespond p—s à ™h—rger une i™ône qui s9—0™her—it d—ns l— ˜—rre de titre en h—ut à g—u™heF gel— ne fon™tionne p—s p—rtout F €ersonnellementD j9envoie l— v—leur x…vv à l— fon™tionF ƒ—™hez qu9il est possi˜le de ™h—nger l9i™ône de l— fenêtreD m—is nous verrons ™omment le f—ire d—ns le ™h—pitre suiv—nt seulementD ™—r ™e n9est p—s en™ore de notre nive—uF †oi™i don™ le même m—in que tout à l9heure —ve™ l— fon™tion ƒhv•‡w•ƒetg—ption en plus X 7 7. QIS . Comme il n'y a pas de barre de titre dans ces deux modes. cela donne un résultat sous Gnome sous Linux.OUVERTURE D'UNE FENÊTRE Figure PIFI ! …ne fenêtre vide en TRH x RVH Attention au mode plein écran (ƒhv•p…vvƒg‚iix) et au mode sans bordure (ƒhv•xyp‚ewi). À ma connaissance.

quitte à envoyer x…vv comme je l'ai fait ici. de ne pas renseigner certains paramètres facultatifs lors des appels de fonctions. Le C++ permet. lui. il est obligatoire de renseigner tous les paramètres même si certains ne vous intéressent pas. CRÉATION D'UNE FENÊTRE ET DE SURFACES int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4w— super fenêtre ƒhv 34D x…vvAY p—use@AY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY £ ¢gode we˜ X IPISUP ¡ Vous aurez remarqué que j'ai mis x…vv pour le fameux second paramètre peu utile.CHAPITRE 21. En C.   v— fenêtre — m—inten—nt un titre @™f (gF PIFPAF Figure PIFP ! …ne fenêtre —ve™ un titre QIT .

en dessinant pixel par pixel la forme. comme des cercles. il faudra écrire nous-mêmes des fonctions. ou bien utiliser une bibliothèque supplémentaire avec la SDL.MANIPULATION DES SURFACES Manipulation des surfaces €our le moment nous —vons une fenêtre —ve™ un fond noirF g9est l— fenêtre de ˜—seF ge qu9on veut f—ireD ™9est l— remplirD ™9estEàEdire  dessiner ded—nsF v— ƒhvD je vous l9—i dit d—ns le ™h—pitre pré™édentD est une ˜i˜liothèque ˜—s nive—uF gel— veut dire qu9elle ne nous propose que des fon™tions de ˜—seD très simplesF it en e'etD l— seule forme que l— ƒhv nous permet de dessinerD ™9est le re™t—ngle 3 „out ™e que vous —llez f—ireD ™9est —ssem˜ler des re™t—ngles d—ns l— fenêtreF yn —ppelle ™es re™t—ngles des surfacesF v— surf—™e est l— ˜rique de ˜—se de l— ƒhvF Il est bien sûr possible de dessiner d'autres formes. Votre première surface : l'écran h—ns tout progr—mme ƒhvD il y — —u moins une surf—™e que l9on —ppelle génér—lement e™r—n @ou s™reen en —ngl—isAF g9est une surf—™e qui ™orrespond à toute l— fenêtreD ™9estEàEdire à toute l— zone noire de l— fenêtre que vous voyezF h—ns notre ™ode sour™eD ™h—que surf—™e ser— mémorisée d—ns une v—ri—˜le de type ƒhv•ƒurf—™eF yuiD ™9est un type de v—ri—˜le ™réé p—r l— ƒhv @une stru™tureD en l9o™E ™urren™eAF gomme l— première surf—™e que nous devons ™réer est l9é™r—nD —llonsEy X ƒhv•ƒurf—™e Be™r—n a x…vvY †ous rem—rquerez que je ™rée un pointeurF €ourquoi je f—is ç— c €—r™e que ™9est l— ƒhv qui v— —llouer de l9esp—™e en mémoire pour notre surf—™eF …ne surf—™e n9— en e'et p—s toujours l— même t—ille et l— ƒhv est o˜ligée de f—ire une —llo™—tion dyn—mique pour nous @i™iD ç— dépendr— de l— t—ille de l— fenêtre que vous —vez ouverteAF te ne vous l9—i p—s dit tout à l9heureD m—is l— fon™tion ƒhv•ƒet†ideowode renvoie une v—leur 3 ille renvoie un pointeur sur l— surf—™e de l9é™r—n qu9elle — ™réée en mémoire pour nousF €—rf—itD on v— don™ pouvoir ré™upérer ™e pointeur d—ns e™r—n X e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY xotre pointeur peut m—inten—nt v—loir X ! x…vv X e™r—n v—ut x…vv si l— ƒhv•ƒet†ideowode n9— p—s réussi à ™h—rger le mode vidéo dem—ndéF gel— —rrive si vous dem—ndez une trop gr—nde résolution ou un trop gr—nd nom˜re de ™ouleurs que ne supporte p—s votre ordin—teur Y QIU . Mais pour le faire. etc. des triangles. C'est un peu compliqué et de toute manière. vous verrez que nous n'en aurons pas vraiment besoin dans la pratique.

j'ai écrit 10244 * 768. car je ne voyais pas le double 4 dans mon code (oui. je me suis trompé en voulant faire du plein écran. je devais être un peu fatigué). comme c'est curieux !). Au lieu de demander une résolution de 1024 * 768. Je ne comprenais pas au départ pourquoi ça ne voulait pas charger.CHAPITRE 21. Un petit coup d'÷il au chier stderrFtxt qui contenait l'erreur et j'ai tout de suite compris que c'était ma résolution qui avait été rejetée (tiens. CRÉATION D'UNE FENÊTRE ET DE SURFACES ! une —utre v—leur X si l— v—leur est di'érente de x…vvD ™9est que l— ƒhv — pu —llouer l— surf—™e en mémoireD don™ que tout est ˜on 3 sl ser—it ˜ien i™i de gérer les erreursD ™omme on — —ppris à le f—ire tout à l9heure pour l9initi—lis—tion de l— ƒhvF †oi™i don™ notre m—in —ve™ l— gestion de l9erreur pour ƒhv•ƒet†ideowode X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvY GG ve pointeur qui v— sto™ker l— surf—™e de → l9é™r—n ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY GG yn tente d9ouvrir une fenêtre if @e™r—n aa x…vvA GG ƒi l9ouverture — é™houéD on le note et on —rrête { fprintf@stderrD 4smpossi˜le de ™h—rger le mode vidéo X 7s’n4D → ƒhv•qetirror@AAY exit@iˆs„•pesv…‚iAY } → ƒhv•‡w•ƒetg—ption@4w— super fenêtre ƒhv 34D x…vvAY p—use@AY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X UVVIQR ¡ ve mess—ge que nous l—isser— ƒhv•qetirror@A nous ser— très utile pour s—voir ™e qui n9— p—s m—r™héF Petite anecdote : une fois. £ ¢gode   Colorer une surface sl n9y — p—s QT f—çons de remplir une surf—™eF F F in f—itD il y en — deux X QIV .

MANIPULATION DES SURFACES ! soit vous remplissez l— surf—™e —ve™ une ™ouleur unie Y ! soit vous remplissez l— surf—™e en ™h—rge—nt une im—geF Il est aussi possible de dessiner pixel par pixel dans la surface mais c'est assez compliqué. pourquoi ne pas avoir utilisé le type de variable int ou tout simplement ? v— ƒhv est une ˜i˜liothèque multiEpl—tesEformesF yrD ™omme vous le s—vez m—inten—ntD l— t—ille o™™upée p—r un int ou un long peut v—rier selon votre yƒF €our s9—ssurer que le nom˜re o™™uper— toujours l— même t—ille en mémoireD l— ƒhv — don™  inventé des types pour sto™ker des entiers qui ont l— même t—ille sur tous les systèmesF sl y — p—r exemple X ! …intQP X un entier de longueur QP ˜its @soit R o™tets A Y ! …intIT X un entier ™odé sur IT ˜its @P o™tetsA Y ! …intV X un entier ™odé sur V ˜its @I o™tetAF v— ƒhv ne f—it qu9un simple typedef qui ™h—nger— selon l9yƒ que vous utilisezF ‚eE g—rdez de plus près le (™hier ƒhv•typesFh si vous êtes ™urieuxF yn ne v— p—s s9—tt—rder làEdessus plus longtemps ™—r les dét—ils de tout ™el— ne sont p—s import—ntsF †ous —vez juste ˜esoin de retenir que …intQP est un type qui sto™ke un entierD ™omme un intF 8 8. Si c'est un nombre. QIW . xous —llons d—ns un premier temps voir ™omment remplir une surf—™e —ve™ une ™ouleur unieF h—ns le ™h—pitre suiv—ntD nous —pprendrons à ™h—rger une im—geF v— fon™tion qui permet de ™olorer une surf—™e —ve™ une ™ouleur unie s9—ppelle ƒhv•pill‚e™t @FillRect a  remplir re™t—ngle en —ngl—isAF ille prend trois p—r—mètresD d—ns l9ordre X ! un pointeur sur l— surf—™e d—ns l—quelle on doit dessiner @p—r exemple e™r—nA Y ! l— p—rtie de l— surf—™e qui doit être remplieF ƒi vous voulez remplir toute l— surf—™e @et ™9est ™e qu9on veut f—ireAD envoyez x…vv Y ! l— ™ouleur à utiliser pour remplir l— surf—™eF in résumé X ƒhv•pill‚e™t@surf—™eD x…vvD ™ouleurAY La gestion des couleurs en SDL in ƒhvD une ™ouleur est sto™kée d—ns un nom˜re de type …intQPF long. Je rappelle que 1 octet = 8 bits. nous ne le verrons pas ici.

mais comment je sais quel nombre je dois mettre pour utiliser la couleur verte. du bleu. QPH . du noir et du blanc ? xonD ™9est à vous de ™om˜iner intelligemment les qu—ntités de ™ouleursF €our vous —iderD ouvrez p—r exemple le logi™iel €—intF ellez d—ns le menu gouleurs G wodifier les ™ouleursF gliquez sur le ˜outon héfinir les ™ouleurs personn—liséesF vàD ™hoisissez l— ™ouleur qui vous intéresse @(gF PIFQAF ves ™ompos—ntes de l— ™ouleur sont —0™hées en ˜—s à droiteF s™iD j9—i séle™tionné un ˜leuEvertF gomme l9indique l— fenêtreD il se ™rée à l9—ide de IU de rougeD PHT de vert et IIP de ˜leuF 9. azur. CRÉATION D'UNE FENÊTRE ET DE SURFACES D'accord. gris foncé ou encore jaune pâle à points roses avec des petites eurs violettes ? 9 sl existe une fon™tion qui sert à ç— X ƒhv•w—p‚qfF ille prend qu—tre p—r—mètres X ! le form—t des ™ouleursF ge form—t dépend du nom˜re de ˜its G pixel que vous —vez dem—ndé —ve™ ƒhv•ƒet†ideowodeF †ous pouvez le ré™upérerD il est sto™ké d—ns l— sousEv—ri—˜le e™r—nEbform—t Y ! l— qu—ntité de rouge de l— ™ouleur Y ! l— qu—ntité de vert de l— ™ouleur Y ! l— qu—ntité de ˜leu de l— ™ouleurF gert—ins d9entre vous ne le s—vent peutEêtre p—sD m—is toute ™ouleur sur un ordin—teur est ™onstruite à p—rtir de trois ™ouleurs de ˜—se X le rougeD le vert et le ˜leuF gh—que qu—ntité peut v—rier de H @p—s de ™ouleurA à PSS @toute l— ™ouleurAF hon™D si on é™rit X ƒhv•w—p‚qf@e™r—nEbform—tD PSSD HD HA F F F on ™rée une ™ouleur rougeF sl n9y — p—s de vert ni de ˜leuF eutre exempleD si on é™rit X ƒhv•w—p‚qf@e™r—nEbform—tD HD HD PSSA F F F ™ette foisD ™9est une ™ouleur ˜leueF ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSA F F F làD il s9—git d9une ™ouleur ˜l—n™he @toutes les ™ouleurs s9—dditionnentAF ƒi vous voulez du noirD il f—ut don™ é™rire HD HD HF On ne peut que mettre du rouge. Bien entendu. du vert. cette dernière couleur n'existe pas.CHAPITRE 21.

MANIPULATION DES SURFACES Figure PIFQ ! ƒéle™tion d9une ™ouleur et de ses ™ompos—ntes Coloration de l'écran v— fon™tion ƒhv•w—p‚qf renvoie un …intQP qui ™orrespond à l— ™ouleur dem—ndéeF yn peut don™ ™réer une v—ri—˜le ˜leu†ert qui ™ontiendr— le ™ode de l— ™ouleur ˜leuEvert X …intQP ˜leu†ert a ƒhv•w—p‚qf@e™r—nEbform—tD IUD PHTD IIPAY „outefoisD ™e n9est p—s toujours l— peine de p—sser p—r une v—ri—˜le pour sto™ker l— ™ouleur @à moins que vous en —yez ˜esoin très souvent d—ns votre progr—mmeAF †ous pouvez tout simplement envoyer dire™tement l— ™ouleur donnée p—r ƒhv•w—p‚qf à ƒhv•pill‚e™tF ƒi on veut remplir notre é™r—n de ˜leuEvertD on peut don™ é™rire X ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD IUD PHTD IIPAAY yn ™om˜ine i™i deux fon™tionsD m—is ™omme vous devriez m—inten—nt le s—voirD ç— ne pose —u™un pro˜lème —u l—ng—ge gF Mise à jour de l'écran xous y sommes presqueF „outefois il m—nque en™ore une petite ™hose X dem—nder l— mise à jour de l9é™r—nF in e'etD l9instru™tion ƒhv•pill‚e™t ™olorie ˜ien l9é™r—n m—is ™el— ne se f—it que d—ns l— mémoireF sl f—ut ensuite dem—nder à l9ordin—teur de mettre à jour l9é™r—n —ve™ les nouvelles donnéesF €our ™el—D on v— utiliser l— fon™tion ƒhv•plipD dont nous rep—rlerons plus longuement plus loin d—ns le ™oursF gette fon™tion prend un p—r—mètre X l9é™r—nF ƒhv•plip@e™r—nAY GB wise à jour de l9é™r—n BG QPI .

CRÉATION D'UNE FENÊTRE ET DE SURFACES On résume ! †oi™i une fon™tion m—in@A qui ™rée une fenêtre —ve™ un fond ˜leuEvert X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4w— super fenêtre ƒhv 34D x…vvAY GG golor—tion de l— surf—™e e™r—n en ˜leuEvert ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD IUD PHTD IIPAAY ƒhv•plip@e™r—nAY GB wise à jour de l9é™r—n —ve™ s— nouvelle ™ouleur BG p—use@AY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X PTTVRI ¡ ve résult—t est présenté sur l— (gF PIFRF £ ¢gode   Figure PIFR ! v— fenêtre est remplie d9un fond ˜leuEvert QPP .CHAPITRE 21.

avec les cartes 3D qu'on sort de nos jours. Quoique. . .MANIPULATION DES SURFACES Dessiner une nouvelle surface à l'écran g9est ˜ienD m—is ne nous —rrêtons p—s en si ˜on ™heminF €our le moment on n9— qu9une seule surf—™eD ™9estEàEdire l9é™r—nF yn —imer—it pouvoir y dessinerD ™9estEàEdire  ™oller des surf—™es —ve™ une —utre ™ouleur p—rEdessusF €our ™ommen™erD nous —llons —voir ˜esoin de ™réer une v—ri—˜le de type ƒhv•ƒurf—™e pour ™ette nouvelle surf—™e X ƒhv•ƒurf—™e Bre™t—ngle a x…vvY xous devons ensuite dem—nder à l— ƒhv de nous —llouer de l9esp—™e en mémoire pour ™ette nouvelle surf—™eF €our l9é™r—nD nous —vons utilisé ƒhv•ƒet†ideowodeF „outefoisD ™ette fon™tion ne m—r™he que pour l9é™r—n @l— surf—™e glo˜—leAD on ne v— p—s ™réer une fenêtre di'érente pour ™h—que re™t—ngle que l9on veut dessiner 3 sl existe don™ une —utre fon™tion pour ™réer une surf—™e X ƒhv•gre—te‚qfƒurf—™eF g9est ™elle que nous utiliserons à ™h—que fois que nous voudrons ™réer une surf—™e unie ™omme i™iF gette fon™tion prendF F F ˜e—u™oup de p—r—mètres @huit 3AF h9—illeursD peu d9entre eux nous intéressent pour l9inst—ntD je v—is don™ éviter de vous dét—iller ™eux qui ne nous serviront p—s de suiteF gomme en g nous sommes o˜ligés d9indiquer tous les p—r—mètresD nous enverrons l— v—leur H qu—nd le p—r—mètre ne nous intéresse p—sF ‚eg—rdons de plus près les qu—tre premiers p—r—mètresD les plus intéress—nts @ils deE vr—ient vous r—ppeler l— ™ré—tion de l9é™r—nAF ! …ne liste de )—gs @des optionsAF †ous —vez le ™hoix entre X ! ƒhv•r‡ƒ…‚pegi X l— surf—™e ser— ™h—rgée en mémoire vidéoF sl y — moins d9esp—™e d—ns ™ette mémoire que d—ns l— mémoire système D m—is ™ette mémoire est plus optimisée et —™™élérée Y ! ƒhv•ƒ‡ƒ…‚pegi X l— surf—™e ser— ™h—rgée en mémoire système où il y — ˜e—u™oup de pl—™eD m—is ™el— o˜liger— votre pro™esseur à f—ire plus de ™—l™ulsF ƒi vous —viez ™h—rgé l— surf—™e en mémoire vidéoD ™9est l— ™—rte Qh qui —ur—it f—it l— plup—rt des ™—l™ulsF ! v— l—rgeur de l— surf—™e @en pixelsAF ! v— h—uteur de l— surf—™e @en pixelsAF ! ve nom˜re de ™ouleurs @en ˜its G pixelAF †oi™i don™ ™omment on —lloue notre nouvelle surf—™e en mémoire X 10 re™t—ngle a ƒhv•gre—te‚qfƒurf—™e@ƒhv•r‡ƒ…‚pegiD PPHD IVHD QPD HD HD HD HAY ves qu—tre derniers p—r—mètres sont mis à HD ™omme je vous l9—i ditD ™—r ils ne nous intéressent p—sF gomme notre surf—™e — été —llouée m—nuellementD il f—udr— penser à l— li˜érer de l— mémoire —ve™ l— fon™tion ƒhv•preeƒurf—™e@AD à utiliser juste —v—nt ƒhv•uit@A X 10. QPQ . il y a de quoi se poser des questions.

CRÉATION D'UNE FENÊTRE ET DE SURFACES ƒhv•preeƒurf—™e@re™t—ngleAY ƒhv•uit@AY La surface e™r—n n'a pas besoin d'être libérée avec cela est fait automatiquement lors de ƒhv•uit@A.CHAPITRE 21. ƒhv•preeƒurf—™e@A. yn peut m—inten—nt ™olorer notre nouvelle surf—™e en l— rempliss—nt p—r exemple de ˜l—n™ X ƒhv•pill‚e™t@re™t—ngleD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY Coller la surface à l'écran ellezD ™9est presque (niD ™our—ge 3 xotre surf—™e est prêteD m—is si vous testez le proE gr—mme vous verrez qu9elle ne s9—0™her— p—s 3 in e'etD l— ƒhv n9—0™he à l9é™r—n que l— surf—™e e™r—nF €our que l9on puisse voir notre nouvelle surf—™eD il v— f—lloir blitter la surfaceD ™9estEàEdire l— ™oller sur l9é™r—nF yn utiliser— pour ™el— l— fon™tion ƒhv•flitƒurf—™eF gette fon™tion —ttend X ! l— surf—™e à ™oller @i™iD ™e ser— re™t—ngleA Y ! une inform—tion sur l— p—rtie de l— surf—™e à ™oller @f—™ult—tiveAF Ǘ ne nous intéresse p—s ™—r on veut ™oller toute l— surf—™eD don™ on enverr— x…vv Y ! l— surf—™e sur l—quelle on doit ™ollerD ™9estEàEdire e™r—n d—ns notre ™—s Y ! un pointeur sur une v—ri—˜le ™onten—nt des ™oordonnéesF ges ™oordonnées indiquent où devr— être ™ollée notre surf—™e sur l9é™r—nD ™9estEàEdire s— positionF €our indiquer les ™oordonnéesD on doit utiliser une v—ri—˜le de type ƒhv•‚e™tF g9est une stru™ture qui ™ontient plusieurs sousEv—ri—˜lesD dont deux qui nous intéressent i™i X ! x X l9—˜s™isse Y ! y X l9ordonnéeF sl f—ut s—voir que le point de ™oordonnées @HD HA est situé tout en h—ut à g—u™heF in ˜—s à droiteD le point — les ™oordonnées @TRHD RVHA si vous —vez ouvert une fenêtre de t—ille TRH x RVH ™omme moiF eidezEvous du s™hém— de l— (gF PIFS pour vous situerF ƒi vous —vez déjà f—it des m—ths une fois d—ns votre vieD vous ne devriez p—s être trop pertur˜ésF gréons don™ une v—ri—˜le positionF yn v— mettre x et y à H pour ™oller l— surf—™e en h—ut à g—u™he de l9é™r—n X ƒhv•‚e™t positionY positionFx a HY positionFy a HY QPR .

MANIPULATION DES SURFACES Figure PIFS ! goordonnées sur l— fenêtre w—inten—nt qu9on — notre v—ri—˜le positionD on peut ˜litter notre re™t—ngle sur l9é™r—n X ƒhv•flitƒurf—™e@re™t—ngleD x…vvD e™r—nD 8positionAY ‚em—rquez le sym˜ole 8D ™—r il f—ut envoyer l9—dresse de notre v—ri—˜le positionF Résumé du code source te ™rois qu9un petit ™ode pour résumer tout ç— ne ser— p—s super)u 3 int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bre™t—ngle a x…vvY ƒhv•‚e™t positionY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY GG ello™—tion de l— surf—™e re™t—ngle a ƒhv•gre—te‚qfƒurf—™e@ƒhv•r‡ƒ…‚pegiD PPHD IVHD QPD HD HD HD HAY ƒhv•‡w•ƒetg—ption@4w— super fenêtre ƒhv 34D x…vvAY ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD IUD PHTD IIPAAY positionFx a HY GG ves ™oordonnées de l— surf—™e seront @HD HA positionFy a HY GG ‚empliss—ge de l— surf—™e —ve™ du ˜l—n™ QPS .

CHAPITRE 21. QPT . C'est là qu'on comprend l'intérêt des maths et de la géométrie ! Et encore. CRÉATION D'UNE FENÊTRE ET DE SURFACES ƒhv•pill‚e™t@re™t—ngleD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY ƒhv•flitƒurf—™e@re™t—ngleD x…vvD e™r—nD 8positionAY GG goll—ge de l— surf—™e → sur l9é™r—n ƒhv•plip@e™r—nAY GG wise à jour de l9é™r—n p—use@AY ƒhv•preeƒurf—™e@re™t—ngleAY GG vi˜ér—tion de l— surf—™e ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X TVUPTS ¡ it voilà le tr—v—il @(gF PIFTA 3 £ ¢gode   Figure PIFT ! …ne surf—™e ˜l—n™he en h—ut à g—u™he de l— fenêtre Centrer la surface à l'écran yn s—it —0™her l— surf—™e en h—ut à g—u™heF sl ser—it —ussi f—™ile de l— pl—™er en ˜—s à droiteF ves ™oordonnées ser—ient @TRH E PPHD RVH E IVHAD ™—r il f—ut retr—n™her l— t—ille de notre re™t—ngle pour qu9il s9—0™he entièrementF w—isF F F ™omment f—ire pour ™entrer le re™t—ngle ˜l—n™ c ƒi vous ré)é™hissez ˜ien deux se™ondesD ™9est mathématique F 11 11. tout ceci est d'un niveau très simple ici.

EXERCICE : CRÉER UN DÉGRADÉ positionFx a @TRH G PA E @PPH G PAY positionFy a @RVH G PA E @IVH G PAY v9—˜s™isse du re™t—ngle ser— l— moitié de l— l—rgeur de l9é™r—n @TRH G PAF w—isD en plus de ç—D il f—ut retr—n™her l— moitié de l— l—rgeur du re™t—ngle @PPH G PAD ™—r sinon ç— ne ser— p—s p—rf—itement ™entré @ess—yez de ne p—s le f—ireD vous verrez ™e que je veux direAF g9est l— même ™hose pour l9ordonnée —ve™ l— h—uteur de l9é™r—n et du re™t—ngleF ‚ésult—t X l— surf—™e ˜l—n™he est p—rf—itement ™entrée @(gF PIFUAF Figure PIFU ! …ne surf—™e ˜l—n™he —u ™entre de l— fenêtre Exercice : créer un dégradé yn v— (nir le ™h—pitre p—r un petit exer™i™e @™orrigéA suivi d9une série d9—utres exer™i™es @non ™orrigés pour vous for™er à tr—v—iller 3AF v9exer™i™e ™orrigé n9est vr—iment p—s di0™ile X on veut ™réer un dégr—dé verti™—l —ll—nt du noir —u ˜l—n™F †ous —llez devoir ™réer PSS surf—™es de I pixel de h—uteurF gh—™une —ur— une ™ouleur di'érenteD de plus en plus noireF †oi™i ™e que vous devez —rriver à o˜tenir —u (n—lD une im—ge simil—ire à l— (gF PIFVF g9est mignonD non c it le pire ™9est qu9il su0t de quelques petites ˜ou™les seulement pour y —rriverF €our f—ire ç—D on v— devoir ™réer PST surf—™es @PST lignesA —y—nt les ™ompos—ntes rougeE vertE˜leu suiv—ntes X @HD HD HA GG xoir @ID ID IA GG qris très très pro™he du noir QPU .

CHAPITRE 21. CRÉATION D'UNE FENÊTRE ET DE SURFACES Figure PIFV ! hégr—dé du noir —u ˜l—n™ @PD PD PA GG qris très pro™he du noir FFF @IPVD IPVD IPVA GG qris moyen @à SH 7A FFF @PSQD PSQD PSQA GG qris très pro™he du ˜l—n™ @PSRD PSRD PSRA GG qris très très pro™he du ˜l—n™ @PSSD PSSD PSSA GG fl—n™ „out le monde devr—it —voir vu venir une ˜ou™le pour f—ire ç— @on ne v— p—s f—ire PST ™opierE™oller 3AF †ous —llez devoir ™réer un t—˜le—u de type ƒhv•ƒurf—™eB de PST ™—ses pour sto™ker ™h—™une des lignesF ellez —u ˜oulotD je vous donne S minutes 3 Correction ! h9—˜ordD il f—ll—it ™réer notre t—˜le—u de PST ƒhv•ƒurf—™eBF yn l9initi—lise à x…vv X ƒhv•ƒurf—™e Blignes‘PST“ a {x…vv}Y yn ™rée —ussi une v—ri—˜le i dont on —ur— ˜esoin pour nos forF yn ™h—nge —ussi l— h—uteur de l— fenêtre pour qu9elle soit plus —d—ptée d—ns notre ™—sF yn lui donne don™ PST pixels de h—uteurD pour ™h—™une des PST lignes à —0™herF insuiteD on f—it un for pour —llouer une à une ™h—™une des PST surf—™esF ve t—˜le—u re™evr— PST pointeurs vers ™h—™une des surf—™es ™réées X for @i a H Y i `a PSS Y iCCA lignes‘i“ a ƒhv•gre—te‚qfƒurf—™e@ƒhv•r‡ƒ…‚pegiD TRHD ID QPD HD HD HD HAY insuiteD on remplit et on ˜litte ™h—™une de ™es surf—™es une p—r uneF QPV .

EXERCICE : CRÉER UN DÉGRADÉ for @i a H Y i `a PSS Y iCCA { positionFx a HY GG ves lignes sont à g—u™he @—˜s™isse de HA positionFy a iY GG v— position verti™—le dépend du numéro de l— ligne ƒhv•pill‚e™t@lignes‘i“D x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD iD iD iAAY GG hessin ƒhv•flitƒurf—™e@lignes‘i“D x…vvD e™r—nD 8positionAY GG goll—ge } xotez que j9utilise l— même v—ri—˜le position tout le tempsF €—s ˜esoin d9en ™réer PST en e'etD ™—r l— v—ri—˜le ne sert que pour être envoyée à ƒhv•flitƒurf—™eF yn peut don™ l— réutiliser s—ns pro˜lèmeF gh—que foisD je mets à jour l9ordonnée @yA pour ˜litter l— ligne à l— ˜onne h—uteurF v— ™ouleur à ™h—que p—ss—ge d—ns l— ˜ou™le dépend de i @™e ser— HD HD H l— première foisD et PSSD PSSD PSS l— dernière 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 v—ri—˜le position indique à quel endroit est pl—™é le ™oin en h—ut à g—u™he de notre surf—™e @i™iD notre ligneAF ille n9indique p—s l— l—rgeur de l— surf—™eD juste s— position sur l9é™r—nF gomme toutes nos lignes ™ommen™ent à g—u™he de l— fenêtre @le plus à g—u™he possi˜leAD on met une —˜s™isse de HF iss—yez de mettre une —˜s™isse de SH pour voir ™e que ç— f—it X toutes les lignes seront d陗lées vers l— droiteF gomme l— surf—™e f—it TRH pixels de l—rgeurD l— ƒhv dessine TRH pixels vers l— droite @de l— même ™ouleurA en p—rt—nt des ™oordonnées indiquées d—ns l— v—ri—˜le positionF ƒur le s™hém— de l— (gF PIFWD je vous montre les ™oordonnées du point en h—ut à g—u™he de l9é™r—n @position de l— première ligneA et ™elui du point en ˜—s à droite de l9é™r—n @position de l— dernière ligneAF Figure PIFW ! goordonnées sur l— fenêtre de dégr—dé gomme vous le voyezD de h—ut en ˜—s l9—˜s™isse ne ™h—nge p—s @x reste ég—l à H tout le longAF g9est seulement y qui ™h—nge pour ™h—que nouvelle ligneD d9où le positionFy a QPW .

CRÉATION D'UNE FENÊTRE ET DE SURFACES iYF in(nD il ne f—ut p—s ou˜lier de li˜érer l— mémoire pour ™h—™une des PST surf—™es ™rééesD le tout à l9—ide d9une petite ˜ou™le ˜ien entenduF for @i a H Y i `a PSS Y iCCA GG x9ou˜liez p—s de li˜érer les PST surf—™es ƒhv•preeƒurf—™e@lignes‘i“AY Résumé du m—in †oi™i don™ l— fon™tion m—in —u ™omplet X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Blignes‘PST“ a {x…vv}Y ƒhv•‚e™t positionY int i a HY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD PSTD QPD ƒhv•r‡ƒ…‚pegiAY for @i a H Y i `a PSS Y iCCA lignes‘i“ a ƒhv•gre—te‚qfƒurf—™e@ƒhv•r‡ƒ…‚pegiD TRHD ID QPD HD HD HD HAY ƒhv•‡w•ƒetg—ption@4won dégr—dé en ƒhv 34D x…vvAY ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY for @i a H Y i `a PSS Y iCCA { positionFx a HY GG ves lignes sont à g—u™he @—˜s™isse de HA positionFy a iY GG v— position verti™—le dépend du numéro de l— ligne ƒhv•pill‚e™t@lignes‘i“D x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD iD iD iAAY ƒhv•flitƒurf—™e@lignes‘i“D x…vvD e™r—nD 8positionAY } ƒhv•plip@e™r—nAY p—use@AY for @i a H Y i `a PSS Y iCCA GG x9ou˜liez p—s de li˜érer les PST surf—™es ƒhv•preeƒurf—™e@lignes‘i“AY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY £ ¢gode we˜ X PTQWTH ¡   QQH .CHAPITRE 21.

EXERCICE : CRÉER UN DÉGRADÉ  Je veux des exercices pour m'entraîner !  €—s de pro˜lèmeD génér—teur d9exer™i™es —™tivé 3 ! gréez le dégr—dé inverseD du ˜l—n™ —u noirF gel— ne devr—it p—s être trop di0™ile pour ™ommen™er 3 ! †ous pouvez —ussi f—ire un dou˜le dégr—déD en —ll—nt du noir —u ˜l—n™ ™omme on — f—it i™iD puis du ˜l—n™ —u noir @l— fenêtre fer— —lors le dou˜le de h—uteurAF ! quère plus di0™ileD vous pouvez —ussi vous entr—îner à f—ire un dégr—dé horizont—l —u lieu d9un dégr—dé verti™—lF ! p—ites des dégr—dés en utilis—nt d9—utres ™ouleurs que le ˜l—n™ et le noirF iss—yez pour ™ommen™er du rouge —u noirD du vert —u noir et du ˜leu —u noirD puis du rouge —u ˜l—n™D et™F En résumé ! v— ƒhv doit être ™h—rgée —ve™ ƒhv•snit —u dé˜ut du progr—mme et dé™h—rgée —ve™ ƒhv•uit à l— (nF ! ves )—gs sont des ™onst—ntes que l9on peut —dditionner entre elles —ve™ le sym˜ole  | F illes jouent le rôle d9optionsF ! v— ƒhv vous f—it m—nipuler des surf—™es qui ont l— forme de re™t—ngles —ve™ le type ƒhv•ƒurf—™eF ve dessin sur l— fenêtre se f—it à l9—ide de ™es surf—™esF ! sl y — toujours —u moins une surf—™e qui prend toute l— fenêtreD que l9on —ppelle en génér—l e™r—nF ! ve rempliss—ge d9une surf—™e se f—it —ve™ ƒhv•pill‚e™t et le ™oll—ge sur l9é™r—n à l9—ide de ƒhv•flitƒurf—™eF ! ves ™ouleurs sont dé(nies à l9—ide d9un mél—nge de rougeD de vert et de ˜leuF QQI .

CHAPITRE 21. CRÉATION D'UNE FENÊTRE ET DE SURFACES QQP .

QQQ . pour le moment nous ne pouvons créer que des surfaces unies. C'est vraiment la base de ce qu'il faut connaître sur cette bibliothèque. à ouvrir une fenêtre et gérer des surfaces. des PNG. La manipulation d'images est souvent très motivante car c'est en assemblant ces images (aussi appelées  sprites ) que l'on fabrique les premières briques d'un jeu vidéo. Dans ce chapitre. que ce soit des BMP. nous allons apprendre à charger des images dans des surfaces. c'est-à-dire ayant la même couleur. des GIF ou des JPG. Cependant. ce qui est un peu monotone.Chapitre 22 Diculté : Acher des images N ous venons d'apprendre à charger la SDL.

CHAPITRE 22. AFFICHER DES IMAGES Charger une image BMP v— ƒhv est une ˜i˜liothèque très simpleF ille ne propose à l— ˜—se que le ™h—rgement d9im—ges de type  ˜itm—p @extension F˜mpAF xe p—niquez p—s pour —ut—ntD ™—r grâ™e à une extension de l— ƒhv @l— ˜i˜liothèque ƒhv•sm—geAD nous verrons qu9il est possi˜le de ™h—rger de nom˜reux —utres typesF €our ™ommen™erD nous —llons nous ™ontenter de ™e que l— ƒhv o're à l— ˜—seF xous —llons don™ étudier le ™h—rgement de fw€F Le format BMP …n fw€ @—˜révi—tion de  fitm—p A est un form—t d9im—geF ves im—ges que vous voyez sur votre ordin—teur sont sto™kées d—ns des (™hiersF sl existe plusieurs form—ts d9im—gesD ™9estEàEdire plusieurs f—çons de ™oder l9im—ge d—ns un (™hierF ƒelon le form—tD l9im—ge prend plus ou moins d9esp—™e disque et se trouve être de plus ou moins ˜onne qu—litéF ve fitm—p est un form—t non ™ompressé @™ontr—irement —ux t€qD €xqD qspD et™FAF gon™rètementD ™el— signi(e les ™hoses suiv—ntes X ! le (™hier est très r—pide à lireD ™ontr—irement —ux form—ts ™ompressés qui doivent être dé™ompressésD ™e qui prend un peu plus de temps Y ! l— qu—lité de l9im—ge est p—rf—iteF gert—ins form—ts ™ompressés détériorent l— qu—lité de l9im—geD ™e n9est p—s le ™—s du fw€ Y ! m—is le (™hier est —ussi ˜ien plus gros puisqu9il n9est p—s ™ompressé 3 sl — don™ des qu—lités et des déf—utsF €our l— ƒhvD l9—v—nt—ge ™9est que ™e type de (™hier est simple et r—pide à lireF ƒi vous —vez souvent ˜esoin de ™h—rger des im—ges —u ™ours de l9exé™ution de votre progr—mmeD il v—ut mieux utiliser des fw€ X ™ertes le (™hier est plus grosD m—is il se ™h—rger— plus vite qu9un qsp p—r exempleF gel— peut se révéler utile si votre progr—mme doit ™h—rger de très nom˜reuses im—ges en peu de tempsF 1 Charger un Bitmap Téléchargement du pack d'images xous —llons tr—v—iller —ve™ plusieurs im—ges d—ns ™e ™h—pitreF ƒi vous voulez f—ire les tests en même temps que vous lisez @et vous devriez 3AD je vous re™omm—nde de téléE ™h—rger un p—™k qui ™ontient toutes les im—ges dont on v— —voir ˜esoinF £   ¢gode we˜ X VTRIUS ¡ fien entenduD vous pouvez utiliser vos propres im—gesF sl f—udr— en rev—n™he —d—pter l— t—ille de votre fenêtre à ™ellesE™iF €l—™ez toutes les im—ges d—ns le dossier de votre projetF xous —llons ™ommen™er p—r 1. car les PNG et GIF n'altèrent pas l'image. Je pense au JPG plus particulièrement. QQR .

com. qui n'est aujourd'hui plus commercialisé. le logiciel a été renommé en  Vue  et a beaucoup évolué.CHARGER UNE IMAGE BMP tr—v—iller —ve™ le (™hier l—™•en•mont—gneF˜mp F 2 Charger l'image dans une surface xous —llons utiliser une fon™tion qui v— ™h—rger l9im—ge fw€ et l— mettre d—ns une surf—™eF gette fon™tion — pour nom ƒhv•vo—dfw€F †ous —llez voir à quel point ™9est simple X m—ƒurf—™e a ƒhv•vo—dfw€@4im—geF˜mp4AY v— fon™tion ƒhv•vo—dfw€ rempl—™e deux fon™tions que vous ™onn—issez X ! ƒhv•gre—te‚qfƒurf—™e X elle se ™h—rge—it d9—llouer de l— mémoire pour sto™ker une surf—™e de l— t—ille dem—ndée @équiv—lent —u m—llo™A Y ! ƒhv•pill‚e™t X elle rempliss—it l— stru™ture d9une ™ouleur unieF €ourquoi estE™e que ç— rempl—™e ™es deux fon™tions c g9est très simple X ! l— t—ille à —llouer en mémoire pour l— surf—™e dépend de l— t—ille de l9im—ge X si l9im—ge — une t—ille de PSH x QHHD —lors votre surf—™e —ur— une t—ille de PSH x QHH Y ! d9—utre p—rtD votre surf—™e ser— remplie pixel p—r pixel p—r le ™ontenu de votre im—ge fw€F godons s—ns plus t—rder X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bim—gehepond a x…vvY ƒhv•‚e™t positionpondY positionpondFx a HY positionpondFy a HY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@VHHD THHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4gh—rgement d9im—ges en ƒhv4D x…vvAY GB gh—rgement d9une im—ge fitm—p d—ns une surf—™e BG im—gehepond a ƒhv•vo—dfw€@4l—™•en•mont—gneF˜mp4AY GB yn ˜litte p—rEdessus l9é™r—n BG ƒhv•flitƒurf—™e@im—gehepondD x…vvD e™r—nD 8positionpondAY ƒhv•plip@e™r—nAY p—use@AY ƒhv•preeƒurf—™e@im—gehepondAY GB yn li˜ère l— surf—™e BG 2. C'est une scène 3D d'exemple tirée de l'excellent logiciel de modélisation de paysages Vue d'Esprit 4. rendez-vous sur e-onsoftware. QQS . Depuis. Si vous voulez en savoir plus.

normalement ? QQT . les icônes des programmes ne sont-elles pas des Fi™o. AFFICHER DES IMAGES ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X QIPUUS ¡ t9—i don™ ™réé un pointeur vers une surf—™e @im—gehepondA —insi que les ™oordonnées ™orrespond—ntes @positionpondAF v— surf—™e est ™réée en mémoire et remplie p—r l— fon™tion ƒhv•vo—dfw€F yn l— ˜litte ensuite sur l— surf—™e e™r—n et ™9est tout 3 edmirez le résult—t sur l— (gF PPFIF £ ¢gode   Figure PPFI ! …ne im—ge fw€ ™h—rgée d—ns l— fenêtre gomme vous voyez ™e n9ét—it p—s ˜ien di0™ile 3 Associer une icône à son application w—inten—nt que nous s—vons ™h—rger des im—gesD nous pouvons dé™ouvrir ™omment —sso™ier une i™ône à notre progr—mmeF v9i™ône ser— —0™hée en h—ut à g—u™he de l— fenêtre @—insi que d—ns l— ˜—rre des tâ™hesAF €our le moment nous —vons une i™ône p—r déf—utF Mais.CHAPITRE 22.

†oi™i le ™ode sour™e ™ompletF †ous noterez que j9—i simplement —jouté le ƒhv•‡w•ƒets™on p—r r—pport —u ™ode pré™édent X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bim—gehepond a x…vvY ƒhv•‚e™t positionpondY positionpondFx a HY positionpondFy a HY ƒhv•snit@ƒhv•sxs„•†shiyAY GB gh—rgement de l9i™ône e†ex„ ƒhv•ƒet†ideowode BG ƒhv•‡w•ƒets™on@ƒhv•vo—dfw€@4sdl•i™oneF˜mp4AD x…vvAY e™r—n a ƒhv•ƒet†ideowode@VHHD THHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4gh—rgement d9im—ges en ƒhv4D x…vvAY im—gehepond a ƒhv•vo—dfw€@4l—™•en•mont—gneF˜mp4AY ƒhv•flitƒurf—™e@im—gehepondD x…vvD e™r—nD 8positionpondAY QQU . sous Windows il faut que l'icône soit de taille 32 x 32 pixels. sinon elle sera déformée. la SDL  réduira  les dimensions de l'image pour qu'elle rentre dans 16 x 16 pixels.CHARGER UNE IMAGE BMP xonD p—s for™ément 3 h9—illeurs les Fi™o n9existent que sous ‡indowsF v— ƒhv ré™on™ilie tout le monde en utilis—nt un système ˜ien à elle X une surf—™e 3 ih ouiD l9i™ône d9un progr—mme ƒhv n9est rien d9—utre qu9une simple surf—™eF Votre icône doit normalement être de taille 16 x 16 pixels. c'est-à-dire qu'elle doit se trouver avant ƒhv•ƒet†ideowode dans votre code source. Ne vous en faites pas. Toutefois. €our —jouter l9i™ône à l— fenêtreD on utilise l— fon™tion ƒhv•‡w•ƒets™onF gette fon™tion prend deux p—r—mètres X l— surf—™e qui ™ontient l9im—ge à —0™her —insi que des inforE m—tions sur l— tr—nsp—ren™e @x…vv si on ne veut p—s de tr—nsp—ren™eAF v— gestion de l— tr—nsp—ren™e d9une i™ône est un peu ™ompliquée @il f—ut pré™iser un à un quels sont les pixels tr—nsp—rentsAD nous ne l9étudierons don™ p—sF yn v— ™om˜iner deux fon™tions en une X ƒhv•‡w•ƒets™on@ƒhv•vo—dfw€@4sdl•i™oneF˜mp4AD x…vvAY v9im—ge est ™h—rgée en mémoire p—r ƒhv•vo—dfw€ et l9—dresse de l— surf—™e est dire™E tement envoyée à ƒhv•‡w•ƒets™onF La fonction ƒhv•‡w•ƒets™on doit être appelée avant que la fenêtre ne soit ouverte.

AFFICHER DES IMAGES ƒhv•plip@e™r—nAY p—use@AY ƒhv•preeƒurf—™e@im—gehepondAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY ‚ésult—tD l9i™ône est ™h—rgée et —0™hée sur l— fenêtre @(gF PPFPAF Figure PPFP ! …ne i™ône —sso™iée —u progr—mme Gestion de la transparence Le problème de la transparence xous —vons tout à l9heure ™h—rgé une im—ge ˜itm—p d—ns notre fenêtreF ƒupposons que l9on veuille ˜litter une im—ge p—rEdessusF Ǘ vous —rriver— très fréquemment ™—r d—ns un jeuD en génér—lD le personn—ge que l9on dépl—™e est un fitm—p et il se dépl—™e sur une im—ge de fondF yn v— ˜litter l9im—ge de ozor sur l— s™ène X 3 int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bim—gehepond a x…vvD Bzozor a x…vvY ƒhv•‚e™t positionpondD positionozorY positionpondFx a HY positionpondFy a HY positionozorFx a SHHY positionozorFy a PTHY ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•‡w•ƒets™on@ƒhv•vo—dfw€@4sdl•i™oneF˜mp4AD x…vvAY e™r—n a ƒhv•ƒet†ideowode@VHHD THHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4gh—rgement d9im—ges en ƒhv4D x…vvAY im—gehepond a ƒhv•vo—dfw€@4l—™•en•mont—gneF˜mp4AY ƒhv•flitƒurf—™e@im—gehepondD x…vvD e™r—nD 8positionpondAY 3.CHAPITRE 22. QQV . Il s'agit de la bonne vieille mascotte du Site du Zéro pour ceux qui ne le connaîtraient pas.

GESTION DE LA TRANSPARENCE GB gh—rgement et ˜litt—ge de ozor sur l— s™ène BG zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY ƒhv•plip@e™r—nAY p—use@AY ƒhv•preeƒurf—™e@im—gehepondAY ƒhv•preeƒurf—™e@zozorAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY yn — juste r—jouté une surf—™e pour y sto™ker ozorD que l9on ˜litte ensuite à un endroit sur l— s™ène @(gF PPFQAF Figure PPFQ ! ozor ˜litté p—rEdessus l9im—ge de fond g9est plutôt l—idD non c Je sais pourquoi. c'est parce que tu as mis un fond bleu tout moche sur l'image de Zozor ! QQW .

AFFICHER DES IMAGES €—r™e que vous ™royez qu9—ve™ un fond noir ou un fond m—rron derrière ozorD ç— —ur—it été plus joli c ih ˜ien nonD le pro˜lème i™i ™9est que notre im—ge est for™ément re™t—ngul—ireD don™ si on l— ™olle sur l— s™ène on voit son fondD ™e qui ne rend p—s très ˜ienF reureusementD l— ƒhv gère l— tr—nsp—ren™e 3 Rendre une image transparente Étape 1 : préparer l'image €our ™ommen™erD il f—ut prép—rer l9im—ge que vous voulez ˜litter sur l— s™èneF ve form—t fw€ ne gère p—s l— tr—nsp—ren™eD ™ontr—irement —ux qsp et €xqF sl v— don™ f—lloir utiliser une —stu™eF sl f—ut mettre l— même ™ouleur de fond sur toute l9im—geF gelleE™i ser— rendue tr—nsE p—rente p—r l— ƒhv —u moment du ˜litF y˜servez à quoi ressem˜le mon zozorF˜mp de plus près @(gF PPFRAF Figure PPFR ! v9im—ge zozorF˜mp — un fond ˜leu ve fond ˜leu derrière est don™ volont—ireF xotez que j9—i ™hoisi le ˜leu —u h—s—rdD j9—ur—is très ˜ien pu mettre un fond vert ou rouge p—r exempleF ge qui ™ompteD ™9est que ™ette ™ouleur soit unique et unieF t9—i ™hoisi le ˜leu p—r™e qu9il n9y en —v—it p—s d—ns l9im—ge de ozorF ƒi j9—v—is ™hoisi le vertD j9—ur—is pris le risque que l9her˜e que m—™houille ozor @en ˜—s à g—u™he de l9im—geA soit rendue tr—nsp—renteF À vous don™ de vous dé˜rouiller —ve™ votre logi™iel de dessin @€—intD €hotoshopD „he qimpD ™h—™un ses goûtsA pour donner un fond uni à votre im—geF Étape 2 : indiquer la couleur transparente €our indiquer à l— ƒhv l— ™ouleur qui doit être rendue tr—nsp—renteD vous devez utiliser l— fon™tion ƒhv•ƒetgolorueyF gette fon™tion doit être —ppelée —v—nt de ˜litter l9im—geF †oi™i ™omment je m9en sers pour rendre le ˜leu derrière ozor tr—nsp—rent X ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY sl y — trois p—r—mètres X ! l— surf—™e qui doit être rendue tr—nsp—rente @i™iD ™9est zozorA Y ! une liste de )—gs X utilisez ƒhv•ƒ‚ggyvy‚ui‰ pour —™tiver l— tr—nsp—ren™eD H pour l— dés—™tiver Y QRH .CHAPITRE 22.

GESTION DE LA TRANSPARENCE ! indiquez ensuite l— ™ouleur qui doit être rendue tr—nsp—renteF t9—i utilisé ƒhv•w—p‚qf pour ™réer l— ™ouleur —u form—t nom˜re @…intQPA ™omme on l9— déjà f—it p—r le p—sséF gomme vous le voyezD ™9est le ˜leu pur @HD HD PSSA que je rends tr—nsp—rentF in résuméD on ™h—rge d9—˜ord l9im—ge —ve™ ƒhv•vo—dfw€D on indique l— ™ouleur tr—nsE p—rente —ve™ ƒhv•ƒetgolorueyD puis on peut ˜litter —ve™ ƒhv•flitƒurf—™e X GB yn ™h—rge l9im—ge X BG zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY GB yn rend le ˜leu derrière ozor tr—nsp—rent X BG ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY GB yn ˜litte l9im—ge m—inten—nt tr—nsp—rente sur le fond X BG ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY ‚ésult—t X ozor est p—rf—itement intégré à l— s™ène @(gF PPFSA 3 Figure PPFS ! ozor tr—nsp—rent sur l9im—ge de fond †oilà ve te™hnique de ˜—se que vous réutiliserez tout le temps d—ns vos futurs proE gr—mmesF epprenez à ˜ien m—nier l— tr—nsp—ren™e ™—r ™9est fond—ment—l pour ré—liser un jeu un minimum ré—listeF La transparence Alpha g9est un —utre type de tr—nsp—ren™eF tusqu9i™iD on se ™ontent—it de dé(nir …xi ™ouleur de tr—nsp—ren™e @p—r exemple le ˜leuAF gette ™ouleur n9—pp—r—iss—it p—s une fois l9im—ge QRI .

Charger plus de formats d'image avec SDL_Image v— ƒhv ne gère que les fitm—p @fw€A ™omme on l9— vuF e prioriD ™e n9est p—s un très gros pro˜lème p—r™e que l— le™ture des fw€ est r—pide pour l— ƒhvD m—is il f—ut re™onn—ître qu9—ujourd9hui on — plutôt l9h—˜itude d9utiliser d9—utres form—tsF in p—rti™ulierD nous sommes h—˜itués —ux form—ts d9im—ges  ™ompressés ™omme le €xqD le qsp et le t€iqF Ǘ tom˜e ˜ienD il existe justement une ˜i˜liothèque ƒhv•sm—ge qui gère tous les form—ts suiv—nts X ! „qe Y QRP . AFFICHER DES IMAGES ˜littéeF v— tr—nsp—ren™e elph— ™orrespond à tout —utre ™hoseF ille permet de ré—liser un  méE l—nge entre une im—ge et le fondF g9est une sorte de fonduF v— tr—nsp—ren™e elph— d9une surf—™e peut être —™tivée p—r l— fon™tion ƒhv•ƒetelph— X ƒhv•ƒetelph—@zozorD ƒhv•ƒ‚gev€reD IPVAY sl y — là en™ore trois p—r—mètres X ! l— surf—™e en question @zozorA Y ! une liste de )—gs X mettez ƒhv•ƒ‚gev€re pour —™tiver l— tr—nsp—ren™eD H pour l— dés—™tiver Y ! très import—nt X l— v—leur Alpha de l— tr—nsp—ren™eF g9est un nom˜re ™ompris entre H @im—ge tot—lement tr—nsp—renteD don™ invisi˜leA et PSS @im—ge tot—lement op—queD ™omme s9il n9y —v—it p—s de tr—nsp—ren™e elph—AF €lus le nom˜re Alpha est petitD plus l9im—ge est tr—nsp—rente et fondueF †oi™i p—r exemple un ™ode qui —pplique une tr—nsp—ren™e elph— de IPV à notre ozor X zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY GB „r—nsp—ren™e elph— moyenne @IPVA X BG ƒhv•ƒetelph—@zozorD ƒhv•ƒ‚gev€reD IPVAY ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY †ous noterez que j9—i ™onservé l— tr—nsp—ren™e de ƒhv•ƒetgolorueyF ves deux types de tr—nsp—ren™e sont en e'et ™om˜in—˜lesF v— (gF PPFT vous montre à quoi ressem˜le ozor selon l— v—leur AlphaF La transparence Alpha 128 (transparence moyenne) est une valeur spéciale qui est optimisée par la SDL.CHAPITRE 22. C'est peut être bon à savoir si vous utilisez beaucoup de transparence Alpha dans votre programme. Ce type de transparence est plus rapide à calculer pour votre ordinateur que les autres.

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE Figure PPFT ! xive—ux de tr—nsp—ren™e elph— QRQ .

AFFICHER DES IMAGES ! fw€ Y ! €xw Y ! ˆ€w Y ! ˆgp Y ! €gˆ Y ! qsp Y ! t€q Y ! „sp Y ! vfw Y ! €xqF sl est en f—it possi˜le de r—jouter des extensions à l— ƒhvF ge sont des ˜i˜liothèques qui ont ˜esoin de l— ƒhv pour fon™tionnerF yn peut voir ç— ™omme des add-ons F ƒhv•sm—ge est l9une d9entre ellesF 4 Installer SDL_image sous Windows Téléchargement …ne p—ge spé™i—le du site de l— ƒhv référen™e les ˜i˜liothèques utilis—nt l— ƒhvF gette p—ge s9intitule vi˜r—riesD vous trouverez un lien d—ns le menu de g—u™heF †ous pourrez voir qu9il y — ˜e—u™oup de ˜i˜liothèques disponi˜lesF gellesE™i ne proviennent génér—leE ment p—s des —uteurs de l— ƒhvD ™e sont plutôt des utilis—teurs de l— ƒhv qui proposent leurs ˜i˜liothèques pour —méliorer l— ƒhvF gert—ines sont très ˜onnes et méritent le détourD d9—utres sont moins ˜onnes et en™ore ˜oguéesF sl f—ut —rriver à f—ire le triF gher™hez ƒhv•sm—ge d—ns l— listeF F F vous —rriverez sur l— p—ge dédiée à ƒhv•sm—geF   £ ¢gode we˜ X RQRTUP ¡ „élé™h—rgez l— version de ƒhv•sm—ge qui vous ™orrespond d—ns l— se™tion fin—ry @ne prenez €eƒ l— sour™eD on n9en — p—s ˜esoin 3AF ƒi vous êtes sous ‡indowsD télé™h—rgez ƒhv•im—geEdevelEIFPFIHE†gFzipD et ™e même si vous n9utilisez p—s †isu—l gCC 3 Installation h—ns ™e FzipD vous trouverez X ! ƒhv•im—geFh X le seul he—der dont — ˜esoin l— ˜i˜liothèque ƒhv•sm—geF €l—™ezEle d—ns g:’€rogr—m piles’godeflo™ks’ƒhvEIFPFIQ’in™ludeD ™9estEàEdire à ™ôté des —utres he—ders de l— ƒhv Y ! ƒhv•im—geFli˜ X ™opiez d—ns g:’€rogr—m piles’godeflo™ks’ƒhvEIFPFIQ’li˜F yuiD je s—isD je vous —i dit que norm—lement les Fli˜ ét—ient des (™hiers réservés à †isu—lD m—is i™i ex™eptionnellement le Fli˜ fon™tionner— même —ve™ le ™ompil—teur mingw Y 4.CHAPITRE 22. plus français. QRR . On emploie aussi parfois le mot  greon .

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE ! plusieurs hvv X pl—™ezEles toutes d—ns le dossier de votre projet @à ™ôté de ƒhvFdllD don™AF insuiteD vous devez modi(er les options de votre projet pour  linker —ve™ le (™hier ƒhv•im—geFli˜F ƒi vous êtes sous gode: :flo™ks p—r exempleD —llez d—ns le menu €roje™ts G fuild optionsF h—ns l9onglet vinkerD ™liquez sur le ˜outon edd et indiquez où se trouve le (™hier ƒhv•im—geFli˜ @(gF PPFUAF Figure PPFU ! ƒéle™tion de ƒhv•im—geFli˜ ƒi on vous dem—nde Keep as a relative path ?D répondez ™e que vous voulezD ç— ne ™h—nger— rien d—ns l9immédi—tF te re™omm—nde de répondre p—r l— nég—tiveD personnelE lementF insuiteD vous n9—vez plus qu9à in™lure le he—der ƒhv•im—geFh d—ns votre ™ode sour™eF ƒelon l9endroit où vous —vez pl—™é le (™hier ƒhv•im—geFhD vous devrez soit utiliser ™e ™ode X 5in™lude `ƒhvGƒhv•im—geFhb F F F soit ™eluiE™i X QRS .

vous n'aurez aucun problème pour installer ƒhv•im—ge. la manipulation est quasiment la même. Installer SDL_image sous Mac OS X ƒi vous utilisez w—™ yƒ ˆD télé™h—rgez le (™hier Fdmg sur le site de l— ƒhvD se™tion ƒhv•im—geF £   gode we˜ X RQRTUP ¡ ¢ gopiez le (™hier ƒhv•im—geFfr—mework d—ns w—™intosh rhGvi˜r—ryGpr—meworksF goE piez ensuite le (™hier ƒhv•im—geFh d—ns ƒhvFfr—meworkGre—dersF gréez un nouve—u projet de type ƒhv eppli™—tion et f—ites edd G ixisting pr—meworks @(gF PPFVAF Figure PPFV ! ejout de ƒhv•im—ge sous ˆ™ode vàD séle™tionnez le (™hier ƒhv•im—geFfr—mework que vous venez de télé™h—rgerF g9est tout 3 sl f—udr— en rev—n™he in™lure le (™hier Fh d—ns votre ™ode ™omme ™e™i X 5in™lude 4ƒhv•im—geFh4 QRT . Si vous avez réussi à installer la SDL.CHAPITRE 22. AFFICHER DES IMAGES 5in™lude `ƒhv•im—geFhb iss—yez les deuxD l9un des deux devr—it fon™tionnerF Si vous êtes sous Visual Studio.

n'hésitez pas à vous rendre au code web indiqué. eutre ˜on point X si l9im—ge que vous ™h—rgez gère l— tr—nsp—ren™e @™omme ™9est le ™—s des €xq et des qspAD —lors ƒhv•im—ge —™tiver— —utom—tiquement l— tr—nsp—ren™e pour ™ette im—ge 3 gel— vous évite don™ d9—voir à —ppeler ƒhv•ƒetgolorueyF te v—is vous présenter le ™ode sour™e qui ™h—rge s—pinFpng et l9—0™he F xotez ˜ien que j9in™lue ƒhvGƒhv•im—geFh et que je ne f—is p—s —ppel à ƒhv•ƒetgoloruey ™—r mon €xq est n—turellement tr—nsp—rentF †ous —llez voir que j9utilise swq•vo—d p—rtout d—ns ™e ™ode en rempl—™ement de ƒhv•vo—dfw€F 5 5in™lude `stdli˜Fhb 5in™lude `stdioFhb 5in™lude `ƒhvGƒhvFhb 5in™lude `ƒhvGƒhv•im—geFhb GB sn™lusion du he—der de ƒhv•im—ge @—d—pter le → dossier —u ˜esoinA BG int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bim—gehepond a x…vvD Bs—pin a x…vvY ƒhv•‚e™t positionpondD positionƒ—pinY GB ‘FFF“ gh—rgement de l— ƒhv et d9une im—ge de fond BG GB gh—rgement d9un €xq —ve™ swq•vo—d geluiE™i est —utom—tiquement rendu tr—nsp—rent ™—r les inform—tions de tr—nsp—ren™e sont ™odées à l9intérieur du fi™hier €xq BG s—pin a swq•vo—d@4s—pinFpng4AY ƒhv•flitƒurf—™e@s—pinD x…vvD e™r—nD 8positionƒ—pinAY 5. QRU . Je l'ai un peu raccourci pour ne pas encombrer le livre de codes source répétitifs que vous avez déjà vus plusieurs fois. Si vous voulez obtenir le code source complet. vous pouvez même oublier maintenant la fonction ƒhv•vo—dfw€ et ne plus utiliser que swq•vo—d pour le chargement de n'importe quelle image.CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE F F F —u lieu d9utiliser des ™hevrons ` bF ‚empl—™ez don™ l— ligne d9in™lude de ƒhv•im—ge d—ns le ™ode qui v— suivre p—r ™elle que je viens de vous donnerF Charger les images in f—itD inst—ller ƒhv•im—ge est IHH fois plus ™ompliqué que de l9utiliserD ™9est vous dire l— ™omplexité de l— ˜i˜liothèque 3 sl y — …xi seule fon™tion à ™onn—ître X swq•vo—dF ille prend un p—r—mètre X le nom du (™hier à ouvrirF ge qui est pr—tiqueD ™9est que ™ette fon™tion est ™—p—˜le d9ouvrir tous les types de (™hiers que gère ƒhv•im—ge @qspD €xqD t€qD m—is —ussi fw€D „spF F FAF ille déte™ter— toute seule le type du (™hier en fon™tion de son extensionF Comme ƒhv•im—ge peut aussi ouvrir les BMP.

AFFICHER DES IMAGES ƒhv•plip@e™r—nAY p—use@AY ƒhv•preeƒurf—™e@im—gehepondAY ƒhv•preeƒurf—™e@s—pinAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X SPVSRV ¡ gomme on peut le voir sur l— (gF PPFWD l9im—ge €xq — été insérée —ve™ l— tr—nsp—ren™e sur l9im—ge de fond 3 £ ¢gode   Figure PPFW ! …ne im—ge €xq tr—nsp—rente insérée à l9—ide de ƒhv•im—ge En résumé ! v— ƒhv permet de ™h—rger des im—ges d—ns des surf—™esF €—r déf—utD elle ne gère que les fw€ —ve™ ƒhv•vo—dfw€F ! yn peut dé(nir une ™ouleur tr—nsp—rente —ve™ ƒhv•ƒetgolorueyF ! yn peut rendre l9ensem˜le de l9im—ge plus ou moins tr—nsp—rent —ve™ l— fon™tion ƒhv•ƒetelph— F QRV .CHAPITRE 22.

CHARGER PLUS DE FORMATS D'IMAGE AVEC SDL_IMAGE ! v— ˜i˜liothèque ƒhv•im—ge permet d9insérer n9importe quel type d9im—ge @€xqD t€iqF F FA —ve™ swq•vo—dF sl f—ut ™epend—nt l9inst—ller en plus de l— ƒhvF QRW .

CHAPITRE 22. AFFICHER DES IMAGES QSH .

C'est à partir de là que vous allez vraiment être capables de contrôler votre application. Votre application va donc devenir enn réellement dynamique ! QSI . Chacun de vos périphériques (clavier. Nous allons apprendre à intercepter ces événements et à réagir en conséquence. souris.) peut produire des événements. .Chapitre 23 Diculté : La gestion des événements L a gestion des événements est une des fonctionnalités les plus importantes de la SDL. . C'est probablement une des sections les plus passionnantes à découvrir.

CHAPITRE 23. car nous allons apprendre à la reproduire. LA GESTION DES ÉVÉNEMENTS gon™rètementD qu9estE™e qu9un événement c g9est un  sign—l envoyé p—r un périphéE rique @ou p—r le système d9exploit—tionA à votre —ppli™—tionF †oi™i quelques exemples d9événements ™our—nts X ! qu—nd l9utilis—teur —ppuie sur une tou™he du ™l—vier Y ! qu—nd il ™lique —ve™ l— souris Y ! qu—nd il ˜ouge l— souris Y ! qu—nd il réduit l— fenêtre Y ! qu—nd il dem—nde à fermer l— fenêtre Y ! et™F ve rôle de ™e ™h—pitre ser— de vous —pprendre à tr—iter ™es événementsF †ous serez ™—p—˜les de dire à l9ordin—teur  ƒi l9utilis—teur ™lique à ™et endroitD f—is ç—D sinon f—is ™el—F F F ƒ9il ˜ouge l— sourisD f—is ™e™iF ƒ9il —ppuie sur l— tou™he D —rrête le proE gr—mmeF F F D et™F Le principe des événements €our nous h—˜ituer —ux événementsD nous —llons —pprendre à tr—iter le plus simple d9entre eux X la demande de fermeture du programmeF g9est un événement qui se produit lorsque l9utilis—teur ™lique sur l— ™roix pour fermer l— fenêtre @(gF PQFIAF Figure PQFI ! v— ™roix permett—nt de fermer l— fenêtre g9est vr—iment l9événement le plus simpleF in plusD ™9est un événement que vous —vez utilisé jusqu9i™i s—ns vr—iment le s—voirD ™—r il ét—it situé d—ns l— fon™tion p—use@A 3 in e'etD le rôle de l— fon™tion p—use ét—it d9—ttendre que l9utilis—teur dem—nde à fermer le progr—mmeF ƒi on n9—v—it p—s ™réé ™ette fon™tionD l— fenêtre se ser—it —0™hée et fermée en un é™l—ir 3 À partir de maintenant. Supprimez-la de votre code source. vous pouvez oublier la fonction p—use. La variable d'événement €our tr—iter des événementsD vous —urez ˜esoin de dé™l—rer une v—ri—˜le @juste une seuleD r—ssurezEvousA de type ƒhv•iventF eppelezEl— ™omme vous voulez X moiD je v—is l9—ppeler eventD ™e qui signi(e  événement en —ngl—isF ƒhv•ivent eventY QSP .

LE PRINCIPE DES ÉVÉNEMENTS €our nos tests nous —llons nous ™ontenter d9un m—in très ˜—sique qui —0™he juste une fenêtreD ™omme on l9— vu quelques ™h—pitres plus tôtF †oi™i à quoi doit ressem˜ler votre m—in X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvY ƒhv•ivent eventY GG gette v—ri—˜le servir— plus t—rd à gérer les événements ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4qestion des événements en ƒhv4D x…vvAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X VRPPTS ¡ g9est don™ un ™ode très ˜—siqueD il ne ™ontient qu9une nouve—uté X l— dé™l—r—tion de l— v—ri—˜le event dont nous —llons ˜ientôt nous servirF „estez ™e ™ode X ™omme prévuD l— fenêtre v— s9—0™her et se fermer immédi—tement —prèsF £ ¢gode   La boucle des événements vorsqu9on veut —ttendre un événementD on f—it génér—lement une ˜ou™leF gette ˜ou™le se répèter— t—nt qu9on n9— p—s eu l9événement vouluF yn v— —voir ˜esoin d9utiliser un ˜ooléen qui indiquer— si on doit ™ontinuer l— ˜ou™le ou nonF gréez don™ ™e ˜ooléen que vous —ppellerez p—r exemple ™ontinuer X int ™ontinuer a IY ge ˜ooléen est mis à I —u dép—rt ™—r on veut que l— ˜ou™le se répète „ex„ …i l— v—ri—˜le ™ontinuer v—ut I @vr—iAF hès qu9elle v—udr— H @f—uxAD —lors on sortir— de l— ˜ou™le et le progr—mme s9—rrêter—F †oi™i l— ˜ou™le à ™réer X while @™ontinuerA { GB „r—itement des événements BG } †oilà X on — pour le moment une ˜ou™le in(nie qui ne s9—rrêter— que si on met l— v—ri—˜le ™ontinuer à HF g9est ™e que nous —llons é™rire à l9intérieur de ™ette ˜ou™le qui est le plus intéress—ntF QSQ .

n'est-ce pas ? g9est une question que je me pos—is il y — en™ore peu de tempsF v— réponse est un petit peu ™ompliquée ™—r ç— ™on™erne l— f—çon dont l9yƒ gère les pro™essus @les progr—mmesAF ƒi vous voulez ! m—is je vous en p—rle r—pidement !D —ve™ ƒhv•‡—itiventD le pro™essus de votre progr—mme est mis  en p—use F †otre progr—mme n9est don™ plus tr—ité p—r le pro™esseurF sl ser—  réveillé p—r l9yƒ —u moment où il y —ur— un événementF hu ™oupD le pro™esseur se remettr— à tr—v—iller sur votre progr—mme à ™e momentElàF gel— explique pourquoi votre progr—mme ne ™onsomme p—s de pro™esseur pend—nt qu9il —ttend l9événementF te ™omprends que ™e soit un peu —˜str—it pour vous pour le momentF it à dire vr—iD vous n9—vez p—s ˜esoin de ™omprendre ç— m—inten—ntF †ous —ssimilerez mieux toutes les di'éren™es plus loin en pr—tiqu—ntF €our le momentD nous —llons utiliser ƒhv•‡—itivent ™—r notre progr—mme reste très simpleF ges deux fon™tions s9utilisent de toute f—çon de l— même m—nièreF QSR . non ? ƒhv•‡—itivent si cette fonction xonD ™—r il y — des ™—s où ƒhv•€ollivent se révèle indispens—˜leF g9est le ™—s des jeux d—ns lesquels l9é™r—n se met à jour même qu—nd il n9y — p—s d9événementF €renons p—r exemple „etris X les ˜lo™s des™endent tout seulsD il n9y — p—s ˜esoin que l9utilis—teur ™rée d9événement pour ç— 3 ƒi on —v—it utilisé ƒhv•‡—itiventD le progr—mme ser—it resté  ˜loqué d—ns ™ette fon™tion et vous n9—uriez p—s pu mettre à jour l9é™r—n pour f—ire des™endre les ˜lo™s 3 Comment fait ƒhv•‡—itivent pour ne pas consommer de processeur ? Après tout. LA GESTION DES ÉVÉNEMENTS Récupération de l'événement w—inten—ntD f—isons —ppel à une fon™tion de l— ƒhv pour dem—nder si un événement s9est produitF yn dispose de deux fon™tions qui font ™el—D m—is d9une m—nière di'érente X ! ƒhv•‡—itivent X elle —ttend qu9un événement se produiseF gette fon™tion est dite ˜loqu—nte ™—r elle suspend l9exé™ution du progr—mme t—nt qu9—u™un événement ne s9est produit Y ! ƒhv•€ollivent X ™ette fon™tion f—it l— même ™hose m—is n9est p—s ˜loqu—nteF ille vous dit si un événement s9est produit ou nonF wême si —u™un événement ne s9est produitD elle rend l— m—in à votre progr—mme de suiteF ges deux fon™tions sont utilesD m—is d—ns des ™—s di'érentsF €our f—ire simpleD si vous utilisez ƒhv•‡—itivent votre progr—mme utiliser— très peu de pro™esseur ™—r il —ttenE dr— qu9un événement se produiseF in rev—n™heD si vous utilisez ƒhv•€olliventD votre progr—mme v— p—r™ourir votre ˜ou™le while et r—ppeler ƒhv•€ollivent indé(niment jusqu9à ™e qu9un événement se soit produitF À tous les ™oupsD vous utiliserez IHH 7 du pro™esseurF Mais alors. il faut tout le temps utiliser utilise moins le processeur. la fonction est bien obligée de faire une boucle innie pour tester tout le temps s'il y a un événement ou non.CHAPITRE 23.

LE PRINCIPE DES ÉVÉNEMENTS †ous devez envoyer à l— fon™tion l9—dresse de votre v—ri—˜le event qui sto™ke l9événeE mentF gomme ™ette v—ri—˜le n9est p—s un pointeur @reg—rdez l— dé™l—r—tion à nouve—uAD nous —llons mettre le sym˜ole 8 dev—nt le nom de l— v—ri—˜le —(n de donner l9—dresse X ƒhv•‡—itivent@8eventAY eprès —ppel de ™ette fon™tionD l— v—ri—˜le event ™ontient o˜lig—toirement un événementF Cela n'aurait pas forcément été le cas si on avait utilisé cette fonction aurait pu renvoyer  Pas d'événement . par exemple ? v— ƒhv nous fournit des ™onst—ntesD ™e qui simpli(e gr—ndement l9é™riture du proE gr—mmeF sl en existe ˜e—u™oup @—ut—nt qu9il y — d9événements possi˜lesAF xous les verrons —u fur et à mesure tout —u long de ™e ™h—pitreF while @™ontinuerA { ƒhv•‡—itivent@8eventAY GB ‚é™upér—tion de l9événement d—ns event BG swit™h@eventFtypeA GB „est du type d9événement BG { ™—se ƒhv•…s„X GB ƒi ™9est un événement de type 4uitter4 BG ™ontinuer a HY ˜re—kY } } †oi™i ™omment ç— fon™tionneF IF hès qu9il y — un événementD l— fon™tion ƒhv•‡—itivent renvoie ™et événement d—ns eventF PF yn —n—lyse le type d9événement grâ™e à un swit™hF ve type de l9événement se trouve d—ns eventFtype QF yn teste à l9—ide de ™—se d—ns le swit™h le type de l9événementF €our le momentD on ne teste que l9événement ƒhv•…s„ @dem—nde de fermeture du progr—mmeAD ™—r ™9est le seul qui nous intéresseF QSS . ƒhv•€ollivent : Analyse de l'événement w—inten—ntD nous disposons d9une v—ri—˜le event qui ™ontient des inform—tions sur l9événement qui s9est produitF sl f—ut reg—rder l— sousEv—ri—˜le eventFtype et f—ire un test sur s— v—leurF qénér—lement on utilise un swit™h pour tester l9événementF Mais comment sait-on quelle valeur correspond à l'événement  Quitter .

CHAPITRE 23. LA GESTION DES ÉVÉNEMENTS ! ƒi ™9est un événement ƒhv•…s„D ™9est que l9utilis—teur — dem—ndé à quitter le progr—mmeF h—ns ™e ™—s on met le ˜ooléen ™ontinuer à HF eu pro™h—in tour de ˜ou™leD l— ™ondition ser— f—usse et don™ l— ˜ou™le s9—rrêter—F ve progr—mme s9—rrêter— ensuiteF ! ƒi ™e n9est p—s un événement ƒhv•…s„D ™9est qu9il s9est p—ssé —utre ™hose X l9utilis—teur — —ppuyé sur une tou™heD — ™liqué ou tout simplement ˜ougé l— souris d—ns l— fenêtreF gomme ™es —utres événements ne nous intéressent p—sD on ne les tr—ite p—sF yn ne f—it don™ rien X l— ˜ou™le re™ommen™e et on —ttend à nouve—u un événement @on rep—rt à l9ét—pe IAF ge que je viens de vous expliquer i™i est extrêmement import—ntF ƒi vous —vez ™ompris ™e ™odeD vous —vez tout ™ompris et le reste du ™h—pitre ser— très f—™ile pour vousF Le code complet int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvY ƒhv•ivent eventY GB v— v—ri—˜le ™onten—nt l9événement BG int ™ontinuer a IY GB xotre ˜ooléen pour l— ˜ou™le BG ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4qestion des événements en ƒhv4D x…vvAY while @™ontinuerA GB „ex„ …i l— v—ri—˜le ne v—ut p—s H BG { ƒhv•‡—itivent@8eventAY GB yn —ttend un événement qu9on ré™upère d—ns → event BG swit™h@eventFtypeA GB yn teste le type d9événement BG { ™—se ƒhv•…s„X GB ƒi ™9est un événement …s„„i‚ BG ™ontinuer a HY GB yn met le ˜ooléen à HD don™ l— ˜ou™le v— → s9—rrêter BG ˜re—kY } } ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X VSWVPQ ¡ †oilà le ™ode ™ompletF sl n9y — rien de ˜ien di0™ile X si vous —vez suivi jusqu9i™iD ç— ne devr—it p—s vous surprendreF h9—illeursD vous rem—rquerez qu9on n9— f—it que reproduire QST £ ¢gode   .

comme pause. QSU . Comparez avec le code de la fonction pause : c'est le même.LE CLAVIER ™e que f—is—it l— fon™tion p—use F 1 Le clavier xous —llons m—inten—nt étudier les événements produits p—r le ™l—vierF ƒi vous —vez ™ompris le dé˜ut du ™h—pitreD vous n9—urez —u™un pro˜lème pour tr—iter les —utres types d9événementsF sl n9y — rien de plus f—™ileF €ourquoi estE™e si simple c €—r™e que m—inten—nt que vous —vez ™ompris le fon™tionneE ment de l— ˜ou™le in(nieD tout ™e que vous —llez —voir à f—ireD ™9est d9—jouter d9—utres ™—se d—ns le swit™h pour tr—iter d9—utres types d9événementsF Ǘ ne devr—it p—s être trop durF Les événements du clavier sl existe deux événements di'érents qui peuvent être générés p—r le ™l—vier X ! ƒhv•ui‰hy‡x X qu—nd une tou™he du ™l—vier est enfon™ée Y ! ƒhv•ui‰…€ X qu—nd une tou™he du ™l—vier est relâ™héeF €ourquoi y —EtEil ™es deux événements c €—r™e que qu—nd vous —ppuyez sur une tou™heD il se p—sse deux ™hoses X vous enfon™ez l— tou™he @ƒhv•ui‰hy‡xAD puis vous l— relâ™hez @ƒhv•ui‰…€AF v— ƒhv vous permet de tr—iter ™es deux événements à p—rtD ™e qui ser— ˜ien pr—tiqueD vous verrezF €our le momentD nous —llons nous ™ontenter de tr—iter l9événement ƒhv•ui‰hy‡x @—ppui de l— tou™heA X while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX GB ƒi —ppui sur une tou™he BG ™ontinuer a HY ˜re—kY } } ƒi on —ppuie sur une tou™heD le progr—mme s9—rrêteF „estezD vous verrez 3 1. Bien entendu. il est préférable de placer ce code dans une fonction à part. car cela allège la fonction main et la rend plus lisible. sauf qu'on a cette fois tout mis dans le main.

. etc. sl y — une ™onst—nte pour ™h—™une des tou™hes du ™l—vierF †ous trouverez ™ette liste d—ns l— do™ument—tion de l— ƒhvD que vous —vez très pro˜—˜lement télé™h—rgée —ve™ l— ˜i˜liothèque qu—nd vous —vez dû l9inst—llerF ƒi tel n9est p—s le ™—sD je vous re™omm—nde fortement de retourner sur le site de l— ƒhv et d9y télé™h—rger l— do™ument—tionD ™—r elle est très utileF †ous trouverez l— liste des tou™hes du ™l—vier d—ns l— se™tion ueysym definitionsF gette liste est trop longue pour être présentée i™i @voir un —perçu (gF PQFPAD —ussi je vous propose pour ™el— de ™onsulter l— do™ument—tion sur le we˜ dire™tementF   £ ¢gode we˜ X PQSSPW ¡ Figure PQFP ! eperçu de l— do™ument—tion des ™onst—ntes du ™l—vier fien entenduD l— do™ument—tion est en —ngl—is et don™F F F l— liste —ussiF ƒi vous voulez vr—iment progr—mmerD il est import—nt d9être ™—p—˜le de lire l9—ngl—is ™—r toutes les do™ument—tions sont d—ns ™ette l—ngueD et vous ne pouvez p—s vous en p—sser 3 sl y — deux t—˜le—ux d—ns ™ette liste X un gr—nd @—u dé˜utA et un petit @à l— (nAF xous nous intéresserons —u gr—nd t—˜le—uF h—ns l— première ™olonne vous —vez l— ™onst—nteD d—ns l— se™onde l— représent—tion équiv—lente en eƒgss et en(nD d—ns l— troisième ™olonneD vous —vez une des™ription de l— tou™heF €renons p—r exemple l— tou™he i™h—p @ is™—pe en —ngl—isAF yn peut véri(er si l— tou™he enfon™ée est i™h—p ™omme ™e™i X 3 2. ƒuppr. QSV . ou encore smprF i™r—n. Notez que certaines touches comme Maj (ou Shift) n'ont pas de valeur ASCII correspondante. intrée. . bien sûr (ABCDE0123.). Elle fonctionne aussi lors d'un relâchement de la touche SDL_KEYUP. mais aussi la touche i™h—p.CHAPITRE 23. 3. LA GESTION DES ÉVÉNEMENTS Récupérer la touche ƒ—voir qu9une tou™he — été enfon™ée ™9est ˜ienD m—is s—voir l—quelleD ™9est qu—nd même mieux 3 yn peut o˜tenir l— n—ture de l— tou™he enfon™ée grâ™e à une sousEsousEsousEv—ri—˜le @oufA qui s9—ppelle eventFkeyFkeysymFsymF gette v—ri—˜le ™ontient l— v—leur de l— tou™he qui — été enfon™ée F 2 L'avantage. c'est que la SDL permet de récupérer la valeur de toutes les touches du clavier. Il y a les lettres et les chires.

†oi™i une ˜ou™le d9événement ™omplète que vous pouvez tester X while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX swit™h @eventFkeyFkeysymFsymA { ™—se ƒhvu•iƒge€iX GB eppui sur l— tou™he i™h—pD on —rrête le → progr—mme BG ™ontinuer a HY ˜re—kY } ˜re—kY } } gette foisD le progr—mme s9—rrête si on —ppuie sur i™h—p ou si on ™lique sur l— ™roix de l— fenêtreF Maintenant que vous savez comment arrêter le programme en appuyant sur une touche. Flag SDL_FULLSCREEN dans SDL_SetVideoMode. vous êtes autorisés à faire du plein écran si ça vous amuse . 4 4. pour rappel. j'ai plutôt tendance à me servir des swit™h quand je traite les événements car je teste beaucoup de valeurs diérentes (en pratique. QSW . contrairement à ici).LE CLAVIER swit™h @eventFkeyFkeysymFsymA { ™—se ƒhvu•iƒge€iX GB eppui sur l— tou™he i™h—pD on —rrête le progr—mme BG ™ontinuer a HY ˜re—kY } J'utilise un swit™h pour faire mon test mais j'aurais aussi bien pu utiliser un if. Auparavant. je vous avais demandé d'éviter de le faire car on ne savait pas comment arrêter un programme en plein écran (il n'y a pas de croix sur laquelle cliquer pour arrêter !). Toutefois. j'ai beaucoup de ™—se dans un swit™h.

il faut donc que ces surfaces aient été initialisées auparavant. LA GESTION DES ÉVÉNEMENTS Exercice : diriger Zozor au clavier †ous êtes m—inten—nt ™—p—˜les de dépl—™er une im—ge d—ns l— fenêtre à l9—ide du ™l—vier 3 g9est un exer™i™e très intéress—nt qui v— d9—illeurs nous permettre de voir ™omment utiliser le dou˜le ˜u'ering et l— répétition de tou™hesF he plusD ™e que je v—is vous —pprendre là est l— ˜—se de tous les jeux ré—lisés en ƒhvD don™ ce n'est pas un exercice facultatif 3 te vous invite à le lire et à le f—ire très soigneusementF Charger l'image €our ™ommen™erD nous —llons ™h—rger une im—geF yn v— f—ire simple X on v— reprendre l9im—ge de ozor utilisée d—ns le ™h—pitre pré™édentF gréez don™ l— surf—™e zozorD ™h—rgez l9im—ge et rendezEl— tr—nsp—rente @™9ét—it un fw€D je vous le r—ppelleAF zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY insuiteD et ™9est ™ert—inement le plus import—ntD vous devez ™réer une v—ri—˜le de type ƒhv•‚e™t pour retenir les ™oordonnées de ozor X ƒhv•‚e™t positionozorY te vous re™omm—nde d9initi—liser les ™oordonnéesD en mett—nt soit x a H et y a H @position en h—ut à g—u™he de l— fenêtreAD soit en ™entr—nt ozor d—ns l— fenêtre ™omme vous —vez —ppris à le f—ire il n9y — p—s si longtempsF GB yn ™entre ozor à l9é™r—n BG positionozorFx a e™r—nEbw G P E zozorEbw G PY positionozorFy a e™r—nEbh G P E zozorEbh G PY Vous devez initialiser positionozor après avoir chargé les surfaces e™r—n et zozor.CHAPITRE 23. j'utilise la largeur (w) et la hauteur (h) de ces deux surfaces pour calculer la position centrée de Zozor à l'écran. En eet. ƒi vous vous êtes ˜ien dé˜rouillésD vous devriez —voir réussi à —0™her ozor —u ™entre de l9é™r—n @(gF PSFIAF t9—i ™hoisi de mettre le fond en ˜l—n™ ™ette fois @en f—is—nt un ƒhv•pill‚e™t sur e™r—nAD m—is ™e n9est p—s une o˜lig—tionF Schéma de la programmation événementielle u—nd vous ™odez un progr—mme qui ré—git —ux événements @™omme on v— le f—ire i™iAD vous devez suivre l— plup—rt du temps le même  s™hém— de ™odeF ge s™hém— est à QTH .

EXERCICE : DIRIGER ZOZOR AU CLAVIER Figure PQFQ ! ozor ™entré d—ns l— fenêtre connaître par c÷urF ve voi™i X while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•„‚…gX GB qestion des événements de type „‚…g BG ™—se ƒhv•fsh…viX GB qestion des événements de type fsh…vi BG } GB yn eff—™e l9é™r—n @i™i fond ˜l—n™A X BG ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY → GB yn f—it tous les ƒhv•flitƒurf—™e né™ess—ires pour ™oller les surf—™es à l9é™r—n BG GB yn met à jour l9—ffi™h—ge X BG ƒhv•plip@e™r—nAY } †oilà d—ns les gr—ndes lignes l— forme de l— ˜ou™le prin™ip—le d9un progr—mme ƒhvF yn ˜ou™le t—nt qu9on n9— p—s dem—ndé à —rrêter le progr—mmeF QTI .

LA GESTION DES ÉVÉNEMENTS IF On attend un événement @ƒhv•‡—itiventA ou ˜ien on véri(e s9il y — un événement m—is on n9—ttend p—s qu9il y en —it un @ƒhv•€olliventAF €our le moment on se ™ontente de ƒhv•‡—itiventF PF yn f—it un @gr—ndA swit™h pour s—voir de quel type d9événement il s9—git @évéE nement de type „‚…gD de type fsh…viD ™omme ç— vous ™h—nte 3AF On traite l'événement qu'on a reçu X on e'e™tue ™ert—ines —™tionsD ™ert—ins ™—l™ulsF QF …ne fois sorti du swit™hD on prép—re un nouvel —0™h—ge X @—A première ™hose à f—ire X on eace l'écran —ve™ un ƒhv•pill‚e™tF ƒi on ne le f—is—it p—sD on —ur—it des  tr—™es de l9—n™ien é™r—n qui su˜sister—ientD et for™émentD ™e ne ser—it p—s très joli Y @˜A ensuiteD on f—it tous les blits né™ess—ires pour ™oller les surf—™es sur l9é™r—n Y @™A en(nD une fois que ™9est f—itD on met à jour l'achage —ux yeux de l9utiE lis—teurD en —ppel—nt l— fon™tion ƒhv•plip@e™r—nAF Traiter l'événement SDL_KEYDOWN †oyons m—inten—nt ™omment on v— tr—iter l9événement ƒhv•ui‰hy‡xF xotre ˜ut est de diriger ozor —u ™l—vier —ve™ les )è™hes dire™tionnellesF yn v— don™ modi(er ses ™oordonnées à l9é™r—n en fon™tion de l— )è™he sur l—quelle on —ppuie X swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX swit™h@eventFkeyFkeysymFsymA { ™—se ƒhvu•…€X GG plè™he h—ut positionozorFyEEY ˜re—kY ™—se ƒhvu•hy‡xX GG plè™he ˜—s positionozorFyCCY ˜re—kY ™—se ƒhvu•‚sqr„X GG plè™he droite positionozorFxCCY ˜re—kY ™—se ƒhvu•vip„X GG plè™he g—u™he positionozorFxEEY ˜re—kY } ˜re—kY } gomment j9—i trouvé ™es ™onst—ntes c h—ns l— do™9 3 te vous —i donné tout à l9heure un lien vers l— p—ge de l— do™9 qui liste toutes les tou™hes du ™l—vier X ™9est là que je me suis serviF QTP .CHAPITRE 23.

Notez que nous ne sommes pas obligés de le déplacer d'un pixel.EXERCICE : DIRIGER ZOZOR AU CLAVIER we˜ X PQSSPW ¡ ge qu9on f—it là est très simple X ! si on —ppuie sur l— )è™he  h—ut D on diminue l9ordonnée @yA de l— position de ozor d9un pixel pour le f—ire  monter Y ! si on v— vers le ˜—sD on doit —u ™ontr—ire —ugmenter @in™rémenterA l9ordonnée de ozor @yA Y ! si on v— vers l— droiteD on —ugmente l— v—leur de l9—˜s™isse @xA Y ! si on v— vers l— g—u™heD on doit diminuer l9—˜s™isse @xAF it m—inten—nt c in vous —id—nt du s™hém— de ™ode donné pré™édemmentD vous devriez être ™—p—˜les de diriger ozor —u ™l—vier 3 5 £ ¢gode   int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bzozor a x…vvY ƒhv•‚e™t positionozorY ƒhv•ivent eventY int ™ontinuer a IY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegiAY ƒhv•‡w•ƒetg—ption@4qestion des événements en ƒhv4D x…vvAY GB gh—rgement de ozor BG zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY GB yn ™entre ozor à l9é™r—n BG positionozorFx a e™r—nEbw G P E zozorEbw G PY positionozorFy a e™r—nEbh G P E zozorEbh G PY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX swit™h@eventFkeyFkeysymFsymA { ™—se ƒhvu•…€X GG plè™he h—ut positionozorFyEEY ˜re—kY ™—se ƒhvu•hy‡xX GG plè™he ˜—s 5. on pourrait très bien le déplacer de 10 pixels en 10 pixels. QTQ .

CHAPITRE 23. LA GESTION DES ÉVÉNEMENTS positionozorFyCCY ˜re—kY ™—se ƒhvu•‚sqr„X GG plè™he droite positionozorFxCCY ˜re—kY ™—se ƒhvu•vip„X GG plè™he g—u™he positionozorFxEEY ˜re—kY } } ˜re—kY } GB yn eff—™e l9é™r—n BG ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY GB yn pl—™e ozor à s— nouvelle position BG ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY GB yn met à jour l9—ffi™h—ge BG ƒhv•plip@e™r—nAY ƒhv•preeƒurf—™e@zozorAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X PSPIVV ¡ sl est primordi—l de ˜ien ™omprendre ™omment est ™omposée l— ˜ou™le prin™ip—le du progr—mmeF sl f—ut être ™—p—˜le de l— ref—ire de têteF ‚elisez le s™hém— de ™ode que vous —vez vu plus h—utD —u ˜esoinF hon™ en résuméD on — une grosse ˜ou™le —ppelée  fou™le prin™ip—le du progr—mme F ille ne s9—rrêter— que si on le dem—nde en mett—nt le ˜ooléen ™ontinuer à HF h—ns ™ette ˜ou™leD on ré™upère d9—˜ord un événement à tr—iterF yn f—it un swit™h pour déterminer de quel type d9événement il s9—gitF in fon™tion de l9événementD on e'e™tue di'érentes —™tionsF s™iD je mets à jour les ™oordonnées de ozor pour donner l9impression qu9on le dépl—™eF insuiteD —près le swit™h vous devez mettre à jour votre é™r—n ™omme suitF IF €remièrementD vous e'—™ez l9é™r—n vi— un ƒhv•pill‚e™t @de l— ™ouleur de fond que vous voulezAF PF insuiteD vous ˜littez vos surf—™es sur l9é™r—nF s™iD je n9—i eu ˜esoin de ˜litter que ozor ™—r il n9y — que luiF †ous noterezD et ™9est très import—ntD que je ˜litte ozor à positionozor 3 g9est là que l— di'éren™e se f—it X si j9—i mis à jour positionozor —up—r—v—ntD —lors ozor —pp—r—îtr— à un —utre endroit et on —ur— l9impression qu9on l9— dépl—™é 3 QF in(nD toute dernière ™hose à f—ire X ƒhv•plipF gel— ordonne l— mise à jour de l9é™r—n —ux yeux de l9utilis—teurF QTR £ ¢gode   .

EXERCICE : DIRIGER ZOZOR AU CLAVIER yn peut don™ dépl—™er ozor où l9on veut sur l9é™r—nD m—inten—nt @(gF PQFRA 3 Figure PQFR ! ozor en ˜—l—de Quelques optimisations Répétition des touches €our l9inst—ntD notre progr—mme fon™tionne m—is on ne peut se dépl—™er que d9un pixel à l— foisF xous sommes o˜ligés d9—ppuyer à nouve—u sur les )è™hes du ™l—vier si on veut en™ore se dépl—™er d9un pixelF te ne s—is p—s vousD m—is moi ç— m9—muse moyennement de m9ex™iter frénétiquement sur l— même tou™he du ™l—vier juste pour dépl—™er le personn—ge de PHH pixelsF reureusementD il y — ƒhv•in—˜leuey‚epe—t 3 gette fon™tion permet d9—™tiver l— réE pétition des tou™hesF ille f—it en sorte que l— ƒhv régénère un événement de type ƒhv•ui‰hy‡x si une tou™he est m—intenue enfon™ée un ™ert—in tempsF gette fon™tion peut être —ppelée qu—nd vous voulezD m—is je vous ™onseille de l9—ppeler de préféren™e —v—nt l— ˜ou™le prin™ip—le du progr—mmeF ille prend deux p—r—mètres X ! l— durée @en millise™ondesA pend—nt l—quelle une tou™he doit rester enfon™ée —v—nt d9—™tiver l— répétition des tou™hes Y ! le dél—i @en millise™ondesA entre ™h—que génér—tion d9un événement ƒhv•ui‰hy‡x une fois que l— répétition — été —™tivéeF QTS .

CHAPITRE 23. LA GESTION DES ÉVÉNEMENTS ve premier p—r—mètre indique —u ˜out de ™om˜ien de temps on génère une répétition l— première foisD et le se™ond indique le temps qu9il f—ut ensuite pour que l9événement se répèteF €ersonnellementD pour des r—isons de )uiditéD je mets l— même v—leur à ™es deux p—r—mètresD le plus souventF iss—yez —ve™ une répétition de IH ms X ƒhv•in—˜leuey‚epe—t@IHD IHAY w—inten—ntD vous pouvez l—isser une tou™he du ™l—vier enfon™éeF †ous —llez voirD ™9est qu—nd même mieux 3 Travailler avec le double buer À p—rtir de m—inten—ntD il ser—it ˜on d9—™tiver l9option de double buering de l— ƒhvF ve dou˜le ˜u'ering est une te™hnique ™our—mment utilisée d—ns les jeuxF ille permet d9éviter un s™intillement de l9im—geF €ourquoi l9im—ge s™intiller—itEelle c €—r™e que qu—nd vous dessinez à l9é™r—nD l9utilis—teur  voit qu—nd vous dessinez et don™ qu—nd l9é™r—n s9e'—™eF wême si ç— v— très viteD notre ™erve—u perçoit un ™lignotement et ™9est très dés—gr闘leF v— te™hnique du dou˜le ˜u'ering ™onsiste à utiliser deux  é™r—ns X l9un est réel @™elui que l9utilis—teur est en tr—in de voir sur son moniteurAD l9—utre est virtuel @™9est une im—ge que l9ordin—teur est en tr—in de ™onstruire en mémoireAF ges deux é™r—ns —lternent X l9é™r—n e est —0™hé pend—nt que l9—utre @l9é™r—n fA en  —rrièreEpl—n prép—re l9im—ge suiv—nte @(gF PQFSAF Figure PQFS ! in dou˜le ˜u'eringD l9im—ge suiv—nte est prép—rée en tâ™he de fond …ne fois que l9im—ge en —rrièreEpl—n @l9é™r—n fA — été dessinéeD on intervertit les deux é™r—ns en —ppel—nt l— fon™tion ƒhv•plip @(gF PQFTAF v9é™r—n e p—rt en —rrièreEpl—n prép—rer l9im—ge suiv—nteD t—ndis que l9im—ge de l9é™r—n f s9—0™he dire™tement et inst—nt—nément —ux yeux de l9utilis—teurF ‚ésult—t X —u™un s™intillement 3 QTT .

EXERCICE : DIRIGER ZOZOR AU CLAVIER Figure PQFT ! ƒhv•plip intervertit les é™r—ns pour —0™her l— nouvelle im—ge €our ré—liser ™el—D tout ™e que vous —vez à f—ire est de ™h—rger le mode vidéo en —jout—nt le )—g ƒhv•hy…fvif…p X e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY †ous n9—vez rien d9—utre à ™h—nger d—ns votre ™odeF Le double buering est une technique bien connue de votre carte graphique. Ça ne coûte pas plus cher et c'est mieux : de quoi se plaint-on ? QTU . C'est donc directement géré par le matériel et ça va très très vite. †ous vous dem—ndez peutEêtre pourquoi on — déjà utilisé ƒhv•plip —up—r—v—nt s—ns le dou˜le ˜u'ering c in f—itD ™ette fon™tion — deux utilités X ! si le dou˜le ˜u'ering est —™tivéD elle sert à ™omm—nder  l9é™h—nge des é™r—ns qu9on vient de voir Y ! si le dou˜le ˜u'ering n9est p—s —™tivéD elle ™omm—nde un r—fr—î™hissement m—nuel de l— fenêtreF gette te™hnique est v—l—˜le d—ns le ™—s d9un progr—mme qui ne ˜ouge p—s ˜e—u™oupD m—is pour l— plup—rt des jeuxD je re™omm—nde de l9—™tiverF horén—v—ntD j9—ur—i toujours le dou˜le ˜u'ering —™tivé d—ns mes ™odes sour™e F ƒi vous le souh—itezD vous pouvez ré™upérer le ™ode sour™e ™omplet qui f—it us—ge du dou˜le ˜u'ering et de l— répétition des tou™hesF sl est très simil—ire à ™elui que l9on — vu pré™édemmentD on y — seulement —jouté les nouvelles instru™tions qu9on vient d9—pprendreF   £ ¢gode we˜ X TIVVUH ¡ 6 6.

LA GESTION DES ÉVÉNEMENTS La souris †ous vous dites peutEêtre que gérer l— souris est plus ™ompliqué que le ™l—vier c ue nenni 3 g9est même plus simpleD vous —llez voir 3 v— souris peut générer trois types d9événements di'érentsF ! ƒhv•wy…ƒif…„„yxhy‡x X lorsqu9on ™lique —ve™ l— sourisF gel— ™orrespond —u moment où le ˜outon de l— souris est enfon™éF ! ƒhv•wy…ƒif…„„yx…€ X lorsqu9on relâ™he le ˜outon de l— sourisF „out ™el— fon™tionne ex—™tement sur le même prin™ipe que les tou™hes du ™l—vier X il y — d9—˜ord un —ppuiD puis un relâ™hement du ˜outonF ! ƒhv•wy…ƒiwy„syx X lorsqu9on dépl—™e l— sourisF À ™h—que fois que l— souris ˜ouge d—ns l— fenêtre @ne ser—itE™e que d9un pixel 3AD un événement ƒhv•wy…ƒiwy„syx est généré 3 xous —llons d9—˜ord tr—v—iller —ve™ les ™li™s de l— souris et plus p—rti™ulièrement —ve™ ƒhv•wy…ƒif…„„yx…€F yn ne tr—v—iller— p—s —ve™ ƒhv•wy…ƒif…„„yxhy‡x i™iD m—is vous s—vez de toute m—nière que ™9est ex—™tement p—reil s—uf que ™el— se produit plus tôtD —u moment de l9enfon™ement du ˜outon de l— sourisF xous verrons un peu plus loin ™omment tr—iter l9événement ƒhv•wy…ƒiwy„syxF Gérer les clics de la souris xous —llons don™ ™—pturer un événement de type ƒhv•wy…ƒif…„„yx…€ @™li™ de l— sourisA puis voir quelles inform—tions on peut ré™upérerF gomme d9h—˜itudeD on v— devoir —jouter un ™—se d—ns notre swit™h de testD —lors —llonsEy g—iement X swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•wy…ƒif…„„yx…€X GB gli™ de l— souris BG ˜re—kY } tusqueElàD p—s de di0™ulté m—jeureF uelles inform—tions peutEon ré™upérer lors d9un ™li™ de l— souris c sl y en — deux X ! le bouton de la souris —ve™ lequel on — ™liqué @™li™ g—u™he c ™li™ droit c ™li™ ˜outon du milieu cA Y ! les coordonnées de la souris —u moment du ™li™ @x et yAF Récupérer le bouton de la souris yn v— d9—˜ord voir —ve™ quel ˜outon de l— souris on — ™liquéF €our ™el—D il f—ut —n—lyser l— sousEv—ri—˜le eventF˜uttonF˜utton @nonD je ne ˜ég—ie p—sA et ™omp—rer s— v—leur QTV .CHAPITRE 23.

yn v— f—ire un test simple pour véri(er si on — f—it un ™li™ droit —ve™ l— sourisF ƒi on — f—it un ™li™ droitD on —rrête le progr—mme @ouiD je s—isD ™e n9est p—s très origin—l pour le moment m—is ç— permet de testerA X swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•wy…ƒif…„„yx…€X if @eventF˜uttonF˜utton aa ƒhv•f…„„yx•‚sqr„A GB yn —rrête le progr—mme → si on — f—it un ™li™ droit BG ™ontinuer a HY ˜re—kY } †ous pouvez testerD vous verrez que le progr—mme s9—rrête si on f—it un ™li™ droitF Récupérer les coordonnées de la souris †oilà une inform—tion très intéress—nte X les ™oordonnées de l— souris —u moment du ™li™ 3 yn les ré™upère à l9—ide de deux v—ri—˜les @pour l9—˜s™isse et l9ordonnéeA X eventF˜uttonFx et eventF˜uttonFyF emusonsEnous un petit peu X on v— ˜litter ozor à l9endroit du ™li™ de l— sourisF gomE pliqué c €—s du tout 3 iss—yez de le f—ireD ™9est un jeu d9enf—nt 3 †oi™i l— ™orre™tion X while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { 7. Tout le monde n'en a pas forcément un. c'est en général un clic avec la molette. Elles ne correspondent pas à un  clic  sur la molette comme on pourrait le penser à tort.LA SOURIS —ve™ l9une des S ™onst—ntes suiv—ntes X ! ƒhv•f…„„yx•vip„ X ™li™ —ve™ le ˜outon g—u™he de l— souris Y ! ƒhv•f…„„yx•wshhvi X ™li™ —ve™ le ˜outon du milieu de l— souris Y ! ƒhv•f…„„yx•‚sqr„ X ™li™ —ve™ le ˜outon droit de l— souris Y ! ƒhv•f…„„yx•‡riiv…€ X molette de l— souris vers le h—ut Y ! ƒhv•f…„„yx•‡riivhy‡x X molette de l— souris vers le ˜—sF 7 Les deux dernières constantes correspondent au mouvement vers le haut ou vers le bas auquel on procède avec la molette de la souris. QTW .

LA GESTION DES ÉVÉNEMENTS ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•wy…ƒif…„„yx…€X positionozorFx a eventF˜uttonFxY positionozorFy a eventF˜uttonFyY ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY GB yn pl—™e ozor à s— → nouvelle position BG ƒhv•plip@e™r—nAY } Ǘ ressem˜le à s9y méprendre à ™e que je f—is—is —ve™ les tou™hes du ™l—vierF vàD ™9est même en™ore plus simple X on met dire™tement l— v—leur de x de l— souris d—ns positionozorFxD et de même pour yF insuite on ˜litte ozor à ™es ™oordonnéesElàD et voilà le tr—v—il @(gF PQFUA 3 Figure PQFU ! ozor —pp—r—ît à l9endroit du ™li™ €etit exer™i™e très simple X pour le momentD on dépl—™e ozor quel que soit le ˜outon de l— souris utilisé pour le ™li™F iss—yez de ne dépl—™er ozor que si on f—it un ™li™ g—u™he —ve™ l— sourisF ƒi on f—it un ™li™ droitD —rrêtez le progr—mmeF QUH .CHAPITRE 23.

c'était eventF˜uttonFx). yn v— pl—™er ozor —ux mêmes ™oordonnées que l— sourisD là en™oreF †ous —llez voirD ™9est rudement e0™—™e et toujours —ussi simple 3 while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•wy…ƒiwy„syxX positionozorFx a eventFmotionFxY positionozorFy a eventFmotionFyY ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY GB yn pl—™e ozor à s— → nouvelle position BG ƒhv•plip@e™r—nAY } fougez votre ozor à l9é™r—nF ue voyezEvous c sl suit n—turellement l— souris où que vous —lliezF g9est ˜e—uD ™9est r—pideD ™9est )uide @vive le dou˜le ˜u'eringAF QUI . tout ça ? €—s du tout X r—ssurezEvousD il en — vu d9—utres 3 fonD que peutEon ré™upérer d9intéress—nt i™i c ves ™oordonnées de l— sourisD ˜ien sûr 3 yn les trouve d—ns eventFmotionFx et eventFmotionFyF Faites attention : on n'utilise pas les mêmes variables que pour le clic de souris de tout à l'heure (avant.LA SOURIS Gérer le déplacement de la souris …n dépl—™ement de l— souris génère un événement de type ƒhv•wy…ƒiwy„syxF xotez ˜ien qu9on génère —ut—nt d9événements que l9on p—r™ourt de pixels pour se dépl—™er 3 ƒi on ˜ouge l— souris de IHH pixels @™e qui n9est p—s ˜e—u™oupAD il y —ur— don™ IHH événements générésF Mais ça ne fait pas beaucoup d'événements à gérer pour notre ordinateur. Les variables utilisées sont diérentes en SDL en fonction de l'événement.

la souris a bougé ! Même si ce n'est pas l'utilisateur qui l'a fait. Eh oui. il y a quand même eu un déplacement. Les événements de la fenêtre v— fenêtre elleEmême peut générer un ™ert—in nom˜re d9événements X ! lorsqu9elle est redimensionnée Y ! lorsqu9elle est réduite en ˜—rre des tâ™hes ou rest—urée Y ! lorsqu9elle est —™tive @—u premier pl—nA ou lorsqu9elle n9est plus —™tive Y ! lorsque le ™urseur de l— souris se trouve à l9intérieur de l— fenêtre ou lorsqu9il en sortF gommençons p—r étudier le premier d9entre eux X l9événement généré lors du redimenE sionnement de l— fenêtreF QUP . un événement de type ƒhv•wy…ƒiwy„syx sera généré. LA GESTION DES ÉVÉNEMENTS Quelques autres fonctions avec la souris xous —llons voir deux fon™tions très simples en r—pport —ve™ l— sourisD puisque nous y sommesF ges fon™tions vous seront très pro˜—˜lement utiles ˜ientôtF Masquer la souris yn peut m—squer le ™urseur de l— souris très f—™ilementF sl su0t d9—ppeler l— fon™tion ƒhv•ƒhowgursor et de lui envoyer un )—g X ! ƒhv•hsƒefvi X m—sque le ™urseur de l— souris Y ! ƒhv•ixefvi X ré—0™he le ™urseur de l— sourisF €—r exemple X ƒhv•ƒhowgursor@ƒhv•hsƒefviAY ve ™urseur de l— souris rester— m—squé t—nt qu9il ser— à l9intérieur de l— fenêtreF w—squez de préféren™e le ™urseur —v—nt l— ˜ou™le prin™ip—le du progr—mmeF €—s l— peine en e'et de le m—squer à ™h—que tour de ˜ou™leD une seule fois su0tF Placer la souris à un endroit précis yn peut pl—™er m—nuellement le ™urseur de l— souris —ux ™oordonnées que l9on veut d—ns l— fenêtreF yn utilise pour ™el— ƒhv•‡—rpwouse qui prend pour p—r—mètres les ™oordonnées x et y où le ™urseur doit être pl—™éF €—r exempleD le ™ode suiv—nt pl—™e l— souris —u ™entre de l9é™r—n X ƒhv•‡—rpwouse@e™r—nEbw G PD e™r—nEbh G PAY Lorsque vous faites un ‡—rpwouse.CHAPITRE 23.

on parle de focus .LES ÉVÉNEMENTS DE LA FENÊTRE Redimensionnement de la fenêtre €—r déf—utD une fenêtre ƒhv ne peut p—s être redimensionnée p—r l9utilis—teurF te vous r—ppelle que pour ™h—nger ç—D il f—ut —jouter le )—g ƒhv•‚iƒsefvi d—ns l— fon™tion ƒhv•ƒet†ideowode X e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…p | → ƒhv•‚iƒsefviAY …ne fois que vous —vez —jouté ™e )—gD vous pouvez redimensionner l— fenêtreF vorsque vous f—ites ™el—D un événement de type ƒhv•†shiy‚iƒsi est généréF †ous pouvez ré™upérer X ! l— nouvelle l—rgeur d—ns eventFresizeFw Y ! l— nouvelle h—uteur d—ns eventFresizeFhF yn peut utiliser ™es inform—tions pour f—ire en sorte que notre ozor soit toujours ™entré d—ns l— fenêtre X ™—se ƒhv•†shiy‚iƒsiX positionozorFx a eventFresizeFw G P E zozorEbw G PY positionozorFy a eventFresizeFh G P E zozorEbh G PY ˜re—kY Visibilité de la fenêtre v9événement ƒhv•eg„s†ii†ix„ est généré lorsque l— visi˜ilité de l— fenêtre ™h—ngeF gel— peut être dû à de nom˜reuses ™hoses X ! l— fenêtre est réduite en ˜—rre des tâ™hes ou rest—urée Y ! le ™urseur de l— souris se trouve à l9intérieur de l— fenêtre ou en sort Y ! l— fenêtre est —™tive @—u premier pl—nA ou n9est plus —™tiveF En programmation. Lorsqu'on dit qu'une application a le focus. Une seule fenêtre peut avoir le focus à un instant donné (vous ne pouvez pas avoir deux fenêtres au premier plan en même temps !). Tous les clics sur la souris ou appuis sur les touches du clavier que vous ferez seront envoyés à la fenêtre qui a le focus et non aux autres. Ét—nt donné le nom˜re de r—isons qui peuvent —voir provoqué ™et événementD il f—ut impér—tivement reg—rder d—ns des v—ri—˜les pour en s—voir plusF ! eventF—™tiveFg—in X indique si l9événement est un g—in @IA ou une perte @HAF €—r exempleD si l— fenêtre est p—ssée en —rrièreEpl—n ™9est une perte @HAD si elle est remise —u premier pl—n ™9est un g—in @IAF ! eventF—™tiveFst—te X ™9est une ™om˜in—ison de )—gs indiqu—nt le type d9événement qui s9est produitF †oi™i l— liste des )—gs possi˜les X QUQ . c'est que le clavier ou la souris de l'utilisateur s'y trouve.

LA GESTION DES ÉVÉNEMENTS X le ™urseur de l— souris vient de rentrer ou de sortir de l— fenêtreF sl f—ut reg—rder l— v—leur de eventF—™tiveFg—in pour s—voir si elle est rentrée @g—in a IA ou sortie @g—in a HA de l— fenêtre Y ! ƒhv•e€€sx€…„pyg…ƒ X l9—ppli™—tion vient de re™evoir le fo™us du ™l—vier ou de le perdreF gel— signi(e en f—it que votre fenêtre vient d9être mise —u premier pl—n ou en —rrièreEpl—nF in™ore une foisD il f—ut reg—rder l— v—leur de eventF—™tiveFg—in pour s—voir si l— fenêtre — été mise —u premier pl—n @g—in a IA ou en —rrièreEpl—n @g—in a HA Y ! ƒhv•e€€eg„s†i X l9—ppli™—ton — été icôniéeD ™9estEàEdire réduite d—ns l— ˜—rre des tâ™hes @g—in a HAD ou remise d—ns son ét—t norm—l @g—in a IAF †ous suivez toujours c sl f—ut ˜ien ™omp—rer les v—leurs des deux sousEv—ri—˜les g—in et st—te pour s—voir ex—™tement ™e qui s9est produitF ƒhv•e€€wy…ƒipyg…ƒ ! Tester la valeur d'une combinaison de ags eventF—™tiveFst—te est une ™om˜in—ison de )—gsF gel— signi(e que d—ns un événeE mentD il peut se produire deux ™hoses à l— fois @p—r exempleD si on réduit l— fenêtre d—ns l— ˜—rre des tâ™hesD on perd —ussi le fo™us du ™l—vier et de l— sourisAF sl v— don™ f—lloir f—ire un test un peu plus ™ompliqué qu9un simpleF F F if @eventF—™tiveFst—te aa ƒhv•e€€eg„s†iA Pourquoi est-ce plus compliqué ? €—r™e que ™9est une ™om˜in—ison de ˜itsF te ne v—is p—s vous f—ire un ™ours sur les opér—tions logiques ˜it à ˜it i™iD ç— ser—it un peu trop pour ™e ™ours et vous n9—vez p—s né™ess—irement ˜esoin d9en ™onn—ître d—v—nt—geF te v—is vous proposer un ™ode prêt à l9emploi qu9il f—ut utiliser pour tester si un )—g est présent d—ns une v—ri—˜le s—ns rentrer d—ns les dét—ilsF €our tester p—r exemple s9il y — eu un ™h—ngement de fo™us de l— sourisD on doit é™rire X if @@eventF—™tiveFst—te 8 ƒhv•e€€wy…ƒipyg…ƒA aa ƒhv•e€€wy…ƒipyg…ƒA sl n9y — p—s d9erreurF ettentionD ™9est pré™is X il f—ut un seul 8 et deux aD et il f—ut ˜ien utiliser les p—renthèses ™omme je l9—i f—itF gel— fon™tionne de l— même m—nière pour les —utres événementsF €—r exemple X if @@eventF—™tiveFst—te 8 ƒhv•e€€eg„s†iA aa ƒhv•e€€eg„s†iA Tester l'état et le gain à la fois h—ns l— pr—tiqueD vous voudrez sûrement tester l9ét—t et le g—in à l— foisF †ous pourrez —insi s—voir ex—™tement ™e qui s9est p—sséF QUR .CHAPITRE 23.

Ce sera à vous de tester l'état de la variable p—use pour savoir s'il faut ou non eectuer les calculs de votre jeu. ce code n'est pas complet. te vous l—isse f—ire d9—utres tests pour les —utres ™—s @p—r exempleD véri(er si le ™urseur de l— souris est à l9intérieur ou à l9extérieur de l— fenêtreAF †ous pouvez " pour vous entr—îner " f—ire ˜ouger ozor vers l— droite lorsque l— souris rentre d—ns l— fenêtreD et le f—ire ˜ouger vers l— g—u™he lorsqu9elle en sortF En résumé ! ves événements sont des sign—ux que vous envoie l— ƒhv pour vous informer d9une —™tion de l— p—rt de l9utilis—teur X —ppui sur une tou™heD mouvement ou ™li™ de l— sourisD fermeture de l— fenêtreD et™F ! ves événements sont ré™upérés d—ns une v—ri—˜le de type ƒhv•ivent —ve™ l— fon™E tion ƒhv•‡—itivent @fon™tion ˜loqu—nte m—is f—™ile à gérerA ou —ve™ l— fon™tion ƒhv•€ollivent @fon™tion non ˜loqu—nte m—is plus ™omplexe à m—nipulerAF ! sl f—ut —n—lyser l— sousEv—ri—˜le eventFtype pour ™onn—ître le type d9événement qui s9est produitF yn le f—it en génér—l d—ns un swit™hF ! …ne fois le type d9événement déterminéD il est le plus souvent né™ess—ire d9—n—lyser l9événement d—ns le dét—ilF €—r exempleD lorsqu9une tou™he du ™l—vier — été enfon™ée @ƒhv•ui‰hy‡xA il f—ut —n—lyser eventFkeyFkeysymFsym pour ™onn—ître l— tou™he en questionF ! ve dou˜le ˜u'ering est une te™hnique qui ™onsiste à ™h—rger l9im—ge suiv—nte en tâ™he de fond et à l9—0™her seulement une fois qu9elle est prêteF gel— permet d9éviter des s™intillements dés—gr闘les à l9é™r—nF QUS .LES ÉVÉNEMENTS DE LA FENÊTRE ƒupposons que vous —yez un jeu qui f—it f—ire ˜e—u™oup de ™—l™uls à l9ordin—teurF †ous voulez que le jeu se mette en p—use —utom—tiquement lorsque l— fenêtre est réduiteD et qu9il se rel—n™e lorsque l— fenêtre est rest—uréeF gel— évite que le jeu ™ontinue pend—nt que le joueur n9est plus —™tif et ™el— évite —ussi —u pro™esseur de f—ire trop de ™—l™uls p—r l— même o™™—sionF ve ™ode ™iEdessous met en p—use le jeu en —™tiv—nt un ˜ooléen p—use à IF sl remet en m—r™he le jeu en dés—™tiv—nt le ˜ooléen à HF if @@eventF—™tiveFst—te 8 ƒhv•e€€eg„s†iA aa ƒhv•e€€eg„s†iA { if @eventF—™tiveFg—in aa HA GB v— fenêtre — été réduite BG p—use a IY else if @eventF—™tiveFg—in aa IA GB v— fenêtre — été rest—urée BG p—use a HY } Bien entendu.

LA GESTION DES ÉVÉNEMENTS QUT .CHAPITRE 23.

vous l'aurez compris je crois. Ce premier TP de la section SDL est justement là pour vous faire découvrir un cas pratique et surtout vous inviter à manipuler. un grand nombre de fonctions prêtes à l'emploi.Chapitre 24 Diculté : TP : Mario Sokoban L a bibliothèque SDL fournit. mais le jeu est pourtant un grand classique des casse-têtes. notre programme ne sera pas une console mais bel et bien une fenêtre ! 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. surtout si on ne pratique pas. QUU . Il consiste à pousser des caisses pour les amener à des points précis dans un labyrinthe. Cette fois. Il est facile de s'y perdre les premiers temps. comme vous l'avez vu.

TP : MARIO SOKOBAN Cahier des charges du Sokoban À propos du Sokoban  ƒoko˜—n est un terme j—pon—is qui signi(e  w—g—sinier F sl s9—git d9un ™—sseEtête inventé d—ns les —nnées VH p—r riroyuki sm—˜—y—shiF ve jeu — remporté un ™on™ours de progr—mm—tion à ™ette époqueF Le but du jeu sl est simple à ™omprendre X vous dirigez un personn—ge d—ns un l—˜yrintheF sl doit pousser des ™—isses pour les —mener à des endroits pré™isF ve joueur ne peut p—s dépl—™er deux ™—isses à l— foisF ƒi le prin™ipe se ™omprend vite et ˜ienD ™el— ne veut p—s dire pour —ut—nt que le jeu est toujours f—™ileF sl est en e'et possi˜le de ré—liser des ™—sseEtêtes vr—imentF F F prise de tête 3 v— (gF PRFI vous donne un —perçu du jeu que nous —llons ré—liserF Figure PRFI ! ve jeu w—rio ƒoko˜—n que nous —llons ré—liser Pourquoi avoir choisi ce jeu ? €—r™e que ™9est un jeu popul—ireD qu9il f—it un ˜on sujet de progr—mm—tion et qu9on peut le ré—liser —ve™ les ™onn—iss—n™es que l9on — —™quisesF elors ˜ien sûrD ç— dem—nde de l9org—nis—tionF v— di0™ulté n9est p—s vr—iment d—ns le ™ode luiEmême m—is d—ns QUV .CHAPITRE 24.

-) 2. . Ce n'est pas indispensable mais ça ajoutera du piment ! QUW .CAHIER DES CHARGES DU SOKOBAN l9org—nis—tionF sl v— en e'et f—lloir dé™ouper notre progr—mme en plusieurs (™hiers F™ intelligemment et ess—yer de ™réer les ˜onnes fon™tionsF g9est —ussi pour ™ette r—ison que j9—i dé™idé ™ette fois de ne p—s ™onstruire le „€ ™omme les pré™édents X je ne v—is p—s vous donner des indi™es suivis d9une ™orre™tion à l— (nF eu ™ontr—ireD je v—is vous montrer ™omment je ré—lise tout le projet de e à F Et si je veux m'entraîner tout seul ? €—s de pro˜lème 3 ellezEy l—n™ezEvousD ™9est même très ˜ien 3 sl vous f—udr— ™ert—inement un peu de temps X personnellement ç— m9— pris une ˜onne petite journéeD et en™ore ™9est p—r™e que j9—i un peu l9h—˜itude de progr—mmer et que j9évite ™ert—ins pièges ™our—nts F ƒ—™hez qu9un tel jeu peut être ré—lisé de nom˜reuses f—çons di'érentesF te v—is vous montrer m— f—çon de f—ire X ™e n9est p—s l— meilleureD m—is ™e n9est p—s l— plus m—uv—ise non plusF ve „€ se terminer— p—r une série de suggestions d9—mélior—tions et je vous proposer—i de télé™h—rger le ™ode sour™e ™omplet ˜ien entenduF in™ore une fois X je vous ™onseille d9ess—yer de vous y l—n™er p—r vousEmêmesF €—ssezEy deux ou trois jours et f—ites de votre mieuxF sl est import—nt que vous pr—tiquiezF 1 Le cahier des charges ve ™—hier des ™h—rges est un do™ument d—ns lequel on é™rit tout ™e que le progr—mme doit s—voir f—ireF in l9o™™uren™eD que veutEon que notre jeu soit ™—p—˜le de f—ire c g9est le moment de se dé™ider 3 †oi™i ™e que je propose X ! le joueur doit pouvoir se dépl—™er d—ns un l—˜yrinthe et pousser des ™—isses Y ! il ne peut p—s pousser deux ™—isses à l— fois Y ! une p—rtie est ™onsidérée ™omme g—gnée lorsque toutes les ™—isses sont sur des o˜je™E tifs Y ! les nive—ux de jeu seront enregistrés d—ns un (™hier @p—r exemple nive—uxFlvlA Y ! un éditeur ser— intégré —u progr—mme pour que n9importe qui puisse ™réer ses propres nive—ux F †oilà qui nous donner— ˜ien —ssez de tr—v—ilF À noter qu9il y — des ™hoses que notre progr—mme ne s—ur— p—s f—ireD ç— —ussi il f—ut le direF ! xotre progr—mme ne pourr— gérer qu9un seul nive—u à l— foisF ƒi vous voulez ™oder une  —venture —ve™ une suite de nive—uxD vous n9—urez qu9à le f—ire vousEmêmes à l— (n de ™e „€F ! sl n9y —ur— p—s de gestion du temps é™oulé @on ne s—it p—s en™ore f—ire ç—A ni du 2 1. Cela ne m'a pas empêché de me prendre la tête à plusieurs reprises quand même.

TP : MARIO SOKOBAN s™oreF in f—itD —ve™ tout ™e qu9on veut déjà f—ire @not—mment l9éditeur de nive—uxAD il y en — pour un petit momentF Je vous indiquerai à la n du TP une liste d'idées pour améliorer le programme.CHAPITRE 24. je ne vous donnerai pas les codes source de la version complète pour vous forcer à travailler .-) QVH . Je vais pas tout vous servir sur un plateau d'argent non plus ! . car ce sont des idées que j'aurai moimême implémentées dans une version plus complète du programme que je vous proposerai de télécharger. Et ce ne seront pas des paroles en l'air. 3 Récupérer les sprites du jeu h—ns l— plup—rt des jeux PhD que ™e soient des jeux de pl—teEforme ou de ™—sseEtête ™omme i™iD on —ppelle les im—ges qui ™omposent le jeu des sprites F h—ns notre ™—sD j9—i dé™idé qu9on ™réer—it un ƒoko˜—n mett—nt en s™ène w—rio @d9où le nom  w—rio ƒoko˜—n AF gomme w—rio est un personn—ge popul—ire d—ns le monde de l— PhD on n9—ur— p—s trop de m—l à trouver des sprites de w—rioF sl f—udr— —ussi trouver des sprites pour les murs de ˜riquesD les ™—issesD les o˜je™tifsD et™F ƒi vous f—ites une re™her™he sur qoogle pour  sprites D vous trouverez de nom˜reuses réponsesF in e'etD il y — ˜e—u™oup de sites qui proposent de télé™h—rger des sprites de jeux Ph —uxquels vous —vez sûrement joué p—r le p—sséF †oi™i les sprites que nous —llons utiliser X Sprite Description …n murF …ne ™—isseF …ne ™—isse pl—™ée sur un o˜je™tifF …n o˜je™tif @où l9on doit pl—™er une ™—isseAF ve joueur @w—rioA orienté vers le ˜—sF w—rio vers l— droiteF w—rio vers l— g—u™heF w—rio vers le h—utF ve plus simple pour vous ser— de télé™h—rger un p—™k que j9—i prép—ré ™onten—nt toutes ™es im—gesF   £ ¢gode we˜ X SRPSTT ¡ 3. En revanche.

J'aurais pu faire en sorte que Mario soit toujours orienté vers le bas. Ça ne fera qu'un petit dé de plus à relever ! t9—i —ussi ™réé une petite im—ge qui pourr— servir de menu d9—™™ueil —u l—n™ement du progr—mme @(gF PRFPAD vous l— trouverez d—ns le p—™k que vous venez norm—lement de télé™h—rgerF Figure PRFP ! v9é™r—n d9—™™ueil du progr—mme †ous noterez que les im—ges sont d—ns di'érents form—tsF sl y — des qspD des €xq et des t€iqF xous —llons don™ —voir ˜esoin de l— ˜i˜liothèque ƒhv•sm—geF €ensez à ™on(gurer votre projet pour qu9il gère l— ƒhv et ƒhv•sm—geF ƒi vous —vez ou˜lié ™omment f—ireD revoyez les ™h—pitres pré™édentsF ƒi vous ne ™on(gurez p—s votre projet ™orre™tementD on vous dir— que les fon™tions que vous utilisez @™omme swq•vo—dA n9existent p—s 3 Le main et les constantes gh—que fois qu9on ™ommen™e un projet —ssez import—ntD il est né™ess—ire de ˜ien s9orE g—niser dès le dép—rtF in génér—lD je ™ommen™e p—r me ™réer un (™hier de ™onst—ntes ™onst—ntesFh —insi qu9un (™hier m—inF™ qui ™ontiendr— l— fon™tion m—in @et uniqueE ment ™elleElàAF ge n9est p—s une règle X ™9est juste m— f—çon de fon™tionnerF gh—™un — s— propre m—nière de f—ireF QVI .LE MAIN ET LES CONSTANTES Notez que j'aurais très bien pu n'utiliser qu'un sprite pour le joueur. mais le fait de pouvoir le diriger dans les quatre directions ajoute un peu plus de réalisme.

TP : MARIO SOKOBAN Les diérents chiers du projet te propose de ™réer dès à présent tous les (™hiers du projet @même s9ils restent vides —u dép—rtAF †oi™i don™ les (™hiers que je ™rée X ! ™onst—ntesFh X les dé(nitions de ™onst—ntes glo˜—les à tout le progr—mme Y ! m—inF™ X le (™hier qui ™ontient l— fon™tion m—in @fon™tion prin™ip—le du progr—mmeA Y ! jeuF™ X fon™tions gér—nt une p—rtie de ƒoko˜—n Y ! jeuFh X prototypes des fon™tions de jeuF™ Y ! editeurF™ X fon™tions gér—nt l9éditeur de nive—ux Y ! editeurFh X prototypes des fon™tions de editeurF™ Y ! fi™hiersF™ X fon™tions gér—nt l— le™ture et l9é™riture de (™hiers de nive—ux @™omme nive—uxFlvl p—r exempleA Y ! fi™hiersFh X prototypes des fon™tions de fi™hiersF™F yn v— ™ommen™er p—r ™réer le (™hier des ™onst—ntesF Les constantes : constantes.CHAPITRE 24.h †oi™i le ™ontenu de mon (™hier de ™onst—ntes X GB ™onst—ntesFh EEEEEEEEEEEE €—r m—teoPID pour ve ƒite du éro @wwwFsiteduzeroF™omA ‚ôle X définit des ™onst—ntes pour tout le progr—mme @t—ille de l— fenêtreFFFA BG 5ifndef hip•gyxƒ„ex„iƒ 5define hip•gyxƒ„ex„iƒ 5define 5define 5define 5define 5define „esvvi•fvyg xf•fvygƒ•ve‚qi…‚ xf•fvygƒ•re…„i…‚ ve‚qi…‚•pixi„‚i re…„i…‚•pixi„‚i QR GG „—ille d9un ˜lo™ @™—rréA en pixels IP IP „esvvi•fvyg B xf•fvygƒ•ve‚qi…‚ „esvvi•fvyg B xf•fvygƒ•re…„i…‚ enum {re…„D feƒD qe…griD h‚ys„i}Y enum {†shiD w…‚D gesƒƒiD yftig„spD we‚syD gesƒƒi•yu}Y 5endif we˜ X PSHTHW ¡ †ous noterez plusieurs points intéress—nts d—ns ™e petit (™hierF ! ve (™hier ™ommen™e p—r un ™omment—ire d9enEtêteF te re™omm—nde de mettre ™e type de ™omment—ire —u dé˜ut de ™h—™un de vos (™hiers @que ™e soient des Fh ou des QVP £ ¢gode   .

LE MAIN ET LES CONSTANTES qénér—lementD un ™omment—ire d9enEtête ™ontient X le nom du (™hier Y l9—uteur Y le rôle du (™hier @™e à quoi servent les fon™tions qu9il ™ontientA Y je ne l9—i p—s f—it làD m—is génér—lementD on met —ussi l— d—te de ™ré—tion et l— d—te de dernière modi(™—tionF Ǘ permet de s9y retrouverD surtout d—ns les gros projets à plusieursF ! ve (™hier est protégé ™ontre les in™lusions in(niesF sl utilise l— te™hnique que l9on — —pprise à l— (n du ™h—pitre sur le prépro™esseurF s™i ™ette prote™tion ne sert p—s vr—imentD m—is j9—i pris l9h—˜itude de f—ire ç— pour ™h—™un de mes (™hiers Fh s—ns ex™eptionF ! in(nD le ™÷ur du (™hierF †ous —vez une série de defineF t9indique l— t—ille d9un petit ˜lo™ en pixels @tous mes sprites sont des ™—rrés de QR pxAF t9indique que m— fenêtre ™omporter— IP x IP ˜lo™s de l—rgeurF te ™—l™ule ™omme ç— les dimensions de l— fenêtre p—r une simple multipli™—tion des ™onst—ntesF ge que je f—is là n9est p—s o˜lig—toireD m—is — un énorme —v—nt—ge X si plus t—rd je veux ™h—nger l— t—ille du jeuD je n9—ur—i qu9à éditer ™e (™hier @et à re™ompilerA et tout mon ™ode sour™e s9—d—pter— en ™onséquen™eF ! in(nD j9—i dé(ni d9—utres ™onst—ntes vi— des énumérations anonymesF g9est légèE rement di'érent de ™e qu9on — —ppris d—ns le ™h—pitre sur les types de v—ri—˜les personn—lisésF s™iD je ne ™rée p—s un type personn—liséD je dé(nis juste des ™onst—ntesF gel— ressem˜le —ux define à une di'éren™e près X ™9est l9ordin—teur qui —ttri˜ue —uE tom—tiquement un nom˜re à ™h—™une des v—leurs @en ™ommenç—nt p—r HAF einsiD on — re…„ a HD feƒ a ID qe…gri a PD et™F gel— permettr— de rendre notre ™ode sour™e ˜e—u™oup plus ™l—ir p—r l— suiteD vous verrez 3 in résuméD j9utilise X ! des define lorsque je veux —ttri˜uer une v—leur pré™ise à une ™onst—nte @p—r exemple  QR pixels A Y ! des énumér—tions lorsque l— v—leur —ttri˜uée à une ™onst—nte ne m9importe p—sF s™iD je me moque ˜ien de s—voir que re…„ v—ut H @ç— pourr—it —ussi ˜ien v—loir ISHD ç— ne ™h—nger—it rienA Y tout ™e qui ™ompte pour moiD ™9est que ™ette ™onst—nte —it une v—leur di'érente de feƒD qe…gri et h‚ys„iF ! ! ! ! F™AF Inclure les dénitions de constantes ve prin™ipe ser— d9in™lure ™e (™hier de ™onst—ntes d—ns ™h—™un de mes (™hiers F™F einsiD p—rtout d—ns mon ™ode je pourr—i utiliser les ™onst—ntes que je viens de dé(nirF sl f—udr— don™ t—per l— ligne suiv—nte —u dé˜ut de ™h—™un des (™hiers F™ X 5in™lude 4™onst—ntesFh4 QVQ .

CHAPITRE 24. TP : MARIO SOKOBAN Le main : main.c v— fon™tion m—in prin™ip—le est extrêmement simpleF ille — pour rôle d9—0™her l9é™r—n d9—™™ueil du jeu et de rediriger vers l— ˜onne se™tionF GB m—inF™ EEEEEE €—r m—teoPID pour ve ƒite du éro @wwwFsiteduzeroF™omA ‚ôle X menu du jeuF €ermet de ™hoisir entre l9éditeur et le jeu luiEmêmeF BG 5in™lude 5in™lude 5in™lude 5in™lude `stdli˜Fhb `stdioFhb `ƒhvGƒhvFhb `ƒhvGƒhv•im—geFhb 5in™lude 4™onst—ntesFh4 5in™lude 4jeuFh4 5in™lude 4editeurFh4 int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bmenu a x…vvY ƒhv•‚e™t positionwenuY ƒhv•ivent eventY int ™ontinuer a IY ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•‡w•ƒets™on@swq•vo—d@4™—isseFjpg4AD x…vvAY GG v9i™ône doit être ™h—rgée —v—nt ƒhv•ƒet†ideowode e™r—n a ƒhv•ƒet†ideowode@ve‚qi…‚•pixi„‚iD re…„i…‚•pixi„‚iD QPD ƒhv•r‡ƒ…‚pegi → | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4w—rio ƒoko˜—n4D x…vvAY → menu a swq•vo—d@4menuFjpg4AY positionwenuFx a HY positionwenuFy a HY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY QVR .

LE MAIN ET LES CONSTANTES ˜re—kY ™—se ƒhv•ui‰hy‡xX swit™h@eventFkeyFkeysymFsymA { ™—se ƒhvu•iƒge€iX GG †eut —rrêter le jeu ™ontinuer a HY ˜re—kY ™—se ƒhvu•u€IX GG hem—nde à jouer jouer@e™r—nAY ˜re—kY ™—se ƒhvu•u€PX GG hem—nde l9éditeur de nive—ux editeur@e™r—nAY ˜re—kY } ˜re—kY } } GG iff—™ement de l9é™r—n ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY ƒhv•flitƒurf—™e@menuD x…vvD e™r—nD 8positionwenuAY ƒhv•plip@e™r—nAY ƒhv•preeƒurf—™e@menuAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X UQQQTW ¡ v— fon™tion m—in se ™h—rge d9e'e™tuer les initi—lis—tions de l— ƒhvD de donner un titre à l— fenêtre —insi qu9une i™ôneF À l— (n de l— fon™tionD ƒhv•uit@A est —ppelée pour —rrêter l— ƒhv proprementF v— fon™tion —0™he un menuF ve menu est ™h—rgé en utilis—nt l— fon™tion swq•vo—d de ƒhv•sm—ge X menu a swq•vo—d@4menuFjpg4AY £ ¢gode   Vous remarquerez que. pour donner les dimensions de la fenêtre. j'utilise les constantes ve‚qi…‚•pixi„‚i et re…„i…‚•pixi„‚i qu'on a dénies dans ™onst—ntesFh. La boucle des événements v— ˜ou™le in(nie gère les événements suiv—nts X QVS .

CHAPITRE 24. mais on pourrait en renvoyer une. QVT . si on voulait. On pourrait par exemple renvoyer un booléen pour dire si oui ou non on a gagné. TP : MARIO SOKOBAN ! arrêt du programme @ƒhv•…s„A X si on dem—nde à fermer le progr—mme @™li™ sur l— ™roix en h—ut à droite de l— fenêtreAD —lors on p—sse le ˜ooléen ™ontinuer à HD et l— ˜ou™le s9—rrêter—F frefD ™l—ssique Y ! appui sur la touche Echap X —rrêt du progr—mme @™omme ƒhv•…s„A Y ! appui sur la touche 1 du pavé numérique X l—n™ement du jeu @—ppel de l— fon™tion jouerA Y ! appui sur la touche 2 du pavé numérique X l—n™ement de l9éditeur @—ppel de l— fon™tion editeurAF gomme vous le voyezD ™9est vr—iment très simpleF ƒi on —ppuie sur ID le jeu est l—n™éF …ne fois que le jeu est terminéD l— fon™tion jouer s9—rrête et on retourne d—ns le m—in d—ns lequel on ref—it un tour de ˜ou™leF ve m—in ˜ou™le à l9in(ni t—nt qu9on ne dem—nde p—s à —rrêter le jeuF qrâ™e à ™ette petite org—nis—tion très simpleD on peut don™ gérer le menu d—ns le m—in et l—isser des fon™tions spé™i—les @™omme jouerD ou editeurA gérer les di'érentes p—rties du progr—mmeF Le jeu ett—quons m—inten—nt le gros du sujet X l— fon™tion jouer 3 gette fon™tion est l— plus import—nte du progr—mmeD —ussi soyez —ttentifs ™—r ™9est vr—iment là qu9il f—ut ™omE prendreF †ous verrez —près que ™réer l9éditeur de nive—ux n9est p—s si ™ompliqué que ç— en — l9—irF Les paramètres envoyés à la fonction v— fon™tion jouer — ˜esoin d9un p—r—mètre X l— surf—™e e™r—nF in e'etD l— fenêtre — été ouverte d—ns le m—inD et pour que l— fon™tion jouer puisse y dessinerD il f—ut qu9elle ré™upère le pointeur sur e™r—n 3 ƒi vous reg—rdez le m—in à nouve—uD vous voyez qu9on —ppelle jouer en lui envoy—nt e™r—n X jouer@e™r—nAY ve prototype de l— fon™tionD que vous pouvez mettre d—ns jeuFhD est don™ le suiv—nt X void jouer@ƒhv•ƒurf—™eB e™r—nAY La fonction ne renvoie aucune valeur (d'où le void).

LE JEU Les déclarations de variables gette fon™tion v— —voir ˜esoin de nom˜reuses v—ri—˜lesF te n9—i p—s pensé à toutes les v—ri—˜les dont j9—i eu ˜esoin du premier ™oupF sl y en — don™ ™ert—ines que j9—i —joutées p—r l— suiteF Variables de types dénis par la SDL †oi™i pour ™ommen™er toutes les v—ri—˜les de types dé(nis p—r l— ƒhv dont j9—i ˜esoin X ƒhv•ƒurf—™e Bm—rio‘R“ a {x…vv}Y GG R surf—™es pour R dire™tions de m—rio ƒhv•ƒurf—™e Bmur a x…vvD B™—isse a x…vvD B™—isseyu a x…vvD Bo˜je™tif a x…vvD → Bm—rioe™tuel a x…vvY ƒhv•‚e™t positionD positiontoueurY ƒhv•ivent eventY t9—i ™réé un t—˜le—u de ƒhv•ƒurf—™e —ppelé m—rioF g9est un t—˜le—u de qu—tre ™—ses qui sto™ker— w—rio d—ns ™h—™une des dire™tions @un vers le ˜—sD un —utre vers l— g—u™heD vers le h—ut et vers l— droiteAF sl y — ensuite plusieurs surf—™es ™orrespond—nt à ™h—™un des sprites que je vous —i f—it télé™h—rger plus h—ut X murD ™—isseD ™—isseyu @une ™—isse sur un o˜je™tifA et o˜je™tifF À quoi sert m—rioe™tuel ? g9est un pointeur vers une surf—™eF sl pointe sur l— surf—™e ™orrespond—nt —u w—rio orienté d—ns l— dire™tion —™tuelleF g9est don™ m—rioe™tuel que l9on ˜litter— à l9é™r—nF ƒi vous reg—rdez tout en ˜—s de l— fon™tion jouerD vous verrez justement X ƒhv•flitƒurf—™e@m—rioe™tuelD x…vvD e™r—nD 8positionAY yn ne ˜litte don™ p—s un élément du t—˜le—u m—rioD m—is le pointeur m—rioe™tuelF einsiD en ˜litt—nt m—rioe™tuelD on ˜litte soit le w—rio vers le ˜—sD soit ™elui vers le h—utD et™F ve pointeur m—rioe™tuel pointe vers une des ™—ses du t—˜le—u m—rioF uoi d9—utre à p—rt ç— c …ne v—ri—˜le position de type ƒhv•‚e™t dont on se servir— pour dé(nir l— position des éléments à ˜litter @on s9en servir— pour tous les spritesD inutile de ™réer un ƒhv•‚e™t pour ™h—que surf—™e 3AF positiontoueur est en rev—n™he un peu di'érente X elle indique à quelle ™—se sur l— ™—rte se trouve —™tuellement le joueurF in(nD l— v—ri—˜le event tr—iter— les événementsF Variables plus  classiques  t9—i —ussi ˜esoin de me ™réer des v—ri—˜les un peu plus ™l—ssiques de type int @entierAF QVU .

TP : MARIO SOKOBAN int ™ontinuer a ID o˜je™tifs‚est—nts a HD i a HD j a HY int ™—rte‘xf•fvygƒ•ve‚qi…‚“‘xf•fvygƒ•re…„i…‚“ a {H}Y ™ontinuer et o˜je™tifs‚est—nts sont des ˜ooléensF i et j sont des petites v—ri—˜les qui vont me permettre de p—r™ourir le t—˜le—u ™—rteF g9est là que les ™hoses deviennent vr—iment intéress—ntesF t9—i en e'et ™réé un t—˜le—u à deux dimensionsF te ne vous —i p—s p—rlé de ™e type de t—˜le—ux —up—r—v—nt D m—is ™9est justement le moment idé—l pour vous —pprendre ™e que ™9estF ge n9est p—s ˜ien ™ompliquéD vous —llez voirF ‚eg—rdez l— dé(nition de plus près X 4 int ™—rte‘xf•fvygƒ•ve‚qi…‚“‘xf•fvygƒ•re…„i…‚“ a {H}Y in f—itD il s9—git d9un t—˜le—u d9int @entiersA qui — l— p—rti™ul—rité d9—voir deux p—ires de ™ro™hets ‘ “F ƒi vous vous souvenez ˜ien de ™onst—ntesFhD xf•fvygƒ•ve‚qi…‚ et xf•fvygƒ•re…„i…‚ sont des ™onst—ntes qui v—lent toutes les deux IPF ge t—˜le—u ser— don™ à l— ™ompil—tion ™réé ™omme ™e™i X int ™—rte‘IP“‘IP“ a {H}Y Mais qu'est-ce que ça veut dire ? Ǘ veut dire que pour ™h—que  ™—se de ™—rteD il y — IP sousE™—sesF sl y —ur— don™ les v—ri—˜les suiv—ntes X ™—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“ 4. QVV . ajouter ces explications dans le chapitre sur les tableaux l'aurait rendu un peu indigeste.CHAPITRE 24. de plus. Je n'ai pas eu l'occasion d'en parler auparavant .

LE JEU ™—rte‘I“‘R“ ™—rte‘I“‘S“ ™—rte‘I“‘T“ ™—rte‘I“‘U“ ™—rte‘I“‘V“ ™—rte‘I“‘W“ ™—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 t—˜le—u de IP B IP a IRR ™—ses 3 gh—™une des ™es ™—ses représente une ™—se de l— ™—rteF v— (gF PRFQ vous donne une idée de l— f—çon dont l— ™—rte est représentéeF Figure PRFQ ! hé™oup—ge de l— ™—rte QVW .

CHAPITRE 24. TP : MARIO SOKOBAN einsiD l— ™—se en h—ut à g—u™he est sto™kée d—ns ™—rte‘H“‘H“F v— ™—se en h—ut à droite est sto™kée d—ns ™—rte‘H“‘II“F v— ™—se en ˜—s à droite @l— toute dernièreA est sto™kée d—ns ™—rte‘II“‘II“F ƒelon l— v—leur de l— ™—se @qui est un nom˜re entierAD on s—it si l— ™—se ™ontient un murD une ™—isseD un o˜je™tifD et™FAF g9est justement là que v— servir notre énumér—tion de tout à l9heure 3 enum {†shiD w…‚D gesƒƒiD yftig„spD we‚syD gesƒƒi•yu}Y ƒi l— ™—se v—ut †shi @HA on s—it que ™ette p—rtie de l9é™r—n devr— rester ˜l—n™heF ƒi elle v—ut w…‚ @IAD on s—it qu9il f—udr— ˜litter une im—ge de murD et™F Initialisations Chargement des surfaces w—inten—nt qu9on — p—ssé en revue toutes les v—ri—˜les de l— fon™tion jouerD on peut ™ommen™er à f—ire quelques initi—lis—tions X GG gh—rgement des sprites @dé™orsD personn—geFFFA mur a swq•vo—d@4murFjpg4AY ™—isse a swq•vo—d@4™—isseFjpg4AY ™—isseyu a swq•vo—d@4™—isse•okFjpg4AY o˜je™tif a swq•vo—d@4o˜je™tifFpng4AY m—rio‘feƒ“ a swq•vo—d@4m—rio•˜—sFgif4AY m—rio‘qe…gri“ a swq•vo—d@4m—rio•g—u™heFgif4AY m—rio‘re…„“ a swq•vo—d@4m—rio•h—utFgif4AY m—rio‘h‚ys„i“ a swq•vo—d@4m—rio•droiteFgif4AY ‚ien de sor™ier làEded—ns X on ™h—rge tout grâ™e à swq•vo—dF ƒ9il y — une petite p—rE ti™ul—ritéD ™9est le ™h—rgement de m—rioF yn ™h—rge en e'et w—rio d—ns ™h—™une des dire™tions d—ns le t—˜le—u m—rio en utilis—nt les ™onst—ntes re…„D feƒD qe…griD h‚ys„iF ve f—it d9utiliser les ™onst—ntes rend i™i " ™omme vous le voyez " le ™ode plus ™l—irF yn —ur—it très ˜ien pu é™rire m—rio‘H“D m—is ™9est qu—nd même plus lisi˜le d9—voir m—rio‘re…„“ p—r exemple 3 Orientation initiale du Mario (m—rioe™tuel) yn initi—lise ensuite m—rioe™tuel pour qu9il —it une dire™tion —u dép—rt X m—rioe™tuel a m—rio‘feƒ“Y GG w—rio ser— dirigé vers le ˜—s —u dép—rt t9—i trouvé plus logique de ™ommen™er l— p—rtie —ve™ un w—rio qui reg—rde vers le ˜—s @™9estEàEdire vers nousAF ƒi vous voulezD vous pouvez ™h—nger ™ette ligne et mettre X m—rioe™tuel a m—rio‘h‚ys„i“Y †ous verrez que w—rio ser— —lors orienté vers l— droite —u dé˜ut du jeuF QWH .

elle renverra  vrai . Sinon.LE JEU Chargement de la carte w—inten—ntD il v— f—lloir remplir notre t—˜le—u à deux dimensions ™—rteF €our l9inst—ntD ™e t—˜le—u ne ™ontient que des HF sl f—ut lire le nive—u qui est sto™ké d—ns le (™hier nive—uxFlvlF GG gh—rgement du nive—u if @3™h—rgerxive—u@™—rteAA exit@iˆs„•pesv…‚iAY GG yn —rrête le jeu si on n9— p—s pu ™h—rger le nive—u t9—i ™hoisi de f—ire gérer le ™h—rgement @et l9enregistrementA de nive—ux p—r des fon™tions situées d—ns fi™hiersF™F s™iD on —ppelle don™ l— fon™tion ™h—rgerxive—uF yn l9étudier— plus en dét—ils plus loin @elle n9est p—s très ™ompliquéeD de toute m—nièreAF „out ™e qui nous intéresse i™i ™9est de s—voir que notre nive—u — été ™h—rgé d—ns le t—˜le—u ™—rteF Si le niveau n'a pas pu être chargé (parce que nive—uxFlvl n'existe pas). la fonction renverra  faux . yn teste don™ le résult—t du ™h—rgement d—ns une ™onditionF ƒi le résult—t est nég—tif @d9où le point d9ex™l—m—tion qui sert à exprimer l— nég—tionAD on —rrête tout X on —ppelle exitF ƒinonD ™9est que tout v— ˜ien et on peut ™ontinuerF xous possédons m—inten—nt un t—˜le—u ™—rte qui dé™rit le ™ontenu de ™h—que ™—se X w…‚D †shiD gesƒƒiF F F Recherche de la position de départ de Mario sl f—ut m—inten—nt initi—liser l— v—ri—˜le positiontoueurF gette v—ri—˜leD de type ƒhv•‚e™tD est un peu p—rti™ulièreF yn ne s9en sert p—s pour sto™ker des ™oordonnées en pixelsF yn s9en sert pour sto™ker des ™oordonnées en  ™—ses sur l— ™—rteF einsiD si on — X F F F ™9est que le joueur se trouve d—ns l— toute dernière ™—se en ˜—s à droite de l— ™—rteF ‚eportezEvous —u s™hém— de l— ™—rte de l— (gF PRFQ pour ˜ien voir à quoi ç— ™orrespond si vous —vez @déjàA ou˜liéF yn doit p—r™ourir notre t—˜le—u ™—rte à deux dimensions à l9—ide d9une dou˜le ˜ou™leF yn utilise l— petite v—ri—˜le i pour p—r™ourir le t—˜le—u verti™—lement et l— v—ri—˜le j pour le p—r™ourir horizont—lement X GG ‚e™her™he de l— position de w—rio —u dép—rt for @i a H Y i ` xf•fvygƒ•ve‚qi…‚ Y iCCA { for @j a H Y j ` xf•fvygƒ•re…„i…‚ Y jCCA { if @™—rte‘i“‘j“ aa we‚syA GG ƒi w—rio se trouve à ™ette position positiontoueurFx aa II positiontoueurFy aa II QWI .

CHAPITRE 24. TP : MARIO SOKOBAN { } } } positiontoueurFx a iY positiontoueurFy a jY ™—rte‘i“‘j“ a †shiY À ™h—que ™—seD on teste si elle ™ontient we‚sy @™9estEàEdire le dép—rt du joueur sur l— ™—rteAF ƒi ™9est le ™—sD on sto™ke les ™oordonnées —™tuelles @situées d—ns i et jA d—ns l— v—ri—˜le positiontoueurF yn e'—™e —ussi l— ™—se en l— mett—nt à †shi pour qu9elle soit ™onsidérée ™omme une ™—se vide p—r l— suiteF Activation de la répétition des touches hernière ™hoseD très simple X on —™tive l— répétition des tou™hes pour qu9on puisse se dépl—™er sur l— ™—rte en l—iss—nt une tou™he enfon™éeF GG e™tiv—tion de l— répétition des tou™hes ƒhv•in—˜leuey‚epe—t@IHHD IHHAY La boucle principale €(ou 3 xos initi—lis—tions sont f—itesD on peut m—inten—nt s9o™™uper de l— ˜ou™le prinE ™ip—leF g9est une ˜ou™le ™l—ssique qui fon™tionne sur le même s™hém— que ™elles qu9on — vues jusqu9i™iF ille est juste un peu plus grosse et un peu plus ™omplète @f—ut ™9qui f—ut ™omme on dit 3AF ‚eg—rdons de plus près le swit™h qui teste l9événement X swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX swit™h@eventFkeyFkeysymFsymA { ™—se ƒhvu•iƒge€iX ™ontinuer a HY ˜re—kY ™—se ƒhvu•…€X m—rioe™tuel a m—rio‘re…„“Y depl—™ertoueur@™—rteD 8positiontoueurD re…„AY ˜re—kY ™—se ƒhvu•hy‡xX QWP .

c'est quoi ce bazar ? g9est ™e qu9on —ppelle la gestion des collisionsF ƒi ç— peut vous r—ssurerD i™i ™9est une gestion des ™ollisions extrêmement simpleD vu que le joueur se dépl—™e p—r  ™—ses QWQ .LE JEU m—rioe™tuel a m—rio‘feƒ“Y depl—™ertoueur@™—rteD 8positiontoueurD feƒAY ˜re—kY ™—se ƒhvu•‚sqr„X m—rioe™tuel a m—rio‘h‚ys„i“Y depl—™ertoueur@™—rteD 8positiontoueurD h‚ys„iAY ˜re—kY ™—se ƒhvu•vip„X m—rioe™tuel a m—rio‘qe…gri“Y depl—™ertoueur@™—rteD 8positiontoueurD qe…griAY ˜re—kY } } ˜re—kY ƒi on —ppuie sur l— tou™he i™h—pD le jeu s9—rrêter— et on retourner— —u menu prin™ip—lF gomme vous le voyezD il n9y — p—s QT événements di'érents à gérer X on teste juste si le joueur —ppuie sur les tou™hes  h—ut D  ˜—s D  g—u™he ou  droite de son ™l—vierF ƒelon l— tou™he enfon™éeD on ™h—nge l— dire™tion de w—rioF g9est là qu9intervient m—rioe™tuel 3 ƒi on —ppuie vers le h—utD —lors X m—rioe™tuel a m—rio‘re…„“Y ƒi on —ppuie vers le ˜—sD —lors X m—rioe™tuel a m—rio‘feƒ“Y m—rioe™tuel pointe don™ sur l— surf—™e représent—nt w—rio d—ns l— position —™tuelleF g9est —insi qu9en ˜litt—nt m—rioe™tuel tout à l9heureD on ser— ™ert—in de ˜litter w—rio d—ns l— ˜onne dire™tionF w—inten—ntD ™hose très import—nte X on —ppelle une fon™tion depl—™ertoueurF gette fon™tion v— dépl—™er le joueur sur l— ™—rte s9il — le droit de le f—ireF ! €—r exempleD on ne peut p—s f—ire monter w—rio d9un ™r—n vers le h—ut s9il se trouve déjà tout en h—ut de l— ™—rteF ! yn ne peut p—s non plus le f—ire monter s9il y — un mur —uEdessus de luiF ! yn ne peut p—s le f—ire monter s9il y — deux ™—isses —uEdessus de luiF ! €—r ™ontreD on peut le f—ire monter s9il y — juste une ™—isse —uEdessus de luiF ! w—is —ttentionD on ne peut p—s le f—ire monter s9il y — une ™—isse —uEdessus de lui et que l— ™—isse se trouve —u ˜ord de l— ™—rte 3 Oh la la.

la queue du cochon xotre swit™h est terminé X à ™e st—de du progr—mmeD l— ™—rte et le joueur ont pro˜—E ˜lement ™h—ngéF uoi qu9il en soitD ™9est l9heure du ˜lit 3 yn ™ommen™e p—r e'—™er l9é™r—n en lui donn—nt une ™ouleur de fond ˜l—n™he X GG iff—™ement de l9é™r—n ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY it m—inten—ntD on p—r™ourt tout notre t—˜le—u à deux dimensions ™—rte pour s—voir quel élément ˜litter à quel endroit sur l9é™r—nF yn e'e™tue une dou˜le ˜ou™le ™omme on l9— vu plus tôt pour p—r™ourir toutes les IRR ™—ses du t—˜le—u X GG €l—™ement des o˜jets à l9é™r—n o˜je™tifs‚est—nts a HY for @i a H Y i ` xf•fvygƒ•ve‚qi…‚ Y iCCA { for @j a H Y j ` xf•fvygƒ•re…„i…‚ Y jCCA { positionFx a i B „esvvi•fvygY positionFy a j B „esvvi•fvygY swit™h@™—rte‘i“‘j“A { ™—se w…‚X ƒhv•flitƒurf—™e@murD x…vvD e™r—nD 8positionAY QWR .CHAPITRE 24. TP : MARIO SOKOBAN et d—ns seulement qu—tre dire™tions possi˜les à l— foisF h—ns un jeu Ph où on peut se dépl—™er d—ns toutes les dire™tions pixel p—r pixelD l— gestion des ™ollisions est ˜ien plus ™omplexeF w—is il y — pire X l— QhF v— gestion des ™ollisions d—ns un jeu Qh est vr—iment l— ˜ête noire des progr—mmeursF reureusementD il existe des ˜i˜liothèques de gestion des ™ollisions en Qh qui font le gros du tr—v—il à notre pl—™eF ‚evenons à l— fon™tion depl—™ertoueur et ™on™entronsEnousF yn lui envoie trois p—r—E mètres X ! l— ™—rte X pour qu9elle puisse l— lire m—is —ussi l— modi(erD si on dépl—™e une ™—isse p—r exemple Y ! l— position du joueur X là —ussiD l— fon™tion devr— lire et éventuellement modi(er l— position du joueur Y ! l— dire™tion d—ns l—quelle on dem—nde à —ller X on utilise là en™ore les ™onst—ntes re…„D feƒD qe…griD h‚ys„i pour plus de lisi˜ilitéF xous étudierons l— fon™tion depl—™ertoueur plus loinF t9—ur—is très ˜ien pu mettre tous les tests d—ns le swit™hD m—is ™eluiE™i ser—it devenu énorme et illisi˜leF g9est là que dé™ouper son progr—mme en fon™tions prend tout son intérêtF Blittons. blittons.

LE JEU ˜re—kY ™—se gesƒƒiX ƒhv•flitƒurf—™e@™—isseD x…vvD e™r—nD 8positionAY ˜re—kY ™—se gesƒƒi•yuX ƒhv•flitƒurf—™e@™—isseyuD x…vvD e™r—nD 8positionAY ˜re—kY ™—se yftig„spX ƒhv•flitƒurf—™e@o˜je™tifD x…vvD e™r—nD 8positionAY o˜je™tifs‚est—nts a IY ˜re—kY } } } €our ™h—™une des ™—sesD on prép—re l— v—ri—˜le position @de type ƒhv•‚e™tA pour pl—™er l9élément —™tuel à l— ˜onne position sur l9é™r—nF ve ™—l™ul est très simple X positionFx a i B „esvvi•fvygY positionFy a j B „esvvi•fvygY sl su0t de multiplier i p—r „esvvi•fvyg pour —voir positionFxF einsiD si on se trouve à l— troisième ™—seD ™9est que i v—ut P @n9ou˜liez p—s que i ™ommen™e à H 3AF yn f—it don™ le ™—l™ul P B QR a TVF yn ˜litter— don™ l9im—ge TV pixels vers l— droite sur e™r—nF yn f—it l— même ™hose pour les ordonnées yF insuiteD on f—it un swit™h sur l— ™—se de l— ™—rte qu9on est en tr—in d9—n—lyserF và en™oreD —voir dé(ni des ™onst—ntes est vr—iment pr—tique et rend les ™hoses plus lisi˜lesF yn teste don™ si l— ™—se v—ut w…‚D d—ns ™e ™—s on ˜litte un murF he même pour les ™—isses et les o˜je™tifsF Test de victoire †ous rem—rquerez qu9—v—nt l— dou˜le ˜ou™leD on initi—lise le ˜ooléen o˜je™tifs‚est—nts à HF ge ˜ooléen ser— mis à I dès qu9on —ur— déte™té un o˜je™tif sur l— ™—rteF ƒ9il ne reste plus d9o˜je™tifsD ™9est que toutes les ™—isses sont sur des o˜je™tifs @il n9y — plus que des gesƒƒi•yuAF sl su0t de tester si le ˜ooléen v—ut  f—ux D ™9estEàEdire s9il ne reste plus d9o˜je™tifsF h—ns ™e ™—sD on met l— v—ri—˜le ™ontinuer à H pour —rrêter l— p—rtie X GG ƒi on n9— trouvé —u™un o˜je™tif sur l— ™—rteD ™9est qu9on — g—gné if @3o˜je™tifs‚est—ntsA ™ontinuer a HY Le joueur sl nous reste à ˜litter le joueur X QWS .

CHAPITRE 24. TP : MARIO SOKOBAN GG yn pl—™e le joueur à l— ˜onne position positionFx a positiontoueurFx B „esvvi•fvygY positionFy a positiontoueurFy B „esvvi•fvygY ƒhv•flitƒurf—™e@m—rioe™tuelD x…vvD e™r—nD 8positionAY yn ™—l™ule s— position @en pixels ™ette foisA en f—is—nt une simple multipli™—tion entre positiontoueur et „esvvi•fvygF yn ˜litte ensuite le joueur à l— position indiquéeF Flip ! yn — tout f—itD il ne nous reste plus qu9à —0™her l9é™r—n —u joueur X ƒhv•plip@e™r—nAY Fin de la fonction : déchargements eprès l— ˜ou™le prin™ip—leD on doit f—ire quelques preeƒurf—™e pour li˜érer l— mémoire des sprites qu9on — ™h—rgésF yn dés—™tive —ussi l— répétition des tou™hes en envoy—nt les v—leurs H à l— fon™tion ƒhv•in—˜leuey‚epe—t X GG hés—™tiv—tion de l— répétition des tou™hes @remise à HA ƒhv•in—˜leuey‚epe—t@HD HAY GG vi˜ér—tion des surf—™es ™h—rgées ƒhv•preeƒurf—™e@murAY ƒhv•preeƒurf—™e@™—isseAY ƒhv•preeƒurf—™e@™—isseyuAY ƒhv•preeƒurf—™e@o˜je™tifAY for @i a H Y i ` R Y iCCA ƒhv•preeƒurf—™e@m—rio‘i“AY La fonction deplacerJoueur v— fon™tion depl—™ertoueur se trouve elle —ussi d—ns jeuF™F g9est une fon™tionF F F —ssez déli™—te à é™rireF g9est peutEêtre l— prin™ip—le di0™ulté que l9on ren™ontre lorsqu9on ™ode un jeu de ƒoko˜—nF Rappel X l— fon™tion depl—™ertoueur véri(e si on — le droit de dépl—™er le joueur d—ns l— dire™tion dem—ndéeF ille met à jour l— position du joueur @positiontoueurA et —ussi l— ™—rte si une ™—isse — été dépl—™éeF †oi™i le prototype de l— fon™tion X void depl—™ertoueur@int ™—rte‘“‘xf•fvygƒ•re…„i…‚“D ƒhv•‚e™t BposD int dire™tionAY ge prototype est un peu p—rti™ulierF †ous voyez que j9envoie le t—˜le—u ™—rte et que je pré™ise l— t—ille de l— deuxième dimension @xf•fvygƒ•re…„i…‚AF €ourquoi ™el— c QWT .

LE JEU v— réponse est un peu ™ompliquée pour que je l— développe —u milieu de ™e ™oursF €our f—ire simpleD le g ne devine p—s qu9il s9—git d9un t—˜le—u à deux dimensions et il f—ut —u moins donner l— t—ille de l— se™onde dimension pour que ç— fon™tionneF hon™D lorsque vous envoyez un t—˜le—u à deux dimensions à une fon™tionD vous devez indiquer l— t—ille de l— se™onde dimension d—ns le prototypeF g9est ™omme ç—D ™9est o˜lig—toireF eutre ™hose X vous noterez que positiontoueur s9—ppelle en f—it pos d—ns ™ette fon™E tionF t9—i ™hoisi de r—™™our™ir le nom p—r™e que ™9est plus ™ourt à é™rireD et vu qu9on v— —voir ˜esoin de l9é™rire de nom˜reuses foisD —ut—nt ne p—s se f—tiguerF gommençons p—r tester l— dire™tion d—ns l—quelle on veut —ller vi— un gr—nd swit™h X swit™h@dire™tionA { ™—se re…„X GB et™F BG Et c'est parti pour des tests de folie ! sl f—ut m—inten—nt é™rire tous les tests de tous les ™—s possi˜lesD en ess—y—nt de ne p—s en ou˜lier un seulF †oi™i ™omment je pro™ède X je teste toutes les possi˜ilités de ™ollision ™—s p—r ™—sD et dès que je déte™te une ™ollision @qui f—it que le joueur ne peut p—s ˜ougerAD je f—is un ˜re—kY pour sortir du swit™hD et don™ empê™her le dépl—™ementF †oi™i p—r exemple toutes les possi˜ilités de ™ollision qui existent pour un joueur qui veut se dépl—™er vers le h—ut X ! le joueur est déjà tout en h—ut de l— ™—rte Y ! il y — un mur —uEdessus du joueur Y ! il y — deux ™—isses —uEdessus du joueur @et il ne peut p—s dépl—™er deux ™—isses à l— foisD r—ppelezEvousA Y ! il y — une ™—isse puis le ˜ord de l— ™—rteF ƒi tous ™es tests sont okD —lors je me permets de dépl—™er le joueurF te v—is vous montrer les tests pour un dépl—™ement vers le h—utF €our les —utres sensD il su0r— d9—d—pter un petit peu le ™odeF if @posEby E I ` HA GG ƒi le joueur dép—sse l9é™r—nD on —rrête ˜re—kY yn ™ommen™e p—r véri(er si le joueur est déjà tout en h—ut de l9é™r—nF in e'etD si on ess—y—it d9—ppeler ™—rte‘S“‘EI“ p—r exempleD ™e ser—it le pl—nt—ge du progr—mme —ssuré 3 yn ™ommen™e don™ p—r véri(er qu9on ne v— p—s  dé˜order de l9é™r—nF insuite X if @™—rte‘posEbx“‘posEby E I“ aa w…‚A GG ƒ9il y — un murD on —rrête ˜re—kY QWU .

TP : MARIO SOKOBAN và en™ore ™9est simpleF yn véri(e s9il n9y — p—s un mur —uEdessus du joueurF ƒi tel est le ™—sD on —rrête @˜re—kAF insuite @—ttention les yeuxA X GG → if → ƒi on veut pousser une ™—isseD il f—ut vérifier qu9il n9y — p—s de mur derrière @ou une —utre ™—isseD ou l— limite du mondeA @@™—rte‘posEbx“‘posEby E I“ aa gesƒƒi || ™—rte‘posEbx“‘posEby E I“ aa gesƒƒi•yuA 88 @posEby E P ` H || ™—rte‘posEbx“‘posEby E P“ aa w…‚ || ™—rte‘posEbx“‘posEby E P“ aa gesƒƒi || ™—rte‘posEbx“‘posEby E P“ aa → gesƒƒi•yuAA ˜re—kY ge gros test peut se tr—duire ™omme ™e™i X  ƒs —uEdessus du joueur il y — une ™—isse @ou une ™—isse•okD ™9estEàEdire une ™—isse ˜ien pl—™éeA i„ ƒs —uEdessus de ™ette ™—isse il y — soit le vide @on dé˜orde du nive—u ™—r on est tout en h—utAD soit une —utre ™—isseD soit une ™—isse•ok X evy‚ƒ on ne peut p—s se dépl—™er X ˜re—kF ƒi on —rrive à p—sser ™e testD on — le droit de dépl—™er le joueurF yuf 3 yn —ppelle d9—˜ord une fon™tion qui v— dépl—™er une ™—isse si né™ess—ire X GG ƒi on —rrive làD ™9est qu9on peut dépl—™er le joueur 3 GG yn vérifie d9—˜ord s9il y — une ™—isse à dépl—™er depl—™erg—isse@8™—rte‘posEbx“‘posEby E I“D 8™—rte‘posEbx“‘posEby E P“AY Le déplacement de caisse : depl—™erg—isse t9—i ™hoisi de gérer le dépl—™ement de ™—isse d—ns une —utre fon™tion ™—r ™9est le même ™ode pour les qu—tre dire™tionsF yn doit juste s9être —ssuré —v—nt qu9on — le droit de se dépl—™er @™e qu9on vient de f—ireAF yn envoie à l— fon™tion deux p—r—mètres X le ™ontenu de l— ™—se d—ns l—quelle on veut —ller et le ™ontenu de l— ™—se d9—prèsF void depl—™erg—isse@int Bpremiereg—seD int Bse™ondeg—seA { if @Bpremiereg—se aa gesƒƒi || Bpremiereg—se aa gesƒƒi•yuA { if @Bse™ondeg—se aa yftig„spA Bse™ondeg—se a gesƒƒi•yuY else Bse™ondeg—se a gesƒƒiY if @Bpremiereg—se aa gesƒƒi•yuA Bpremiereg—se a yftig„spY else Bpremiereg—se a †shiY } } QWV .CHAPITRE 24.

LE JEU gette fon™tion met à jour l— ™—rte ™—r elle prend en p—r—mètres des pointeurs sur les ™—ses ™on™ernéesF te vous l—isse l— lireD ™9est —ssez simple à ™omprendreF sl ne f—ut p—s ou˜lier que si on dépl—™e une gesƒƒi•yuD il f—ut rempl—™er l— ™—se où elle se trouv—it p—r un yftig„spF ƒinonD si ™9est une simple gesƒƒiD —lors on rempl—™e l— ™—se en question p—r du †shiF Déplacer le joueur yn retourne d—ns l— fon™tion depl—™ertoueurF gette fois ™9est l— ˜onneD on peut déE pl—™er le joueurF gomment f—itEon c g9est très très simple X posEbyEEY GG yn peut enfin f—ire monter le joueur @oufff 3A sl su0t de diminuer l9ordonnée y @™—r le joueur veut monterAF Résumé in guise de résuméD voi™i tous les tests pour le ™—s re…„ X swit™h@dire™tionA { ™—se re…„X if @posEby E I ` HA GG ƒi le joueur dép—sse l9é™r—nD on —rrête ˜re—kY if @™—rte‘posEbx“‘posEby E I“ aa w…‚A GG ƒ9il y — un murD on —rrête ˜re—kY GG ƒi on veut pousser une ™—isseD il f—ut vérifier qu9il n9y — p—s de → mur derrière @ou une —utre ™—isseD ou l— limite du mondeA if @@™—rte‘posEbx“‘posEby E I“ aa gesƒƒi || ™—rte‘posEbx“‘posEby E I“ aa → gesƒƒi•yuA 88 @posEby E P ` H || ™—rte‘posEbx“‘posEby E P“ aa w…‚ || ™—rte‘posEbx“‘posEby E P“ aa gesƒƒi || ™—rte‘posEbx“‘posEby E P“ aa → gesƒƒi•yuAA ˜re—kY GG ƒi on —rrive làD ™9est qu9on peut dépl—™er le joueur 3 GG yn vérifie d9—˜ord s9il y — une ™—isse à dépl—™er depl—™erg—isse@8™—rte‘posEbx“‘posEby E I“D 8™—rte‘posEbx“‘posEby E P“AY posEbyEEY GG yn peut enfin f—ire monter le joueur @oufff 3A ˜re—kY te vous l—isse le soin de f—ire du ™opierE™oller pour les —utres ™—s @—ttentionD il f—udr— —d—pter le ™odeD ™e n9est p—s ex—™tement p—reil à ™h—que fois 3AF QWW .

Rassurez-vous. ça ira bien plus vite ! RHH .CHAPITRE 24. TP : MARIO SOKOBAN it voilàD on vient de (nir de ™oder le jeu 3 in(n presque X il nous reste à voir l— fon™tion de ™h—rgement @et de s—uveg—rdeA de nive—uxF yn verr— ensuite ™omment ™réer l9éditeur F 5 Chargement et enregistrement de niveaux ve (™hier fi™hiersF™ ™ontient deux fon™tions X ! ™h—rgerxive—u Y ! s—uveg—rderxive—uF gommençons p—r le ™h—rgement de nive—uF chargerNiveau gette fon™tion prend un p—r—mètre X l— ™—rteF và en™oreD il f—ut pré™iser l— t—ille de l— se™onde dimension ™—r il s9—git d9un t—˜le—u à deux dimensionsF v— fon™tion renvoie un ˜ooléen X  vr—i si le ™h—rgement — réussiD  f—ux si ™9est un é™he™F ve prototype est don™ X int ™h—rgerxive—u@int nive—u‘“‘xf•fvygƒ•re…„i…‚“AY †oyons le dé˜ut de l— fon™tion X psviB fi™hier a x…vvY ™h—r lignepi™hier‘xf•fvygƒ•ve‚qi…‚ B xf•fvygƒ•re…„i…‚ C I“ a {H}Y int i a HD j a HY fi™hier a fopen@4nive—uxFlvl4D 4r4AY if @fi™hier aa x…vvA return HY yn ™rée un t—˜le—u de ™h—r pour sto™ker tempor—irement le résult—t du ™h—rgement du nive—uF yn ouvre le (™hier en le™ture seule @4r4AF yn —rrête l— fon™tion en renvoy—nt H @ f—ux A si l9ouverture — é™houéF gl—ssiqueF ve (™hier nive—uxFlvl ™ontient une ligne qui est une suite de nom˜resF gh—que nom˜re représente une ™—se du nive—uF €—r exemple X IIIIIHHIIIIIIIIIIRHHHHHIIIIIHHHIIHHIHQQIHIHIIHIIHHHHHPHHIPIIIH ‘FFF“ yn v— don™ lire ™ette ligne —ve™ un fgets X fgets@lignepi™hierD xf•fvygƒ•ve‚qi…‚ B xf•fvygƒ•re…„i…‚ C ID fi™hierAY 5.

et sa valeur n'est pas H ! Pour analyser le chier. RHI . La carte s'appelle niveau dans cette fonction d'ailleurs.CHARGEMENT ET ENREGISTREMENT DE NIVEAUX yn v— —n—lyser le ™ontenu de lignepi™hierF yn s—it que les IP premiers ™—r—™tères représentent l— première ligneD les IP suiv—nts l— se™onde ligneD et™F for @i a H Y i ` xf•fvygƒ•ve‚qi…‚ Y iCCA { for @j a H Y j ` xf•fvygƒ•re…„i…‚ Y jCCA { swit™h @lignepi™hier‘@i B xf•fvygƒ•ve‚qi…‚A C j“A { ™—se 9H9X nive—u‘j“‘i“ a HY ˜re—kY ™—se 9I9X nive—u‘j“‘i“ a IY ˜re—kY ™—se 9P9X nive—u‘j“‘i“ a PY ˜re—kY ™—se 9Q9X nive—u‘j“‘i“ a QY ˜re—kY ™—se 9R9X nive—u‘j“‘i“ a RY ˜re—kY } } } €—r un simple petit ™—l™ulD on prend le ™—r—™tère qui nous intéresse d—ns lignepi™hier et on —n—lyse s— v—leurF Ce sont des  lettres  qui sont stockées dans le chier. Je veux dire par là que 9H9 est stocké comme le caractère ASCII 9H9. mais ça ne change rien. il faut tester avec ™—se 9H9 et non avec ™—se H ! Attention à ne pas mélanger les chires et les lettres ! ve swit™h f—it l— ™onversion 9H9 ab HD 9I9 ab ID et™F sl pl—™e tout d—ns le t—˜le—u ™—rte F …ne fois que ™9est f—itD on peut fermer le (™hier et renvoyer I pour dire que tout s9est ˜ien p—ssé X 6 f™lose@fi™hierAY return IY pin—lementD le ™h—rgement du nive—u d—ns le (™hier n9ét—it p—s ˜ien ™ompliquéF ve seul piège à éviter ™9ét—it de ˜ien penser à ™onvertir l— v—leur eƒgss 9H9 en un nom˜re H @et de même pour ID PD QD RF F FAF 6.

CHAPITRE 24. TP : MARIO SOKOBAN sauvegarderNiveau gette fon™tion est là en™ore simple X int s—uveg—rderxive—u@int nive—u‘“‘xf•fvygƒ•re…„i…‚“A { psviB fi™hier a x…vvY int i a HD j a HY fi™hier a fopen@4nive—uxFlvl4D 4w4AY if @fi™hier aa x…vvA return HY for @i a H Y i ` xf•fvygƒ•ve‚qi…‚ Y iCCA { for @j a H Y j ` xf•fvygƒ•re…„i…‚ Y jCCA { fprintf@fi™hierD 47d4D nive—u‘j“‘i“AY } } f™lose@fi™hierAY return IY } t9utilise fprintf pour  tr—duire les nom˜res du t—˜le—u nive—u en ™—r—™tères eƒgssF g9ét—it là en™ore l— seule di0™ulté @m—is à l9enversA X il ne f—ut p—s é™rire H m—is 9H9F L'éditeur de niveaux v9éditeur de nive—ux est plus f—™ile à ™réer qu9on ne pourr—it l9im—ginerF in plus ™9est une fon™tionn—lité qui v— ™onsidér—˜lement —llonger l— durée de vie de notre jeuD —lors pourquoi s9en priver c †oilà ™omment l9éditeur v— fon™tionnerF ! yn utilise l— souris pour pl—™er les ˜lo™s qu9on veut sur l9é™r—nF ! …n ™li™ droit e'—™e le ˜lo™ sur lequel se trouve l— sourisF ! …n ™li™ g—u™he pl—™e un o˜jetF get o˜jet est mémorisé X p—r déf—utD on pose des murs —ve™ le ™li™ g—u™heF yn peut ™h—nger l9o˜jet en ™ours en —ppuy—nt sur les tou™hes du p—vé numérique X ! I X murD ! P X ™—isseD ! Q X o˜je™tifD ! R X dép—rt du joueur w—rioF ! in —ppuy—nt sur ƒD le nive—u ser— s—uveg—rdéF ! yn peut revenir —u menu prin™ip—l en —ppuy—nt sur i™h—pF RHP .

L'ÉDITEUR DE NIVEAUX Figure PRFR ! Édition d9un nive—u —ve™ l9éditeur Initialisations qlo˜—lementD l— fon™tion ressem˜le à ™elle du jeuF t9—i d9—illeurs ™ommen™é à l— ™réer en f—is—nt un simple ™opierE™oller de l— fon™tion de jeuD puis en enlev—nt ™e qui ne serv—it plus et en —jout—nt de nouvelles fon™tionn—litésF ve dé˜ut y ressem˜le déjà p—s m—l X void editeur@ƒhv•ƒurf—™eB e™r—nA { ƒhv•ƒurf—™e Bmur a x…vvD B™—isse a x…vvD Bo˜je™tif a x…vvD Bm—rio a x…vvY ƒhv•‚e™t positionY ƒhv•ivent eventY int ™ontinuer a ID ™li™q—u™heingours a HD ™li™hroitingours a HY int o˜jete™tuel a w…‚D i a HD j a HY int ™—rte‘xf•fvygƒ•ve‚qi…‚“‘xf•fvygƒ•re…„i…‚“ a {H}Y GG gh—rgement des o˜jets et du nive—u mur a swq•vo—d@4murFjpg4AY ™—isse a swq•vo—d@4™—isseFjpg4AY o˜je™tif a swq•vo—d@4o˜je™tifFpng4AY m—rio a swq•vo—d@4m—rio•˜—sFgif4AY if @3™h—rgerxive—u@™—rteAA exit@iˆs„•pesv…‚iAY RHQ .

Notez que ce n'est pas ce qu'il y a de plus ergonomique pour l'utilisateur : celui-ci s'attend plutôt à ce que le programme s'arrête quand on clique sur la croix.CHAPITRE 24. Il faudrait peut-être trouver un moyen d'arrêter le programme en renvoyant une valeur spéciale à la fonction main par exemple. RHR . Je vous laisse rééchir à une solution. Sinon on est obligé de cliquer frénétiquement avec la souris pour placer plusieurs fois le même objet à diérents endroits. 8. ce qui est un peu fatigant. or ce n'est pas ce qu'il se passe ici car on ne fait que revenir au menu. TP : MARIO SOKOBAN vàD vous —vez les dé(nitions de v—ri—˜les et les initi—lis—tionsF †ous rem—rquerez que je ne ™h—rge qu9un w—rio @™elui dirigé vers le ˜—sAF in e'etD on ne v— p—s diriger w—rio —u ™l—vier làD on — juste ˜esoin d9un sprite représent—nt l— position de dép—rt de w—rioF v— v—ri—˜le o˜jete™tuel retient l9o˜jet —™tuellement séle™tionné p—r l9utilis—teurF €—r déf—utD ™9est un w…‚F ve ™li™ g—u™he ™réer— don™ un mur —u dép—rtD m—is ™el— pourr— être ™h—ngé p—r l9utilis—teur en —ppuy—nt sur ID PD Q ou RF ves ˜ooléens ™li™q—u™heingours et ™li™hroitingoursD ™omme leurs noms l9indiquentD permettent de mémoriser si un ™li™ est en ™ours @si le ˜outon de l— souris est enfon™éAF gel— nous permettr— de poser des o˜jets à l9é™r—n en l—iss—nt le ˜outon de l— souris enfon™é F te vous expliquer—i le prin™ipe un peu plus loinF in(nD l— ™—rte —™tuellement s—uveg—rdée d—ns nive—uxFlvl est ™h—rgéeF ge ser— notre point de dép—rtF 7 La gestion des événements gette foisD on v— devoir gérer un nom˜re import—nt d9événements di'érentsF ellonsEyD un p—r unF ƒhv•…s„ ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ƒi on ™lique sur l— ™roixD l— ˜ou™le s9—rrête et on revient —u menu prin™ip—l F 8 ƒhv•wy…ƒif…„„yxhy‡x ™—se ƒhv•wy…ƒif…„„yxhy‡xX if @eventF˜uttonF˜utton aa ƒhv•f…„„yx•vip„A { GG yn met l9o˜jet —™tuellement ™hoisi @murD ™—isseFFFA à l9endroit du → ™li™ ™—rte‘eventF˜uttonFx G „esvvi•fvyg“‘eventF˜uttonFy G „esvvi•fvyg“ a → o˜jete™tuelY ™li™q—u™heingours a IY GG yn retient qu9un ˜outon est enfon™é } else if @eventF˜uttonF˜utton aa ƒhv•f…„„yx•‚sqr„A GG gli™ droit pour eff—™er { 7.

L'ÉDITEUR DE NIVEAUX ™—rte‘eventF˜uttonFx G „esvvi•fvyg“‘eventF˜uttonFy G„esvvi•fvyg“ a †shiY ™li™hroitingours a IY } ˜re—kY yn ™ommen™e p—r tester le ˜outon qui est enfon™é @on véri(e si ™9est le ™li™ g—u™he ou le ™li™ droitA X ! si ™9est un ™li™ g—u™heD on pl—™e l9o˜jete™tuel sur l— ™—rte à l— position de l— souris Y ! si ™9est un ™li™ droitD on e'—™e ™e qu9il y — à ™et endroit sur l— ™—rte @on met †shi ™omme je vous —v—is ditAF Comment sait-on sur quelle  case  de la carte on se trouve ? yn le retrouve grâ™e à un petit ™—l™ulF sl su0t de prendre les ™oordonnées de l— souE ris @eventF˜uttonFx p—r exempleA et de diviser ™ette v—leur p—r l— t—ille d9un ˜lo™ @„esvvi•fvygAF g9est une division de nom˜res entiersF gomme en g une division de nom˜res entiers donne un nom˜re entierD on est sûr d9—voir une v—leur qui ™orresponde à une des ™—ses de l— ™—rteF €—r exempleD si je suis —u USe pixel sur l— ™—rte @sur l9—xe des —˜s™isses xAD je divise ™e nom˜re p—r „esvvi•fvyg qui v—ut i™i QRF US G QR a P x9ou˜liez p—s que le reste est ignoréF yn ne g—rde que l— p—rtie entière de l— division en g ™—r il s9—git d9une divison de nom˜res entiersF yn s—it don™ qu9on se trouve sur l— ™—se no P @™9estEàEdire l— troisième ™—seD ™—r un t—˜le—u ™ommen™e à HD souvenezEvousAF eutre exemple X si je suis —u IHe pixel @™9estEàEdire très pro™he du ˜ordAD ç— v— donner le ™—l™ul suiv—nt X IH G QR a H yn est don™ à l— ™—se no H 3 g9est ™omme ç— qu9un simple petit ™—l™ul nous permet de s—voir sur quelle ™—se de l— ™—rte on se situeF ™—rte‘eventF˜uttonFx G „esvvi•fvyg“‘eventF˜uttonFy G „esvvi•fvyg“ a o˜jete™tuelY eutre ™hose très import—nte X on met un ˜ooléen ™li™q—u™heingours @ou ™li™hroit selon le ™—sA à IF gel— nous permettr— de s—voir lors d9un événement wy…ƒiwy„syx si un ˜outon de l— souris est enfon™é pend—nt le dépl—™ementF ƒhv•wy…ƒif…„„yx…€ ™—se ƒhv•wy…ƒif…„„yx…€X GG yn dés—™tive le ˜ooléen qui dis—it qu9un ˜outon ét—it → enfon™é RHS .

TP : MARIO SOKOBAN if @eventF˜uttonF˜utton aa ƒhv•f…„„yx•vip„A ™li™q—u™heingours a HY else if @eventF˜uttonF˜utton aa ƒhv•f…„„yx•‚sqr„A ™li™hroitingours a HY ˜re—kY v9événement wy…ƒif…„„yx…€ sert simplement à remettre le ˜ooléen à HF yn s—it que le ™li™ est terminé et don™ qu9il n9y — plus de  ™li™ en ™ours F ƒhv•wy…ƒiwy„syx ™—se ƒhv•wy…ƒiwy„syxX if @™li™q—u™heingoursA GG ƒi on dépl—™e l— souris et que le ˜outon g—u™he de → l— souris est enfon™é { ™—rte‘eventFmotionFx G „esvvi•fvyg“‘eventFmotionFy G „esvvi•fvyg“ a → o˜jete™tuelY } else if @™li™hroitingoursA GG €—reil pour le ˜outon droit de l— souris { ™—rte‘eventFmotionFx G „esvvi•fvyg“‘eventFmotionFy G „esvvi•fvyg“ a †shiY } ˜re—kY g9est là que nos ˜ooléens prennent toute leur import—n™eF yn véri(e qu—nd on ˜ouge l— souris si un ™li™ est en ™oursF ƒi tel est le ™—sD on pl—™e sur l— ™—rte un o˜jet @ou du vide si ™9est un ™li™ droitAF gel— nous permet don™ de pl—™er d9—0lée plusieurs o˜jets du même type s—ns —voir à ™liquer plusieurs foisF yn — juste à dépl—™er l— souris en m—inten—nt son ˜outon enfon™é 3 in ™l—ir X à ™h—que fois qu9on ˜ouge l— souris @ne ser—itE™e que d9un pixelAD on véri(e si un des ˜ooléens est —™tivéF ƒi tel est le ™—sD —lors on pose un o˜jet sur l— ™—rteF ƒinonD on ne f—it rienF Résumé X je résume l— te™hniqueD ™—r vous vous en servirez ™ert—inement d—ns d9—utres progr—mmesF gette te™hnique permet de s—voir si un ˜outon de l— souris est enfon™é lorsqu9on l— dépl—™eF yn peut s9en servir pour ™oder un glisserEdépl—™erF IF vors d9un wy…ƒif…„„yxhy‡x X on met un ˜ooléen ™li™ingours à IF PF vors d9un wy…ƒiwy„syx X on teste si le ˜ooléen ™li™ingours v—ut  vr—i F ƒ9il v—ut  vr—i D on s—it qu9on est en tr—in de f—ire une sorte de glisserEdépl—™er —ve™ l— sourisF QF vors d9un wy…ƒif…„„yx…€ X on remet le ˜ooléen ™li™ingours à HD ™—r le ™li™ est terminé @relâ™hement du ˜outon de l— sourisAF RHT .CHAPITRE 24.

L'ÉDITEUR DE NIVEAUX ƒhv•ui‰hy‡x ves tou™hes du ™l—vier permettent de ™h—rger et de s—uveg—rder le nive—u —insi que de ™h—nger l9o˜jet —™tuellement séle™tionné pour le ™li™ g—u™he de l— sourisF ™—se ƒhv•ui‰hy‡xX swit™h@eventFkeyFkeysymFsymA { ™—se ƒhvu•iƒge€iX ™ontinuer a HY ˜re—kY ™—se ƒhvu•sX s—uveg—rderxive—u@™—rteAY ˜re—kY ™—se ƒhvu•™X ™h—rgerxive—u@™—rteAY ˜re—kY ™—se ƒhvu•u€IX o˜jete™tuel a w…‚Y ˜re—kY ™—se ƒhvu•u€PX o˜jete™tuel a gesƒƒiY ˜re—kY ™—se ƒhvu•u€QX o˜jete™tuel a yftig„spY ˜re—kY ™—se ƒhvu•u€RX o˜jete™tuel a we‚syY ˜re—kY } ˜re—kY ge ™ode est très simpleF yn ™h—nge l9o˜jet —™tuel si on —ppuie sur une des tou™hes numériquesD on enregistre le nive—u si on —ppuie sur ƒD ou on ™h—rge le dernier nive—u enregistré si on —ppuie sur gF Blit time ! †oilà X on — p—ssé en revue tous les événementsF w—inten—ntD on n9— plus qu9à ˜litter ™h—™un des éléments de l— ™—rte à l9—ide d9une dou˜le ˜ou™leF g9est à peu de ™hoses près le même ™ode que ™elui de l— fon™tion de jeuF te vous le redonneD m—is p—s l— peine de vous le réexpliquer i™iF GG iff—™ement de l9é™r—n ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY GG €l—™ement des o˜jets à l9é™r—n for @i a H Y i ` xf•fvygƒ•ve‚qi…‚ Y iCCA RHU .

TP : MARIO SOKOBAN { for @j a H Y j ` xf•fvygƒ•re…„i…‚ Y jCCA { positionFx a i B „esvvi•fvygY positionFy a j B „esvvi•fvygY swit™h@™—rte‘i“‘j“A { ™—se w…‚X ƒhv•flitƒurf—™e@murD x…vvD e™r—nD 8positionAY ˜re—kY ™—se gesƒƒiX ƒhv•flitƒurf—™e@™—isseD x…vvD e™r—nD 8positionAY ˜re—kY ™—se yftig„spX ƒhv•flitƒurf—™e@o˜je™tifD x…vvD e™r—nD 8positionAY ˜re—kY ™—se we‚syX ƒhv•flitƒurf—™e@m—rioD x…vvD e™r—nD 8positionAY ˜re—kY } } } GG wise à jour de l9é™r—n ƒhv•plip@e™r—nAY sl ne f—ut p—s ou˜lier —près l— ˜ou™le prin™ip—le de f—ire les s9imposent X ƒhv•preeƒurf—™e@murAY ƒhv•preeƒurf—™e@™—isseAY ƒhv•preeƒurf—™e@o˜je™tifAY ƒhv•preeƒurf—™e@m—rioAY ƒhv•preeƒurf—™e qui eve™ ç—D le mén—ge est f—itF XEA Résumé et améliorations fienD on — f—it le tourF v9heure est —u résuméF Alors résumons ! it quel meilleur résumé pourr—itEon im—giner que le ™ode sour™e ™omplet du progr—mme —ve™ les ™omment—ires c RHV .CHAPITRE 24.

RHW . Compilé pour Windows.RÉSUMÉ ET AMÉLIORATIONS €our éviter de vous proposer des diz—ines de p—ges de ™ode qui répètent tout ™e qu9on vient de voirD je vous propose plutôt de télé™h—rger le ™ode sour™e ™omplet du proE gr—mme —insi que l9exé™ut—˜le F   £ ¢gode we˜ X UVWHQW ¡ ge (™hier Fzip ™ontient X ! l9exé™ut—˜le pour ‡indows @si vous êtes sous un —utre yƒD il su0r— de re™ompilerA Y ! les hvv de l— ƒhv et de ƒhv•sm—ge Y ! toutes les im—ges dont — ˜esoin le progr—mme @je vous les —i f—it télé™h—rger plus tôt d—ns le p—™k  sprites A Y ! les sour™es ™omplètes du progr—mme Y ! le (™hier F™˜p de projet gode: :flo™ksF ƒi vous voulez ouvrir le projet sous un —utre shiD ™réez un nouve—u projet de type ƒhv @™on(gurezEle ™orre™tement pour l— ƒhvA et —joutezEy m—nuellement tous les (™hiers F™ et FhF ge n9est p—s ˜ien ™ompliquéD vous verrezF †ous noterez que le projet ™ontientD en plus des F™ et des FhD un (™hier ressour™esFr™F g9est un (™hier qui peut être —jouté —u projet @uniquement sous ‡indowsA et qui permet d9intégrer des (™hiers d—ns l9exé™ut—˜leF s™iD je me sers du (™hier de ressour™es pour intégrer une i™ône d—ns l9exé™ut—˜leF gel— —ur— pour e'et de donner une i™ône à l9exé™ut—˜leD visi˜le d—ns l9explor—teur ‡indows @(gF PRFSAF 9 Figure PRFS ! sntégr—tion d9une i™ône à l9exé™ut—˜le evouez que ™9est qu—nd même plus symp— que d9—voir l9i™ône p—r déf—ut de ‡indows pour les exé™ut—˜les 3 †ous trouverez plus d9inform—tions sur ™ette te™hnique sur le ƒite du éroF £   ¢gode we˜ X VTPPQU ¡ 9.

Pour plus d'informations. 11.lvl.CHAPITRE 24. Je vous suggère de mettre un niveau par ligne dans niveaux. voir l'annexe du Site du Zéro (code web : 851504) RIH . Le programme d'installation a été créé à l'aide d'Inno Setup. TP : MARIO SOKOBAN Améliorez ! ge progr—mme n9est p—s p—rf—itD loin de là 3 †ous voulez des idées pour l9—méliorer c ! sl m—nque un mode d'emploiF e0™hez un é™r—n d9expli™—tions juste —v—nt le l—nE ™ement d9une p—rtie et —v—nt le l—n™ement de l9éditeurF sndiquez en p—rti™ulier les tou™hes à utiliserF ! h—ns l9éditeur de nive—uxD on ne s—it p—s quel est l9o˜jet —™tuellement séle™tionnéF ge qui ser—it ˜ienD ™9est que l'objet actuellement sélectionné suive le ™urseur de l— sourisF gomme ç—D l9utilis—teur verr—it ™e qu9il s9—pprête à mettre sur l— ™—rteF g9est f—™ile à f—ire X on — déjà f—it un ozor qui suit le ™urseur de l— souris d—ns le ™h—pitre pré™édent 3 ! h—ns l9éditeur de nive—uxD on —ppré™ier—it de pouvoir ™hoisir une CAISSE_OK @une ™—isse ˜ien pl—™ée sur un o˜je™tif dès le dép—rtAF in e'etD je me suis rendu ™ompte p—r l— suite qu9il y — de nom˜reux nive—ux qui ™ommen™ent —ve™ des ™—isses ˜ien pl—™ées dès le dép—rt @ç— ne veut p—s dire que le nive—u est plus f—™ileD loin de làAF ! h—ns l9éditeur toujoursD il f—udr—it empêcher que l'on puisse placer plus d'un départ de joueur sur une même carte 3 ! vorsqu9on réussit un nive—uD on retourne immédi—tement —u menuF g9est un peu ˜rutF ue diriezEvous d9acher un message  Bravo  —u ™entre de l9é™r—n qu—nd on g—gne c ! in(nD il ser—it ˜ien que le progr—mme puisse gérer plus d9un nive—u à l— foisF sl f—udr—it que l9on puisse ™réer une véritable petite aventure d'une vingtaine de niveaux p—r exempleF g9est un petit peu plus ™ompliqué à ™oder m—is f—is—˜leF sl f—udr— —d—pter le jeu et l9éditeur de nive—ux en ™onséquen™e F gomme promisD pour vous prouver que ™9est f—is—˜leF F F je l9—i f—it 3 te ne vous donne p—s le ™ode sour™eD en rev—n™he @je ™rois que je vous en —i déjà —ssez donné jusqu9i™i 3AD m—is je vous donne le progr—mme ™omplet ™ompilé pour ‡indows et vinuxF ve progr—mme ™omporte une —venture de PH nive—ux @de très très f—™ile àF F F super di0™ileAF €our ré—liser ™ert—ins de ™es nive—uxD je me suis ˜—sé sur le site d9un p—ssionné de ƒoko˜—n @soko˜—nFonlineFfrAF €our télé™h—rger le w—rio ƒoko˜—n —mélioré pour ‡indows X   £ gode we˜ X RHITQT ¡ ¢ it pour télé™h—rger l— version vinux X £   ¢gode we˜ X TQHUIS ¡ 10 11 10.

la gestion du temps est fondamentale. Il n'en reste pas moins que pour la majorité des jeux.-) RII . bien que le TP Mario Sokoban constitue un contre-exemple. comment vous y prendriez-vous pour réaliser un Tetris ou un Snake (jeu du serpent) ? Il faut bien que les blocs bougent toutes les X secondes. . Il est rare que l'on crée un programme SDL sans faire appel aux fonctions de gestion du temps.Chapitre 25 Diculté : Maîtrisez le temps ! C e chapitre est d'une importance capitale : il va vous apprendre à contrôler le temps en SDL. Du moins. Par exemple. ce que vous ne savez pas faire. pas avant d'avoir lu ce chapitre.

. d'autres fois. Pro- RIP . on se moque complètement que notre programme utilise tout le temps 100 % de CPU. C'est le cas de la quasi-totalité des jeux.CHAPITRE 25. désormais. 1. Notez que j'abrègerai CPU . C'est une abréviation courante qui signie Central soit  Unité centrale de calcul . comme c'est le cas pour un lecteur MP3 qui tourne en fond pendant que vous naviguez sur Internet. ‚evenons à l— fon™tion qui nous intéresseF ƒon prototype est d9une simpli™ité désol—nte X void ƒhv•hel—y@…intQP msAY in ™l—irD vous envoyez à l— fon™tion le nom˜re de millise™ondes pend—nt lesquelles votre progr—mme doit  dormir F g9est une simple mise en p—useF €—r exempleD si vous voulez que votre progr—mme se mette en p—use I se™ondeD vous devrez é™rire X ƒhv•hel—y@IHHHAY x9ou˜liez p—s que ™e sont des millise™ondes X ! IHHH millise™ondes a I se™onde Y ! SHH millise™ondes a IGP se™onde Y ! PSH millise™ondes a IGR se™ondeF cessing Unit. MAÎTRISEZ LE TEMPS ! Le Delay et les ticks h—ns un premier tempsD nous —llons —pprendre à utiliser deux fon™tions très simples X ! ƒhv•hel—y X permet de mettre en p—use le progr—mme un ™ert—in nom˜re de milliseE ™ondes Y ! ƒhv•qet„i™ks X retourne le nom˜re de millise™ondes é™oulées depuis le l—n™ement du progr—mmeF ges deux fon™tions sont très simples ™omme nous —llons le voirD m—is ˜ien les utiliser n9est p—s si évident que ç— en — l9—irF F F SDL_Delay gette fon™tion e'e™tue une p—use sur le progr—mme dur—nt un ™ert—in tempsF €end—nt que le progr—mme est en p—useD on dit qu9il dort @ sleep en —ngl—isA X il n9utilise p—s le pro™esseurF ƒhv•hel—y peut don™ être utilisée pour réduire l9utilis—tion du pro™esseur F qrâ™e à ƒhv•hel—yD vous pourrez rendre votre progr—mme moins gourm—nd en ressour™es proE ™esseurF sl fer— don™ moins  r—mer votre €g si ƒhv•hel—y est utilisée intelligemmentF 1 Tout dépend du programme que vous créez : parfois. . Mais. on aimerait bien que notre programme utilise le moins de CPU possible pour que l'utilisateur puisse faire autre chose en même temps.

maintenant. vous pouvez être certains que votre programme ne sera pas mis en pause 1 ms mais un peu plus (peut-être 9-10 ms). Par exemple. . RIQ . Le problème de la granularité du temps xonD r—ssurezEvousD je ne v—is p—s vous f—ire un tr—ité de physique qu—ntique —u ˜e—u milieu d9un ™h—pitre ƒhv 3 „outefoisD j9estime qu9il y — quelque ™hose que vous devez s—voir X ƒhv•hel—y n9est p—s une fon™tion  p—rf—ite F it ™e n9est p—s de s— f—uteD ™9est l— f—ute de votre yƒ @‡indowsD vinuxD w—™ yƒ ˆF F FAF €ourquoi l9yƒ intervientEil làEded—ns c „out simplement p—r™e que ™9est lui qui ™ontrôle les progr—mmes qui tournent 3 †otre progr—mme v— don™ dire à l9yƒ X  te dorsD réveilleE moi d—ns I se™onde F w—is l9yƒ ne v— p—s for™ément le réveiller ex—™tement —u ˜out d9une se™ondeF in e'etD il —ur— peutEêtre un peu de ret—rd @un ret—rd de IH ms en moyenne environD ç— dépend des €gAF €ourquoi c €—r™e que votre g€… ne peut tr—v—iller que sur un progr—mme à l— foisF ve rôle de l9yƒ est de dire —u g€… ™e sur quoi il doit tr—v—iller X  elorsD pend—nt RH ms tu v—s tr—v—iller sur firefoxFexeD puis pend—nt IIH ms sur explorerFexe Y ensuiteD pend—nt VH ms tu v—s tr—v—iller sur progr—mme•sdlFexeD puis retr—v—iller sur firefoxFexe pend—nt TS ms D et™F v9yƒ est le vérit—˜le ™hef d9or™hestre de l9ordin—teur 3 w—inten—ntD im—ginez qu9—u ˜out d9une se™onde un —utre progr—mme soit en™ore en tr—in de tr—v—iller X il f—udr— qu9il —it (ni pour que votre progr—mme puisse  reprendre l— m—in ™omme on ditD ™9estEàEdire être tr—ité à nouve—u p—r le g€…F u9estE™e qu9il f—ut retenir c ue votre g€… ne peut p—s gérer plus d9un progr—mme à l— fois F €our donner l9impression que l9on peut f—ire tourner plusieurs progr—mmes en même temps sur un ordin—teurD l9yƒ  dé™oupe le temps et —utorise les progr—mmes à tr—v—iller tour à tourF yrD ™ette gestion des progr—mmes est très ™omplexe et on ne peut don™ p—s —voir l— g—r—ntie que notre progr—mme ser— réveillé —u ˜out d9une se™onde ex—™tementF „outefoisD ™el— dépend des €g ™omme je vous l9—i dit plus h—utF ghez moiD j9—i pu ™onst—ter que l— fon™tion ƒhv•hel—y ét—it —ssez pré™iseF 2 À cause de ce problème de granularité du temps. . Les CPU double c÷ur ont en eet la capacité de travailler sur deux programmes à la fois. si vous faites : ƒhv•hel—y@IAY . 2. C'est toutefois de moins en moins vrai.LE DELAY ET LES TICKS Vous ne pouvez rien faire dans votre programme pendant qu'il est en pause ! Un programme qui  dort  ne peut rien faire puisqu'il n'est pas actif pour l'ordinateur. vous ne pouvez donc pas mettre en pause votre programme pendant un temps trop court.

MAÎTRISEZ LE TEMPS ! ƒhv•hel—y est don™ ˜ien pr—tiqueD m—is ne lui f—ites p—s trop ™on(—n™eF ille ne mettr— p—s en p—use votre progr—mme pend—nt le temps exact que vous indiquezF ge n9est p—s p—r™e que l— fon™tion est m—l ™odéeD ™9est p—r™e que le fon™tionnement d9un ordin—teur est très ™omplexe et ne permet p—s d9être très pré™is à ™e nive—uF SDL_GetTicks gette fon™tion renvoie le nom˜re de millise™ondes é™oulées depuis le l—n™ement du progr—mmeF g9est un indi™—teur de temps indispens—˜leF gel— vous permet de vous repérer d—ns le tempsD vous —llez voir 3 †oi™i le prototype X …intQP ƒhv•qet„i™ks@voidAY v— fon™tion n9—ttend —u™un p—r—mètreD elle renvoie juste le nom˜re de millise™ondes é™ouléesF ge nom˜re —ugmente —u fur et à mesure que le temps p—sseD inl—ss—˜lementF €our infoD l— do™9 de l— ƒhv indique que le nom˜re —tteint son m—ximum et est réE initi—lisé —u ˜out de RW jours 3 e priori votre progr—mme ƒhv devr—it tourner moins longtemps que ç—D don™ p—s de sou™i de ™e ™ôtéElàF Utiliser SDL_GetTicks pour gérer le temps ƒi ƒhv•hel—y est —ssez f—™ile à ™omprendre et à utiliserD ™e n9est p—s le ™—s de l— fon™tion ƒhv•qet„i™ksF sl est temps d9—pprendre à ˜ien s9en servirF F F †oi™i un exemple 3 xous —llons reprendre notre ˜on vieux progr—mme —ve™ l— fenêtre —0™h—nt ozor à l9é™r—n @(gF PSFIAF gette foisD —u lieu de le diriger —u ™l—vier ou à l— sourisD nous —llons f—ire en sorte qu9il ˜ouge tout seul sur l9é™r—n 3 €our f—ire simpleD on v— le f—ire ˜ouger horizont—lement sur l— fenêtreF yn reprend pour ™ommen™er ex—™tement le même ™ode sour™e que ™elui qu9on —v—it utilisé d—ns le ™h—pitre sur les événementsF †ous devriez pouvoir ™réer un progr—mme —ussi simple s—ns —voir ˜esoin de mon —ideD i™iF ƒi né—nmoins vous en —vez ˜esoinD vous pouvez ré™upérer le ™ode sour™e de ˜—se sur snternetF £   ¢gode we˜ X SQRWIV ¡ sntéressonsEnous à ozorF xous voulons le f—ire ˜ougerF €our ™el—D le mieux est d9utiliser ƒhv•qet„i™ksF yn v— —voir ˜esoin de deux v—ri—˜les X temps€re™edent et tempse™tuelF illes vont sto™ker le temps retourné p—r ƒhv•qet„i™ks à des moments di'érentsF sl nous su0r— de f—ire l— di'éren™e entre tempse™tuel et temps€re™edent pour voir le temps qui s9est é™ouléF ƒi le temps é™oulé est p—r exemple supérieur à QH msD —lors on ™h—nge les ™oordonnées de ozorF gommen™ez don™ p—r ™réer ™es deux v—ri—˜les dont on v— —voir ˜esoin X int temps€re™edent a HD tempse™tuel a HY RIR .CHAPITRE 25.

LE DELAY ET LES TICKS Figure PSFI ! ozor —u ™entre de l9é™r—n w—inten—ntD d—ns notre ˜ou™le in(nieD nous —llons —jouter le ™ode suiv—nt X tempse™tuel a ƒhv•qet„i™ks@AY if @tempse™tuel E temps€re™edent b QHA GB ƒi QH ms se sont é™oulées BG { positionozorFxCCY GB yn ˜ouge ozor BG temps€re™edent a tempse™tuelY GB ve temps 4—™tuel4 devient le temps → 4pre™edent4 pour nos futurs ™—l™uls BG } gomprenez ˜ien ™e qui se p—sseF IF yn prend le temps —™tuel grâ™e à ƒhv•qet„i™ksF PF yn ™omp—re —u temps pré™édemment enregistréF ƒ9il y — un 陗rt de QH ms —u moinsD —lorsF F F QF F F F on ˜ouge ozorD ™—r on veut qu9il se dépl—™e toutes les QH msF s™iD on le d陗le juste vers l— droite toutes les QH ms F RF €uisD et ™9est vr—iment ™e qu9il ne f—ut p—s ou˜lierD on pl—™e le temps  —™tuel d—ns le temps  pré™édent F in e'etD im—ginez le pro™h—in tour de ˜ou™le X le 3 3. Rien ne vous garantit que l'instruction sera exécutée pile poil toutes les 30 ms. RIS . et non égal à 30 ms ! En eet. Il faut vérier si le temps est supérieur à 30 ms. il faut vérier si au moins 30 ms se sont écoulées.

CHAPITRE 25. MAÎTRISEZ LE TEMPS ! temps  —™tuel —ur— ™h—ngéD et on pourr— le ™omp—rer —u temps pré™édentF À nouve—uD on pourr— véri(er si QH ms se seront é™oulées et ˜ouger ozorF Et que se passe-t-il si la boucle met moins de temps que 30 ms ? visez mon ™ode X il ne se p—sse rien 3 yn ne rentre p—s d—ns le ifD on ne f—it don™ rienF yn —ttend le pro™h—in tour de ˜ou™le où on véri(er— à nouve—u si QH ms se seront é™oulées depuis l— dernière fois qu9on — f—it ˜ouger ozorF ge ™ode est ™ourtD m—is il f—ut le ™omprendre 3 ‚elisez mes expli™—tions —ut—nt de fois que né™ess—ireD p—r™e que ™9ét—it pro˜—˜lement le p—ss—ge le plus import—nt du ™h—pitreF Un changement dans la gestion des événements xotre ™ode est p—rf—it à un dét—il près X l— fon™tion ƒhv•‡—itiventF ille ét—it très pr—tique jusqu9i™iD puisqu9on n9—v—it p—s à gérer le tempsF gette fon™tion mett—it en p—use le progr—mme @un peu à l— m—nière de ƒhv•hel—yA t—nt qu9il n9y —v—it p—s d9événementF yr i™iD on n9— p—s ˜esoin d9—ttendre un événement pour f—ire ˜ouger ozor 3 sl doit ˜ouger tout seulF †ous n9—llez qu—nd même p—s ˜ouger l— souris juste pour générer des événements et don™ f—ire sortir le progr—mme de l— fon™tion ƒhv•‡—itivent 3 v— solution c ƒhv•€olliventF te vous —v—is déjà présenté ™ette fon™tion X ™ontr—irement à ƒhv•‡—itiventD elle renvoie une v—leurD qu9il y —it eu un événement ou nonF yn dit que l— fon™tion n9est p—s bloquante X elle ne met p—s en p—use le progr—mmeD l— ˜ou™le in(nie v— don™ tourner tout le tempsF Code complet †oi™i le ™ode (n—l que vous pouvez tester X int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bzozor a x…vvY ƒhv•‚e™t positionozorY ƒhv•ivent eventY int ™ontinuer a IY int temps€re™edent a HD tempse™tuel a HY ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du temps en ƒhv4D x…vvAY zozor a ƒhv•vo—dfw€@4zozorF˜mp4AY RIT .

LE DELAY ET LES TICKS ƒhv•ƒetgoloruey@zozorD ƒhv•ƒ‚ggyvy‚ui‰D ƒhv•w—p‚qf@zozorEbform—tD HD HD PSSAAY positionozorFx a e™r—nEbw G P E zozorEbw G PY positionozorFy a e™r—nEbh G P E zozorEbh G PY ƒhv•in—˜leuey‚epe—t@IHD IHAY while @™ontinuerA { ƒhv•€ollivent@8eventAY GB yn utilise €ollivent et non ‡—itivent pour ne → p—s ˜loquer le progr—mme BG swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY } tempse™tuel a ƒhv•qet„i™ks@AY if @tempse™tuel E temps€re™edent b QHA GB ƒi QH ms se sont é™oulées depuis le dernier tour de ˜ou™le BG { positionozorFxCCY GB yn ˜ouge ozor BG temps€re™edent a tempse™tuelY GB ve temps 4—™tuel4 devient le temps 4pre™edent4 pour nos futurs ™—l™uls BG } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY ƒhv•flitƒurf—™e@zozorD x…vvD e™r—nD 8positionozorAY ƒhv•plip@e™r—nAY → → → } ƒhv•preeƒurf—™e@zozorAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X VVUTRP ¡ †ous devriez voir ozor ˜ouger tout seul sur l9é™r—nF sl se d陗le vers l— droiteF iss—yez p—r exemple de ™h—nger le temps de QH ms en IS ms X ozor devr—it se dépl—™er deux fois plus vite 3 in e'etD il se dépl—™er— une fois toutes les IS ms —u lieu d9une fois toutes les QH ms —up—r—v—ntF RIU £ ¢gode   .

ƒhv•hel—y mettra peut-être quelques millisecondes de RIV . .CHAPITRE 25. . MAÎTRISEZ LE TEMPS ! Consommer moins de CPU e™tuellementD notre progr—mme tourne en ˜ou™le indé(niment à l— vitesse de l— lumière @en(nD presqueAF sl ™onsomme don™ IHH 7 du g€…F €our voir ™el—D il vous su0t p—r exemple de f—ire g„‚v C ev„ C ƒ…€€‚ @onglet €ro™essusA sous ‡indows @(gF PSFPAF Figure PSFP ! gonsomm—tion du g€… p—r le progr—mme gomme vous pouvez le voirD notre g€… est utilisé à IHH 7 p—r notre progr—mme testsdlFexeF te vous l9—i dit plus tôt X si vous ™odez un jeu @surtout un jeu plein é™r—nAD ™e n9est p—s gr—ve si vous utilisez IHH 7 du g€…F w—is si ™9est un jeu d—ns une fenêtre p—r exempleD il v—ut mieux qu9il utilise le moins de g€… possi˜le pour que l9utilis—teur puisse f—ire —utre ™hose s—ns que son €g ne  r—me F v— solution c yn v— reprendre ex—™tement le même ™ode que ™iEdessusD m—is on v— lui —jouter en plus un ƒhv•hel—y pour p—tienter le temps qu9il f—ut —(n que ç— f—sse QH msF yn v— juste —jouter un ƒhv•hel—y d—ns un else X tempse™tuel a ƒhv•qet„i™ks@AY if @tempse™tuel E temps€re™edent b QHA { positionozorFxCCY temps€re™edent a tempse™tuelY } else GB ƒi ç— f—it moins de QH ms depuis le dernier tour de ˜ou™leD on endort le → progr—mme le temps qu9il f—ut BG { ƒhv•hel—y@QH E @tempse™tuel E temps€re™edentAAY } gomment ™el— fon™tionneEtEilD ™ette fois c g9est simpleD il y — deux possi˜ilités @d9—près le ifA X ! soit ç— f—it plus de QH ms qu9on n9— p—s ˜ougé ozorD d—ns ™e ™—s on le ˜ouge Y ! soit ç— f—it moins de QH msD d—ns ™e ™—s on f—it dormir le progr—mme —ve™ ƒhv•hel—y le temps qu9il f—ut pour —tteindre les QH ms environF h9où mon petit ™—l™ul QH E @tempse™tuel E temps€re™edentAF ƒi l— di'éren™e entre le temps —™tuel et le temps pré™édent est p—r exemple de PH msD —lors on endormir— le progr—mme @QH E PHA a IH ms —(n d9—tteindre les QH msF Rappelez-vous que plus que prévu.

LE DELAY ET LES TICKS eve™ ™e ™odeD notre progr—mme v—  dormir l— plup—rt du temps et don™ ™onsommer très peu de g€… @(gF PSFQAF Figure PSFQ ! gonsomm—tion de g€… réduite in moyenneD le progr—mme utilise m—inten—nt entre H et I 7 de g€…F F F €—rfois il utilise légèrement plusD m—is il retom˜e r—pidement à H 7 de g€…F Contrôler le nombre d'images par seconde †ous vous dem—ndez ™ert—inement ™omment on peut limiter @(xerA le nom˜re d9im—ges p—r se™onde —0™hées p—r l9ordin—teurF ih ˜ien ™9est ex—™tement ™e qu9on est en tr—in de f—ire 3 s™iD on —0™he une nouvelle im—ge toutes les QH ms en moyenneF ƒ—™h—nt qu9une se™onde v—ut IHHH msD pour trouver le nom˜re de p€ƒ @im—ges p—r se™ondeAD il su0t de f—ire une division X IHHH G QH a QQ im—ges p—r se™onde environF €our l9÷il hum—inD une —nim—tion est )uide si elle ™ontient —u moins PS im—ges G seE ™ondeF eve™ QQ im—ges G se™ondeD notre —nim—tion ser— don™ tout à f—it )uideD elle n9—pp—r—îtr— p—s  s—™™—dée F ƒi vous voulez plus d9im—ges p—r se™ondeD il f—ut réduire l— limite de temps entre deux im—gesF €—ssez de QH à PH msD et ç— vous fer— du IHHH G PH a SH p€ƒF 4 Exercices v— m—nipul—tion du temps n9est p—s évidenteD il ser—it ˜ien de vous entr—îner un peuD qu9en ditesEvous c †oi™i quelques exer™i™esF ! €our le momentD ozor se d陗le vers l— droite puis disp—r—ît de l9é™r—nF ge ser—it mieux s9il rep—rt—it d—ns l9—utre sens une fois —rrivé tout à droiteD non c gel— donner—it l9impression qu9il re˜onditF te vous ™onseille de ™réer un ˜ooléen versv—hroite qui v—ut  vr—i si ozor se dépl—™e vers l— droite @et  f—ux s9il v— vers l— g—u™heAF ƒi le ˜ooléen v—ut vr—iD vous d陗lez don™ ozor vers l— droiteD sinon vous le d陗lez vers l— g—u™heF ƒurtoutD n9ou˜liez p—s de ™h—nger l— v—leur du ˜ooléen lorsque ozor —tteint le ˜ord droit ou le ˜ord g—u™heF ih ouiD il f—ut ˜ien qu9il rep—rte d—ns l9—utre sens 3 ! €lutôt que de f—ire re˜ondir ozor de droite à g—u™heD f—ites le re˜ondir en di—goE n—le sur l9é™r—n 3 sl vous su0r— de modi(er positionozorFx et positionozorFy 4. Couramment abrégé FPS pour  Frames per second . RIW .

Elle fait intervenir une notion qu'on n'a pas vue jusqu'ici : les pointeurs de fonctions. MAÎTRISEZ LE TEMPS ! simult—némentF †ous pouvez ess—yer de voir ™e que ç— f—it si on —ugmente x et si on diminue y en même tempsD ou ˜ien si on —ugmente les deux en même tempsD et™F ! p—ites en sorte qu9un —ppui sur l— tou™he € empê™he ozor de se dépl—™erD et qu9un nouvel —ppui sur l— tou™he € rel—n™e le dépl—™ement de ozorF g9est un ˜ête ˜ooléen à —™tiver et dés—™tiverF Les timers L'utilisation des timers est un peu complexe. SDL_SetTimer est une fonction ancienne RPH . alors ? Eh bien disons que les timers nous obligent à mieux structurer notre programme en fonctions. Il n'est pas indispensable d'utiliser les timers : si vous les trouvez trop délicats à utiliser. Cependant.CHAPITRE 25. Initialiser le système de timers €our pouvoir utiliser les timersD vous devez d9—˜ord initi—liser l— ƒhv —ve™ un )—g spé™i—l X ƒhv•sxs„•„swi‚F †ous devriez don™ —ppeler votre fon™tion ƒhv•snit ™omme ™e™i X ƒhv•snit@ƒhv•sxs„•†shiy | ƒhv•sxs„•„swi‚AY v— ƒhv est m—inten—nt prête à utiliser les timers 3 Ajouter un timer €our —jouter un timerD on f—it —ppel à l— fon™tion ƒhv•edd„imer dont voi™i le protoE type X 5 5. Il existe en fait deux fonctions permettant d'ajouter un timer en SDL : SDL_AddTimer et SDL_SetTimer. ves timers ™onstituent une —utre f—çon de ré—liser ™e qu9on vient de f—ire —ve™ l— fon™E tion ƒhv•qet„i™ksF g9est une te™hnique un peu p—rti™ulièreF gert—ins l— trouveront pr—tiqueD d9—utres nonF gel— dépend don™ des goûts du progr—mmeurF u9estE™e qu9un timer c g9est un système qui permet de dem—nder à l— ƒhv d9—pE peler une fon™tion toutes les ˆ millise™ondesF †ous pourriez —insi ™réer une fon™tion ˜ougerinnemi@A que l— ƒhv —ppeller—it —utom—tiquement toutes les SH ms —(n que l9ennemi se dépl—™e à interv—lles réguliersF Comme je viens de vous le dire. vous pouvez passer votre chemin sans problème. cela est aussi faisable avec ƒhv•qet„i™ks en utilisant la technique qu'on a vue plus haut. Quel avantage. Elles sont quasiment identiques.

Aujourd'hui. 6. Si vous souhaitez en savoir plus sur les pointeurs de fonctions. RPI . je vous invite à lire le tutoriel rédigé par mleg sur le Site du Zéro qui traite de ce sujet (code web : 199183).LES TIMERS ƒhv•„imersh ƒhv•edd„imer@…intQP interv—lD ƒhv•xew„imerg—ll˜—™k ™—ll˜—™kD → void Bp—r—mAY yn envoie trois p—r—mètres à l— fon™tion X ! l'intervalle de temps @en msA entre ™h—que —ppel de l— fon™tion Y ! le nom de la fonction à appelerF yn —ppelle ™el— un callback X le progr—mme se ™h—rge de r—ppeler ™ette fon™tion de ™—ll˜—™k régulièrement Y ! les paramètres à envoyer à votre fon™tion de ™—ll˜—™kF Comment ? Un nom de fonction peut servir de paramètre ? Je croyais qu'on ne pouvait envoyer que des variables ! in f—itD les fon™tions sont —ussi sto™kées en mémoire —u ™h—rgement du progr—mmeF illes ont don™ elles —ussi une —dresseF hu ™oupD on peut ™réer desF F F pointeurs de fonctions 3 sl su0t d9é™rire le nom de l— fon™tion à —ppeler pour indiquer l9—dresse de l— fon™tionF einsiD l— ƒhv s—ur— à quelle —dresse en mémoire elle doit se rendre pour —ppeler votre fon™tion de ™—ll˜—™kF ƒhv•edd„imer renvoie un numéro de timer @un  sh AF †ous devez sto™ker ™e résult—t d—ns une v—ri—˜le de type ƒhv•„imershF gel— vous permettr— p—r l— suite de dés—™tiver le timer X il vous su0r— d9indiquer l9sh du timer à —rrêterF v— ƒhv vous permet d9—™tiver plusieurs timers en même tempsF gel— explique l9intérêt de sto™ker un sh de timer pour pouvoir les di'éren™ierF yn v— don™ ™réer un sh de timer X 6 ƒhv•„imersh timerY GB †—ri—˜le pour sto™ker le numéro du timer BG F F F puis on v— ™réer notre timer X timer a ƒhv•edd„imer@QHD ˜ougerozorD 8positionozorAY GB hém—rr—ge du timer BG s™iD je ™rée un timer qui — les propriétés suiv—ntes X ! il ser— —ppelé toutes les QH ms Y ! il —ppeller— l— fon™tion de ™—ll˜—™k ˜ougerozor Y ! il lui enverr— ™omme p—r—mètre un pointeur sur l— position de ozor pour qu9il puisse l— modi(erF †ous l9—urez ™ompris X le rôle de l— fon™tion ˜ougerozor ser— de ™h—nger l— position de ozor toutes les QH msF qui existe toujours pour des raisons de compatibilité. on nous recommande donc d'utiliser SDL_AddTimer. si on veut bien faire les choses.

MAÎTRISEZ LE TEMPS ! Création de la fonction de callback ettention X il f—ut être p—rti™ulièrement vigil—nt i™iF †otre fon™tion de ™—ll˜—™k doit obligatoirement —voir le prototype suiv—nt X …intQP nomhev—pon™tion@…intQP interv—lleD void Bp—r—metreAY €our ™réer le ™—ll˜—™k ˜ougerozorD je devr—i don™ é™rire l— fon™tion ™omme ™e™i X …intQP ˜ougerozor@…intQP interv—lleD void Bp—r—metreAY †oi™i m—inten—nt le ™ontenu de m— fon™tion ˜ougerozorD qui est plus déli™—te qu9il n9y p—r—ît X GB pon™tion de ™—ll˜—™k @ser— —ppelée toutes les QH msA BG …intQP ˜ougerozor@…intQP interv—lleD void Bp—r—metreA { ƒhv•‚e™tB positionozor a p—r—metreY GB gonversion de voidB en ƒhv•‚e™tB BG positionozorEbxCCY } return interv—lleY v— fon™tion ˜ougerozor ser— don™ —utom—tiquement —ppelée toutes les QH ms p—r l— ƒhvF v— ƒhv lui enverr— toujours deux p—r—mètres @ni plusD ni moinsA X ! l'intervalle de temps qui sép—re deux —ppels de l— fon™tion @i™iD ç— ser— QH msA Y ! le paramètre  personnalisé  que vous —vez dem—ndé à envoyer à l— fon™tionF ‚em—rquezD et ™9est très import—ntD que ™e p—r—mètre est un pointeur sur voidF gel— signi(e que ™9est un pointeur qui peut pointer sur n9importe quoi X un intD une stru™ture personn—liséeD ou ™omme i™i un ƒhv•‚e™t @positionozorAF ve pro˜lèmeD ™9est que ™e p—r—mètre est un pointeur de type in™onnu @voidA pour l— fon™tionF sl v— don™ f—lloir dire à l9ordin—teur que ™e p—r—mètre est un ƒhv•‚e™tB @un pointeur sur ƒhv•‚e™tAF €our f—ire ç—D je ™rée un pointeur sur ƒhv•‚e™t d—ns m— fon™tion qui prend ™omme v—leurF F F le pointeur p—r—metreF 7 Quel intérêt d'avoir créé un DEUXIÈME pointeur qui contient la même adresse ? v9intérêtD ™9est que positionozor est de type ƒhv•‚e™tB ™ontr—irement à l— v—ri—˜le p—r—metre qui ét—it de type voidBF 7. Heureusement. RPP . vous pouvez toujours créer un type personnalisé (ou un tableau) qui sera un assemblage des variables que vous voulez transmettre.CHAPITRE 25. Il n'est pas possible d'envoyer plus d'un paramètre personnalisé à la fonction de callback.

LES TIMERS †ous pourrez don™ —™™éder à positionozorEbx et positionozorEbyF ƒi vous —viez f—it p—r—metreEbx ou p—r—metreEbyD le ™ompil—teur —ur—it tout rejeté en ˜lo™ p—r™e que le type void ne ™ontient p—s de sousEv—ri—˜le x et yF eprèsD l— ligne suiv—nte est simple X on modi(e l— v—leur de positionozorEbx pour d陗ler ozor vers l— droiteF hernière ™hoseD très import—nte X vous devez retourner l— v—ri—˜le interv—lleF gel— indiquer— à l— ƒhv qu9on veut ™ontinuer à f—ire en sorte que l— fon™tion soit —ppelée toutes les QH msF ƒi vous voulez ™h—nger l9interv—lle d9—ppelD il su0t de renvoyer une —utre v—leur @m—is ˜ien souventD on ne ™h—nge p—s ™et interv—lleAF Arrêter le timer €our —rrêter le timerD ™9est très simple X ƒhv•‚emove„imer@timerAY GB errêt du timer BG sl su0t d9—ppeler ƒhv•‚emove„imer en indiqu—nt l9sh du timer à —rrêterF s™iD j9—rrête le timer juste —près l— ˜ou™le in(nieD —u même endroit que les ƒhv•preeƒurf—™eF En résumé ! v— fon™tion ƒhv•hel—y permet de mettre en p—use le progr—mme un ™ert—in nom˜re de millise™ondesF gel— permet de réduire l9utilis—tion du g€… qui n9est —lors plus monopolisé p—r votre progr—mmeF ! yn peut ™onn—ître le nom˜re de millise™ondes é™oulées depuis le l—n™ement du proE gr—mme —ve™ ƒhv•qet„i™ksF eve™ quelques petits ™—l™ulsD on peut s9en servir pour e'e™tuer une gestion des événements non ˜loqu—nte —ve™ ƒhv•€olliventF ! ves timers ™onstituent un système qui permet de r—ppeler une de vos fon™tions @dite de callback A à interv—lles réguliersF ve même résult—t peut être o˜tenu —ve™ ƒhv•qet„i™ks m—is les timers —ident à rendre le progr—mme plus lisi˜le et mieux stru™turéF RPQ .

MAÎTRISEZ LE TEMPS ! RPR .CHAPITRE 25.

il n'y a donc aucune fonction pour écrire du texte dans une fenêtre SDL ? . il y a plus simple : on peut utiliser la bibliothèque SDL_ttf. . Il sut d'utiliser. tout comme SDL_image. Ça fonctionne. Il est temps de vous apporter la réponse : c'est non. RPS . Cependant. il y a quand même moyen d'y arriver.Chapitre 26 Diculté : Écrire du texte avec SDL_ttf J e suis persuadé que la plupart d'entre vous se sont déjà posé cette question :  Mais bon sang. Son rôle est de créer une ƒhv•ƒurf—™e à partir du texte que vous lui envoyez. Heureusement. C'est une bibliothèque qui vient s'ajouter par-dessus la SDL. mais ce n'est pas ce qu'il y a de plus pratique. . la ruse ! On peut par exemple blitter des images de lettres une à une à l'écran.

c'est grave. mais en fait. vous remarquerez qu'il n'y a que deux chiers . Sous Windows. évidemment. ÉCRIRE DU TEXTE AVEC SDL_TTF Installer SDL_ttf sl f—ut s—voir queD ™omme ƒhv•im—geD ƒhv•ttf est une ˜i˜liothèque qui né™essite que l— ƒhv soit inst—llée F „out ™omme ƒhv•im—geD ƒhv•ttf est une des ˜i˜liothèques liées à l— ƒhv les plus popuE l—ires @™9estEàEdire qu9elle est très télé™h—rgéeAF gomme vous —llez pouvoir le ™onst—terD ™ette ˜i˜liothèque est e'e™tivement ˜ien f—iteF …ne fois que vous —urez —ppris à l9utiliserD vous ne pourrez plus vous en p—sser 3 1 Comment fonctionne SDL_ttf ? ƒhv•ttf n9utilise p—s des im—ges ˜itm—p pour générer du texte d—ns des surf—™esF g9est une méthode en e'et —ssez lourde à mettre en pl—™e et on n9—ur—it pu utiliser qu9une seule poli™eF in f—itD ƒhv•ttf f—it —ppel à une —utre ˜i˜liothèque X FreeTypeF g9est une ˜i˜liothèque ™—p—˜le de lire les (™hiers de poli™e @FttfA et d9en sortir l9im—geF ƒhv•ttf ré™upère don™ ™ette im—ge et l— ™onvertit pour l— ƒhv en ™ré—nt une ƒhv•ƒurf—™eF ƒhv•ttf — don™ ˜esoin de l— ˜i˜liothèque pree„ype pour fon™tionnerD sinon elle ne ser— p—s ™—p—˜le de lire les (™hiers FttfF ƒi vous êtes sous Windows et que vous prenezD ™omme je le f—isD l— version ™ompilée de l— ˜i˜liothèqueD vous n9—urez p—s ˜esoin de télé™h—rger quoi que ™e soit de plus ™—r pree„ype ser— in™luse d—ns l— hvv ƒhv•ttfFdllF †ous n9—vez don™ rien à f—ireF ƒi vous êtes sous Linux ou Mac OS et que vous devez re™ompiler l— ˜i˜liothèqueD il vous f—udr— en rev—n™he pree„ype pour ™ompilerF ‚endezEvous sur l— p—ge de télé™h—rE gement de pree„ype pour ré™upérer les (™hiers pour développeursF   £ ¢gode we˜ X PHSVVI ¡ Installer SDL_ttf ‚endezEvous sur l— p—ge de télé™h—rgement de ƒhv•ttfF £   gode we˜ X IVUUPU ¡ ¢ vàD ™hoisissez le (™hier qu9il vous f—ut d—ns l— se™tion Binary F ve (™hier s€ ™ontient ™omme d9h—˜itude un dossier in™lude et un dossier li˜F €l—™ez le ™ontenu du dossier in™lude d—ns mingwQPGin™ludeGƒhv et le ™ontenu du dossier li˜ d—ns mingwQPGli˜F 2 1.h et .zip ayant le suxe win32 et VC6. Bon : si à ce stade du cours vous n'avez toujours pas installé la SDL. RPT . Le premier (win32) contient la DLL que vous aurez besoin de livrer avec votre exécutable. exceptionnellement. On pourrait penser d'après le nom que ça n'est fait que pour Visual C++. donc je vais supposer que c'est déjà fait ! 2.CHAPITRE 26.lib dont vous allez avoir besoin pour programmer. le chier . il fonctionnera donc sous Code: :Blocks.lib livré ici marche aussi avec mingw32. Vous aurez aussi besoin de mettre cette DLL dans le dossier de votre projet pour pouvoir tester votre programme. Le second (VC6) contient les .

Chez moi.-) RPU . 4. . c'est dans C:\Program Files\CodeBlocks\mingw32\lib.INSTALLER SDL_TTF Vous mingwQPGin™ludeGƒhv devez copier Attention aux erreurs ! le chier ƒhv•ttfFh dans le dossier et non pas dans mingwQPGin™lude tout court. Si vous ne vous êtes pas encore posé cette question. Congurer un projet pour SDL_ttf sl nous reste une dernière petite ™hose à f—ire X ™on(gurer notre projet pour qu9il utilise ˜ien ƒhv•ttfF sl v— f—lloir modi(er les options du linker pour qu9il ™ompile ˜ien votre progr—mme en utilis—nt l— ˜i˜liothèque ƒhv•ttfF †ous —vez déjà —ppris à f—ire ™ette opér—tion pour l— ƒhv et pour ƒhv•im—geD je v—is don™ —ller plus viteF gomme je tr—v—ille sous gode: :flo™ksD je v—is vous donner l— pro™édure —ve™ ™et shiF ge n9est p—s ˜ien di'érent —ve™ les —utres shi X ! rendezEvous d—ns le menu €roje™t G fuild yptions Y ! d—ns l9onglet vinkerD ™liquez sur le petit ˜outon edd Y ! indiquez où se trouve le (™hier ƒhv•ttfFli˜ Y ! on vous dem—nde Keep this as a relative path ? €eu importe ™e que vous répondezD ç— m—r™her— d—ns les deux ™—sF te vous ™onseille qu—nd même de répondre p—r l— nég—tiveD ™—r sinon votre projet ne fon™tionner— plus si vous le dépl—™ez d—ns un —utre dossier Y ! v—lidez en ™liqu—nt sur yuF 3 On n'a pas besoin de linker avec la bibliothèque FreeType aussi ? xonD ™—r ™omme je vous l9—i dit pree„ype est in™luse d—ns l— hvv de ƒhv•ttfF †ous n9—vez p—s à vous préo™™uper de pree„ypeD ™9est ƒhv•ttf qui gère ç—D m—inten—ntF La documentation w—inten—nt que vous ™ommen™ez à devenir des progr—mmeurs —guerrisD vous devriez vous dem—nder immédi—tement X  w—is où est l— do™9 c F sl y — ™ertes des ™ours qui dét—illent le fon™tionnement des ˜i˜liothèquesD ™omme ™e livreF „outefoisF F F ! te ne v—is p—s f—ire un ™h—pitre pour toutes les ˜i˜liothèques qui existent @même en y p—ss—nt m— vieD je n9—ur—is p—s le tempsAF sl v— don™ f—lloir tôt ou t—rd lire une do™9D et mieux v—ut ™ommen™er à —pprendre à le f—ire m—inten—nt 3 ! h9—utre p—rtD une ˜i˜liothèque est en génér—l —ssez ™omplexe et ™ontient ˜e—u™oup de fon™tionsF te ne peux p—s présenter toutes ™es fon™tions d—ns un ™h—pitreD ™e ser—it ˜ien trop long 3 4 3. c'est que vous n'êtes pas encore des programmeurs aguerris.

CHAPITRE 26. €our dém—rrer ƒhv•ttf @on dit —ussi  initi—liser AD on doit don™ —ppeler l— fon™tion „„p•snit@AF eu™un p—r—mètre n9est né™ess—ireF v— fon™tion renvoie EI s9il y — eu une erreurF †ous pouvez don™ dém—rrer ƒhv•ttf très simplement ™omme ™e™i X „„p•snit@AY 5. c'est peu ! RPV . ÉCRIRE DU TEXTE AVEC SDL_TTF in ™l—ir X les do™ument—tions ont l9—v—nt—ge d9être ™omplètes et on ne peut p—rfois p—s y ™ouperF te vous ™onseille don™ de mettre dès à présent d—ns vos f—voris l9—dresse de l— do™9 de ƒhv•ttfF £   ¢gode we˜ X PURHSH ¡ v— do™9 est disponi˜le en plusieurs form—ts X r„wv en ligneD r„wv zippéD €hpD et™F €renez l— version qui vous —rr—nge le plusF †ous verrez que ƒhv•ttf est une ˜i˜liothèque très simple X il y — peu de fon™tions @environ RHESHA F gel— devr—it être signe @pour les progr—mmeurs —guerris que vous êtes YEA A que ™ette ˜i˜liothèque est simple et que vous s—urez l— m—nier —ssez viteF ellezD il est temps d9—pprendre à utiliser ƒhv•ttfD m—inten—nt 3 5 Chargement de SDL_ttf L'include ev—nt toute ™hoseD il f—ut —jouter l9in™lude suiv—nt en h—ut de votre (™hier F™ X 5in™lude `ƒhvGƒhv•ttfFhb ƒi vous —vez des erreurs de ™ompil—tion à ™e st—deD véri(ez si vous —vez ˜ien pl—™é le (™hier ƒhv•ttfFh d—ns le dossier mingwQPGin™ludeGƒhv et non d—ns mingwQPGin™lude tout ™ourtF Démarrage de SDL_ttf „out ™omme l— ƒhvD ƒhv•ttf — ˜esoin d9être dém—rrée et —rrêtéeF sl y — don™ des fon™tions très simil—ires à ™elles de l— ƒhv X ! „„p•snit X dém—rre ƒhv•ttf Y ! „„p•uit X —rrête ƒhv•ttfF Il n'est pas nécessaire que la SDL soit démarrée avant ƒhv•ttf. Oui.

CHARGEMENT DE SDL_TTF ƒi vous voulez véri(er s9il y — une erreur et être —insi plus rigoureuxD utilisez plutôt ™e ™ode X if@„„p•snit@A aa EIA { fprintf@stderrD 4irreur d9initi—lis—tion de „„p•snit X 7s’n4D → „„p•qetirror@AAY exit@iˆs„•pesv…‚iAY } ƒ9il y — eu une erreur —u dém—rr—ge de ƒhv•ttfD un (™hier stderrFtxt ser— ™réé @sous ‡indowsD du moinsA ™onten—nt un mess—ge expli™—tif de l9erreurF €our ™eux qui se poser—ient l— question X l— fon™tion „„p•qetirror@A renvoie le dernier mess—ge d9erreur de ƒhv•ttfF g9est pour ™el— qu9on l9utilise d—ns le fprintfF Arrêt de SDL_ttf €our —rrêter ƒhv•ttfD on —ppelle „„p•uit@AF và en™oreD p—s de p—r—mètreD p—s de prise de têteF †ous pouvez —ppeler „„p•uit —v—nt ou —près ƒhv•uitD peu importeF „„p•uit@AY Chargement d'une police fon tout ç— ™9est ˜ien ˜e—u m—is ™e n9est p—s —ssez ™ompliquéD on ne s9—muse p—sF €—ssons —ux ™hoses sérieusesD si vous le voulez ˜ien X m—inten—nt que ƒhv•ttf est ™h—rgéeD nous devons ™h—rger une poli™eF …ne fois que ™el— ser— f—itD nous pourrons en(n voir ™omment é™rire du texte 3 và en™ore il y — deux fon™tions X ! „„p•ypenpont X ouvre un (™hier de poli™e @FttfA Y ! „„p•glosepont X ferme une poli™e ouverteF „„p•ypenpont doit sto™ker son résult—t d—ns une v—ri—˜le de type „„p•pontF †ous devez ™réer un pointeur de „„p•pontD ™omme ™e™i X „„p•pont Bpoli™e a x…vvY ve pointeur poli™e ™ontiendr— don™ les inform—tions sur l— poli™e une fois qu9on l9—ur— ouverteF v— fon™tion „„p•ypenpont prend deux p—r—mètres X ! le nom du (™hier de poli™e @—u form—t FttfA à ouvrirF v9idé—l ™9est de mettre le (™hier de poli™e d—ns le répertoire de votre projetF ixemple de (™hier X —ri—lFttf @pour l— poli™e eri—lA Y RPW .

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF ! l— t—ille de l— poli™e à utiliserF †ous pouvez p—r exemple utiliser une t—ille de PPF ge sont les mêmes t—illes que ™elles que vous utilisez d—ns un logi™iel de tr—itement de texte tel que ‡ordF sl nous reste à trouver ™es f—meuses poli™es FttfF †ous en —vez déjà un ™ert—in nom˜re sur votre ordin—teurD m—is vous pouvez en télé™h—rger sur snternet ™omme on v— le voirF Sur votre ordinateur †ous en —vez déjà sur votre ordin—teur 3 ƒi vous êtes sous ‡indowsD vous en trouverez ˜e—u™oup d—ns le dossier g:’‡indows’pontsF †ous n9—vez qu9à ™opier le (™hier de poli™e qui vous pl—ît d—ns le dossier de votre projetF ƒi le nom ™ontient des ™—r—™tères  ˜iz—rres ™omme des esp—™esD des —™™ents ou même des m—jus™ulesD je vous ™onseille de le renommerF €our être sûr de n9—voir —u™un pro˜lèmeD n9utilisez que des minus™ules et évitez les esp—™esF ! ixemple de nom in™orre™t X „swiƒ xi‡ ‚ywexF„„p Y ! ixemple de nom ™orre™t X timesFttfF Sur Internet eutre possi˜ilité X ré™upérer une poli™e sur snternetF †ous trouverez plusieurs sites propos—nt des poli™es gr—tuites et origin—les à télé™h—rgerF te vous re™omm—nde personnellement d—fontF™omD qui est ˜ien ™l—sséD très ˜ien fourni et £ v—riéF   gode we˜ X UUIITP ¡ ¢ ves (gF PTFID PTFP et PTFQ vous donnent un —perçu de poli™es que vous pourrez y trouver très f—™ilementF Figure PTFI ! €oli™e elph— ‡ood Figure PTFP ! €oli™e ‚—ven Charger la police te vous propose d9utiliser l— poli™e engelin— pour l— suite des exemplesF †ous pouvez l— télé™h—rger en ligneF RQH .

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE Figure PTFQ ! €oli™e engelin— we˜ X QIPSPR ¡ yn ouvrir— l— poli™e ™omme ™e™i X poli™e a „„p•ypenpont@4—ngelin—Fttf4D TSAY £ ¢gode   v— poli™e utilisée ser— —ngelin—FttfF t9—i ˜ien pris soin de mettre le (™hier d—ns le dossier de mon projet et de le renommer pour qu9il soit tout en minus™ulesF v— poli™e ser— de t—ille TSF Ǘ p—r—ît gros m—is visi˜lementD ™9est une poli™e qu9il f—ut é™rire en gros pour qu9on puisse l— voirF ge qui est très import—ntD ™9est que „„p•ypenpont sto™ke le résult—t d—ns l— v—ri—˜le poli™eF †ous —llez réutiliser ™ette v—ri—˜le tout à l9heure en é™riv—nt du texteF ille permettr— d9indiquer l— poli™e 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 début du programme et fermez-la à la n. Fermer la police sl f—ut penser à fermer ™h—que poli™e ouverte —v—nt l9—ppel à „„p•uit@AF h—ns mon ™—sD ç— donner— don™ le ™ode suiv—nt X „„p•glosepont@poli™eAY GB hoit être —v—nt „„p•uit@A BG „„p•uit@AY it voilà le tr—v—il 3 Les diérentes méthodes d'écriture w—inten—nt que ƒhv•ttf est ™h—rgée et qu9on — une v—ri—˜le poli™e ™h—rgée elle —ussiD plus rien ni personne ne nous empê™her— d9é™rire du texte d—ns notre fenêtre ƒhv 3 fien X é™rire du texte ™9est ˜ienD m—is —ve™ quelle fon™tion c h9—près l— do™9D p—s moins de IP fon™tions sont disponi˜les 3 in f—itD il y — trois f—çons di'érentes pour ƒhv•ttf de dessiner du texteF RQI .

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF

! Solid @(gF PTFRA X ™9est l— te™hnique l— plus r—pideF ve texte ser— r—pidement é™rit d—ns une ƒhv•ƒurf—™eF v— surf—™e ser— tr—nsp—rente m—is n9utiliser— qu9un nive—u de tr—nsp—ren™e @on — —ppris ç— il y — quelques ™h—pitresAF g9est pr—tiqueD m—is le texte ne ser— p—s très joliD p—s très  —rrondi D surtout s9il est é™rit grosF …tilisez ™ette te™hnique lorsque vous devez souvent ™h—nger le texteD p—r exemple pour —0™her le temps qui s9é™oule ou le nom˜re de p€ƒ d9un jeuF ! Shaded @(gF PTFSA X ™ette foisD le texte ser— joliF ves lettres seront —nti—li—sées D le texte —pp—r—îtr— plus lisseF sl y — un déf—utD en rev—n™he X le fond doit être d9une ™ouleur unieF sl est impossi˜le de rendre le fond de l— ƒhv•ƒurf—™e tr—nsp—rente en ShadedF ! Blended @(gF PTFTA X ™9est l— te™hnique l— plus puiss—nteD m—is elle est lenteF in f—itD elle met —ut—nt de temps que Shaded à ™réer l— ƒhv•ƒurf—™eF v— seule di'éren™e —ve™ ShadedD ™9est que vous pouvez ˜litter le texte sur une im—ge et l— tr—nsp—ren™e ser— respe™tée @™ontr—irement à Shaded qui impos—it un fond uniAF ettention X le ™—l™ul du ˜lit ser— plus lent que pour ShadedF
6

Figure PTFR ! ƒolid X mode d9é™riture très r—pide m—is peu esthétique @texte non lisséA

Figure PTFS ! ƒh—ded X mode d9é™riture lent m—is plus joli ™—r —nti—lisé " fond o˜liE

g—toirement uni in résumé X

6. Cela signie que leurs contours seront adoucis, ce qui est plus agréable à l'÷il.

RQP

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE

Figure PTFT ! flended X mode d9é™riture lent @et ˜lit lentA m—is ˜ien plus ˜e—u ™—r —nti—lisé et fon™tionne sur un fond non uni

! si vous —vez un texte qui ™h—nge souventD ™omme un ™ompte à re˜oursD utilisez Solid Y ! si votre texte ne ™h—nge p—s très souvent et que vous voulez ˜litter votre texte sur un fond uniD utilisez Shaded Y ! si votre texte ne ™h—nge p—s très souvent m—is que vous voulez ˜litter sur un fond non uni @™omme une im—geAD utilisez BlendedF †oilàD vous devriez déjà être un peu plus f—miliers —ve™ ™es trois types d9é™riture de ƒhv•ttfF te vous —v—is dit qu9il y —v—it IP fon™tions en toutF in e'etD pour ™h—™un de ™es trois types d9é™ritureD il y — qu—tre fon™tionsF gh—que fon™tion é™rit le texte à l9—ide d9un charset di'érentD ™9estEàEdire d9une p—lette de ™—r—™tères di'érenteF ges qu—tre fon™tions sont X ! v—tinI Y ! …„pV Y ! …ni™ode Y ! …ni™ode qlyphF v9idé—l est d9utiliser l9…ni™ode ™—r ™9est un ™h—rset gér—nt l— qu—siEtot—lité des ™—r—™tères exist—nt sur „erreF „outefoisD utiliser l9…ni™ode n9est p—s toujours for™ément simple @un ™—r—™tère prend plus que l— t—ille d9un ™h—r en mémoireAD nous ne verrons don™ p—s ™omment l9utiliser i™iF e prioriD si votre progr—mme est é™rit en fr—nç—is le mode v—tinI su0t —mplementD vous pouvez vous ™ontenter de ™eluiElàF ves trois fon™tions utilis—nt le ™h—rset v—tinI sont X ! „„p•‚ender„ext•ƒolid Y ! „„p•‚ender„ext•ƒh—ded Y ! „„p•‚ender„ext•flendedF RQQ

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF

Exemple d'écriture de texte en Blended
€our spé™i(er une ™ouleur à ƒhv•ttfD on ne v— p—s utiliser le même type qu9—ve™ l— ƒhv @un …intQP ™réé à l9—ide de l— fon™tion ƒhv•w—p‚qfAF eu ™ontr—ireD nous —llons utiliser une stru™ture toute prête de l— ƒhv X ƒhv•golorF gette stru™ture ™omporte trois sousEv—ri—˜les X l— qu—ntité de rougeD de vert et de ˜leuF ƒi vous voulez ™réer une v—ri—˜le ™ouleurxoireD vous devrez don™ é™rire X
ƒhv•golor ™ouleurxoire a {HD HD H}Y

Attention à ne pas confondre avec les couleurs qu'utilise habituellement la SDL ! La SDL utilise des …intQP créés à l'aide de ƒhv•w—p‚qf. ƒhv•ttf utilise des ƒhv•golor.

yn v— é™rire un texte en noir d—ns une ƒhv•ƒurf—™e texte X
texte a „„p•‚ender„ext•flended@poli™eD 4ƒ—lut les érHs 34D ™ouleurxoireAY

†ous voyez d—ns l9ordre les p—r—mètres à envoyer X l— poli™e @de type „„p•pontAD le texte à é™rireD et en(n l— ™ouleur @de type ƒhv•golorAF ve résult—t est sto™ké d—ns une ƒhv•ƒurf—™eF ƒhv•ttf ™—l™ule —utom—tiquement l— t—ille né™ess—ire à donner à l— surf—™e en fon™tion de l— t—ille du texte et du nom˜re de ™—r—™tères que vous —vez voulu é™rireF gomme toute ƒhv•ƒurf—™eD notre pointeur texte ™ontient les sousEv—ri—˜les w et h indiE qu—nt respe™tivement s— l—rgeur et s— h—uteurF g9est don™ un ˜on moyen de ™onn—ître les dimensions du texte une fois que ™eluiE™i — été é™rit d—ns l— ƒhv•ƒurf—™eF †ous n9—urez qu9à é™rire X
texteEbw GB honne l— l—rgeur BG texteEbh GB honne l— h—uteur BG

Code complet d'écriture de texte
†ous s—vez désorm—is tout ™e qu9il f—ut ™onn—ître sur ƒhv•ttfF †oyons pour résumer un ™ode ™omplet d9é™riture de texte en mode flended X
5in™lude 5in™lude 5in™lude 5in™lude 5in™lude `stdli˜Fhb `stdioFhb `ƒhvGƒhvFhb `ƒhvGƒhv•im—geFhb `ƒhvGƒhv•ttfFhb

int m—in@int —rg™D ™h—r B—rgv‘“A {

RQR

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE
ƒhv•ƒurf—™e Be™r—n a x…vvD Btexte a x…vvD Bfond a x…vvY ƒhv•‚e™t positionY ƒhv•ivent eventY „„p•pont Bpoli™e a x…vvY ƒhv•golor ™ouleurxoire a {HD HD H}Y int ™ontinuer a IY ƒhv•snit@ƒhv•sxs„•†shiyAY „„p•snit@AY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du texte —ve™ ƒhv•ttf4D x…vvAY fond a swq•vo—d@4mor—ir—Fjpg4AY GB gh—rgement de l— poli™e BG poli™e a „„p•ypenpont@4—ngelin—Fttf4D TSAY GB əriture du texte d—ns l— ƒhv•ƒurf—™e texte en mode flended @optim—lA BG texte a „„p•‚ender„ext•flended@poli™eD 4ƒ—lut les érHs 34D ™ouleurxoireAY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY positionFx a HY positionFy a HY ƒhv•flitƒurf—™e@fondD x…vvD e™r—nD 8positionAY GB flit du fond BG positionFx a THY positionFy a QUHY ƒhv•flitƒurf—™e@texteD x…vvD e™r—nD 8positionAY GB flit du texte BG ƒhv•plip@e™r—nAY

}

„„p•glosepont@poli™eAY „„p•uit@AY ƒhv•preeƒurf—™e@texteAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY

RQS

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF

we˜ X PVSRWR ¡ ve résult—t vous est présenté sur l— (gF PTFUF

£ ¢gode

 

Figure PTFU ! …n texte é™rit à l9—ide de ƒhv•ttf

ƒi vous voulez ™h—nger de mode d9é™riture pour testerD il n9y — qu9une ligne à modi(er X ™elle ™ré—nt l— surf—™e @—ve™ l9—ppel à l— fon™tion „„p•‚ender„ext•flendedAF
La fonction „„p•‚ender„ext•ƒh—ded prend un quatrième paramètre, contrairement aux deux autres. Ce dernier paramètre est la couleur de fond à utiliser. Vous devrez donc créer une autre variable de type ƒhv•golor pour indiquer une couleur de fond (par exemple le blanc).

Attributs d'écriture du texte
sl est —ussi possi˜le de spé™i(er des —ttri˜uts d9é™ritureD ™omme gr—sD it—lique et soulignéF sl f—ut d9—˜ord que l— poli™e soit ™h—rgéeF †ous devriez don™ —voir une v—ri—˜le poli™e v—lideF †ous pouvez —lors f—ire —ppel à l— fon™tion „„p•ƒetpontƒtyle qui v— modi(er l— poli™e pour qu9elle soit en gr—sD it—lique ou souligné selon vos désirsF v— fon™tion prend deux p—r—mètres X ! l— poli™e à modi(er Y ! une ™om˜in—ison de )—gs pour indiquer le style à donner X gr—sD it—lique ou soulignéF €our les )—gsD vous devez utiliser ™es ™onst—ntes X RQT

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE

! „„p•ƒ„‰vi•xy‚wev X norm—l Y ! „„p•ƒ„‰vi•fyvh X gr—s Y ! „„p•ƒ„‰vi•s„evsg X it—lique Y ! „„p•ƒ„‰vi•…xhi‚vsxi X soulignéF gomme ™9est une liste de )—gsD vous pouvez les ™om˜iner à l9—ide du sym˜ole | ™omme on — —ppris à le f—ireF „estons X
GB gh—rgement de l— poli™e BG poli™e a „„p•ypenpont@4—ngelin—Fttf4D TSAY GB ve texte ser— é™rit en it—lique et souligné BG „„p•ƒetpontƒtyle@poli™eD „„p•ƒ„‰vi•s„evsg | „„p•ƒ„‰vi•…xhi‚vsxiAY GB əriture du texte en it—lique et souligné BG texte a „„p•‚ender„ext•flended@poli™eD 4ƒ—lut les érHs 34D ™ouleurxoireAY

‚ésult—tD le texte est é™rit en it—lique et souligné @(gF PTFVAF

Figure PTFV ! əriture en it—lique et souligné

€our rest—urer une poli™e à son ét—t norm—lD il su0t de ref—ire —ppel à l— fon™tion „„p•ƒetpontƒtyle en utilis—nt ™ette fois le )—g „„p•ƒ„‰vi•xy‚wevF

Exercice : le compteur
get exer™i™e v— ™umuler ™e que vous —vez —ppris d—ns ™e ™h—pitre et d—ns le ™h—pitre sur l— gestion du tempsF †otre missionD si vous l9—™™eptezD ™onsister— à ™réer un ™ompteur qui s9in™rémenter— tous les dixièmes de se™ondeF RQU

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF

ge ™ompteur v— don™ progressivement —0™her X HD IHHD PHHD QHHD RHHD et™F eu ˜out d9une se™onde le nom˜re IHHH devr—it don™ s9—0™herF
Astuce pour écrire dans une chaîne

€our ré—liser ™et exer™i™eD vous —urez ˜esoin de s—voir ™omment é™rire d—ns une ™h—îne de ™—r—™tères en mémoireF in e'etD vous devez donner un ™h—rB à „„p•‚ender„ext m—is vousD ™e que vous —urezD ™9est un nom˜re @un int p—r exempleAF gomment ™onvertir un nom˜re en ™h—îne de ™—r—™tères c yn peut utiliser pour ™el— l— fon™tion sprintfF ille m—r™he de l— même m—nière que fprintfD s—uf qu9—u lieu d9é™rire d—ns un (™hier elle é™rit d—ns une ™h—îne F ve premier p—r—mètre que vous lui donnerez ser— don™ un pointeur sur un t—˜le—u de ™h—rF
7

Veillez à réserver susamment d'espace pour le tableau de ™h—r si vous ne voulez pas déborder en mémoire !

ixemple X
sprintf@tempsD 4„emps X 7d4D ™ompteurAY

s™iD temps est un t—˜le—u de ™h—r @PH ™—r—™tèresAD et ™ompteur est un int qui ™ontient le tempsF eprès ™ette instru™tionD l— ™h—îne temps ™ontiendr— p—r exemple 4„emps X SHH4F À vous de jouer 3
Correction

†oi™i une ™orre™tion possi˜le de l9exer™i™e X
int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Btexte a x…vvY ƒhv•‚e™t positionY ƒhv•ivent eventY „„p•pont Bpoli™e a x…vvY ƒhv•golor ™ouleurxoire a {HD HD H}D ™ouleurfl—n™he a {PSSD PSSD PSS}Y int ™ontinuer a IY int tempse™tuel a HD temps€re™edent a HD ™ompteur a HY ™h—r temps‘PH“ a 44Y GB „—˜le—u de ™h—r suffis—mment gr—nd BG ƒhv•snit@ƒhv•sxs„•†shiyAY „„p•snit@AY
7. Le  s  de sprintf signie  string , c'est-à-dire  chaîne  en anglais.

RQV

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE
e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du texte —ve™ ƒhv•ttf4D x…vvAY GB gh—rgement de l— poli™e BG poli™e a „„p•ypenpont@4—ngelin—Fttf4D TSAY GB sniti—lis—tion du temps et du texte BG tempse™tuel a ƒhv•qet„i™ks@AY sprintf@tempsD 4„emps X 7d4D ™ompteurAY texte a „„p•‚ender„ext•ƒh—ded@poli™eD tempsD ™ouleurxoireD ™ouleurfl—n™heAY while @™ontinuerA { ƒhv•€ollivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD PSSD PSSAAY tempse™tuel a ƒhv•qet„i™ks@AY if @tempse™tuel E temps€re™edent ba IHHA GB ƒi IHH ms —u moins se sont é™oulées BG { ™ompteur Ca IHHY GB yn r—joute IHH ms —u ™ompteur BG sprintf@tempsD 4„emps X 7d4D ™ompteurAY GB yn é™rit d—ns l— ™h—îne 4temps4 le nouve—u temps BG ƒhv•preeƒurf—™e@texteAY GB yn supprime l— surf—™e pré™édente BG texte a „„p•‚ender„ext•ƒh—ded@poli™eD tempsD ™ouleurxoireD ™ouleurfl—n™heAY GB yn é™rit l— ™h—îne temps d—ns l— ƒhv•ƒurf—™e BG temps€re™edent a tempse™tuelY GB yn met à jour le temps€re™edent BG } positionFx a IVHY positionFy a PIHY ƒhv•flitƒurf—™e@texteD x…vvD e™r—nD 8positionAY GB flit du texte BG ƒhv•plip@e™r—nAY } „„p•glosepont@poli™eAY „„p•uit@AY ƒhv•preeƒurf—™e@texteAY ƒhv•uit@AY return iˆs„•ƒ…ggiƒƒY

RQW

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF
}

we˜ X WIQIHU ¡ v— (gF PTFW vous présente le résult—t —u ˜out de IQDW se™ondes très ex—™tementF

£ ¢gode

 

Figure PTFW ! ve ™ompteur —u ˜out de IQDW se™ondes

x9hésitez p—s à télé™h—rger ™e projet si vous souh—itez l9étudier en dét—il et l9—méliorerF sl n9est p—s en™ore p—rf—it X on pourr—it p—r exemple utiliser ƒhv•hel—y pour éviter d9utiliser IHH 7 du g€…F £   ¢gode we˜ X UTSTPW ¡
Pour aller plus loin

ƒi vous voulez —méliorer ™e petit ˜out de progr—mmeD vous pouvez ess—yer d9en f—ire un jeu où il f—ut ™liquer le plus de fois possi˜le d—ns l— fenêtre —ve™ l— souris d—ns un temps imp—rtiF …n ™ompteur s9in™rémenter— à ™h—que ™li™ de l— sourisF …n ™ompte à re˜ours doit s9—0™herF vorsqu9il —tteint HD on r陗pitule le nom˜re de ™li™s e'e™tués et on dem—nde si on veut f—ire une nouvelle p—rtieF †ous pouvez —ussi gérer les meilleurs s™ores en les enregistr—nt d—ns un (™hierF gel— vous fer— tr—v—iller à nouve—u l— gestion des (™hiers en gF fon ™our—ge 3 RRH

LES DIFFÉRENTES MÉTHODES D'ÉCRITURE

En résumé
! yn ne peut p—s é™rire de texte en ƒhvD à moins d9utiliser une extension ™omme l— ˜i˜liothèque ƒhv•ttfF ! gette ˜i˜liothèque permet de ™h—rger un (™hier de poli™e —u form—t Fttf à l9—ide de l— fon™tion „„p•ypenpontF ! sl y — trois modes d9é™riture du texteD du plus simple —u plus sophistiqué X SolidD Shaded et BlendedF ! yn é™rit d—ns une ƒhv•ƒurf—™e vi— des fon™tions ™omme „„p•‚ender„ext•flendedF

RRI

CHAPITRE 26. ÉCRIRE DU TEXTE AVEC SDL_TTF

RRP

Chapitre

27
Diculté :

Jouer du son avec FMOD

D

epuis que nous avons découvert la SDL, nous avons appris à placer des images dans la fenêtre, à faire interagir l'utilisateur avec le clavier et la souris, à écrire du texte, mais il manque clairement un élément : le son ! Ce chapitre va combler ce manque. Parce que les possibilités oertes par la SDL en matière d'audio sont très limitées, nous allons découvrir ici une bibliothèque spécialisée dans le son : FMOD.

RRQ

CHAPITRE 27. JOUER DU SON AVEC FMOD

pwyh est s—ns —u™un doute une des meilleures ˜i˜liothèques —udio qui existent à ™e jourF sl —ur—it été possi˜le de tr—v—iller —ve™ le module —udio de l— ƒhvD m—is ét—nt donné ses limit—tions il ser— ˜ien plus intéress—nt pour nous d9inst—ller une ˜i˜liothèque spé™i—lisée d—ns le dom—ineD ™omme pwyhF
1

Installer FMOD
Télécharger FMOD
€our télé™h—rger l— ˜i˜liothèqueD il f—ut vous rendre sur son site o0™ielF   £ ¢gode we˜ X RUVQWI ¡
FMOD est une bibliothèque gratuite mais pas sous license LGPL, contrairement à la SDL. Cela signie que vous pouvez l'utiliser gratuitement du moment que vous ne l'utilisez pas pour réaliser un programme payant . Si vous voulez faire payer votre programme, il faudra payer une redevance à l'auteur (je vous laisse consulter les prix sur le site de FMOD).
2

‚endezEvous sur l— p—ge des télé™h—rgements @hownlo—dsA et prenez pwyh QF ettention X il y — plusieurs versions de pwyhD et en p—rti™ulier une plus ré™enteD —ppelée pwyh ix @il s9—git en f—it de pwyh RAF „outefoisD pwyh ix est une ˜i˜liothèque gCCD ™ontr—irement à pwyh Q qui est une ˜i˜liothèque gF

Installer FMOD
ve (™hier que vous —vez télé™h—rgé est un (™hier s€ F v9inst—ll—tion se déroule de l— même m—nière qu9—ve™ les —utres ˜i˜liothèques qu9on — vues jusqu9i™iF IF †ous —vez un dossier epi —ve™ l— hvv de pwyh @fmodFdllA à pl—™er d—ns le répertoire de votre projetF PF h—ns le dossier —piGin™D vous trouverez les FhF €l—™ezEles à ™ôté des —utres Fh d—ns le dossier de votre shiF €—r exemple gode flo™ksGmingwQPGin™ludeGpwyh @j9—i ™réé un dossier spé™i—l pour pwyh ™omme pour ƒhvAF QF h—ns le dossier —piGli˜D ré™upérez le (™hier qui ™orrespond à votre ™ompil—teurF ! ƒi vous utilisez gode: :flo™ksD don™ le ™ompil—teur mingwD ™opiez li˜fmodF— d—ns le dossier li˜ de votre shiF h—ns le ™—s de gode: :flo™ksD ™9est le dossier godeflo™ksGmingwQPGli˜F
3

1. On ne peut jouer que des sons WAV, par exemple. 2. On notera que de nombreux jeux célèbres font partie des utilisateurs de FMOD, comme World of Warcraft, Need for Speed, Wolfenstein . . . FMOD fonctionne par ailleurs sur un très grand nombre de plates-formes, particulièrement sur des consoles de jeux comme la XBOX 360, la PS2, la PS3, la PSP, la Wii, etc. 3. Si c'est un exécutable, c'est que vous avez pris FMOD Ex et non FMOD 3 !

RRR

INSTALLER FMOD

! ƒi vous utilisez †isu—l gCCD ré™upérez le (™hier fmodv™Fli˜F RF in(nD et ™9est peutEêtre le plus import—ntD d—ns le dossier do™ument—tion vous trouverez un (™hier d9—ide qui ™orrespond à l— do™ument—tion de pwyhF te vous ™onseille de le pl—™er quelque p—rt sur votre disque dur et d9en f—ire un r—™™our™i ˜ien visi˜leF in e'etD l— do™ument—tion liste toutes les possi˜ilités de pwyh d—ns le dét—ilF h—ns ™e ™h—pitreD on ne pourr— en voir que les prin™ip—lesF ƒi vous voulez —llez plus loinD il f—udr— don™ vous plonger d—ns ™ette do™9F sl reste à ™on(gurer notre projetF và en™oreD ™9est ™omme d9h—˜itude X vous ouvrez votre projet —ve™ votre shi f—vori et vous —joutez le (™hier F— @ou Fli˜A à l— liste des (™hiers que le linker doit ré™upérerF ƒous gode: :flo™ksD menu €roje™t G fuild yptionsD onglet vinkerD ™liquez sur edd et indiquez où se trouve le (™hier F—F ƒi on vous dem—nde Keep as a relative path ?D je vous ™onseille de répondre p—r l— nég—tiveD m—is d—ns les deux ™—s ç— devr—it de toute m—nière m—r™herF pwyh est inst—lléeD voyons r—pidement de quoi elle est ™onstituéeF

Les diérentes sections de FMOD
pwyh Q est en f—it l— ™om˜in—ison de deux ˜i˜liothèques X ! FSOUND X ™ette p—rtie gère tous les sons de type €gwF sl s9—git tout simplement de sons  réels enregistrés Y ™el— ™omprend —ussi ˜ien les form—ts ™ompressés que non ™ompressés X ‡e†D w€QD yqqD et™F ges sons peuvent être des musiques ou des sons de ™ourte durée ™omme des ˜ruits de p—sD de ˜—lleF F F h9—illeursD pwyh distingue deux types de sons X ! les sons courts @˜ruit de p—sD ˜ruit de ˜—lleA destinés à être répétés souventD ! les sons longsD ™omme une musique dur—nt p—r exemple Q minutes @qui peut être l— musique de fond de votre jeuA Y ! FMUSIC X ™ette se™tion gère les musiques —u form—t ˜in—ireF gette foisD il n9y — p—s de son enregistréD juste des notes de musiqueF ve form—t ˜in—ire le plus ™onnu est pro˜—˜lement le wshsF †ous s—vez pro˜—˜lement que les wshs sont des (™hiers —udio de petite t—ille X ™9est justement p—r™e qu9ils enregistrent seulement les notes de musique @il ne peut don™ p—s y —voir de  p—roles —ve™ un tel form—t de (™hierAF gette se™tion peut être très utile pour jouer de vieilles musiques type q—me˜oy ou ƒuperxiƒD ™omme p—r exemple l— musique de ƒuper w—rioD de „etrisD et™F h—ns ™e ™h—pitreD nous verrons les trois types de sons ™—r ils se ™h—rgent et se lisent —ve™ des fon™tions di'érentes X ! pƒy…xh X sons ™ourts Y ! pƒy…xh X sons longs @musiquesA Y ! pw…ƒsg X musique type wshsF RRS

CHAPITRE 27. JOUER DU SON AVEC FMOD

Initialiser et libérer FMOD
gomme l— plup—rt des ˜i˜liothèques é™rites en gD il f—ut ™h—rger @on dit —ussi  initi—E liser A pwyh et l— li˜érer qu—nd on n9en — plus ˜esoinF À ™e nive—uD ç— ne devr—it p—s ˜e—u™oup vous ™h—nger de l— ƒhvF

Inclure le header
ev—nt toute ™hose " vous —vez dû le f—ire instin™tivement m—is ç— ne ™oûte rien de le pré™iser " X il f—ut in™lure le (™hier Fh de pwyhF
5in™lude `pwyhGfmodFhb

t9—i pl—™é ™e (™hier d—ns un sousEdossier pwyhF ed—ptez ™ette ligne en fon™tion de l— position du (™hier si ™hez vous ™9est di'érentF

Initialiser FMOD
yn initi—lise pwyh —ve™ l— fon™tion pƒy…xh•snitF ille prend Q p—r—mètresF ! La fréquence d'échantillonnage X ™e p—r—mètre permet d9indiquer l— qu—lité de son que doit gérer pwyhF €lus l— fréquen™e est élevéeD meilleur est le son @m—is plus gr—nde est l— puiss—n™e dem—ndéeAF †oi™i quelques exemples de fréquen™es pour vous —ider à f—ire votre ™hoixF ! u—lité gh X RR IHH rz ! u—lité r—dio X PP HSH rz ! u—lité téléphonique X II HPS rz „out —u long de ™e ™h—pitreD nous utiliserons une fréquen™e de RR IHH rz F ! Le nombre maximal de canaux que devr— gérer pwyhF in d9—utres termesD ™9est le nom˜re m—xim—l de sons qui pourront être joués en même tempsF „out dépend de l— puiss—n™e de votre ™—rte sonF yn ™onseille génér—lement une v—leur de QP @™e ser— su0s—nt pour l— plup—rt des petits jeuxAF €our inform—tionD pwyh peut théoriquement gérer jusqu9à IHPR ™—n—ux di'érentsD m—is à ™e nive—u ç— risque de f—ire ˜e—u™oup tr—v—iller votre ordin—teur 3 ! in(nD on peut indiquer des agsF sl n9y — rien de ˜ien intéress—nt à mettre en génér—lD on se ™ontenter— don™ d9envoyer H @p—s de )—gsAF xous pouvons don™ initi—liser pwyh ™omme ™e™i X
4

pƒy…xh•snit@RRIHHD QPD HAY

ge qui signi(e X fréquen™e de RR IHH rz @qu—lité gh —u mieuxAD QP ™—n—ux et p—s d9options p—rti™ulières @)—g a HAF
4. Si le son que vous utilisez est de mauvaise qualité à la base, FMOD ne l'améliorera pas. Par contre, si vous avez un son de fréquence 44 100 Hz et que FMOD utilise une fréquence de 22 050 Hz, sa qualité sera diminuée.

RRT

LES SONS COURTS

Libérer FMOD
yn —rrête pwyh de l— m—nière l— plus simple qui soit X
pƒy…xh•glose@AY

istE™e que j9—i vr—iment ˜esoin de ™ommenter ™e ™ode c YEA

Les sons courts
xous ™ommen™erons p—r étudier les sons ™ourtsF …n  son ™ourt D ™omme je l9—ppelleD est un son qui dure génér—lement quelques se™ondes @p—rfois moins d9une se™ondeA et destiné à être joué régulièrementF uelques exemples de sons ™ourts X ! un ˜ruit de ˜—lle Y ! un ˜ruit de p—s Y ! un ti™Et—™ @pour f—ire stresser le joueur —v—nt l— (n d9un ™ompte à re˜ours 3A Y ! des —ppl—udissements Y ! et™F frefD ç— ™orrespond d—ns les gr—ndes lignes à tous les sons qui ne sont p—s des muE siquesF qénér—lementD ™es sons sont tellements ™ourts qu9on ne prend p—s l— peine de les ™ompresserF yn les trouve don™ le plus souvent —u form—t ‡e† non ™ompresséF

Trouver des sons courts
ev—nt de ™ommen™erD il f—udr—it f—ire le plein de sonsF he nom˜reux sites proposent justement des ˜—nques de sonsF ƒi vous f—ites une re™her™he à l9—ide de l9expression  pree ƒounds —ve™ qoogle @ sons gr—tuits en —ngl—isAD vous o˜tenez des ™ent—ines de millions de résult—ts 3 ‚ien qu9—ve™ les sites de l— première p—geD vous devriez trouver votre ˜onheurF €ersonnellementD j9—i retenu pindƒoundsF™omD un moteur de re™her™he pour sonsF £   ¢gode we˜ X VUTVUH ¡ in re™her™h—nt  gun D on trouve des tonnes de sons de tir de fusil Y en t—p—nt  footsE teps on trouve des ˜ruits de p—sD et™F

Les étapes à suivre pour jouer un son
v— première ét—pe ™onsiste à ™h—rger en mémoire le son que vous voulez jouerF sl est ™onseillé de ™h—rger tous les sons qui seront fréquemment utilisés d—ns le jeu dès le dé˜ut du progr—mmeF †ous les li˜érerez à l— (nF in e'etD une fois que le son est ™h—rgé en mémoireD s— le™ture est très r—pideF RRU

CHAPITRE 27. JOUER DU SON AVEC FMOD

Le pointeur

€remière ét—pe X ™réer un pointeur de type pƒy…xh•ƒew€vi qui représenter— notre sonF
pƒy…xh•ƒew€vi Btir a x…vvY

Charger le son

heuxième ét—pe X ™h—rger le son —ve™ l— fon™tion pƒy…xh•ƒ—mple•vo—dF ille prendF F F S p—r—mètresF ! ve numéro de la sample pool d—ns l—quelle pwyh doit g—rder une tr—™e du sonF te m9explique X l— sample pool est une sorte de t—˜le—u d—ns lequel pwyh g—rde une ™opie des pointeurs vers ™h—™un des sons ™ourts ™h—rgésF gel— lui permet de li˜érer —utom—tiquement l— mémoire lorsqu9on —ppelle pƒy…xh•glose@A @l— fon™tion d9—rrêt de pwyhA X il su0t à pwyh de lire ™e t—˜le—u et de li˜érer ™h—™un des éléments qui s9y trouventF „outefoisD plutôt que de f—ire ™on(—n™e à pwyhD il v—ut mieux penser à —ppeler nousEmêmes l— fon™tion de li˜ér—tion de mémoire @pƒy…xh•ƒ—mple•pree@AA que nous —llons dé™ouvrir d—ns quelques inst—ntsF €our indiquer un numéro de l— s—mple poolD le mieux est d9envoyer pƒy…xh•p‚ii à l— fon™tionF ille se ™h—rger— —lors d9o™™uper le premier empl—™ement li˜re de l— s—mple pool qu9elle trouver—F ! ve nom du chier son à ™h—rgerF sl peut être de form—t ‡e†D w€QD yqqD et™F „outefoisD il v—ut mieux ™h—rger des sons ™ourts @quelques se™ondes m—ximumA plutôt que des sons longsF in e'etD l— fon™tion ™h—rger— et dé™oder— tout le son en mémoireD ™e qui peut prendre de l— pl—™e si le son est une musique 3 ! ve troisième p—r—mètre ne nous intéresse p—s X il permet de pré™iser les caractéristiques du chier qu9on veut ™h—rger @fréquen™e d9é™h—ntillonn—geD et™FAF yrD d—ns le ™—s des ‡e†D w€QD yqq et gie D ™es inform—tions sont ins™rites d—ns le (™hierF yn v— don™ envoyer l— v—leur H pour ne rien pré™iserF ! L'oset où doit ™ommen™er l— le™tureF gel— permet de ™ommen™er l— le™ture du son à un moment pré™isF wettez H pour ™ommen™er du dé˜utF ! La longueur X si vous pré™isez un osetD il f—udr— —ussi donner l— longueur de son à lireF yn mettr— là en™ore H ™—r on veut tout lireF v— fon™tion renvoie l9—dresse mémoire à l—quelle — été ™h—rgé le sonF †oi™i un exemple de ™h—rgement X
tir a pƒy…xh•ƒ—mple•vo—d@pƒy…xh•p‚iiD 4p—nFw—v4D HD HD HAY

s™iD je ™h—rge le son p—nFw—v et je le pl—™e d—ns le premier ™—n—l li˜reF ve pointeur tir fer— référen™e à ™e son p—r l— suiteF †ous rem—rquerez qu9en règle génér—le on l—isse les Q derniers p—r—mètres à HF te vous invite à télé™h—rger ™e p—nFw—v pour f—ire des tests en même temps que vous lisez ™e ™h—pitreF £   ¢gode we˜ X PSPTHQ ¡ v— fon™tion renvoie x…vv si le (™hier n9— p—s été ™h—rgéF †ous —vez tout intérêt à véri(er si le ™h—rgement — réussi ou s9il — é™houéF RRV

. J'aurais dû faire les Beaux Arts. . RRW .LES SONS COURTS Jouer le son †ous voulez jouer le son c €—s de pro˜lème —ve™ l— fon™tion pƒy…xh•€l—yƒound 3 sl su0t de lui donner un numéro de ™—n—l sur lequel le jouer —insi que le pointeur sur le sonF €our le numéro de ™—n—lD ne vous prenez p—s l— tête et envoyez pƒy…xh•p‚ii pour l—isser pwyh gérer ç—F pƒy…xh•€l—yƒound@pƒy…xh•p‚iiD tirAY Libérer le son de la mémoire vorsque vous n9—vez plus ˜esoin du sonD vous devez le li˜érer de l— mémoireF sl n9y — rien de plus simpleD il su0t d9indiquer le pointeur à li˜érer —ve™ pƒy…xh•ƒ—mple•pree X pƒy…xh•ƒ—mple•pree@tirAY Exemple : un jeu de tir ve mieux m—inten—nt est de résumer tout ™e qu9on — vu d—ns un ™—s ™on™ret de proE gr—mme é™rit en ƒhvF sl n9y —v—it rien de ™ompliqué etD norm—lementD vous ne devriez —voir —u™une di0™ulté à ré—liser ™et exer™i™eF Le sujet ve ˜ut est simple X ™réer un jeu de tirF yn ne v— p—s ré—liser un jeu ™omplet i™iD m—is juste l— gestion du viseurF te vous propose de télé™h—rger le viseur de l— (gF PUFI que j9—i —moureusement ré—lisé moiEmême sous €—int F 5 Figure PUFI ! ve viseur †oilà les o˜je™tifsF ! pond de fenêtre X noirF ! €ointeur de l— souris X invisi˜leF ! v9im—ge du viseur est ˜littée à l— position de l— souris lorsqu9on l— dépl—™eF ettention X il f—ut que le gix„‚i de l9im—ge soit pl—™é —u nive—u du pointeur de l— sourisF ! u—nd on ™liqueD le son p—nFw—v doit être jouéF Ǘ peut être le dé˜ut d9un jeu de tirF „rop f—™ile c ykD —lors à vous de jouer 3 5. Oui. je sais.

JOUER DU SON AVEC FMOD La correction †oi™i le ™ode ™omplet X 5in™lude 5in™lude 5in™lude 5in™lude 5in™lude `stdli˜Fhb `stdioFhb `ƒhvGƒhvFhb `ƒhvGƒhv•im—geFhb `pwyhGfmodFhb int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bviseur a x…vvY ƒhv•ivent eventY ƒhv•‚e™t positionY int ™ontinuer a IY pƒy…xh•ƒew€vi Btir a x…vvY GB sniti—lis—tion de pwyh BG pƒy…xh•snit@RRIHHD QPD HAY GB gh—rgement du son et vérifi™—tion du ™h—rgement BG tir a pƒy…xh•ƒ—mple•vo—d@pƒy…xh•p‚iiD 4p—nFw—v4D HD HD HAY if @tir aa x…vvA { fprintf@stderrD 4smpossi˜le de lire p—nFw—v’n4AY exit@iˆs„•pesv…‚iAY } GB sniti—lis—tion de l— ƒhv BG ƒhv•snit@ƒhv•sxs„•†shiyAY ƒhv•ƒhowgursor@ƒhv•hsƒefviAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du son —ve™ pwyh4D x…vvAY viseur a swq•vo—d@4viseurFpng4AY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•wy…ƒif…„„yxhy‡xX GB vorqu9on ™liqueD on joue le son BG pƒy…xh•€l—yƒound@pƒy…xh•p‚iiD tirAY RSH .CHAPITRE 27.

LES SONS COURTS ˜re—kY ™—se ƒhv•wy…ƒiwy„syxX GB vorsqu9on dépl—™e l— sourisD on pl—™e le ™entre du viseur à l— position de l— souris BG positionFx a eventFmotionFx E @viseurEbw G PAY positionFy a eventFmotionFy E @viseurEbh G PAY ˜re—kY → } } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY ƒhv•flitƒurf—™e@viseurD x…vvD e™r—nD 8positionAY ƒhv•plip@e™r—nAY GB yn ferme l— ƒhv BG ƒhv•preeƒurf—™e@viseurAY ƒhv•uit@AY GB yn li˜ère le son et on ferme pwyh BG pƒy…xh•ƒ—mple•pree@tirAY pƒy…xh•glose@AY } return iˆs„•ƒ…ggiƒƒY we˜ X VQWUSW ¡ v— (gF PUFP vous donne un —perçu du miniEjeuD m—is le mieux est en™ore de voir le résult—t en vidéo —ve™ le son sur le we˜ 3 £   gode we˜ X QIUVUP ¡ ¢ s™iD j9—i ™h—rgé pwyh —v—nt l— ƒhv et je l9—i li˜érée —près l— ƒhvF sl n9y — p—s de règles —u nive—u de l9ordre @j9—ur—is tout —ussi ˜ien pu f—ire l9inverseAF t9—i ™hoisi de ™h—rger l— ƒhv et d9ouvrir l— fenêtre —près le ™h—rgement de pwyh pour que le jeu soit prêt à être utilisé dès que l— fenêtre s9ouvreD sinon il —ur—it peutEêtre f—llu —ttendre quelques millise™ondes le temps que pwyh se ™h—rgeF ve ™ode estD je penseD su0s—mment ™ommentéF sl n9y — p—s de piège p—rti™ulierD p—s de nouve—uté fr—™—ss—nteF yn noter— l—  petite di0™ulté qui ™onsist—it à ˜litter le ™entre du viseur —u nive—u du pointeur de l— sourisF ve ™—l™ul de l— position de l9im—ge est f—it en fon™tion de ™el—F Idées d'amélioration £ ¢gode   ge ™ode est l— ˜—se d9un jeu de shootF †ous —vez le viseurD le ˜ruit de tirD il ne vous reste plus qu9à f—ire —pp—r—ître ou dé(ler des ennemis et à m—rquer le s™ore du joueurF gomme d9h—˜itudeD ™9est à vous de jouerF †ous vouliez f—ire un jeu c u9à ™el— ne RSI .

CHAPITRE 27. WMA. Bien sûr. les forums du Site du Zéro (code web : 473573) sont toujours là pour vous aider si vous êtes bloqués à un moment de la création de votre jeu. . Il est normal de rencontrer des dicultés. .) in théorieD l— fon™tion pƒy…xh•ƒ—mple•vo—d permet de ™h—rger n9importe quel type de sonD y ™ompris les form—ts ™ompressés w€QD yqqD ‡weF ve pro˜lème ™on™erne les sons  longs D ™9estEàEdire les musiquesF in e'etD une musique dure en moyenne Q à R minutesF yrD l— fon™tion pƒy…xh•ƒ—mple•vo—d ™h—rge tout le (™hier en mémoire @et ™9est l— version dé™ompressée qui est mise en mémoireD ç— prend don™ ˜e—u™oup de pl—™e 3AF ƒi vous —vez un son long @on v— p—rler de  musique dorén—v—ntAD il est préfér—˜le de le ™h—rger en streaming D ™9estEàEdire d9en ™h—rger des petits ˜outs —u fur et à mesure de l— le™tureF g9est ™e que font tous les le™teurs —udioF 6. OGG. JOUER DU SON AVEC FMOD Figure PUFP ! eperçu du miniEjeu du viseur tienneD vous —vez le nive—u m—inten—nt et même un ™ode de ˜—se pour dém—rrer un jeu de tir 3 u9estE™e que vous —ttendez c YEA 6 Les musiques (MP3. quel que soit le niveau qu'on ait ! RSP .

. OGG. WMA. il faudra en parler à l'artiste à moins que celui-ci n'autorise explicitement une utilisation commerciale de son ÷uvre. Vous n'êtes pas sans savoir qu'il faut verser une redevance pour pouvoir utiliser la plupart des chansons que vous connaissez ! 8. mais ça ne veut pas dire qu'on vous autorise à vous faire de l'argent sur le dos des artistes ! €our télé™h—rger des musiques li˜resD je vous re™omm—nde t—mendoD un des sites que je préfèreD ˜ien que ™e soit p—s le seul qui existe d—ns le dom—ineF   £ ¢gode we˜ X RHUUQP ¡ ves ™h—nsons sont ™l—ssées p—r styleF †ous —vez ˜e—u™oup de ™hoixF yn y trouve de toutF te v—is utiliser une ™h—nson du groupe rype de l9—l˜um  vies —nd ƒpee™hes D intitulée  rome F †ous pouvez l— télé™h—rger —u form—t w€QF £   ¢gode we˜ X WPTPHV ¡ 8 Les étapes à suivre pour jouer une musique gomme d9h—˜itudeD il f—ut que pwyh soit ™h—rgé —ve™ pƒy…xh•snit et dé™h—rgé —ve™ pƒy…xh•gloseF Le pointeur gette foisD le pointeur doit être de type pƒy…xh•ƒ„‚iewF pƒy…xh•ƒ„‚iew Bmusique a x…vvY Charger le son gomme je vous l9—i ditD le son ser— ™h—rgé progressivement @on dit en streaming AF „ouE tefoisD il f—ut qu—nd même ouvrir le (™hierD ™—r pour l9inst—nt notre pointeur musique v—ut toujours x…vvD je vous r—ppelleF yn utilise i™i l— fon™tion pƒy…xh•ƒtre—m•ypenF ille prend R p—r—mètresD ™e sont les R mêmes derniers p—r—mètres que ™eux de l— fon™tion pƒy…xh•ƒ—mple•vo—d qu9on — vue 7. Vous pouvez retrouver Hype sur leur page MySpace si vous voulez en savoir plus (code web : 839250). RSQ . Une chanson libre de droits peut être téléchargée. .) Trouver des musiques te vous propose d9utiliser des ™h—nsons li˜res de droits d—ns vos progr—mmes F ves —uE teurs vous —utorisent à di'user li˜rement leurs ™h—nsonsD il n9y — don™ —u™un pro˜lème pour que vous les utilisiez d—ns vos progr—mmesF 7 Si votre programme est payant. copiée et écoutée librement.LES MUSIQUES (MP3.

CHAPITRE 27. JOUER DU SON AVEC FMOD tout à l9heureF in ™l—irD indiquez le nom du (™hier à ouvrir d—ns le premier p—r—mètreD et l—issez les Q —utres p—r—mètres à HF v— fon™tion retourne une —dresse mémoire qu9on ré™upère —ve™ notre pointeur musiqueF musique a pƒy…xh•ƒtre—m•ypen@4rype•romeFmpQ4D HD HD HAY sl est là en™ore fortement ™onseillé de véri(er si le (™hier — ˜ien été ™h—rgéF in ™—s d9é™he™D le pointeur v—ut x…vvF Jouer la musique g9est très simple X on f—it —ppel à pƒy…xh•ƒtre—m•€l—yF ille prend P p—r—mètres X ! ve numéro du ™—n—l sur lequel jouer le son @envoyez pƒy…xh•p‚ii et pwyh se dé˜rouiller— tout seul pour trouver un ™—n—l li˜reA ! ve pointeur vers le (™hier à lire @d—ns notre ™—sD il s9—ppelle musiqueAF yn peut don™ jouer notre musique —ve™ X pƒy…xh•ƒtre—m•€l—y@pƒy…xh•p‚iiD musiqueAY it voilà le tr—v—il 3 w—is ™e n9est p—s toutF h—ns le ™—s d9une musiqueD il peut être ˜ien de s—voir modi(er le volumeD gérer les répétitions de l— ™h—nsonD l— mettre en p—use ou même l9—rrêterF g9est ™e genre de ™hoses que nous —llons —pprendre à f—ire m—inten—ntF Modier le volume eve™ l— fon™tion pƒy…xh•ƒet†olumeD vous pouvez ™h—nger le volume d9un ™—n—lF pƒy…xh•ƒet†olume@pƒy…xh•evvD IPHAY sl f—ut envoyer P p—r—mètres X ! ve numéro du ™—n—l dont on doit ™h—nger le volume @pour ™h—nger le volume de tous les ™—n—uxD envoyez pƒy…xh•evvA ! ve nouve—u volume X indiquez un nom˜re de H @silen™ieuxA à PSS @volume m—xim—lA Notez que cette fonction permet aussi de changer le volume des sons courts. et pas seulement celui des sons streamés (longs). Répétition de la chanson yn — souvent ˜esoin de répéter l— musique de fondF g9est justement ™e que propose l— fon™tion pƒy…xh•ƒtre—m•ƒetvoopgountF ille prend P p—r—mètres X RSR .

) ! ve pointeur vers l— ™h—nson ! ve nom˜re de fois qu9elle doit être répétéeF ƒi vous mettez ID l— ™h—nson ser— don™ répétée une seule foisF ƒi vous mettez un nom˜re nég—tif @™omme EIAD elle ser— jouée indé(nimentF eve™ ™e ™ode sour™eD notre musique ser— don™ répétée à l9in(ni X pƒy…xh•ƒtre—m•ƒetvoopgount@musiqueD EIAY €our que l— répétition fon™tionneD il f—ut envoyer pƒy…xh•vyy€•xy‚wev en se™ond p—E r—mètre de l— fon™tion pƒy…xh•ƒtre—m•ypenF Mettre en pause la chanson sl y — i™i P fon™tions à ™onn—ître X ! pƒy…xh•qet€—used@numero•du•™—n—lA X indique si l— ™h—nson jouée sur le ™—n—l indiqué est en p—use ou nonF ille renvoie  vr—i si l— ™h—nson est en p—useD  f—ux si elle est en tr—in d9être jouéeF ! pƒy…xh•ƒet€—used@numero•du•™—n—lD et—tA X met en p—use ou r闙tive l— le™ture de l— ™h—nson sur le ™—n—l indiquéF invoyez I @ vr—i A pour mettre en p—useD H @ f—ux A pour r闙tiver l— le™tureF ge mor™e—u de ™ode de fenêtre ƒhv met en p—use l— ™h—nson si on —ppuie sur €D et l— r闙tive si on —ppuie à nouve—u sur € ensuiteF ™—se ƒhv•ui‰hy‡xX if @eventFkeyFkeysymFsym aa ƒhvu•pA GG ƒi on —ppuie sur € { if @pƒy…xh•qet€—used@IAA GG ƒi l— ™h—nson est en p—use pƒy…xh•ƒet€—used@pƒy…xh•evvD HAY GG yn enlève l— p—use else GG ƒinonD elle est en ™ours de le™ture pƒy…xh•ƒet€—used@pƒy…xh•evvD IAY GG yn met en p—use } ˜re—kY Stopper la lecture sl su0t d9—ppeler pƒy…xh•ƒtre—m•ƒtopF yn lui envoie le pointeur vers l— ™h—nson à —rrêterF pƒy…xh•ƒtre—m•ƒtop@musiqueAY Et bien d'autres choses yn peut f—ire ˜e—u™oup d9—utres ™hosesD m—is je ne v—is p—s toutes vous les énumérer i™iD —ut—nt répéter l— do™9 3 te vous invite don™ à l— lire si vous ™her™hez des fon™tions supplément—iresF RSS . OGG. . . WMA.LES MUSIQUES (MP3.

CHAPITRE 27. JOUER DU SON AVEC FMOD Libérer la mémoire €our dé™h—rger l— musique de l— mémoireD —ppelez pƒy…xh•ƒtre—m•glose et donnezElui le pointeurF pƒy…xh•ƒtre—m•glose@musiqueAY Code complet de lecture du MP3 ve ™ode ™iEdessous vous montre un progr—mme jou—nt l— musique  rome F v— musique est jouée dès le dé˜ut du progr—mmeF yn peut l— mettre en p—use en —ppuy—nt sur €F int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bpo™hette a x…vvY ƒhv•ivent eventY ƒhv•‚e™t positionY int ™ontinuer a IY pƒy…xh•ƒ„‚iew Bmusique a x…vvY pƒy…xh•snit@RRIHHD QPD HAY GB yn ouvre l— musique BG musique a pƒy…xh•ƒtre—m•ypen@4rype•romeFmpQ4D pƒy…xh•vyy€•xy‚wevD HD HAY if @musique aa x…vvA GB yn vérifie si elle — ˜ien été ouverte @sw€y‚„ex„A BG { fprintf@stderrD 4smpossi˜le de lire rype•romeFmpQ’n4AY exit@iˆs„•pesv…‚iAY } → pƒy…xh•ƒtre—m•ƒetvoopgount@musiqueD EIAY GB yn —™tive l— répétition de l— musique à l9infini BG pƒy…xh•ƒtre—m•€l—y@pƒy…xh•p‚iiD musiqueAY GB yn joue l— musique BG ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du son —ve™ pwyh4D x…vvAY po™hette a swq•vo—d@4hype•lies—ndspee™hesFjpg4AY positionFx a HY positionFy a HY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY RST .

LES MUSIQUES (MIDI) ™—se ƒhv•ui‰hy‡xX if @eventFkeyFkeysymFsym aa ƒhvu•pA GGƒi on —ppuie sur € { if @pƒy…xh•qet€—used@IAA GG ƒi l— ™h—nson est en p—use pƒy…xh•ƒet€—used@ID HAY GG yn enlève l— p—use else GG ƒinonD elle est en ™ours de le™ture pƒy…xh•ƒet€—used@ID IAY GG yn —™tive l— p—use } ˜re—kY } } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY ƒhv•flitƒurf—™e@po™hetteD x…vvD e™r—nD 8positionAY ƒhv•plip@e™r—nAY pƒy…xh•ƒtre—m•glose@musiqueAY GB yn li˜ère l— mémoire BG pƒy…xh•glose@AY ƒhv•preeƒurf—™e@po™hetteAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X UTQVTH ¡ ristoire d9—voir —utre ™hose qu9une fenêtre noireD j9—i mis l— po™hette de l9—l˜um en im—ge de fondF €our —ppré™ier pleinement le résult—tD je vous invite à reg—rder l— vidéo du progr—mme en £™ours d9exé™utionF   ¢gode we˜ X SIUSPT ¡ £ ¢gode   Les musiques (MIDI) ves musiques de type wshs sont très di'érentes des musiques de type w€QD yqq ou ‡we qu9on vient d9étudierF in e'etD —u lieu d9enregistrer l— musique —ve™ un mi™roD ™ette fois l— musique est ™réée de toutes piè™es sur l9ordin—teurF yn n9enregistre que des notes de musiqueD ™e qui explique pourquoi on ne peut p—s enregistrer l— voixF v9—v—nt—ge c in enregistr—nt uniquement les notesD on o˜tient des (™hiers très très petitsF †ous —vez peutEêtre déjà rem—rqué que les wshs ét—ient de tous petits (™hiersF ve déf—ut c ih ˜ien on ne peut p—s enregistrer de voix et les e'ets —utorisés p—r le form—tD ˜ien que nom˜reuxD sont limitésF ge form—t est don™ in—d—pté pour enregistrer des musiques qui p—ssent à l— r—dioD p—r exemple Y en rev—n™heD il est tout à f—it —d—pté pour jouer de vieilles musiques de l9époque de l— ƒuperExiƒD q—mefoyD weg—hriveD et™F RSU .

JOUER DU SON AVEC FMOD Trouver des MIDI yn trouve des kilotonnes de wshs sur le netF te ne m9en f—is p—s pour vousD vous trouverez votre ˜onheur 3 €ersonnellementD j9—i retenu wusi™‚o˜otF™omD un moteur de re™her™he pour (™hiers wshsF £   gode we˜ X VQQPVT ¡ ¢ €ersonnellementD j9—i ré™upéré une vieille musique de w—rio @—hD les souvenirs 3AF †ous pouvez l— télé™h—rger pour vos tests si vous le voulezF £   ¢gode we˜ X RITIWU ¡ Les étapes à suivre pour jouer un MIDI ves fon™tions né™ess—ires pour jouer des wshs ™ommen™ent p—r le pré(xe pw…ƒsg —u lieu de pƒy…xhF „outefoisD les fon™tions de ™h—rgement et de dé™h—rgement de pwyh à utiliser restent les mêmes et elles ont ˜ien le pré(xe pƒy…xhF †ous ™ommen™ez à —voir l9h—˜itudeD je v—is don™ —ller m—inten—nt un peu plus vite d—ns le listing des fon™tionsF Le pointeur pw…ƒsg•wyh…vi Bmusique a x…vvY Charger un MIDI musique a pw…ƒsg•vo—dƒong@4m—rioFmid4AY v— fon™tion prend un seul p—r—mètre X ™omme vous le voyezD ™9est en™ore plus simpleF ille renvoie x…vv si le (™hier n9— p—s pu être ™h—rgéF Jouer un MIDI pw…ƒsg•€l—yƒong@musiqueAY Répéter un MIDI pw…ƒsg•ƒetvooping@musiqueD IAY gette foisD ™9est un peu di'érentF sl f—ut envoyer I @ vr—i A pour que l— musique soit répétée à l9in(niF RSV .CHAPITRE 27.

Modier le volume pw…ƒsg•ƒetw—ster†olume@musiqueD ISHAY ve se™ond p—r—mètre ™orrespond —u volumeF ! H a silen™ieux ! PST a volume m—xim—l Stopper la lecture pw…ƒsg•ƒtopƒong@musiqueAY Libérer la musique MIDI pw…ƒsg•preeƒong@musiqueAY RSW . En particulier. ce code est diérent du code de pause qu'on a vu tout à l'heure. il n'y a pas de canal à indiquer ici.LES MUSIQUES (MIDI) Mettre en pause un MIDI v— fon™tion pw…ƒsg•qet€—used indique si l— ™h—nson est en p—use ou nonF pw…ƒsg•qet€—used@musiqueAY v— fon™tion pw…ƒsg•ƒet€—used met en p—use ou r闙tive l— le™ture de l— ™h—nsonF pw…ƒsg•ƒet€—used@musiqueD IAY invoyez I pour mettre en p—useD H pour rel—n™er l— le™tureF †oi™i un exemple de ™ode gér—nt l— p—use si on —ppuie sur € X ™—se ƒhv•ui‰hy‡xX if @eventFkeyFkeysymFsym aa ƒhvu•pA GGƒi on —ppuie sur € { if @pw…ƒsg•qet€—used@musiqueAA GG ƒi l— ™h—nson est en p—use pw…ƒsg•ƒet€—used@musiqueD HAY GG yn enlève l— p—use else GG ƒinonD elle est en ™ours de le™ture pw…ƒsg•ƒet€—used@musiqueD IAY GG yn —™tive l— p—use } Attention : bien que similaire.

JOUER DU SON AVEC FMOD Code d'exemple pour résumer int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvD Bnive—u a x…vvY ƒhv•ivent eventY ƒhv•‚e™t positionY int ™ontinuer a IY pw…ƒsg•wyh…vi Bmusique a x…vvY pƒy…xh•snit@RRIHHD QPD HAY musique a pw…ƒsg•vo—dƒong@4m—rioFmid4AY GG gh—rgement de l— ™h—nson if @musique aa x…vvA { fprintf@stderrD 4smpossi˜le de lire m—rioFmid’n4AY exit@iˆs„•pesv…‚iAY } pw…ƒsg•ƒetvooping@musiqueD IAY GG ‚épétition infinie pw…ƒsg•€l—yƒong@musiqueAY GG yn joue l— ™h—nson ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@TRHD RVHD QPD ƒhv•r‡ƒ…‚pegi | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4qestion du son —ve™ pwyh4D x…vvAY nive—u a swq•vo—d@4m—rio•nive—uFjpg4AY positionFx a HY positionFy a HY while @™ontinuerA { ƒhv•‡—itivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY ™—se ƒhv•ui‰hy‡xX if @eventFkeyFkeysymFsym aa ƒhvu•pA GGƒi on —ppuie sur € { if @pw…ƒsg•qet€—used@musiqueAA GG ƒi l— ™h—nson est en p—use pw…ƒsg•ƒet€—used@musiqueD HAY GG yn enlève l— p—use else GG ƒinonD elle est en ™ours de le™ture pw…ƒsg•ƒet€—used@musiqueD IAY GG yn —™tive l— p—use } ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY ƒhv•flitƒurf—™e@nive—uD x…vvD e™r—nD 8positionAY ƒhv•plip@e™r—nAY RTH .CHAPITRE 27.

La compression de la vidéo a détérioré la qualité du MIDI original. RTI .LES MUSIQUES (MIDI) } pw…ƒsg•preeƒong@musiqueAY GG hé™h—rgement de l— ™h—nson pƒy…xh•glose@AY ƒhv•preeƒurf—™e@nive—uAY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY we˜ X IIIWRW ¡ ge ™ode reprend les fon™tions prin™ip—les qu9on vient de voirF te vous propose de dé™ouvrir ™e que ç— donne en vidéo F £   ¢gode we˜ X IPHHSW ¡ 9 £ ¢gode   En résumé ! v— ƒhv possède des fon™tionn—lités —udio limitées et il est plutôt ™onseillé de se pen™her sur une ˜i˜liothèque dédiée —u sonD ™omme pwyhF ! yn distingue Q types de sons —ve™ pwyh X des sons ™ourtsD des sons longs @musiques w€QD yqqF F FA et des musiques —u form—t ˜in—ire @wshsAF ! gh—™un de ™es types se lit —ve™ des fon™tions di'érentesF sl est ™onseillé d9utiliser les fon™tions —d—ptées et d9éviter de ™h—rger un son long ™omme si ™9ét—it un son ™ourtD p—r exempleF ! pwyh permet de jouer simult—nément plusieurs sons di'érents à l9—ide de ™—n—uxF ! v— fréquen™e d9é™h—ntillonn—ge indique l— qu—lité du son qui ser— jouéF 9.

JOUER DU SON AVEC FMOD RTP .CHAPITRE 27.

Cette fois. Certes. par exemple une musique. mais on peut l'utiliser dans d'autres domaines.Chapitre 28 Diculté : TP : visualisation spectrale du son C e chapitre de travaux pratiques va vous proposer de manipuler la SDL et FMOD simultanément. Cela consiste à acher la composition du son que l'on joue. On retrouve cela dans de nombreux lecteurs audio. Ce chapitre va justement vous prouver qu'elle peut servir à autre chose. la SDL est tout particulièrement adaptée à cela. C'est amusant et ce n'est pas si compliqué que ça en a l'air ! RTQ . nous n'allons pas travailler sur un jeu. Nous allons réaliser ici une visualisation du spectre sonore en SDL.

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON ge ™h—pitre v— nous permettre de tr—v—iller —utour de notions que nous —vons dé™ouE vertes ré™emment X ! l— gestion du temps Y ! l— ˜i˜liothèque pwyhF xous dé™ouvrirons en outre ™omment modi(er une surf—™e pixel p—r pixelF v— (gF PVFI vous donne un —perçu du progr—mme que nous —llons ™réer d—ns ™e ™h—pitreF Figure PVFI ! †isu—lis—tion du spe™tre sonore g9est le genre de visu—lis—tion qu9on peut retrouver d—ns des le™teurs —udio tels que ‡in—mpD ‡indows wedi— €l—yer ou en™ore em—rouF it pour ne rien gâ™herD ™omme je vous l9—i dit ™e n9est p—s ˜ien di0™ile à f—ireF h9—illeursD ™ontr—irement —u „€ w—rio ƒoko˜—nD ™ette fois ™9est vous qui —llez tr—v—illerF Ǘ vous fer— un très ˜on exer™i™eF Les consignes ves ™onsignes sont simplesF ƒuivezEles p—s à p—s d—ns l9ordre et vous n9—urez p—s d9enE nuis 3 1. Lire un MP3 €our ™ommen™erD vous devez ™réer un progr—mme qui lit un (™hier w€QF †ous n9—vez qu9à reprendre l— ™h—nson  rome du groupe rype que nous —vons utilisée d—ns le ™h—pitre sur pwyh pour illustrer le fon™tionnement de l— le™ture d9une musiqueF £   ¢gode we˜ X WPTPHV ¡ RTR .

Récupérer les données spectrales du son €our ™omprendre le fon™tionnement de l— visu—lis—tion spe™tr—leD il est indispens—˜le que je vous explique un peu ™omment ç— fon™tionne à l9intérieur F …n son peut être dé™oupé en fréquen™es @(gF PVFPAF gert—ines fréquen™es sont ˜—ssesD d9—utres moyennesD et d9—utres h—utesF ge que nous —llons f—ire d—ns notre visu—lis—tionD ™9est —0™her l— qu—ntité de ™h—™une de ™es fréquen™es sous forme de ˜—rresF €lus l— ˜—rre est gr—ndeD plus l— fréquen™e est utiliséeF ƒur l— g—u™he de l— fenêtreD nous f—isons don™ —pp—r—ître les ˜—sses fréquen™es et sur l— droite les h—utesF 2 1. car je n'ai pas l'intention de transformer ce chapitre en cours de maths ! RTS .LES CONSIGNES ƒi vous —vez ˜ien suivi le ™h—pitre sur pwyhD il ne vous f—udr— p—s plus de quelques minutes pour —rriver à le f—ireF te vous ™onseille —u p—ss—ge de pl—™er le w€Q d—ns le dossier de votre projetF 2. 2. Activer le module DSP de FMOD te vous —v—is dit d—ns le ™h—pitre sur pwyh que nous n9—vions p—s vu toutes les possiE ˜ilités de ™ette ˜i˜liothèqueF ille peut lire —ussi des ghD e'e™tuer des enregistrementsD des modi(™—tions sur le sonD et™F xous —llons i™i nous intéresser à un de ses modulesD —ppelé DSPF À quoi servent les fon™tions du module hƒ€ c ih ˜ien ™e sont justement elles qui nous donnent des inform—tions sur le sonD —(n que nous puissions ré—liser notre visu—lis—tion spe™tr—leF sl v— f—lloir —™tiver ™e module F gomme on n9en — p—s toujours ˜esoinD le module hƒ€ est dés—™tivé p—r déf—utF reureusementD l9—™tiver est très simple X 1 pƒy…xh•hƒ€•ƒete™tive@pƒy…xh•hƒ€•qetpp„…nit@AD IAY ve premier p—r—mètre doit être le résult—t renvoyé p—r pƒy…xh•hƒ€•qetpp„…nit@AF u—nt —u se™ond p—r—mètreD ™9est un ˜ooléen X ! si on envoie  vr—i @IAD le module hƒ€ est —™tivé Y ! si on envoie  f—ux @HAD le module hƒ€ est dés—™tivéF €—r ™onséquentD si on veut dés—™tiver le module hƒ€ juste —v—nt l— (n du progr—mmeD il su0t d9é™rire X pƒy…xh•hƒ€•ƒete™tive@pƒy…xh•hƒ€•qetpp„…nit@AD HAY 3. Le module DSP n'est pas activé par défaut car il demande pas mal de calculs supplémentaires à l'ordinateur. Ce sera rapide je vous rassure.

C'est celui utilisé par FMOD ici. TP : VISUALISATION SPECTRALE DU SON Figure PVFP ! hé™oup—ge des fréquen™es Mais comment récupérer les quantités de chaque fréquence ? pwyh nous mâ™he le tr—v—ilF w—inten—nt que le module hƒ€ est —™tivéD on peut f—ire —ppel à l— fon™tion pƒy…xh•hƒ€•qetƒpe™trum@AF sl n9y — —u™un p—r—mètre à lui donnerF in rev—n™heD elle vous renvoie quelque ™hose de très intéress—nt X un pointeur vers un t—˜le—u de SIP flo—tF Rappel : le type flo—t est un type décimal. au même titre que dou˜le. La diérence entre les deux vient du fait que dou˜le est plus précis que flo—t.CHAPITRE 28. c'est donc celui que nous devrons utiliser nous aussi. mais dans notre cas le type flo—t est susant. sl vous f—udr— don™ dé™l—rer un pointeur vers flo—tF pƒy…xh•hƒ€•qetƒpe™trum@A vous renvoie le pointeur sur le t—˜le—uD don™ sur le premier élémentF in ™l—irD on dé™l—re le pointeur X flo—t Bspe™tre a x…vvY it lorsque l— musique est en tr—in d9être jouée et que le module hƒ€ est —™tivéD on peut ré™upérer l9—dresse du t—˜le—u de SIP flo—t que nous — ™réé pwyh X spe™tre a pƒy…xh•hƒ€•qetƒpe™trum@AY RTT .

Réaliser le dégradé h—ns un premier tempsD vous pouvez ré—liser des ˜—rres de ™ouleur unieF †ous pourrez don™ ™réer des surf—™esF sl devr— y en —voir SIP X une pour ™h—que ˜—rreF gh—que surf—™e fer— don™ I pixel de l—rge et l— h—uteur des surf—™es v—rier— en fon™tion de l9intensité de ™h—que fréquen™eF „outefoisD je vous propose ensuite d9e'e™tuer une —mélior—tion X l— ˜—rre doit fondre vers le rouge lorsque le son devient de plus en plus intenseF in ™l—irD l— ˜—rre doit être verte en ˜—s et rouge en h—utF 3.LES CONSIGNES yn peut ensuite p—r™ourir ™e t—˜le—u pour o˜tenir les v—leurs de ™h—™une des fréquen™es X spe™tre‘H“ GG préquen™e l— plus ˜—sse @à g—u™heA spe™tre‘I“ spe™tre‘P“ FFF spe™tre‘SHW“ spe™tre‘SIH“ spe™tre‘SII“ GG préquen™e l— plus h—ute @à droiteA gh—que fréquen™e est un nom˜re dé™im—l ™ompris entre H @rienA et I @m—ximumAF †otre tr—v—il v— ™onsister à —0™her une ˜—rre plus ou moins gr—nde en fon™tion de l— v—leur que ™ontient ™h—que ™—se du t—˜le—uF €—r exempleD si l— v—leur est HFSD vous devrez tr—™er une ˜—rre dont l— h—uteur ™orresE pondr— à l— moitié de l— fenêtreF ƒi l— v—leur est ID elle devr— f—ire toute l— h—uteur de l— fenêtreF qénér—lementD les v—leurs sont —ssez f—i˜les @plutôt pro™hes de H que de IAF te re™omE m—nde de multiplier p—r R toutes les v—leurs pour mieux voir le spe™treF ettention X si vous f—ites ç—D véri(ez que vous ne dép—ssez p—s I @—rrondissez à I s9il le f—utAF ƒi vous vous retrouvez —ve™ des v—leurs supérieures à ID vous risquez d9—voir des pro˜lèmes pour tr—™er les ˜—rres verti™—les p—r l— suite 3 Mais les barres doivent bouger au fur et à mesure du temps. Comment faire ? fonne questionF in e'etD le t—˜le—u de SIP flo—t que vous renvoie pwyh change toutes les 25 ms @pour être à jour p—r r—pport —u son —™tuelAF sl v— don™ f—lE loir d—ns votre ™ode que vous relisiez le t—˜le—u de SIP flo—t en ref—is—nt —ppel à pƒy…xh•hƒ€•qetƒpe™trum@A toutes les PS ms D puis que vous mettiez à jour votre gr—phique en ˜—rresF 3 4. RTU . Relisez le chapitre sur la gestion du temps en SDL pour vous rappeler comment faire. Faites ce qui vous paraît le plus facile. non ? Comme le son change tout le temps. Vous avez le choix entre une solution à base de GetTicks ou à base de callbacks. il faut mettre à jour le graphique.

une surface ne peut avoir qu'une seule couleur si on utilise ƒhv•pill‚e™t@A.CHAPITRE 28. . TP : VISUALISATION SPECTRALE DU SON Mais. On ne peut pas faire de dégradé ! in e'etF yn pourr—it ™ertes ™réer des surf—™es de I pixel de l—rge et de h—ut pour ™h—que ™ouleur du dégr—déD m—is ç— fer—it vr—iment ˜e—u™oup de surf—™es à gérer et ç— ne ser—it p—s très optimisé 3 gomment f—itEon pour dessiner pixel p—r pixel c te ne vous l9—i p—s —ppris —up—r—v—nt ™—r ™ette te™hnique ne mérit—it p—s un ™h—pitre entierF †ous —llez voir en e'et que ™e n9est p—s ˜ien ™ompliquéF in f—itD l— ƒhv ne propose —u™une fon™tion pour dessiner pixel p—r pixelF w—is on — le droit de l9é™rire nousEmêmesF €our ™e f—ireD il f—ut suivre ™es ét—pes méthodiquement d—ns l9ordreF IF p—ites —ppel à l— fon™tion ƒhv•vo™kƒurf—™e pour —nnon™er à l— ƒhv que vous —llez modi(er l— surf—™e m—nuellementF gel—  ˜loque l— surf—™e pour l— ƒhv et vous êtes le seul à y —voir —™™ès t—nt que l— surf—™e est ˜loquéeF s™iD je vous ™onseille de ne tr—v—iller qu9—ve™ une seule surf—™e X l9é™r—nF ƒi vous voulez dessiner un pixel à un endroit pré™is de l9é™r—nD vous devrez don™ ˜loquer l— surf—™e e™r—n X ƒhv•vo™kƒurf—™e@e™r—nAY PF †ous pouvez ensuite modi(er le ™ontenu de ™h—que pixel de l— surf—™eF gomme l— ƒhv ne propose —u™une fon™tion pour f—ire ç—D il v— f—lloir l9é™rire nousEmêmes d—ns notre progr—mmeF gette fon™tionD je vous l— donneF te l— tire de l— do™uE ment—tion de l— ƒhvF ille est un peu ™ompliquée ™—r elle tr—v—ille sur l— surf—™e dire™tement et gère toutes les profondeurs de ™ouleurs @˜its p—r pixelA possi˜lesF €—s ˜esoin de l— retenir ou de l— ™omprendreD ™opiezEl— simplement d—ns votre progr—mme pour pouvoir l9utiliser X void set€ixel@ƒhv•ƒurf—™e Bsurf—™eD int xD int yD …intQP pixelA { int ˜pp a surf—™eEbform—tEbfytes€er€ixelY …intV Bp a @…intV BAsurf—™eEbpixels C y B surf—™eEbpit™h C x B ˜ppY swit™h@˜ppA { ™—se IX Bp a pixelY ˜re—kY ™—se PX B@…intIT BAp a pixelY ˜re—kY ™—se QX if@ƒhv•f‰„iy‚hi‚ aa ƒhv•fsq•ixhsexA { RTV . .

Un indice : il faut utiliser des boucles. :-p RTW .LES CONSIGNES p‘H“ p‘I“ p‘P“ } else { p‘H“ p‘I“ p‘P“ } ˜re—kY a @pixel bb ITA 8 HxffY a @pixel bb VA 8 HxffY a pixel 8 HxffY a pixel 8 HxffY a @pixel bb VA 8 HxffY a @pixel bb ITA 8 HxffY } ™—se RX B@…intQP BAp a pixelY ˜re—kY } we˜ X QIHUQR ¡ ille est simple à utiliserF invoyez les p—r—mètres suiv—nts X ! le pointeur vers l— surf—™e à modi(er @™ette surf—™e doit pré—l—˜lement —voir été ˜loquée —ve™ ƒhv•vo™kƒurf—™eA Y ! l— position en —˜s™isse du pixel à modi(er d—ns l— surf—™e @xA Y ! l— position en ordonnée du pixel à modi(er d—ns l— surf—™e @yA Y ! l— nouvelle ™ouleur à donner à ™e pixelF gette ™ouleur doit être —u form—t …intQPD vous pouvez don™ l— générer à l9—ide de l— fon™tion ƒhv•w—p‚qf@A que vous ™onn—issez ˜ien m—inten—ntF QF in(nD lorsque vous —vez (ni de tr—v—iller sur l— surf—™eD il ne f—ut p—s ou˜lier de l— dé˜loquer en —ppel—nt ƒhv•…nlo™kƒurf—™eF ƒhv•…nlo™kƒurf—™e@e™r—nAY £ ¢gode   Code résumé d'exemple ƒi on résumeD vous —llez voir que ™9est tout simpleF ge ™ode dessine un pixel rouge —u milieu de l— surf—™e e™r—n @don™ —u milieu de l— fenêtreAF ƒhv•vo™kƒurf—™e@e™r—nAY GB yn ˜loque l— surf—™e BG GB yn dessine un pixel rouge —u milieu de l9é™r—n BG set€ixel@e™r—nD e™r—nEbw G PD e™r—nEbh G PD ƒhv•w—p‚qf@e™r—nEbform—tD PSSD HD HAAY ƒhv•…nlo™kƒurf—™e@e™r—nAY GB yn dé˜loque l— surf—™eBG eve™ ™ette ˜—se vous devriez pouvoir ré—liser des dégr—dés du vert —u rouge F 4 4.

TP : VISUALISATION SPECTRALE DU SON La solution elorsD ™omment vous —vez trouvé le sujet c sl n9est p—s ˜ien di0™ile à —ppréhenderD il f—ut juste f—ire quelques ™—l™ulsD surtout pour l— ré—lis—tion du dégr—déF g9est du nive—u de tout le mondeD il f—ut juste ré)é™hir un petit peuF gert—ins mettent plus de temps que d9—utres pour trouver l— solutionF ƒi vous —vez du m—lD ™e n9est p—s ˜ien gr—veF ge qui ™ompte ™9est de (nir p—r y —rriverF uel que soit le projet d—ns lequel vous vous l—n™erezD vous —urez for™ément des petits moments où il ne su0t p—s de s—voir progr—mmerD il f—ut —ussi être logique et ˜ien ré)é™hirF Le code te vous donne le ™ode ™omplet ™iEdessousF xous le ™ommenterons ensuiteF 5in™lude 5in™lude 5in™lude 5in™lude 5define 5define 5define 5define `stdli˜Fhb `stdioFhb `ƒhvGƒhvFhb `pwyhGfmodFhb ve‚qi…‚•pixi„‚i SIP re…„i…‚•pixi„‚i RHH ‚e„sy @re…„i…‚•pixi„‚i G PSSFHA hives•‚ep‚esgrsƒƒiwix„ PS void set€ixel@ƒhv•ƒurf—™e Bsurf—™eD int xD int yD …intQP pixelAY int m—in@int —rg™D ™h—r B—rgv‘“A { ƒhv•ƒurf—™e Be™r—n a x…vvY ƒhv•ivent eventY int ™ontinuer a ID h—uteurf—rre a HD tempse™tuel a HD temps€re™edent a HD → i a HD j a HY flo—t Bspe™tre a x…vvY GB sniti—lis—tion de pwyh EEEEEEEEEEEEEEEEEEEEEE BG pƒy…xh•snit@RRIHHD RD HAY pƒy…xh•ƒ„‚iewB musique a pƒy…xh•ƒtre—m•ypen@4rype•romeFmpQ4D HD HD HAY if @musique aa x…vvA { fprintf@stderrD 4smpossi˜le d9ouvrir l— musique4AY exit@iˆs„•pesv…‚iAY } pƒy…xh•hƒ€•ƒete™tive@pƒy…xh•hƒ€•qetpp„…nit@AD IAY pƒy…xh•ƒtre—m•€l—y@pƒy…xh•p‚iiD musiqueAY GB sniti—lis—tion de l— ƒhv RUH .CHAPITRE 28.

LA SOLUTION EEEEEEEEEEEEEEEEEEEEEEEE BG ƒhv•snit@ƒhv•sxs„•†shiyAY e™r—n a ƒhv•ƒet†ideowode@ve‚qi…‚•pixi„‚iD re…„i…‚•pixi„‚iD QPD ƒhv•ƒ‡ƒ…‚pegi → | ƒhv•hy…fvif…pAY ƒhv•‡w•ƒetg—ption@4†isu—lis—tion spe™tr—le du son4D x…vvAY GB fou™le prin™ip—le BG while @™ontinuerA { ƒhv•€ollivent@8eventAY swit™h@eventFtypeA { ™—se ƒhv•…s„X ™ontinuer a HY ˜re—kY } ƒhv•pill‚e™t@e™r—nD x…vvD ƒhv•w—p‚qf@e™r—nEbform—tD HD HD HAAY GB qestion du temps EEEEEEEEEEEEEEEEE BG tempse™tuel a ƒhv•qet„i™ks@AY if @tempse™tuel E temps€re™edent ` hives•‚ep‚esgrsƒƒiwix„A { ƒhv•hel—y@hives•‚ep‚esgrsƒƒiwix„ E @tempse™tuel E temps€re™edentAAY } temps€re™edent a ƒhv•qet„i™ks@AY GB hessin du spe™tre sonore EEEEEEEEEEEEEEEEEEEEEEEE BG spe™tre a pƒy…xh•hƒ€•qetƒpe™trum@AY ƒhv•vo™kƒurf—™e@e™r—nAY for @i a H Y i ` ve‚qi…‚•pixi„‚i Y iCCA { h—uteurf—rre a spe™tre‘i“ B R B re…„i…‚•pixi„‚iY if @h—uteurf—rre b re…„i…‚•pixi„‚iA h—uteurf—rre a re…„i…‚•pixi„‚iY for @j a re…„i…‚•pixi„‚i E h—uteurf—rre Y j ` re…„i…‚•pixi„‚i Y jCCA { set€ixel@e™r—nD iD jD ƒhv•w—p‚qf@e™r—nEbform—tD PSS E @j G RUI .

CHAPITRE 28. TP : VISUALISATION SPECTRALE DU SON → } } ‚e„syAD j G ‚e„syD HAAY ƒhv•…nlo™kƒurf—™e@e™r—nAY } ƒhv•plip@e™r—nAY pƒy…xh•hƒ€•ƒete™tive@pƒy…xh•hƒ€•qetpp„…nit@AD HAY pƒy…xh•ƒtre—m•glose@musiqueAY pƒy…xh•glose@AY ƒhv•uit@AY } return iˆs„•ƒ…ggiƒƒY void set€ixel@ƒhv•ƒurf—™e Bsurf—™eD int xD int yD …intQP pixelA { int ˜pp a surf—™eEbform—tEbfytes€er€ixelY …intV Bp a @…intV BAsurf—™eEbpixels C y B surf—™eEbpit™h C x B ˜ppY swit™h@˜ppA { ™—se IX Bp a pixelY ˜re—kY ™—se PX B@…intIT BAp a pixelY ˜re—kY ™—se QX if@ƒhv•f‰„iy‚hi‚ aa ƒhv•fsq•ixhsexA { p‘H“ a @pixel bb ITA 8 HxffY p‘I“ a @pixel bb VA 8 HxffY p‘P“ a pixel 8 HxffY } else { p‘H“ a pixel 8 HxffY p‘I“ a @pixel bb VA 8 HxffY p‘P“ a @pixel bb ITA 8 HxffY } ˜re—kY ™—se RX B@…intQP BAp a pixelY ˜re—kY } } RUP .

RUQ .LA SOLUTION †ous pouvez ré™upérer ™e ™ode d—ns une version l—rgement ™ommentée si vous le désirezF £   ¢gode we˜ X VWPPIT ¡ Explication du code h—ns un premier tempsD on initi—lise pwyhD l— musique et le module hƒ€F yn ™h—rge ensuite l— ƒhvF h—ns m— ˜ou™le prin™ip—leD j9—i ™hoisi de gérer le temps vi— ƒhv•qet„i™ks @je n9—i p—s f—it de ™—ll˜—™kAF te véri(e à ™h—que tour de ˜ou™le qu9—u moins PS ms se sont é™ouléesF ƒi ™e n9est p—s le ™—sD on —ttend le temps qu9il f—ut —ve™ ƒhv•hel—y pour —tteindre les PS msF yn peut ensuite dessiner le spe™tre sonoreF yn ré™upère le t—˜le—u de SIP flo—t et on tr—v—ille ensuite pixel p—r pixel sur l— surf—™e e™r—n pour y dessiner les ˜—rres —ve™ deux ˜ou™les X l— première pour p—r™ourir l— fenêtre en l—rgeur et l— se™onde pour l— p—r™ourir en h—uteur et y dessiner ™h—que ˜—rreF gomme je vous l9—v—is ditD j9—i multiplié p—r R l— v—leur du spe™tre pour  zoomer un peuF fien entenduD on risque —lors de dép—sser l— h—uteur de l— fenêtre X je tronque don™ l— ˜—rre verti™—le si on dép—sse re…„i…‚•pixi„‚iF insuiteD il ne reste plus qu9à p—r™ourir en h—uteur l— fenêtre pour dessiner l— ˜—rreF sl f—ut f—ire quelques légers ™—l™uls pour —d—pter proportionnellement l— ˜—rre à l— h—uteur de l— fenêtreF Télécharger et visualiser le résultat †ous devriez o˜tenir un résult—t ™orrespond—nt à l— ™—pture d9é™r—n que je vous —v—is montrée —u dé˜ut du ™h—pitreF fien entenduD il v—ut mieux une —nim—tion pour —ppréE ™ier ™e résult—tF g9est don™ ™e que je vous propose de visu—liserF £   gode we˜ X PHSRHR ¡ ¢ xotez que l— ™ompression — réduit l— qu—lité du son et le nom˜re d9im—ges p—r se™ondeF ve mieux est en™ore de télé™h—rger le progr—mme ™omplet @—ve™ son ™ode sour™eA pour tester ™hez soiF †ous pourrez —insi —ppré™ier le progr—mme d—ns les meilleures ™ondiE tionsF £   gode we˜ X VIUHSW ¡ ¢ Il faut impérativement que le chier rype•romeFmpQ soit placé dans le dossier du programme pour que celui-ci fonctionne (sinon il s'arrêtera de suite).

TP : VISUALISATION SPECTRALE DU SON Idées d'amélioration sl est toujours possi˜le d9—méliorer un progr—mmeF s™iD j9—i de nom˜reuses idées d9exE tensions qui pourr—ient —˜outir à l— ™ré—tion d9un vérit—˜le petit le™teur w€QF ! sl ser—it ˜ien qu9on puisse ™hoisir le w€Q qu9on veut lireF sl f—udr—it p—r exemple lister tous les FmpQ présents d—ns le dossier du progr—mmeF yn n9— p—s vu ™omment f—ire ç—D m—is vous pouvez le dé™ouvrir p—r vousEmêmes F ! ƒi votre progr—mme ét—it ™—p—˜le de lire et gérer les pl—ylistsD ç— ser—it en™ore mieuxF sl existe plusieurs form—ts de pl—ylistD le plus ™onnu est le form—t wQ…F ! †ous pourriez —0™her le nom du w€Q en ™ours de le™ture d—ns l— fenêtre @il f—udr— utiliser ƒhv•ttfAF ! †ous pourriez —0™her un indi™—teur pour qu9on s—™he où en est de l— le™ture du mor™e—uD ™omme ™el— se f—it sur l— plup—rt des le™teurs w€QF ! †ous pourriez —ussi proposer de modi(er le volume de le™tureF ! et™F frefD il y — ˜e—u™oup à f—ireF †ous —vez l— possi˜ilité de ™réer de ˜e—ux le™teurs —udioD il ne tient plus qu9à vous de les ™oder 3 5 5.CHAPITRE 28.h). Indice : utilisez la bibliothèque dirent (il faudra inclure dirent. À vous de chercher des informations sur le web pour savoir comment l'utiliser. RUR .

Quatrième partie Les structures de données RUS .

.

). . les tableaux se révèlent parfois assez limités. Les listes chaînées représentent une façon d'organiser les données en mémoire de manière beaucoup plus exible. Par exemple. Si vous souhaitez stocker une série de données. nous allons devoir le créer nous-mêmes de toutes pièces. Toutefois. C'est un excellent exercice qui vous aidera à être plus à l'aise avec le langage.Chapitre 29 Diculté : Les listes chaînées P our stocker des données en mémoire. il n'est pas possible d'insérer une case au milieu du tableau. De même. Comme à la base le langage C ne propose pas ce système de stockage. si vous créez un tableau de 10 cases et que vous vous rendez compte plus tard dans votre programme que vous avez besoin de plus d'espace. nous avons utilisé des variables simples (type int. . dou˜le. il sera impossible d'agrandir ce tableau. RUU . des tableaux et des structures personnalisées. le plus simple est en général d'utiliser des tableaux.

RUV . 1. peu importe.CHAPITRE 29. les éléments d'une liste chaînée ne sont pas placés côte à côte dans la mémoire. LES LISTES CHAÎNÉES Représentation d'une liste chaînée u9estE™e qu9une liste ™h—înée c te vous propose de p—rtir sur le modèle des t—˜le—uxF …n t—˜le—u peut être représenté en mémoire ™omme sur l— (gF PWFIF sl s9—git i™i d9un t—˜le—u ™onten—nt des intF 1 Figure PWFI ! …n t—˜le—u de R ™—ses en mémoire @représent—tion horizont—leA gomme je vous le dis—is en introdu™tionD le pro˜lème des t—˜le—ux est qu9ils sont (gésF sl n9est p—s possi˜le de les —gr—ndirD à moins d9en ™réer de nouve—uxD plus gr—nds @(gF PWFPAF he mêmeD il n9est p—s possi˜le d9y insérer une ™—se —u milieuD à moins de d陗ler tous les —utres élémentsF Figure PWFP ! yn ne peut p—s —gr—ndir un t—˜le—u —près s— ™ré—tion ve l—ng—ge g ne propose p—s d9—utre système de sto™k—ge de donnéesD m—is il est possi˜le de le ™réer soiEmême de toutes piè™esF in™ore f—utEil s—voir ™omment s9y prendre X ™9est justement ™e que ™e ™h—pitre et les suiv—nts vous proposent de dé™ouvrirF …ne liste ™h—înée est un moyen d9org—niser une série de données en mémoireF gel— ™onsiste à —ssem˜ler des stru™tures en les li—nt entre elles à l9—ide de pointeursF yn pourr—it les représenter ™omme ™e™i X Figure PWFQ ! …ne liste ™h—înée est un —ssem˜l—ge de stru™tures liées p—r des pointeurs gh—que élément peut ™ontenir ™e que l9on veut X un ou plusieurs intD dou˜leF F F in plus de ™el—D ™h—que élément possède un pointeur vers l9élément suiv—nt @(gF PWFRAF te re™onn—is que tout ™el— est en™ore très théorique et doit vous p—r—ître un peu )ou pour le momentF ‚etenez simplement ™omment les éléments sont —gen™és entre eux X ils forment une chaîne de pointeursD d9où le nom de  liste ™h—înée F Contrairement aux tableaux. J'ai choisi ici de représenter le tableau horizontalement. Chaque case pointe vers une autre case en mémoire qui n'est pas nécessairement stockée juste à côté. mais il serait aussi possible de le présenter verticalement.

Le principe des listes chaînées s'adapte à n'importe quel type de données. je propose de faire simple pour que vous compreniez bien le principe. mais ici. RUW . l'idéal est de faire un pointeur sur void : void*.CONSTRUCTION D'UNE LISTE CHAÎNÉE Figure PWFR ! gh—que élément ™ontient une donnée @exF X un intA et un pointeur vers l9élément suiv—nt Construction d'une liste chaînée €—ssons m—inten—nt —u ™on™retF xous —llons ess—yer de ™réer une stru™ture qui fon™E tionne sur le prin™ipe que nous venons de dé™ouvrir F 2 Un élément de la liste €our nos exemplesD nous —llons ™réer une liste ™h—înée de nom˜res entiers F gh—que élément de l— liste —ur— l— forme de l— stru™ture suiv—nte X 3 typedef stru™t ilement ilementY stru™t ilement { int nom˜reY ilement Bsuiv—ntY }Y xous —vons ™réé i™i un élément d9une liste ™h—înéeD ™orrespond—nt à l— (gF PWFR que nous —vons vue plus tôtF ue ™ontient ™ette stru™ture c ! …ne donnéeD i™i un nom˜re de type int X on pourr—it rempl—™er ™el— p—r n9importe quelle —utre donnée @un dou˜leD un t—˜le—uF F FAF gel— ™orrespond à ™e que vous voulez sto™kerD ™9est à vous de l9—d—pter en fon™tion des ˜esoins de votre progr—mme F ! …n pointeur vers un élément du même type —ppelé suiv—ntF g9est ™e qui permet de lier les éléments les uns —ux —utres X ™h—que élément  s—it où se trouve l9élément 4 2. 3. Je rappelle que tout ce que nous allons faire ici fait appel à des techniques du langage C que vous connaissez déjà. On pourrait aussi bien créer une liste chaînée contenant des nombres décimaux ou même des tableaux et des structures. . capable de se réguler tout seul. Cela permet de faire pointer vers n'importe quel type de données. Si on veut travailler de manière générique.-) 4. nous allons nous contenter de créer nos propres structures et fonctions et les transformer en un système logique. Il n'y a aucun élément nouveau.

il ne sait pas quel est l'élément précédent. Elles sont néanmoins plus complexes. On pourrait par exemple y stocker en plus la taille de la liste.CHAPITRE 29. En revanche. LES LISTES CHAÎNÉES suiv—nt en mémoire F gomme je vous le dis—is plus tôtD les ™—ses ne sont p—s ™ôte à ™ôte en mémoireF g9est l— grosse di'éren™e p—r r—pport —ux t—˜le—uxF gel— o're d—v—nt—ge de souplesse ™—r on peut plus f—™ilement —jouter de nouvelles ™—ses p—r l— suite —u ˜esoinF 5 La structure de contrôle in plus de l— stru™ture qu9on vient de ™réer @que l9on dupliquer— —ut—nt de fois qu9il y — d9élémentsAD nous —llons —voir ˜esoin d9une —utre stru™ture pour ™ontrôler l9ensem˜le de l— liste ™h—înéeF ille —ur— l— forme suiv—nte X typedef stru™t viste visteY stru™t viste { ilement BpremierY }Y gette stru™ture viste ™ontient un pointeur vers le premier élément de l— listeF in e'etD il f—ut ™onserver l9—dresse du premier élément pour s—voir où ™ommen™e l— listeF ƒi on ™onn—ît le premier élémentD on peut retrouver tous les —utres en  s—ut—nt d9élément en élément à l9—ide des pointeurs suiv—ntF Une structure composée d'une seule sous-variable n'est en général pas très utile. je pense que l'on aura besoin d'y ajouter des sous-variables plus tard. je préfère donc prendre les devants en créant ici une structure. alors que les listes  doublement chaînées  ont des pointeurs dans les deux sens et n'ont pas ce défaut. c'est-à-dire le nombre d'éléments qu'elle contient. Néanmoins. On parle de liste  simplement chaînée . xous n9—urons ˜esoin de ™réer qu9un seul exempl—ire de l— stru™ture visteF ille permet de ™ontrôler toute l— liste @(gF PWFSAF Le dernier élément de la liste xotre s™hém— est presque ™ompletF sl m—nque une dernière ™hose X on —imer—it retenir le dernier élément de l— listeF in e'etD il f—udr— ˜ien —rrêter de p—r™ourir l— liste à un moment donnéF eve™ quoi pourr—itEon signi(er à notre progr—mme  ƒtopD ™e™i est le dernier élément c sl ser—it possi˜le d9—jouter d—ns l— stru™ture viste un pointeur vers le dernier ilementF „outefoisD il y — en™ore plus simple X il su0t de f—ire pointer le dernier élément de l— liste vers x…vvD ™9estEàEdire de mettre son pointeur suiv—nt à x…vvF gel— nous permet de ré—liser un s™hém— en(n ™omplet de notre stru™ture de liste ™h—înée @(gF PWFTAF 5. RVH . il est donc impossible de revenir en arrière à partir d'un élément avec ce type de liste.

CONSTRUCTION D'UNE LISTE CHAÎNÉE Figure PWFS ! v— stru™ture viste nous donne des inform—tions sur l9ensem˜le de l— liste ™h—înée Figure PWFT ! ve dernier élément de l— liste pointe vers x…vv pour indiquer l— (n de liste RVI .

LES LISTES CHAÎNÉES Les fonctions de gestion de la liste xous —vons ™réé deux stru™tures qui permettent de gérer une liste ™h—înée X ! ilementD qui ™orrespond à un élément de l— liste et que l9on peut dupliquer —ut—nt de fois que né™ess—ire Y ! visteD qui ™ontrôle l9ensem˜le de l— listeF xous n9en —urons ˜esoin qu9en un seul exempl—ireF g9est ˜ienD m—is il m—nque en™ore l9essentiel X les fon™tions qui vont m—nipuler l— liste ™h—înéeF in e'etD on ne v— p—s modi(er  à l— m—in le ™ontenu des stru™tures à ™h—que fois qu9on en — ˜esoin 3 sl est plus s—ge et plus propre de p—sser p—r des fon™tions qui —utom—tisent le tr—v—ilF in™ore f—utEil les ™réerF À première vueD je dir—is qu9on —ur— ˜esoin de fon™tions pour X ! initi—liser l— liste Y ! —jouter un élément Y ! supprimer un élément Y ! —0™her le ™ontenu de l— liste Y ! supprimer l— liste entièreF yn pourr—it ™réer d9—utres fon™tions @p—r exemple pour ™—l™uler l— t—ille de l— listeA m—is elles sont moins indispens—˜lesF xous —llons i™i nous ™on™entrer sur ™elles que je viens de vous énumérerD ™e qui nous fer— déjà une ˜onne ˜—seF te vous inviter—i ensuite à ré—liser d9—utres fon™tions pour vous entr—îner une fois que vous —urez ˜ien ™ompris le prin™ipeF Initialiser la liste v— fon™tion d9initi—lis—tion est l— toute première que l9on doit —ppelerF ille ™rée l— stru™ture de ™ontrôle et le premier élément de l— listeF te vous propose l— fon™tion ™iEdessousD que nous ™ommenterons juste —prèsD ˜ien enE tendu X viste Biniti—lis—tion@A { viste Bliste a m—llo™@sizeof@BlisteAAY ilement Belement a m—llo™@sizeof@BelementAAY if @liste aa x…vv || element aa x…vvA { exit@iˆs„•pesv…‚iAY } elementEbnom˜re a HY elementEbsuiv—nt a x…vvY listeEbpremier a elementY RVP .CHAPITRE 29.

7. RVQ . mais si plus tard on décide de modier le type du pointeur liste. Notez que le type de données est Liste et que la variable s'appelle liste.LES FONCTIONS DE GESTION DE LA LISTE return listeY } yn ™ommen™e p—r ™réer l— stru™ture de ™ontrôle liste F yn l9—lloue dyn—miquement —ve™ un m—llo™F v— t—ille à —llouer est ™—l™ulée —utom—tiquement —ve™ sizeof@BlisteAF v9ordin—teur s—ur— qu9il doit —llouer l9esp—™e né™ess—ire —u sto™k—ge de l— stru™ture viste F yn —lloue ensuite de l— même m—nière l— mémoire né™ess—ire —u sto™k—ge du premier élémentF yn véri(e si les —llo™—tions dyn—miques ont fon™tionnéF in ™—s d9erreurD on —rrête immédi—tement le progr—mme en f—is—nt —ppel à exit@AF ƒi tout s9est ˜ien p—sséD on dé(nit les v—leurs de notre premier élément X ! l— donnée nom˜re est mise à H p—r déf—ut Y ! le pointeur suiv—nt pointe vers x…vv ™—r le premier élément de notre liste est —ussi le dernier pour le momentF gomme on l9— vu plus tôtD le dernier élément doit pointer vers x…vv pour sign—ler qu9il est en (n de listeF xous —vons don™ m—inten—nt réussi à ™réer en mémoire une liste ™omposée d9un seul élément et —y—nt une forme sem˜l—˜le à l— (gF PWFUF 6 7 Figure PWFU ! v9ét—t de l— liste qui vient d9être initi—lisée Ajouter un élément s™iD les ™hoses se ™ompliquent un peuF yù v—EtEon —jouter un nouvel élément c eu dé˜ut de l— listeD à l— (nD —u milieu c v— réponse est qu9on — le ™hoixF vi˜re à nous de dé™ider ™e que nous f—isonsF €our ™e ™h—pitreD je propose que l9on voie ensem˜le l9—jout d9un élément en dé˜ut de listeF h9une p—rtD ™9est simple à ™omprendreD et d9—utre p—rt ™el— me donner— une o™™—sion à l— (n de ™e ™h—pitre de vous proposer de ré)é™hir à l— ™ré—tion d9une fon™tion qui —joute un élément à un endroit pré™is de l— listeF xous devons ™réer une fon™tion ™—p—˜le d9insérer un nouvel élément en dé˜ut de listeF 6. on devra aussi adapter le sizeof. On aurait aussi pu écrire sizeof(Liste). La majuscule permet de les diérencier.

CHAPITRE 29. LES LISTES CHAÎNÉES €our nous mettre en situ—tionD im—ginons un ™—s sem˜l—˜le à l— (gF PWFV X l— liste est ™omposée de trois éléments et on souh—ite en —jouter un nouve—u —u dé˜utF Figure PWFV ! yn souh—ite insérer notre nouvel élément en dé˜ut de liste sl v— f—lloir —d—pter le pointeur premier de l— liste —insi que le pointeur suiv—nt de notre nouvel élément pour  insérer ™orre™tement ™eluiE™i d—ns l— listeF te vous propose pour ™el— ™e ™ode sour™e que nous —n—lyserons juste —près X void insertion@viste BlisteD int nvxom˜reA { GB gré—tion du nouvel élément BG ilement Bnouve—u a m—llo™@sizeof@Bnouve—uAAY if @liste aa x…vv || nouve—u aa x…vvA { exit@iˆs„•pesv…‚iAY } nouve—uEbnom˜re a nvxom˜reY GB snsertion de l9élément —u dé˜ut de l— liste BG nouve—uEbsuiv—nt a listeEbpremierY listeEbpremier a nouve—uY } v— fon™tion insertion@A prend en p—r—mètre l9élément de ™ontrôle liste @qui ™ontient l9—dresse du premier élémentA et le nom˜re à sto™ker d—ns le nouvel élément que l9on v— ™réerF h—ns un premier tempsD on —lloue l9esp—™e né™ess—ire —u sto™k—ge du nouvel élément et on y pl—™e le nouve—u nom˜re nvxom˜reF sl reste —lors une ét—pe déli™—te X l9insertion du nouvel élément d—ns l— liste ™h—înéeF xous —vons i™i ™hoisi pour simpli(er d9insérer l9élément en dé˜ut de listeF €our mettre à jour ™orre™tement les pointeursD nous devons pro™éder d—ns ™et ordre pré™is X IF f—ire pointer notre nouvel élément vers son futur su™™esseurD qui est l9—™tuel preE mier élément de l— liste Y RVR .

vous perdez l'adresse du premier élément de la liste ! Faites le test.LES FONCTIONS DE GESTION DE LA LISTE PF f—ire pointer le pointeur premier vers notre nouvel élémentF On ne peut pas suivre ces étapes dans l'ordre inverse ! En eet. si vous faites d'abord pointer premier vers notre nouvel élément. gel— —ur— pour e'et d9insérer ™orre™tement notre nouvel élément d—ns l— liste ™h—înée @(gF PWFWA 3 Figure PWFW ! snsertion d9un élément d—ns l— liste ™h—înée Supprimer un élément he même que pour l9insertionD nous —llons i™i nous ™on™entrer sur l— suppression du premier élément de l— listeF sl est te™hniquement possi˜le de supprimer un élément pré™is —u milieu de l— listeD ™e ser— d9—illeurs un des exer™i™es que je vous proposer—i à l— (nF v— suppression ne pose p—s de di0™ulté supplément—ireF sl f—ut ™epend—nt ˜ien —d—pter les pointeurs de l— liste d—ns le ˜on ordre pour ne  perdre —u™une inform—tionF void suppression@viste BlisteA { if @liste aa x…vvA { exit@iˆs„•pesv…‚iAY } if @listeEbpremier 3a x…vvA { ilement B—ƒupprimer a listeEbpremierY listeEbpremier a listeEbpremierEbsuiv—ntY free@—ƒupprimerAY } } RVS . vous comprendrez de suite pourquoi l'inverse est impossible.

CHAPITRE 29. LES LISTES CHAÎNÉES yn ™ommen™e p—r véri(er que le pointeur qu9on nous envoie n9est p—s x…vvD sinon on ne peut p—s tr—v—illerF yn véri(e ensuite qu9il y — —u moins un élément d—ns l— listeD sinon il n9y — rien à f—ireF ges véri(™—tions e'e™tuéesD on peut s—uveg—rder l9—dresse de l9élément à supprimer d—ns un pointeur —ƒupprimerF yn —d—pte ensuite le pointeur premier vers le nouve—u premier élémentD qui est —™tuellement en se™onde position de l— liste ™h—înéeF sl ne reste plus qu9à supprimer l9élément ™orrespond—nt à notre pointeur —ƒupprimer —ve™ un free @(gF PWFIHAF Figure PWFIH ! ƒuppression d9un élément de l— liste ™h—înée gette fon™tion est ™ourte m—is s—uriezEvous l— réé™rire c sl f—ut ˜ien ™omprendre qu9on doit f—ire les ™hoses d—ns un ordre pré™is X IF f—ire pointer premier vers le se™ond élément Y PF supprimer le premier élément —ve™ un freeF ƒi on f—is—it l9inverseD on perdr—it l9—dresse du se™ond élément 3 Acher la liste chaînée €our ˜ien visu—liser ™e que ™ontient notre liste ™h—înéeD une fon™tion d9—0™h—ge ser—it idé—le 3 sl su0t de p—rtir du premier élément et d9—0™her ™h—que élément un à un en  s—ut—nt de ˜lo™ en ˜lo™F void —ffi™herviste@viste BlisteA { if @liste aa x…vvA { exit@iˆs„•pesv…‚iAY } ilement B—™tuel a listeEbpremierY while @—™tuel 3a x…vvA { RVT .

ALLER PLUS LOIN printf@47d Eb 4D —™tuelEbnom˜reAY —™tuel a —™tuelEbsuiv—ntY } } printf@4x…vv’n4AY gette fon™tion est simple X on p—rt du premier élément et on —0™he le ™ontenu de ™h—que élément de l— liste @un nom˜reAF yn se sert du pointeur suiv—nt pour p—sser à l9élément qui suit à ™h—que foisF yn peut s9—muser à tester l— ™ré—tion de notre liste ™h—înée et son —0™h—ge —ve™ un m—in X int m—in@A { viste Bm—viste a initi—lis—tion@AY insertion@m—visteD RAY insertion@m—visteD VAY insertion@m—visteD ISAY suppression@m—visteAY —ffi™herviste@m—visteAY } return HY in plus du premier élément @que l9on — l—issé i™i à HAD on en —joute trois nouve—ux à ™ette listeF €uis on en supprime unF eu (n—lD le ™ontenu de l— liste ™h—înée ser— don™ X V Eb R Eb H Eb x…vv Aller plus loin xous venons de f—ire le tour des prin™ip—les fon™tions né™ess—ires à l— gestion d9une liste ™h—înée X initi—lis—tionD —jout d9élémentD suppression d9élémentD et™F †oi™i quelques —utres fon™tions qui m—nquent et que je vous invite à é™rireD ™e ser— un très ˜on exer™i™e 3 ! Insertion d'un élément en milieu de liste X —™tuellementD nous ne pouvons —jouter des éléments qu9—u dé˜ut de l— listeD ™e qui est génér—lement su0s—ntF ƒi toutefois on veut pouvoir —jouter un élément —u milieuD il f—ut ™réer une fon™tion spé™i(que qui prend un p—r—mètre supplément—ire X l9—dresse de ™elui qui pré™èder— notre nouvel élément d—ns l— listeF †otre fon™tion v— p—r™ourir l— liste ™h—înée jusqu9à tom˜er sur l9élément indiquéF ille y insèrer— le petit nouve—u juste —prèsF ! Suppression d'un élément en milieu de liste X le prin™ipe est le même que pour l9insertion en milieu de listeF gette foisD vous devez —jouter en p—r—mètre l9—dresse de l9élément à supprimerF RVU .

LES LISTES CHAÎNÉES ! Destruction de la liste X il su0t de supprimer tous les éléments un à un 3 ! Taille de la liste X ™ette fon™tion indique ™om˜ien il y — d9éléments d—ns votre liste ™h—înéeF v9idé—lD plutôt que d9—voir à ™—l™uler ™ette v—leur à ™h—que foisD ser—it de m—intenir à jour un entier n˜ilements d—ns l— stru™ture visteF sl su0t d9in™rémenter ™e nom˜re à ™h—que fois qu9on —joute un élément et de le dé™rémenter qu—nd on en supprime unF te vous ™onseille de regrouper toutes les fon™tions de gestion de l— liste ™h—înée d—ns des (™hiers liste•™h—ineeF™ et liste•™h—ineeFh p—r exempleF ge ser— votre première ˜i˜liothèque 3 †ous pourrez l— réutiliser d—ns tous les progr—mmes d—ns lesquels vous —vez ˜esoin de listes ™h—înéesF †ous pouvez télé™h—rger le projet des listes ™h—înées ™ompren—nt les fon™tions que nous —vons dé™ouvertes ensem˜leF gel— vous fer— une ˜onne ˜—se de dép—rtF   £ ¢gode we˜ X THQUIT ¡ En résumé ! ves listes ™h—înées ™onstituent un nouve—u moyen de sto™ker des données en mémoireF illes sont plus )exi˜les que les t—˜le—ux ™—r on peut —jouter et supprimer des  ™—ses à n9importe quel momentF ! sl n9existe p—s en l—ng—ge g de système de gestion de listes ™h—înéesD il f—ut l9é™rire nousEmêmes 3 g9est un ex™ellent moyen de progresser en —lgorithmique et en proE gr—mm—tion en génér—lF ! h—ns une liste ™h—înéeD ™h—que élément est une stru™ture qui ™ontient l9—dresse de l9élément suiv—ntF ! sl est ™onseillé de ™réer une stru™ture de ™ontrôle @du type viste d—ns notre ™—sA qui retient l9—dresse du premier élémentF ! sl existe une version —méliorée " m—is plus ™omplexe " des listes ™h—înées —ppeE lée  listes dou˜lement ™h—înées D d—ns lesquelles ™h—que élément possède en plus l9—dresse de ™elui qui le pré™èdeF RVV .CHAPITRE 29.

Les piles et les les sont très utiles pour des programmes qui doivent traiter des données qui arrivent au fur et à mesure. on ne va plus insérer de nouveaux éléments au milieu de la liste mais seulement au début ou à la n. Nous allons voir en détails leur fonctionnement dans ce chapitre.Chapitre 30 Diculté : Les piles et les les N ous avons découvert avec les listes chaînées un nouveau moyen plus souple que les tableaux pour stocker des données. Cette fois. Elles permettent de contrôler la manière dont sont ajoutés les nouveaux éléments. à n'importe quel moment. RVW . Les piles et les les que nous allons découvrir ici sont deux variantes un peu particulières des listes chaînées. Ces listes sont particulièrement exibles car on peut insérer et supprimer des données à n'importe quel endroit.

comme dans Tetris. Oui. Si vous voulez essayer.CHAPITRE 30.-) RWH . . bon courage ! 2. LES PILES ET LES FILES ves piles et les (les sont très simil—iresD m—is révèlent né—nmoins une su˜tile di'éren™e que vous —llez r—pidement re™onn—îtreF xous —llons d—ns un premier temps dé™ouvrir les piles qui vont d9—illeurs ˜e—u™oup vous r—ppeler les listes ™h—înéesD à quelques mots de vo™—˜ul—ire prèsF qlo˜—lementD ™e ™h—pitre ser— simple pour vous si vous —vez ™ompris le fon™tionnement des listes ™h—înéesF ƒi ™e n9est p—s le ™—sD retournez d9—˜ord —u ™h—pitre pré™édent ™—r nous —llons en —voir ˜esoinF Les piles sm—ginez une pile de piè™es @(gF QHFIAF †ous pouvez —jouter des piè™es une à une en h—ut de l— pileD m—is —ussi en enlever depuis le h—ut de l— pileF sl est en rev—n™he impossi˜le d9enlever une piè™e depuis le ˜—s de l— pile 3 1 Figure QHFI ! …ne pile de piè™es Fonctionnement des piles ve prin™ipe des piles en progr—mm—tion est de sto™ker des données —u fur et à mesure les unes —uEdessus des —utres pour pouvoir les ré™upérer plus t—rdF €—r exempleD im—ginons une pile de nom˜res entiers de type int @(gF QHFPAF ƒi j9—joute un élément @on p—rle d9empilageAD il ser— pl—™é —uEdessus @(gF QHFQAF ve plus intéress—nt est s—ns ™onteste l9opér—tion qui ™onsiste à extr—ire les nom˜res de l— pileF yn p—rle de dépilageF yn ré™upère les données une à uneD en ™ommenç—nt p—r l— dernière qui vient d9être posée tout en h—ut de l— pile @(gF QHFRAF yn enlève les données —u fur et à mesureD jusqu9à l— dernière tout en ˜—s de l— pileF yn dit que ™9est un —lgorithme LIFOD ™e qui signi(e  v—st sn pirst yut F „r—du™tion X  ve dernier élément qui — été —jouté est le premier à sortir F ves éléments de l— pile sont reliés entre eux à l— m—nière d9une liste ™h—înéeF sls possèdent un pointeur vers l9élément suiv—nt et ne sont don™ p—s for™ément pl—™és ™ôte à ™ôte en mémoireF ve dernier élément @tout en ˜—s de l— pileA doit pointer vers x…vv pour indiquer qu9on —F F F tou™hé le fond @(gF QHFSAF 2 1.

LES PILES Figure QHFP ! …ne pile de int Figure QHFQ ! impil—ge RWI .

CHAPITRE 30. LES PILES ET LES FILES Figure QHFR ! hépil—ge Figure QHFS ! ves éléments sont reliés entre eux et le dernier pointe vers x…vv RWP .

concrètement ? sl y — des progr—mmes où vous —vez ˜esoin de sto™ker des données tempor—irement pour les ressortir d—ns un ordre pré™is X le dernier élément que vous —vez sto™ké doit être le premier à ressortirF €our vous donner un exemple ™on™retD votre système d9exploit—tion utilise ™e type d9—lgorithme pour retenir l9ordre d—ns lequel les fon™tions ont été —ppeléesF sm—ginez un exemple X IF PF QF RF SF TF votre progr—mme ™ommen™e p—r l— fon™tion m—in @™omme toujoursA Y vous y —ppelez l— fon™tion jouer Y ™ette fon™tion jouer f—it —ppel à son tour à l— fon™tion ™h—rger Y une fois que l— fon™tion ™h—rger est terminéeD on retourne à l— fon™tion jouer Y une fois que l— fon™tion jouer est terminéeD on retourne —u m—in Y en(nD une fois le m—in terminéD il n9y — plus de fon™tion à —ppelerD le progr—mme s9—™hèveF €our  retenir l9ordre d—ns lequel les fon™tions ont été —ppeléesD votre ordin—teur ™rée une pile de ™es fon™tions —u fur et à mesure @(gF QHFTAF Figure QHFT ! v— pile d9—ppel des fon™tions —u fur et à mesure du progr—mme †oilà un exemple ™on™ret d9utilis—tion des pilesF qrâ™e à ™ette te™hniqueD votre ordin—E teur s—it à quelle fon™tion il doit retournerF sl peut empiler IHH fon™tions d9—0lée s9il le f—utD il retrouver— toujours le m—in en ˜—s 3 RWQ .LES PILES À quoi est-ce que tout cela peut bien servir.

LES PILES ET LES FILES Création d'un système de pile w—inten—nt que nous ™onn—issons le prin™ipe de fon™tionnement des pilesD ess—yons d9en ™onstruire uneF gomme pour les listes ™h—înéesD il n9existe p—s de système de pile intégré —u l—ng—ge gF sl f—ut don™ le ™réer nousEmêmesF gh—que élément de l— pile —ur— une stru™ture identique à ™elle d9une liste ™h—înée X typedef stru™t ilement ilementY stru™t ilement { int nom˜reY ilement Bsuiv—ntY }Y v— stru™ture de ™ontrôle ™ontiendr— l9—dresse du premier élément de l— pileD ™elui qui se trouve tout en h—ut X typedef stru™t €ile €ileY stru™t €ile { ilement BpremierY }Y xous —urons ˜esoin en tout et pour tout des fon™tions suiv—ntes X ! empil—ge d9un élément Y ! dépil—ge d9un élémentF †ous noterez queD ™ontr—irement —ux listes ™h—înéesD on ne p—rle p—s d9—jout ni de suppressionF yn p—rle d9empil—ge et de dépil—ge ™—r ™es opér—tions sont limitées à un élément pré™isD ™omme on l9— vuF einsiD on ne peut —jouter et retirer un élément qu9en h—ut de l— pileF yn pourr— —ussi é™rire une fon™tion d9—0™h—ge de l— pileD pr—tique pour véri(er si notre progr—mme se ™omporte ™orre™tementF ellonsEy 3 Empilage xotre fon™tion empiler doit prendre en p—r—mètre l— stru™ture de ™ontrôle de l— pile @de type €ileA —insi que le nouve—u nom˜re à sto™ker F 3 void empiler@€ile BpileD int nvxom˜reA { 3. des char. Je vous rappelle que nous stockons ici des int. On peut stocker n'importe quoi : des double. des chaînes. des tableaux ou même d'autres structures ! RWR . mais rien ne vous empêche d'adapter ces exemples avec un autre type de données.CHAPITRE 30.

De ce fait.LES PILES ilement Bnouve—u a m—llo™@sizeof@Bnouve—uAAY if @pile aa x…vv || nouve—u aa x…vvA { exit@iˆs„•pesv…‚iAY } nouve—uEbnom˜re a nvxom˜reY nouve—uEbsuiv—nt a pileEbpremierY pileEbpremier a nouve—uY } v9—jout se f—it en dé˜ut de pile ™—rD ™omme on l9— vuD il est impossi˜le de le f—ire —u milieu d9une pileF g9est le prin™ipe même de son fon™tionnementD on —joute toujours p—r le h—ut F 4 Dépilage ve rôle de l— fon™tion de dépil—ge est de supprimer l9élément tout en h—ut de l— pileD ç—D vous vous en doutiezF w—is elle doit —ussi retourner l9élément qu9elle dépileD ™9estEàEdire d—ns notre ™—s le nom˜re qui ét—it sto™ké en h—ut de l— pileF g9est ™omme ™el— que l9on —™™ède —ux éléments d9une pile X en les enlev—nt un à unF yn ne p—r™ourt p—s l— pile pour —ller y ™her™her le se™ond ou le troisième élémentF yn dem—nde toujours à ré™upérer le premierF xotre fon™tion depiler v— don™ retourner un int ™orrespond—nt —u nom˜re qui se trouv—it en tête de pile X int depiler@€ile BpileA { if @pile aa x…vvA { exit@iˆs„•pesv…‚iAY } int nom˜rehepile a HY ilement Belementhepile a pileEbpremierY if @pile 3a x…vv 88 pileEbpremier 3a x…vvA { nom˜rehepile a elementhepileEbnom˜reY pileEbpremier a elementhepileEbsuiv—ntY free@elementhepileAY } } return nom˜rehepileY 4. on ne doit pas créer de fonction pour insérer un élément au milieu de la pile. contrairement aux listes chaînées. RWS . Seule la fonction empiler permet d'ajouter un élément.

Les fonctions empiler et depiler susent à gérer une pile ! 6. LES PILES ET LES FILES yn ré™upère le nom˜re en tête de pile pour le renvoyer à l— (n de l— fon™tionF yn modi(e l9—dresse du premier élément de l— pileD puisque ™eluiE™i ™h—ngeF in(nD ˜ien entenduD on supprime l9—n™ienne tête de pile grâ™e à freeF Achage de la pile fien que ™ette fon™tion ne soit p—s indispens—˜le D elle v— nous être utile pour tester le fon™tionnement de notre pile et surtout pour  visu—liser le résult—tF 5 void —ffi™her€ile@€ile BpileA { if @pile aa x…vvA { exit@iˆs„•pesv…‚iAY } ilement B—™tuel a pileEbpremierY while @—™tuel 3a x…vvA { printf@47d’n4D —™tuelEbnom˜reAY —™tuel a —™tuelEbsuiv—ntY } } printf@4’n4AY gette fon™tion ét—nt ridi™ulement simpleD elle ne né™essite —u™une expli™—tion F in rev—n™heD ™9est le moment de f—ire un m—in pour tester le ™omportement de notre pile X 6 int m—in@A { €ile Bm—€ile a initi—liser@AY empiler@m—€ileD empiler@m—€ileD empiler@m—€ileD empiler@m—€ileD empiler@m—€ileD empiler@m—€ileD RAY VAY ISAY ITAY PQAY RPAY printf@4’nit—t de l— pile X’n4AY —ffi™her€ile@m—€ileAY printf@4te depile 7d’n4D depiler@m—€ileAAY 5.CHAPITRE 30. Et toc ! RWT .

LES FILES printf@4te depile 7d’n4D depiler@m—€ileAAY printf@4’nit—t de l— pile X’n4AY —ffi™her€ile@m—€ileAY } return HY yn —0™he l9ét—t de l— pile —près plusieurs empil—ges et une —utre fois —près quelques dépil—gesF yn —0™he —ussi le nom˜re qui est dépilé à ™h—que fois que l9on dépileF ve résult—t d—ns l— ™onsole est le suiv—nt X it—t de l— pile X RP PQ IT IS V R te depile RP te depile PQ it—t de l— pile X IT IS V R †éri(ez que vous voyez ˜ien ™e qui se p—sse d—ns ™e progr—mmeF ƒi vous ™omprenez ™el—D vous —vez ™ompris le fon™tionnement des piles 3 †ous pouvez télé™h—rger le projet ™omplet des piles si vous le désirezF £   gode we˜ X WQSHTS ¡ ¢ Les les ves (les ressem˜lent —ssez —ux pilesD si ™e n9est qu9elles fon™tionnent d—ns le sens inverse 3 Fonctionnement des les h—ns ™e systèmeD les éléments s9ent—ssent les uns à l— suite des —utresF ve premier qu9on f—it sortir de l— (le est le premier à être —rrivéF yn p—rle i™i d9—lgorithme FIFO @pirst sn pirst yutAD ™9estEàEdire  ve premier qui —rrive est le premier à sortir F sl est f—™ile de f—ire le p—r—llèle —ve™ l— vie ™our—nteF u—nd vous —llez prendre un RWU .

CHAPITRE 30.-) RWV . LES PILES ET LES FILES ˜illet de ™iném—D vous f—ites l— queue —u gui™het @(gF QHFUAF À moins d9être le frère du gui™hetierD vous —llez devoir f—ire l— queue ™omme tout le monde et —ttendre derrièreF g9est le premier —rrivé qui ser— le premier serviF Figure QHFU ! …ne (le d9—ttenteF ve premier —rrivé est le premier servi 3 in progr—mm—tionD les (les sont utiles pour mettre en —ttente des inform—tions d—ns l9ordre d—ns lequel elles sont —rrivéesF €—r exempleD d—ns un logi™iel de chat @type mess—gerie inst—nt—néeAD si vous re™evez trois mess—ges à peu de temps d9interv—lleD vous les en(lez les uns à l— suite des —utres en mémoireF †ous vous o™™upez —lors du premier mess—ge —rrivé pour l9—0™her à l9é™r—nD puis vous p—ssez —u se™ondD et —insi de suiteF ves événements que vous envoie l— ˜i˜liothèque ƒhv que nous —vons étudiée sont eux —ussi sto™kés d—ns une (leF ƒi vous ˜ougez l— sourisD un événement ser— généré pour ™h—que pixel dont s9est dépl—™é le ™urseur de l— sourisF v— ƒhv les sto™ke d—ns une (le puis vous les envoie un à un à ™h—que fois que vous f—ites —ppel à ƒhv•€ollivent F in gD une (le est une liste ™h—înée où ™h—que élément pointe vers le suiv—ntD tout ™omme les pilesF ve dernier élément de l— (le pointe vers x…vv @(gF QHFVAF 7 Figure QHFV ! ‚eprésent—tion d9une (le Création d'un système de le ve système de (le v— ressem˜ler à peu de ™hoses près —ux pilesF sl y — seulement quelques petites su˜tilités ét—nt donné que les éléments sortent de l— (le d—ns un —utre sensD m—is 7. Ou à SDL_WaitEvent : oui. . c'est bien ! Je vois que ça suit au fond de la classe.

LES FILES rien d9insurmont—˜le si vous —vez ™ompris les pilesF xous —llons ™réer une stru™ture ilement et une stru™ture de ™ontrôle pile X typedef stru™t ilement ilementY stru™t ilement { int nom˜reY ilement Bsuiv—ntY }Y typedef stru™t pile pileY stru™t pile { pile BpremierY }Y gomme pour les pilesD ™h—que élément de l— (le ser— de type ilementF À l9—ide du pointeur premierD nous disposerons toujours du premier élément et nous pourrons remonter jusqu9—u dernierF Enlage v— fon™tion qui —joute un élément à l— (le est —ppelée fon™tion  d9en(l—ge F sl y — deux ™—s à gérer X ! soit l— (le est videD d—ns ™e ™—s on doit juste ™réer l— (le en f—is—nt pointer premier vers le nouvel élément ™réé Y ! soit l— (le n9est p—s videD d—ns ™e ™—s il f—ut p—r™ourir toute l— (le en p—rt—nt du premier élément jusqu9à —rriver —u dernierF yn r—jouter— notre nouvel élément —près le dernierF †oi™i ™omment on peut f—ire d—ns l— pr—tique X void enfiler@pile BfileD int nvxom˜reA { ilement Bnouve—u a m—llo™@sizeof@Bnouve—uAAY if @file aa x…vv || nouve—u aa x…vvA { exit@iˆs„•pesv…‚iAY } nouve—uEbnom˜re a nvxom˜reY nouve—uEbsuiv—nt a x…vvY if @fileEbpremier 3a x…vvA GB v— file n9est p—s vide BG { GB yn se positionne à l— fin de l— file BG ilement Belemente™tuel a fileEbpremierY while @elemente™tuelEbsuiv—nt 3a x…vvA RWW .

LES PILES ET LES FILES { } } else GB v— file est videD notre élément est le premier BG { fileEbpremier a nouve—uY } elemente™tuel a elemente™tuelEbsuiv—ntY } elemente™tuelEbsuiv—nt a nouve—uY †ous voyez d—ns ™e ™ode le tr—itement des deux ™—s possi˜lesD ™h—™un dev—nt être géré à p—rtF v— di'éren™e p—r r—pport —ux pilesD qui r—joute une petite tou™he de di0™ultéD est qu9il f—ut se pl—™er à l— (n de l— (le pour —jouter le nouvel élémentF w—is ˜onD un petit while et le tour est jouéD ™omme vous pouvez le ™onst—terF XEA Délage ve dé(l—ge ressem˜le étr—ngement —u dépil—geF Ét—nt donné qu9on possède un pointeur vers le premier élément de l— (leD il nous su0t de l9enlever et de renvoyer s— v—leurF int defiler@pile BfileA { if @file aa x…vvA { exit@iˆs„•pesv…‚iAY } int nom˜rehefile a HY GB yn vérifie s9il y — quelque ™hose à défiler BG if @fileEbpremier 3a x…vvA { ilement Belementhefile a fileEbpremierY nom˜rehefile a elementhefileEbnom˜reY fileEbpremier a elementhefileEbsuiv—ntY free@elementhefileAY } } return nom˜rehefileY À vous de jouer ! sl rester—it à é™rire une fon™tion —ffi™herpileD ™omme on l9—v—it f—it pour les pilesF gel— vous permettr—it de véri(er si votre (le se ™omporte ™orre™tementF SHH .CHAPITRE 30.

LES FILES ‚é—lisez ensuite un m—in pour f—ire tourner votre progr—mmeF †ous devriez pouvoir o˜tenir un rendu simil—ire à ™e™i X it—t de l— file X R V IS IT PQ RP te defile R te defile V it—t de l— file X IS IT PQ RP À termeD vous devriez pouvoir ™réer votre propre ˜i˜liothèque de (lesD —ve™ des (™hiers fileFh et fileF™ p—r exempleF te vous propose de télé™h—rger le projet ™omplet de gestion des (lesD si vous le désirezF sl in™lut l— fon™tion —ffi™herpileF £   ¢gode we˜ X RTUVUW ¡ En résumé ! ves piles et les (les permettent d9org—niser en mémoire des données qui —rrivent —u fur et à mesureF ! illes utilisent un système de liste ™h—înée pour —ssem˜ler les élémentsF ! h—ns le ™—s des pilesD les données s9—joutent les unes —uEdessus des —utresF vorsqu9on extr—it une donnéeD on ré™upère l— dernière qui vient d9être —joutée @l— plus ré™enteAF yn p—rle d9—lgorithme vspy @Last In First Out AF ! h—ns les ™—s des (lesD les données s9—joutent les unes à l— suite des —utresF yn extr—it l— première donnée à —voir été —joutée d—ns l— (le @l— plus —n™ienneAF yn p—rle d9—lgorithme pspy @First In First Out AF SHI .

CHAPITRE 30. LES PILES ET LES FILES SHP .

10 000 cases ou plus encore ! SHQ . 1 000. Cela pose des problèmes de performance dès que la liste chaînée devient volumineuse. Leur gros avantage ? Elle permettent de retrouver instantanément un élément précis. Il faut parcourir la liste en avançant d'élément en élément jusqu'à trouver celui qu'on recherche. dorénavant.Chapitre 31 Diculté : Les tables de hachage L es listes chaînées ont un gros défaut lorsqu'on souhaite lire ce qu'elles contiennent : il n'est pas possible d'accéder directement à un élément précis. Elles sont basées sur les tableaux du langage C que vous connaissez bien. Imaginez une liste chaînée de 1 000 éléments où celui que l'on recherche est tout à la n ! Les tables de hachage représentent une autre façon de stocker des données. que la table contienne 100.

Ici. il est possible de stocker ce qu'on veut dans une liste. LES TABLES DE HACHAGE Pourquoi utiliser une table de hachage ? €—rtons du pro˜lème que peuvent nous poser les listes ™h—înéesF gellesE™i sont p—rti™uE lièrement souplesD nous —vons pu le ™onst—ter X il est possi˜le d9—jouter ou de supprimer des ™—ses à tout momentD —lors qu9un t—˜le—u est  (gé une fois qu9il — été ™rééF „outefoisD ™omme je vous le dis—is en introdu™tionD les listes ™h—înées ont qu—nd même un gros déf—ut X si on ™her™he à ré™upérer un élément pré™is de l— listeD il f—ut p—r™ourir ™elleE™i en entier jusqu9à ™e qu9on le retrouve 3 sm—ginons une liste ™h—înée qui ™ontienne des inform—tions sur des élèves X leur nomD leur âge et leur moyenneF gh—que élève ser— représenté p—r une stru™ture ileve F ƒi je veux retrouver les inform—tions sur vu™ hon™ieux d—ns l— (gF QIFID il v— f—lloir p—r™ourir toute l— liste pour se rendre ™ompte qu9il ét—it à l— (n 3 1 Figure QIFI ! €our retrouver vu™ hon™ieux d—ns l— listeD il f—ut l— p—r™ourir en entier en —n—lys—nt ™h—que élément à p—rtir du premier 3 Bien entendu.CHAPITRE 31. Si la liste contient 9 éléments. Comme je vous l'ai dit. Nous avons travaillé auparavant sur des listes chaînées qui contenaient des int. on dit que l'algorithme de recherche d'un élément a une complexité en O(n). 2. car il faut parcourir toute la liste chaînée pour retrouver un élément donné. pour évaluer l'ecacité d'un algorithme . Et le pire. il faudra 9 itérations au maximum pour retrouver un élément. même un pointeur vers une structure comme je le propose ici. si on avait cherché Julien Lefebvre. dans le pire des cas où celui-ci est à la n. cela aurait été beaucoup plus rapide puisqu'il est au début de la liste. c'est Luc. SHR . Néanmoins. 2 h—ns ™et exempleD notre liste ™h—înée ne ™ontient que qu—tre élémentsF v9ordin—teur retrouver— vu™ hon™ieux très r—pidement —v—nt que vous n9—yez eu le temps de dire  ouf F w—is im—ginez m—inten—nt que ™eluiE™i se trouve à l— (n d9une liste ™h—înée ™onten—nt IH HHH éléments 3 ge n9est p—s —™™ept—˜le de devoir p—r™ourir jusqu9à IH HHH éléments pour retrouver une inform—tionF g9est là que les t—˜les de h—™h—ge entrent en jeuF Qu'est-ce qu'une table de hachage ? ƒi vous vous souvenez ˜ienD les t—˜le—ux ne ™onn—iss—ient p—s ™e pro˜lèmeF einsiD pour —™™éder à l9élément d9indi™e P d—ns mon t—˜le—uD il me su0s—it d9é™rire ™e™i X 1. on doit toujours envisager le pire des cas.

on perd l'avantage des listes chaînées qui nous permettaient d'ajouter et de retirer des cases à tout moment ! in e'etD les listes ™h—înées sont plus )exi˜lesF ves t—˜le—uxD euxD permettent un —™™ès plus r—pideF ves tables de hachage ™onstituent quelque p—rt un ™ompromis entre les deuxF sl y — un déf—ut import—nt —ve™ les t—˜le—ux dont on n9— p—s ˜e—u™oup p—rlé jusqu9i™i X les ™—ses sont identi(ées p—r des numéros qu9on —ppelle des indicesF sl n9est p—s possi˜le de dem—nder à l9ordin—teur X  hisEmoi quelles sont les données qui se trouvent à l— ™—se 4vu™ hon™ieux4 F €our retrouver l9âge et l— moyenne de vu™ hon™ieuxD on ne peut don™ p—s é™rire X t—˜le—u‘4vu™ hon™ieux4“Y ge ser—it pourt—nt pr—tique de pouvoir —™™éder à une ™—se du t—˜le—u rien qu9—ve™ le nom 3 ih ˜ien —ve™ les t—˜les de h—™h—ge D ™9est possi˜leF 3 Puisque notre tableau doit forcément être numéroté par des indices. Comme tout ce que nous venons de voir récemment. en fait ? Mais dans ce cas. comment fait-on pour retrouver le bon numéro de case si on connaît seulement le nom  Luc Doncieux  ? fonne rem—rqueF in e'etD un t—˜le—u reste un t—˜le—u et ™eluiE™i ne fon™tionne qu9—ve™ des indi™es numérotésF sm—ginez un t—˜le—u ™orrespond—nt à l— (gF QIFP X ™h—que ™—se — un indi™e et possède un pointeur vers une stru™ture de type ileveF gel—D vous s—vez déjà le f—ireF ƒi on veut retrouver l— ™—se ™orrespond—nt à vu™ hon™ieuxD il f—ut pouvoir tr—nsformer son nom en indi™e du t—˜le—uF einsiD il f—ut pouvoir f—ire l9—sso™i—tion entre ™h—que nom et un numéro de ™—se de t—˜le—u X ! tulien vefe˜vre a H Y ! eurélie f—ssoli a I Y ! ‰—nn w—rtinez a P Y ! vu™ hon™ieux a QF yn ne peut é™rire t—˜le—u‘4vu™ hon™ieux4“ ™omme je l9—i f—it pré™édemmentF ge n9est p—s v—lide en gF 3. avec peu d'outils à la base. en C.QU'EST-CE QU'UNE TABLE DE HACHAGE ? int t—˜le—u‘R“ a {IPD UD IRD QQ}Y printf@47d4D t—˜le—u‘P“AY ƒi on lui donne t—˜le—u‘P“D l9ordin—teur v— dire™tement à l— ™—se mémoire où se trouve sto™ké le nom˜re IRF sl ne p—r™ourt p—s les ™—ses du t—˜le—u une à uneF Tu es en train de dire que les tableaux ne sont  pas si mauvais . Il s'agit simplement d'un concept. on peut créer beaucoup de choses ! SHS . On va réutiliser les briques de base du C que l'on connaît déjà pour créer un nouveau système intelligent. les tables de hachage ne font pas  partie  du langage C. Comme quoi.

LES TABLES DE HACHAGE Figure QIFP ! …n simple t—˜le—u ™onten—nt des pointeurs vers des stru™tures ileve v— question est X ™omment tr—nsformer une ™h—îne de ™—r—™tères en numéro c g9est toute l— m—gie du h—™h—geF sl f—ut é™rire une fon™tion qui prend en entrée une ™h—îne de ™—r—™tèresD f—it des ™—l™uls —ve™D puis retourne en sortie un numéro ™orrespond—nt à ™ette ™h—îneF ge numéro ser— l9indi™e de l— ™—se d—ns notre t—˜le—u @(gF QIFQAF Figure QIFQ ! v— fon™tion de h—™h—ge génère un indi™e ™orrespond—nt —u nom envoyé en p—r—mètre Écrire une fonction de hachage „oute l— di0™ulté ™onsiste à é™rire une fon™tion de h—™h—ge ™orre™teF gomment tr—nE former une ™h—îne de ™—r—™tères en un nom˜re unique c „out d9—˜ordD mettons les ™hoses —u ™l—ir X une t—˜le de h—™h—ge ne ™ontient p—s R ™—ses ™omme sur mes exemplesD m—is plutôt IHHD I HHH ou même plusF €eu importe l— t—ille SHT .CHAPITRE 31.

Plus besoin de parcourir toutes les cases ! 5.ÉCRIRE UNE FONCTION DE HACHAGE du t—˜le—uD l— re™her™he de l9élément ser— —ussi r—pide F sm—ginons don™ un t—˜le—u de IHH ™—ses d—ns lequel on v— sto™ker des pointeurs vers des stru™tures ileveF 4 ileveB t—˜le—u‘IHH“Y xous devons é™rire une fon™tion quiD à p—rtir d9un nomD génère un nom˜re ™ompris entre H et WW @les indi™es du t—˜le—uAF g9est là qu9il f—ut être inventifF sl existe des méthodes m—thém—tiques très ™omplexes pour  h—™her des donnéesD ™9estEàEdire les tr—nsformer en nom˜resF †ous pouvez inventer votre propre fon™tion de h—™h—geF s™iD pour f—ire simpleD je vous propose tout simplement d9—dditionner les v—leurs eƒgss de ™h—que lettre du nomD ™9estEàEdire pour vu™ hon™ieux f—ire l— somme suiv—nte X 5 9v9 C 9u9 C 9™9 C 9 9 C 9h9 C 9o9 C 9n9 C 9™9 C 9i9 C 9e9 C 9u9 C 9x9 yn v— toutefois —voir un pro˜lème X ™ette somme dép—sse IHH 3 gomme notre t—˜le—u ne f—it que IHH ™—sesD si on s9en tient à ç—D on risque de sortir des limites du t—˜le—uF €our régler le pro˜lèmeD on peut utiliser l9opér—teur modulo 7F †ous vous souvenez de lui c sl donne le reste de l— division 3 ƒi on f—it le ™—l™ul X 6 sommevettres 7 IHH F F F on o˜tiendr— for™ément un nom˜re ™ompris entre H et WWF €—r exempleD si l— somme f—it RQISD le reste de l— division p—r IHH est ISF v— fon™tion de h—™h—ge retourner— don™ ISF †oi™i à quoi pourr—it ressem˜ler ™ette f—meuse fon™tion X int h—™h—ge@™h—r B™h—ineA { int i a HD nom˜rer—™he a HY for @i a H Y ™h—ine‘i“ 3a 9’H9 Y iCCA { nom˜rer—™he Ca ™h—ine‘i“Y } nom˜rer—™he 7a IHHY } return nom˜rer—™heY 4. SHU . 6. En eet. mais elles sont trop poussées pour nous ici. la fonction de hachage nous retourne un indice : il sut de  sauter  directement à la case correspondante du tableau. On a donc vite fait de dépasser 100. Je vous rappelle que chaque lettre dans la table ASCII peut être numérotée jusqu'à 255. On dit que c'est une complexité en O(1) car on trouve directement l'élément que l'on recherche. Les algorithmes MD5 et SHA1 sont des fonctions de hachage célèbres.

LES TABLES DE HACHAGE we˜ X SUVRUW ¡ ƒi on lui envoie h—™h—ge@4vu™ hon™ieux4AD elle renvoie SSF eve™ h—™h—ge@4‰—nn w—rtinez4AD on o˜tient VHF qrâ™e à ™ette fon™tion de h—™h—geD vous s—vez don™ d—ns quelle ™—se de votre t—˜le—u vous devez pl—™er vos données 3 vorsque vous voudrez y —™™éder plus t—rd pour en ré™upérer les donnéesD il su0r— de h—™her à nouve—u le nom de l— personne pour retrouver l9indi™e de l— ™—se du t—˜le—u où sont sto™kées les inform—tions 3 7 £ ¢gode   Gérer les collisions u—nd l— fon™tion de h—™h—ge renvoie le même nom˜re pour deux ™lés di'érentesD on dit qu9il y — collisionF €—r exemple d—ns notre ™—sD si nous —vions un —n—gr—mme de vu™ hon™ieux qui s9—ppelle vu™ DoncueixD l— somme des lettres est l— mêmeD don™ le résult—t de l— fon™tion de h—™h—ge ser— le même 3 heux r—isons peuvent expliquer une ™ollisionF ! v— fon™tion de h—™h—ge n9est p—s très perform—nte F g9est notre ™—sF xous —vons é™rit une fon™tion très simple @m—is né—nmoins su0s—nteA pour nos exemplesF ! ve t—˜le—u d—ns lequel on sto™ke nos données est trop petitF ƒi on ™rée un t—˜le—u de R ™—ses et qu9on souh—ite sto™ker S personnesD on —ur— à ™oup sûr une ™ollisionD ™9estEàEdire que notre fon™tion de h—™h—ge donner— le même indi™e pour deux noms di'érentsF ƒi une ™ollision survientD p—s de p—nique 3 heux solutions s9o'rent à vous —u ™hoix X l9—dress—ge ouvert et le ™h—în—geF 8 L'adressage ouvert ƒ9il reste de l— pl—™e d—ns votre t—˜le—uD vous pouvez utiliser l— te™hnique dite du hachage linéaireF ve prin™ipe est simpleF v— ™—se est o™™upée c €—s de pro˜lèmeD —llez à l— ™—se suiv—nteF ehD elle est o™™upée —ussi c ellez à l— suiv—nte 3 einsi de suiteD ™ontinuez jusqu9à trouver l— pro™h—ine ™—se li˜re d—ns le t—˜le—uF ƒi vous —rrivez à l— (n du t—˜le—uD retournez à l— première ™—se et ™ontinuezF gette méthode est très simple à mettre en pl—™eD m—is si vous —vez ˜e—u™oup de ™olliE sionsD vous —llez p—sser ˜e—u™oup de temps à ™her™her l— pro™h—ine ™—se li˜reF sl existe des v—ri—ntes @h—™h—ge dou˜leD h—™h—ge qu—dr—tiqueF F FA qui ™onsistent à h—™her à nouve—u selon une —utre fon™tion en ™—s de ™ollisionF illes sont plus e0™—™es m—is plus ™omplexes à mettre en pl—™eF 7. Notez que SHA1 est aujourd'hui préférée à MD5 car c'est celle des deux qui en produit le moins.CHAPITRE 31. "Luc Doncieux"). SHV . Cela donnerait par exemple : infosSurLuc = rechercheTableHachage(tableau. Les fonctions MD5 et SHA1 mentionnées plus tôt sont de bonne qualité car elles produisent très peu de collisions. Je vous recommande de créer une fonction de recherche qui se chargera de hacher la clé (le nom) et de vous renvoyer un pointeur vers les données que vous recherchiez. 8.

GÉRER LES COLLISIONS Le chaînage …ne —utre solution ™onsiste à ™réer une liste chaînée à l9empl—™ement de l— ™ollisionF †ous —vez deux données @ou plusA à sto™ker d—ns l— même ™—se c …tilisez une liste ™h—înée et ™réez un pointeur vers ™ette liste depuis le t—˜le—u @(gF QIFRAF Figure QIFR ! ƒi deux éléments doivent être sto™kés —u même endroitD ™réez une liste ™h—înée 3 fien entenduD on en revient —u déf—ut des listes ™h—înées X s9il y — QHH éléments à ™et empl—™ement du t—˜le—uD il v— f—lloir p—r™ourir l— liste ™h—înée jusqu9à trouver le ˜onF s™iD ™omme vous le voyezD tout est —'—ire de ™ompromisF ves listes ™h—înées ne sont p—s toujours idé—lesD m—is les t—˜les de h—™h—ge ont —ussi leurs limitesF yn peut ™om˜iner les deux pour tenter de tirer le meilleur de ™h—™une de ™es stru™tures de donnéesF uoi qu9il en soitD le point ™ritique d—ns une t—˜le de h—™h—ge est l— fon™tion de h—™h—geF woins elle produit de ™ollisionsD mieux ™9estF À vous de trouver l— fon™tion de h—™h—ge qui ™onvient le mieux à votre ™—s 3 En résumé ! ves listes ™h—înées sont )exi˜lesD m—is il peut être long de retrouver un élément pré™is à l9intérieur ™—r il f—ut les p—r™ourir ™—se p—r ™—seF ! ves t—˜les de h—™h—ge sont des t—˜le—uxF yn y sto™ke des données à un empl—™ement déterminé p—r une fon™tion de h—™h—geF ! v— fon™tion de h—™h—ge prend en entrée une ™lé @exF X une ™h—îne de ™—r—™tèresA et retourne en sortie un nom˜reF ! ge nom˜re est utilisé pour déterminer à quel indi™e du t—˜le—u sont sto™kées les donnéesF ! …ne ˜onne fon™tion de h—™h—ge doit produire peu de ™ollisionsD ™9estEàEdire qu9elle doit éviter de renvoyer le même nom˜re pour deux ™lés di'érentesF ! in ™—s de ™ollisionD on peut utiliser l9—dress—ge ouvert @re™her™he d9une —utre ™—se li˜re d—ns le t—˜le—uA ou ˜ien le ™h—în—ge @™om˜in—ison —ve™ une liste ™h—înéeAF SHW .

LES TABLES DE HACHAGE SIH .CHAPITRE 31.

Index —dress—ge ouvert F F F F F F F F F F F F F F F F F F F F F SHV —dresseF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSI —lé—toire F F F F F 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 —llo™—tion dyn—mique F F F F F F F F F F F F F F F F PQS de t—˜le—uF F F F F F F F F F F F F F F F F F F F F F FPRS —nti—li—sing F F 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 eƒgss F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUH —ssem˜leur F F F F 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 ˜i˜liothèqueF F 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 ™h—îne de ™—r—™tères F F F F F F F F F F F F F IUT m—thém—tique F F F F F F F F F F F F F F F F F F F F UP ƒhvF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPWI st—nd—rdF F F F F F F F F F F F F F FIQSD PITD PWH tier™eF F F F F F F F F F F F F F F F F F F F F F F F F F F FPWH ˜in—ire F F F F F F F F F 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 ˜itm—pF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQR ˜lit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QPR fw€ F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQR ˜ooléen F F F F F F F 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 ˜ou™le F F F F F F F F 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 ˜re—k F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VW ˜u'er F F F F F F F F F F F F F F F F F F F F F F PSQD PURD QTH vid—geF F F F F F F F F F F F F F F F F F F F F F F F F F FPUW ˜u'er over)ow F F F F F F F F F F F F F F F F F F F F F F F PUS g FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF V gCC F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VD UI gVWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITP gWWF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FITP C B A ™—ll˜—™kF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRPI ™—rré F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR ™eil F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR ™h—în—ge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHW ™h—îne de ™—r—™tèresF F F F F F F F F F F F F F F F F FIUP initi—lis—tionF F F F F F F F F F F F F F F F F F F F FIUQ ™h—rF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSRD IUH t—˜le—u deF Fvoir ™h—îne de ™—r—™tères ™ode sour™e F F F F 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: :flo™ksF F F F F F F F F F F F F F F F F F F F F F F F F FIQ ™ollision F F F F F F F F F F F F F F F F F F F F QWQD QWUD SHV ™omment—ire F F 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 ™ompil—teurF 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 ™ompil—tionF F F F F F F F F F F F F F F F F F F F F F F FUD IQT ™omplexité F F F F F F F F F F F F F F F F F F F F F F SHRD SHU ™on™—tén—tion F F F F F F F F F F F F F F F F F F F F F F F F IVH ™onditionF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUV ™onsoleF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQQ ™onst—nte F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SV ™osF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUS g€… F F F F F F F F F F F F F F F F F F F F F voir pro™esseur dé˜ogueur F F F F 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 dé™rément—tionF F F F F F F F F F F F F F F F F F F F F F F FUI dé(l—ge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHH de(ne F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IWH dép—ssement de mémoire F F F F F F F F F F F F F PUS dépil—geF F F F F F F F F F F F F F F F F F F F F F F F FRWHD RWS dire™tive de prépro™esseur F F F F F F F F QTD IVV disque dur F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV division F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TU resteF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FTV do while F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WU D SII .

INDEX dou˜le F F F F F F F F 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 fput™F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPQ dou˜le ˜u'eringF F F F F F F F F F F F F F F F F F F F F FQTH fputsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPPR free F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRP pree„ype F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPT E éditeur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IP fs™—nf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQH éditeur de liens F F F F F F F F F F F F F F F F F F F F F F IQT fseek F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQP else F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VH ftellF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPQI else if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VI fuite mémoire F F F F F F F F F F F F F F F F F F F F F F F F PPQ empil—ge F F F F F F F F F F F F F F F F F F F F F F F F RWHD RWR G en(l—ge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWW génér—tion —lé—toire F F F F F F F F F F F F F F F F F F IHQ énumér—tion F F F F F F F F F F F F F F F F F F F F F F F F F PII environnement de développementF F F F F FIP getsF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPUT iyp F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPUD PVQ q€v F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWI événement F F F F F F F F F F F F F F F F F F F F F F F F F F F QSP H exit F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRP h—™h—geF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSHT iˆs„•pesv…‚i F F F F F F F F F F F F F F F F F F F F QIH SHR iˆs„•ƒ…ggiƒƒ F F F F F F F F F F F F F F F F F F F F QIH h—™h—ge @t—˜le deAF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFSHV h—™h—ge liné—ireF F exp F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US he—der F F F F F F F F F F F F F F F F F F F F F F F F F F IQHD IVV f—˜sF F F F F F F F F F 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 f™lose F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPI fget™ F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPU fgets F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPVD PUU (™hierF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPIS renommer F F F F F F F F F F F F F F F F F F F F F F F PQQ supprimer F F F F F F F F F F F F F F F F F F F F F F F PQR pspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWU (leF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRWU )—gF F F F F F F F F F F F F F F F F F F F F F F F FQHUD QIID QUR testerF F F F F F F F F F F F F F F F F F F F F F F F F F F FQUR )o—t F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR )oor F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR pwyhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FRRR fo™usF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQUQ fon™tionF F F F F 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 ˜loqu—nte F F F F F F F F F F F F F F F F F F F F F F F RIT lo™—le F F F F F F F F F F F F F F F F F F F F F F F F F F F IRI pointeur deF F F F F F F F F F F F F F F F F F F F F FRPI portée F F F 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 st—tique F 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 poli™e fopen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PIU for F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WV fprintf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PPS p€ƒ F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RIW SIP F shiF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIP if F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UV ifdef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IWU ifndef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IWU im—ges p—r se™ondeF F F F F F F F F F F F F F F F F F FRIW in™lude F F F F F F F F F F F F F F F F F F F F F F F F F F F QTD IVV in™lusion in(nie F F F F F F F F F F F F F F F F F F F F F F IWV in™rément—tion F F F F F F F F F F F F F F F F F F F F UHD WW indi™e F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITI instru™tion F F F F F F F F F F F F F F F F F F F F F F F F F F F F QU int F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SR keysym F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QSV l—ng—ge ˜in—ire F 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 l—ng—ge 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 l—ng—ge 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 l—ng—ge de progr—mm—tion F F F F F F F F F F F F F T vq€vF F F F F F F F F F F F F F F F F F F F F F F F F F FPWID RRR li˜r—irieF F F F F F F F F F F F F F F F Fvoir ˜i˜liothèque vspy F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWH linkerF F F F F F F F F F F F F F F Fvoir éditeur de liens liste ™h—înéeF F F F F F F F F F F F F F F F F F F F F F F F F FRUV log F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US L K I .

INDEX longF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSR ‚qfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQPH m—™roF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIWQ m—in @fon™tionA F F F F F F F F F F F F F F F F F F F F F F F QU m—llo™ F F F F F F F 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 m—thFhF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FUQ whSF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FSHU mémoire —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 dép—ssementF F F F F F F F F F F F F F F F F F F F FPUS v—leur F F F F F F F F F F F F F F F F F F F F F F F F F F F F SI vive F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV wshs F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RSU modulo F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TV multitâ™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 RIQ x…vv F F F F F F F 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 p—r—mètreF F F F F F F F F F F F F F F F F F F F F F FIIPD IIQ pile F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWH pointeur F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRW de fon™tion F F F F F F F F F F F F F F F F F F F F F F RPI de stru™ture F F F F F F F F F F F F F F F F F F F F F PHV poli™e F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RQH portée F F F F F F F 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 prépro™esseur F F F F F F F F F F F F F F F F F F F IQTD IVU ™ondition F F F F F F F F F F F F F F F F F F F F F F F F IWT ™onst—nte deF F F F F F F F F F F F F F F F F F F F FIWH printfF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQWD SW pro™esseur ™onsomm—tion F F F F F F F F F F F F F F RIPD RIV progr—mm—tionF 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 puiss—n™e F F F F F 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—™ine ™—rrée F F 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 mémoire vive r—nd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ registre F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RV returnF F F F F F F F F F F F F F F F F F F F F F F F F F F FQUD IIQ R P N M s—isieF F F F F F F F F 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 s™—nf F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TID PUR ƒhv F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PWI ™ouleur F F F F F F F F F F F F F F F F F F F F F F F F F F QIW inst—ll—tion F F F F F F F F F F F F F F F F F F F F F F PWS surf—™e F F F F F F F F F F F F F F F F F F F F F F F F F F QIU télé™h—rgement F F F F F F F F F F F F F F F F F F PWR ƒhv•flitƒurf—™e F F F F F F F F F F F F F F F F F F F F QPR ƒhv•hel—yF F F F F F F F F F F F F F F F F F F F F F F F F FRIP ƒhv•plip F F F F F F F F F F F F F F F F F F F F F F F F F F F QTR ƒhv•qet„i™ks F F F F F F F F F F F F F F F F F F F F F F RIR ƒhv•sm—ge F F F F F F F F F F F F F F F F F F F F F F F F F QRP ƒhv•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 RPT set€ixel F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RTV ƒreI F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SHU sin F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F US sizeof F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PQT soko˜—nF F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQUV spe™tre sonoreF F F F F F F F F F F F F F F F F F F F F F F FRTS sprintf F F F F F F F F F F F F F F F F F F F F F F F F F F IVSD RQV sprite F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QVH sqrt F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F UR sr—nd F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IHQ stderrF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQHW stdinF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVH str™—t F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVH str™hr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVP str™mpF F F F F F 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 str™pyF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FIUV stre—ming F F F F F F F F F F F F F F F F F F F F F F F F F F F F RSP string F F F F F F F F F F F voir ™h—îne de ™—r—™tères stringFh F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUT strlen F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IUT strp˜rk F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVR strstr F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IVR strtodF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPVS strtol F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PVQ stru™tureF F F F F F F F F F F F F F F F F F F F F F F F F F F F FPHP initi—lis—tionF F F F F F F F F F F F F F F F F F F F FPHU pointeur deF F F F F F F F F F F F F F F F F F F F F FPHV surf—™eF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FQIU swit™hF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FVU SIQ S .

INDEX t—˜le de h—™h—ge F F F F F F F F F F F F F F F F F F F F F SHR t—˜le—u F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITH à t—ille dyn—miqueF F F F F F F F F F F F F F FITP ˜idimensionnel F F F F F F F F F F F F F F F F F F QVV indi™e F F F F F F F F F F F F F F F F F F F F F F F F F F F ITI initi—lis—tionF F F F F F F F F F F F F F F F F F F F FITR t—n F F F F F F F F F F F 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 tern—ire F F F F F F F 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 ti™k F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RIR timer F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RPH type personn—lisé F F F F F F F F F F F F F F F F F F F F PHP typedef F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHR unsigned F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SS v—leurF F F F F F F F 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 v—ri—˜le F F F F F F F 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 —'e™t—tion 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 dé™l—r—tion F F F F F F F F F F F F F F F F F F F F F F F SS glo˜—le F F 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 portée F F F 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 st—tique F 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 †isu—l gCC ixpress F F F F F F F F F F F F F F F F F F IW void F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IIP voidB F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PRI whileF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FWR ˆ™odeF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FPS X W V U T SIR .

.

Notes .

Notes .

Notes .

Notes .

Notes .

Notes .

.

.

.

.

.

.

2009 Conception couverture : Fan Jiyong Illustrations chapitres : Yannick Piault Mario est une marque déposée de Nintendo Corporation Visual Studio est une marque déposée de Microsoft Corporation Google est une marque déposée de Google Corporation Vue et Vue d'Esprit sont des marques déposées de e-on Software .Dépôt légal : novembre 2009 ISBN : 978-2-9535278-0-3 Code éditeur : 978-2-9535278 Imprimé en France Achevé d'imprimer le 1 er février 2010 (2 nde impression) sur les presses de ALBEDIA Imprimeurs (Aurillac) Imprimé sur papier PEFC issu de forêts gérées durablement N° PEFC : 10-31-1446 ALBEDIA Imprimeurs est agréée IMPRIM'VERT Mentions légales : Crédit photo Mathieu Nebra 4 e de couverture : Xavier Granet .

Sign up to vote on this title
UsefulNot useful