Obligement - L'Amiga au maximum

Vendredi 19 avril 2024 - 02:36  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : C - les pièges en C
(Article écrit par Batchman et extrait d'Amiga News - décembre 1990)


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 :

C

...n'a pas du tout le même sens que :

C

Si vous n'en êtes pas convaincu, allez voir dans cet article, ne prenez pas 20 000 FF.

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

Si la variable vaut 1, instructions1 est exécuté ; si elle vaut 2, instructions2 est exécuté, et ainsi de suite. Mais si vous oubliez les break, les instructions qui suivent sont aussi exécutées. Par conséquent, la construction suivante :

C

...est strictement équivalente à :

C

Pour plus de renseignements, ne manquez pas cet article, il y a de nombreux cadeaux à gagner.

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 ;

C

...réalise bien un test, l'expression suivante :

C

...effectue une affectation et un test : la variable reçoit valeur et suivant si cette valeur est nulle, ou pas, les instructions qui suivent le test sont exécutées. Ce qui n'est pas du tout le but recherché. Pour en savoir plus sur ces opérateurs, rendez-vous à cet article.

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 :

C

J comme Jobs (Steve)

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 :

C

Quant aux opérateurs de bits, ils calculent une valeur composée, bit par bit, du résultat de l'opération "ou" ou de l'opération "et" entre les paramètres. Exemple :

C

P comme pointeurs

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 :

C

Il y en a une qui déclare un tableau de pointeurs de caractères ; l'autre déclare un pointeur sur un tableau de caractères. Si vous ne savez pas les reconnaître, je vous conseille fortement une petite révision, sur le parcours d'A-News, au trou n°17 (cet article).

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.


[Retour en haut] / [Retour aux articles]