|
|||||||||||||||||||||||||||||||||||||||||||
|
Afin de fêter dans la bonne humeur la fin de cette année 1990, j'ai pensé qu'il serait bon de s'accorder quelques vacances dans l'étude du langage C. Mais point de sports d'hiver : les séjours en altitude font absorber des rayonnements radioactifs d'origine cosmique d'environ 2000 Becquerel par semaine, dose qui, d'après une étude de spécialistes américains, augmente les risques de cancer de la manette de jeu d'environ 15%. D'autre part, on signale que, cette année, les yétis affamés, par un été sec, on tendance à se rapprocher des stations de sports d'hiver. J'en ai conclu qu'entre une chimiothérapie, toujours délicate sur un objet en plastique ; servir de réveillon à un yéti et se raconter de bonnes blagues, la dernière solution était de loin la meilleure. Je me suis donc permis de réaliser un petit bêtisier informatique, voire un alpha-bêtisier pas toujours informatique. Il aborde pratiquement toutes les fautes classiques et les pièges à éviter en C, ainsi que quelques sujets "périphériques". Attachez vos ceintures, c'est parti. A comme accolades Attention aux accolades : elles sont certes moins dangereuses que les vipères mais elles décrivent mieux le déroulement d'un programme. Elles délimitent les blocs, c'est-à-dire les séquences d'instructions qui doivent etre exécutées dans les structures de contrôle. Si vous ne les placez pas ou pas correctement, votre programme n'a plus du tout le même sens. Exemple : B comme break Non, il ne s'agit pas ici d'un véhicule mais d'une instruction qui permet de sortir des boucles (for, while et do) et aiguillages (switch .. case). Si son utilisation dans les boucles n'appelle pas de commentaire particulier, en revanche, le break est quasiment indispensable pour chaque cas, à l'intérieur d'un switch. Exemple : C comme compilateur Les éternels frères ennemis Lattice et Manx ne sont toujours pas réconciliés. Heureusement, ils n'en sont pas encore venus aux mains. Lequel est le meilleur ? Le Lattice, bien sûr, il est plus professionnel et conforme aux standards : oui, mais le Manx est plus rapide. Et alors, le Lattice produit un code plus optimisé ! Peut-être mais le Manx a un bien meilleur débogueur ! Pfff, et alors le Lattice, eh bien, il est moins cher, na ! Foutaises, le Manx, il a les includes précompilés !... Jetons un voile pudique sur ces disputes stériles. Faites comme moi : du BASIC. D'ailleurs, je n'ai jamais rien compris au C. D comme débogueur Puisqu'on en parle, celui du compilateur Lattice, bien qu'ambitieux, ne se révèle pas très performant, ni fiable. Au contraire, celui du Manx donne toute satisfaction, mais question prix, ce n'est pas la même planète. À propos de bogue (bug), qui signifie, entre autres, cafards, il paraît que l'origine du mot remonte à la préhistoire de l'informatique, où les ordinateurs occupaient des pièces entières, remplies de lampes. Les cafards ("bugs" en anglais) allaient s'y chauffer, et cramaient bien entendu, en faisant claquer les lampes. D'où un fonctionnement anormal et incompréhensible. Cela dit, si, sur Amiga, vos programmes ne donnent pas le résultat escompté, je vous déconseille d'y vaporiser du Baygon Vert... E comme égal Voici certainement le piège le plus vicieux de tout le langage C. Il faut en effet faire la différence entre "=" et "==". Le béotien moyen fera remarquer qu'elle n'est pas évidente et c'est pourquoi tous les débutants (même moi, c'est dire...) se sont un jour krashés à cause du "=". On ne le répètera jamais assez : "=" est l'opérateur d'affectation, "==" est le test d'égalité. Autrement dit, si ; F comme fonction (ou pointeur de fonction) Les pointeurs de fonction sont une possibilité fantastique offerte par le langage C. C'est très puissant, mais délicat à manier. Il ne faut pas faire n'importe quoi, du style leur affecter une valeur arbitraire, ou affecter une valeur à l'adresse qui est pointée. En effet, le pointeur désigne l'adresse du début du code de la fonction. Si vous mettez n'importe quoi à cette adresse, vous risquez fort de devoir affronter le gourou et, à mon avis, c'est lui qui aura le dernier mot. G comme GOTO (ou gourou) Ne pouvant me décider entre les deux pour figurer dans le bêtisier tellement l'un et l'autre y ont leur place, ils y sont tous les deux. GOTO pour commencer. Certainement l'instruction qui aura causé le plus grand nombre de bogues dans l'histoire du logiciel : un véritable holocauste. Je suis certain qu'on lui doit quelques petits krashs de fusées ou quelques faillites retentissantes. A proscrire absolument. A banir de tous vos programmes si vous voulez pouvoir en maîtriser l'évolution. Programmez structuré ! Quant au gourou, ce n'est certes pas le meilleur argument de vente de l'Amiga. Quand il agite son petit rectangle rouge clignotant en face de votre mine désemparée, il se moque de vous ! Si, si ! En effet, pour signaler une alerte irrécupérable, il exécute un petit bout de programme : donc il n'est pas si planté que ça. Croyez-vous qu'un ordinateur "professionnel" (moins puissant qu'un Amiga pour certains) se plante si vous lui faites faire une division par zéro, ou exécuter une instruction illégale ? Que nenni ! Remarquez, un gourou, ça a toujours plus de classe que des bombes... (ne croyez pas que je veuille ici relancer l'interminable querelle sur l'infériorité de l'Atari, surtout pas). H comme Hussein (Saddam) C'est parce qu'il estimait que le Koweit lui volait son pétrole qu'il l'a envahi. La morale est sauve. Ô tempora, Ô mores... I comme indentation Certes, il est possible de programmer comme un goret, de façon à ce qu'un texte C soit complètement incompréhensible, mais, à part des raisons tenant à la lutte contre l'espionnage technologique, je n'y vois pas beaucoup d'intérêt. Il y a donc des recettes simples pour rendre un programme facile et agréable à lire. La principale est l'indentation qui consiste à décaler le début de chaque ligne chaque fois que l'on rentre dans une boucle supplémentaine. Exemple : Le petit garagiste de Californie, qui a déjà à son actif l'Apple II, le Macintosh et le NeXT (excusez du peu), n'est pas un homme heureux : il aurait aimé inventer Amiga. Hélas, en ce qui concerne l'Amiga, c'est un autre J, Jay Miner, que l'on soupçonne d'être le papa. K comme Kernighan (Brian) Il serait injuste de ne pas accorder une mention spéciale à Brian Kernighan, sans qui l'Amiga ramerait peut-être avec son BASIC résident... Et la rubrique Coin C n'existerait pas non plus, quelle tristesse... Comment occuperiez-vous vos soirées ? (et moi, alors ?) Car, et je le répète bien haut, ces faits étant trop souvent méconnus du Brian Kernighan est considéré comme le père du Langage C. Il ne l'eut pas non plus oublier Denis Ritchie, son fidèle compagnon, que d'aucuns considèrent comme sa mère. L comme librairie Librarie, pardon "bibliothèque" puisque c'est comme ça qu'il faut traduire le mot "library". M'en fous, je continue à écrire "librairie". Je déteste avoir tort, surtout quand les autres ont raison. M comme macropréprocesseur Une fois n'est pas coutume, je vais me décerner le bonnet d'âne. Dans le numéro 30 d'Amiga News (cet article), je clame haut et fort que le macropréprocesseur soumet au compilateur un fichier d'où ont été retirés les commentaires et où les définitions de macro ont été remplacées. J'ajoute que vous pouvez le constater par "lc1 -p..." si vous possédez le compilateur Lattice. J'ai été abusé, oui, c'est le mot. Ce compilateur, plus ou moins jeanfoutre au demeurant, a trompé ma confiance, et ce fut pour moi une terrible épreuve. C'est du moins ce qu'en pense mon psy. En fait, il se trouve que contrairement aux préprocesseurs C habituels, qui font bien ce que l'on attend d'eux, celui de Lattice se contente d'inclure les fichiers include. C'est finalement le compilateur qui se charge de l'expansion des macros et de retirer les commentaires. Cela dit, il n'y a aucune modification par rapport au fonctionnement que je décris dans cet article. Trève de discours superfétatoires, le petit problème que je vous narre n'a strictement aucune répercussion au point de vue de la programmation. N comme NeXT Ça fait bien un an que l'on n'a plus entendu parler du merveilleux cube noir. Peut-être n'est-il pas aussi sublime qu'espéré ? L'Amiga 3000 lui ferait-il de l'ombre ? O comme opérateurs Les opérateurs du langage C ne posent pas trop de problèmes, à part la petite subtilité suivante, assez meurtrière dusse-je avouer. En effet, parmi les opérateurs "ou" et "et", il ne tant pas confondre les opérateurs logiques "||" et "&&", et les opérateurs de bits "|" et "&". Les deux premiers réalisent respectivement un "ou" ou un "et" logique entre deux conditions, du type : Ah, les pointeurs... Sujet délicat s'il en est. C'est toute la puissance et le casse-tête du C. Aspirine recommandée. Voici deux déclarations : Q comme quantum Fabricant de disques durs bien connu (oui, je sais, ça n'est pas terrible mais c'est tout ce que j'ai trouvé pour Q. Et je suis terriblement angoissé à l'approche de W, X, Y et Z). R comme RefreshGadgets Il y a longtemps que je réservais une place particulière à cette fonction, certainement la plus boguée d'Intuition (en tout cas, j'espère qu'il n'y a pas pire). A sa décharge, il faut dire qu'elle est extrêmement complexe parce qu'elle doit faire beaucoup de choses. Hélas, le résultat est lui aussi à mettre à la décharge... Son plus gros défaut est de ne pas correctement redessiner les gadgets en fonction de leur état, ce qui empêche la gestion de l'exclusion mutuelle. Pour en savoir plus sur ce douloureux problème de société, qui fait couler beaucoup d'encre, reportez-vous à Télé 7 Jours n°13. S comme Sperry Sperry est la société qui a inventé l'Eniac, le premier véritable ordinateur, à la fin de la Deuxième Guerre Mondiale. Devant la compacité, la puissance et la fiabilité de ce monstre, son patron avait déclaré : "Les ordinateurs, ça n'est pas intéressant : on n'en fabriquera jamais plus de cinquante par an." Quel grand visionnaire ! Alors, du coup, ils n'ont pas investi et ont abandonné le marché à une PME, International Business Machines... T comme types Attention car les accidents sont ici typiques. Si le compilateur veille généralement au grain et vous empêche d'écrire trop de boulettes, son bouclier protecteur n'est pas infaillible. Par exemple, attention aux fonctions recevant des réels (float ou double) en paramètres : si vous ne passez pas en paramètre une variable du même type, il n'y a pas de conversion automatique de type. D'où très certainement le gros bogue des familles. Dans le cas de compilation séparée, on ne plus même plus parler de piège, mais carrément de mine antichar. Effectivement, l'éditeur de liens ne se préoccupe absolument pas des types des paramètres de fonctions ou de leurs valeurs de retour. Par conséquent, lorsque depuis un module objet (un ".o"), vous appelez une fonction située dans un autre module objet, faites très attention à ce que les variables passées en paramètres soient bien du même type que les paramètres des fonctions : d'autre part, la valeur de retour de la fonction, si elle existe, doit être du même type que la variable qui la reçoit. Simple, non ? Bon, je crois qu'on y reviendra parce j'en vois un ou deux qui n'ont pas saisi le subterfuge, et il paraît que ce sujet va tomber à l'exam... U comme Unix Dans le fond, AmigaOS est un petit Unix mono-utilisateur. Encore une fois, les PC avec leur MS-DOS plus proche du ZX81 que de l'Amiga, et l'Atari, font bien pale figure. Ceci dit, Commodore, des petits systèmes Unix personnels, ça ne serait pas bête... Umm ? C'est drôle, j'ai la vague impression d'avoir été entendu. À propos d'Amiga(D)OS, savez-vous quel nom il portait à l'origine ? Tripos. Je ne suis pas certain que ça aurait bien marché chez nous... V comme VSprite Rien n'est parfait dans le meilleur des mondes et, à ce titre, la documentation officielle de l'Amiga traitant des VSprites ou "sprites virtuels" est particulièrement inexacte et incomplète. Contrairement à l'excellente documentation d'Intuition, je lui décerne le bonnet d'âne 1990 (le prix spécial est pour Ayrton Senna). Faisaient également partie du jury d'attribution d'anciens lauréats du bonnet d'âne tels que le Colonel Khadafi, Jean-Pierre Papin, Jacques Médecin, Jean-Pierre Foucault et la marraine du journal, Vanessa Paradis. W comme WaitTOF Si vous trouvez que vos programmes tournent trop rapidement (on ne sait jamais, à notre époque, les gens ont tellement de problèmes), voici un moyen simple et redoutablement efficace pour les ralentir. Le but de la fonction "WaitTOF" est de suspendre le déroulement du programme jusqu'à ce que le spot de balayage soit arrivé en bas de l'écran. Ceci permet dans certains cas d'agir sur le graphisme, sans avoir de petits flashes dus à une modification de l'affichage au moment où le spot balaye. Mais attention, dans le cas d'animations rapides, répéter beaucoup de WaitTOF ralentit très sensiblement le programme. Si vous trouvez que vous programmes sont toujours trop rapides, vous pouvez aussi jeter votre carre 68030 et mettre à la place un 68000, bien que cette opération soit délicate et pose des problèmes de compatibilité, outre son prix exorbitant. X comme Xor Rien à voir avec mon héros favori de dessins animés (c'est vrai, enfin, à côté de lui, Ulysse et Capitaine Flamme ne sont que de charmants bambins). Xor, c'est une opération logique qui signifie "ou exclusif". On peut la résumer ainsi : VRAI ou exclusif VRAI = FAUX VRAI ou exclusif FAUX = VRAI FAUX ou exclusif VRAI = VRAI FAUX ou exclusif FAUX = FAUX En d'autres termes, le résultat n'est vrai que lorsque les opérandes sont différents. L'intérêt de cette formule, c'est qu'elle vous permet d'échanger deux variables sans utiliser de variable intermédiaire. Là où d'habitude vous écrivez : c = a; a = b; b = e; ...pour échanger "a" et "b" par l'intermédiaire de "c", vous pouvez écrire : a = a ^ b; b = b ^ a; a = a ^ b; Vérifiez, ça marche ! En fait, pour échanger deux variables, ça n'est pas très utile. Par contre, ça peut être très intéressant pour échanger de grandes tables qui prennent beaucoup de place (des bitmaps par exemple) sans en avoir une troisième. Notez tout de même qu'un tel échange est certainement moins rapide que par la méthode classique, puisque, à chaque fois on doit faire une opération logique, légèrement plus lente qu'une affectation. Mais d'un autre côté, ça n'a d'incidence que sur de très grandes tables (ce que suis sérieux tout d'un coup ! Ça m'étonnerait que ça dure...). Y comme Yannick Noah En fait, je ne vois pas très bien le rapport avec le C. Quoique. Ça lui aurait peut-être mieux réussi que le tennis. Z comme zygomatiques J'espère que les vôtres fonctionnent beaucoup à la lecture d'Amiga News. En tout cas, pour nous, c'est le cas et ça continuera d'être ainsi tant qu'il y aura des rigolos pour acheter ce journal et pour l'écrire.
|