Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 222
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 224
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/public/lib.urlhandlers.php on line 65
Warning: Cannot modify header information - headers already sent by (output started at /home/gillesbld/www/weblog/inc/config.php:41) in /home/gillesbld/www/weblog/inc/clearbricks/common/lib.http.php on line 247 Embedded weblog - Tag - programmation - Commentaires2014-05-14T10:00:05+02:00Gilles Blancurn:md5:b402c09b50e67198753bdd4269dc5b19Dotclearslides de la conférence GCC par Basile Starynkevitch - OlivierJurn:md5:92561707c77e3e97a9293a5d8e1b8a622011-02-16T19:21:43+01:00OlivierJ<p>Très intéressante, la présentation de Basile Starynkevitch, ne serait-ce que le premier tiers sur les langages et les processeurs et leurs évolutions.</p>cours de kernel Linux en ligne - Gilles Blancurn:md5:19c87b0ef125afc7fc70f1196976d3412010-08-24T12:04:17+02:00Gilles Blanc<p>@Yoann Sculo: c'est loin d'être complet par rapport au catalogue, mais il y a déjà de quoi faire... :)</p>
<p>@Bedo: mais de rien, c'est toujours un plaisir ;)</p>cours de kernel Linux en ligne - Bedourn:md5:9010c6bd517c5cfdae1dd69b2a9f10cd2010-07-13T15:21:33+02:00Bedo<p>Merci de faire ainsi de la pub pour mes œuvres ;-)</p>cours de kernel Linux en ligne - Yoann Sculourn:md5:0a4f5a1b848aeda1d036cf84c466e04e2010-06-26T12:21:55+02:00Yoann Sculo<p>Ah merci pour l'info ! J'étais passé à côté de la discussion linkedIn.<br />
Sinon c'est super, je ne savais pas que Linagora publiait ses supports de formation comme Free Electrons</p>slides de la conférence GCC par Basile Starynkevitch - Frédéricurn:md5:edbf988ba2e1c23556ea393d1d507f6b2010-02-26T12:29:19+01:00Frédéric<p>Merci pour l'info. Les slides sont très intéressants.</p>le code qui fait mal aux yeux du jour - Gilles Blancurn:md5:835e81bcf843a21f7214e4320ba2d3a12009-12-04T15:09:31+01:00Gilles Blanc<p>:)</p>
<p>Pointeur de fonction, quand tu nous tiens...</p>le code qui fait mal aux yeux du jour - Samuel Tardieuurn:md5:56149ae7681b2ac97fdab4f0bb6ede912009-12-02T19:13:35+01:00Samuel Tardieu<p>Faire clignoter une led ? Je ne m'étais jamais posé la question, mais c'est trivial : <a href="http://paste.factorcode.org/paste?id=1048" title="http://paste.factorcode.org/paste?id=1048" rel="nofollow">http://paste.factorcode.org/paste?i...</a></p>
<p>Note la capture de "led" et "on" dans la closure du premier argument de setInterval(). Je ne trouve pas le code particulièrement inélégant. Même si je ne pratique que très rarement le Javascript, je pense que c'est un plutôt beau langage.</p>le code qui fait mal aux yeux du jour - Gilles Blancurn:md5:b31b53dd9200b08cd1b4a62fef081c4d2009-12-02T16:00:40+01:00Gilles Blanc<p>Je vais demander un DIF Erlang, on m'en parle tellement... :p</p>
<p>Bref, on aura deviné que si j'avais besoin de ça, c'est que je suis en train de faire du crasseux pour passer outre des bugs, qui sont induits... par un langage crasseux... Et je ne t'explique même pas l'idée de substitution pour résoudre le problème, elle est pire encore (n'empêche que pour le moment : bug IE non résolu, client pas content). Mais faire une tempo dans un langage de prog graphique, je ne vois pas le problème : la prog par callback au timeout, ça rappelle fortement Motif, et ses fabuleuses boucles de procédures faisant des callbacks sur elles-mêmes (oh, sans tenir compte du délai d'exécution, que j'avais en plus, miam les désynchros...). Comment fait-on clignoter simplement une LED en JS ? :D (puisque je faisais du GPIO jeudi dernier en Python ; ça au moins, je connais...).</p>le code qui fait mal aux yeux du jour - Samuel Tardieuurn:md5:f1deaddd6ade03d5d3be12e7d2026fa82009-12-02T12:46:07+01:00Samuel Tardieu<p>Le problème ici ne concerne pas les créateurs de Javascript, mais les utilisateurs qui ici utilisent du busy waiting.</p>
<p>D'autres très beaux langages comme Erlang ne disposent pas d'une fonction "sleep" non plus. L'idiome consiste à attendre un message qui ne peut pas arriver avec un timeout positionné sur le délai qui nous intéresse.</p>
<p>En Javascript, il suffit, si on a *vraiment* besoin d'attendre un temps donné, d'utiliser les fonctions de synchronisation idoines et les fonctionalités de gestion du temps comme les alarmes. C'est tout aussi propre que "sleep" et peut souvent révéler qu'en fait il n'y en a pas du tout besoin.</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:bb82d071c136d8af17290dd55c442f542009-08-28T18:59:46+02:00Gilles Blanc<p>Eh bien, tu t'es lâché dis-moi ! ^^ Tiens, <a hreflang="en" href="http://www.openbsd.org/cgi-bin/cvsweb/src/bin/date/date.c?rev=1.31;content-type=text%2Fx-cvsweb-markup" rel="nofollow">v'la le code</a>, la fonction setthetime qui utilise cette horreur vaut aussi le coup d'oeil...</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:8ed4db9e4007ff40dd7f51f03cbeb9fd2009-08-28T17:25:01+02:00Patrick Foubet<p>En fait, comme toujours sur un blog, on va à l'essentiel et on néglige les détails, c'est pourquoi souvent les commentaires qu'on y trouve sont mals perçus.<br />
Donc là, comme c'est le tien (de blog), j'ai un remords et je vais essayer de réparer mon manque d'explication (si j'y arrive) ;-)</p>
<p>Voici un petit programme, que j'appelle e.c, dans lequel j'ai défini :<br />
- la macro ATOI2 vue ci-dessus<br />
- la macro ATOI2a que j'ai proposée en échange<br />
- la macro ATOI2b qui est encore une autre version<br />
Dans un premier temps je n'utilise pas ces macros mais "atoi" de la librairie standard.</p>
<p>#define ATOI2(ar) ((ar) += 2, ((ar)[-2] - '0') * 10 + ((ar)[-1] - '0'))<br />
#define ATOI2a(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0')<br />
#define ATOI2b(ar) (((ar++)[0] - '0') * 10 + ((ar++)[0] - '0') )</p>
<p>#include <stdio.h></p>
<p>int main(int N, char*P[])<br />
{<br />
char t[10], *b;<br />
int i,j,k;<br />
strcpy(t,"256789");<br />
b=t;<br />
i = atoi(t); /* ligne 13 */<br />
j = atoi(b);<br />
k = atoi("791234"); /* ligne 15 */<br />
printf(" i=%d j=%d k=%d t=<%s> b=<%s>
",i, j, k, t, b);<br />
}</p>
<p>Je compile :<br />
$ cc -o e e.c<br />
Pas de problème particulier.<br />
J'exécute :<br />
$ ./e<br />
i=256789 j=256789 k=791234 t=<256789> b=<256789><br />
Rien que du classique.</p>
<p>Maintenant je remplace dans les lignes 13 à 15, atoi par ATOI2, macro qui ne travaille que sur les deux premiers caractères et qui en plus fait progresser le pointeur de 2 crans.</p>
<p>Je compile :<br />
$ cc -o e e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: incompatible types in affectation<br />
e.c:15: error: affectation of read-only location<br />
e.c:15: error: incompatible types in affectation</p>
<p>Hé oui ! car une des raisons est que l'on essaie d'accéder aux éléments d'une chaîne de caractère définie comme une constante (ligne 15).<br />
Ceci avec gcc peut se résoudre (bien que ce soit fortement déconseillé) par :<br />
$ cc -o e -fwritable-strings e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: incompatible types in affectation<br />
e.c:15: error: incompatible types in affectation</p>
<p>Il reste quand même que, selon l'implémentation faite par le compilateur, un tableau de caractères et une chaîne constante ne sont pas toujours assimilables à un pointeur !! (cf K&R pour les détails). On peut les utiliser pour initialiser un pointeur mais pas pour faire des opérations dessus.<br />
Certains compilateurs le permettent (comme par exemple le cc d'un Aix que j'ai utilisé dans les années 90) mais il ne faut pas compter dessus !!</p>
<p>Par contre, si on remplace, entre les lignes 13 et 15, atoi par ATOI2a on a bien le résultat sur les 2 premiers caractères mais le pointeur n'est pas décallé de 2 !! Il faut le faire à la main.</p>
<p>Pour bien enfoncer le clou, je propose une seconde alternance, qui fait la même chose que ATOI2 mais sans l'instruction ','. Si on remplace atoi par ATOI2b, on a, à la compilation :<br />
$ cc -o e e.c<br />
e.c: Dans la fonction « main »:<br />
e.c:13: error: wrong type argument to increment<br />
e.c:13: error: wrong type argument to increment<br />
e.c:15: error: wrong type argument to increment<br />
e.c:15: error: wrong type argument to increment</p>
<p>Ce qui confirme bien la raison décrite ci-dessus.<br />
On remarque au passage que l'utilisation des index négatifs ne perturbe pas le compilateur, et c'est normal.</p>
<p>Et voilà tout ce qui se cachait derrière mon laconique "avec un gcc 3.3.5 le code que tu signales ne passe pas" !</p>
<p>Comme quoi, on veut dire deux mots en passant et on y passe la soirée ...</p>
<p>Bien à toi</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:b65fed26bf720f7b905f868b9e0d1afc2009-08-27T11:40:28+02:00Gilles Blanc<p>Pourtant, c'est un gcc3.3.5 qu'il y a sur BSD 4.2 ; mais il faut dire qu'ils l'ont tellement bidouillé, aussi...</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:36eda3d9259d65482608334d76efb4072009-08-27T11:15:26+02:00Patrick Foubet<p>Autant pour moi !! Je voulais écrire :<br />
#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0')<br />
Comme quoi la critique est une arme à double tranchant ;-)</p>
<p>En tous cas, avec un gcc 3.3.5 le code que tu signales ne passe pas !!</p>au détour d'une macro crasseuse - Patrick Foubeturn:md5:fd6721cdc4cf1a41d8f2b855e41221e02009-08-26T17:43:00+02:00Patrick Foubet<p>Je ne sais pas ce que le programmeur d'OpenBSD a fumé avant d'écrire cela mais :<br />
#define ATOI2(ar) ((ar)[-2] - '0') * 10 + ((ar)[-1] - '0')<br />
est quand même plus simple, plus rapide et fonctionne avec tous les compilateurs ;-)</p>au détour d'une macro crasseuse - Gilles Blancurn:md5:069a7f1c6af78e9fe46935e5f1bbce412009-05-28T16:38:24+02:00Gilles Blanc<p>Aaaahhh, bien vu l'expert ! :)</p>au détour d'une macro crasseuse - Samurn:md5:1a9dba419d64cd97a7b52ee845ec5ecd2009-05-27T18:45:08+02:00Sam<p>Cela dit, aujourd'hui, il n'y aurait aucune raison de ne pas le coder comme une fonction :</p>
<p>static inline unsigned char atoi2(const char **ar);</p>
<p>Mais nous sommes en 2009, les compilateurs n'étaient probablement pas aussi efficace à l'époque où cette macro a été codée.</p>au détour d'une macro crasseuse - Samurn:md5:dbbf8c54ac5471165a019a176c7b28052009-05-27T18:31:41+02:00Sam<p>Pourtant, tu as probablement déjà utilisé la virgule comme opérateur, par exemple dans "i++, j++" comme troisième argument d'un "for".</p>
<p>Ce genre d'utilisations est assez fréquente si on ne veut pas utiliser les extensions de GCC qui permettent d'avoir des blocs "{}" renvoyant un résultat, similaires à une lambda expression et permettant même d'y mettre des boucles du coup.</p>