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 - Commentaires 2014-05-14T10:00:05+02:00 Gilles Blanc urn:md5:b402c09b50e67198753bdd4269dc5b19 Dotclear slides de la conférence GCC par Basile Starynkevitch - OlivierJ urn:md5:92561707c77e3e97a9293a5d8e1b8a62 2011-02-16T19:21:43+01:00 OlivierJ <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 Blanc urn:md5:19c87b0ef125afc7fc70f1196976d341 2010-08-24T12:04:17+02:00 Gilles Blanc <p>@Yoann Sculo: c'est loin d'être complet par rapport au catalogue, mais il y a déjà de quoi faire... &nbsp;:)</p> <p>@Bedo: mais de rien, c'est toujours un plaisir &nbsp;;)</p> cours de kernel Linux en ligne - Bedo urn:md5:9010c6bd517c5cfdae1dd69b2a9f10cd 2010-07-13T15:21:33+02:00 Bedo <p>Merci de faire ainsi de la pub pour mes œuvres ;-)</p> cours de kernel Linux en ligne - Yoann Sculo urn:md5:0a4f5a1b848aeda1d036cf84c466e04e 2010-06-26T12:21:55+02:00 Yoann 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éric urn:md5:edbf988ba2e1c23556ea393d1d507f6b 2010-02-26T12:29:19+01:00 Fré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 Blanc urn:md5:835e81bcf843a21f7214e4320ba2d3a1 2009-12-04T15:09:31+01:00 Gilles Blanc <p>:)</p> <p>Pointeur de fonction, quand tu nous tiens...</p> le code qui fait mal aux yeux du jour - Samuel Tardieu urn:md5:56149ae7681b2ac97fdab4f0bb6ede91 2009-12-02T19:13:35+01:00 Samuel 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 Blanc urn:md5:b31b53dd9200b08cd1b4a62fef081c4d 2009-12-02T16:00:40+01:00 Gilles Blanc <p>Je vais demander un DIF Erlang, on m'en parle tellement...&nbsp;&nbsp; :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 ?&nbsp; :D&nbsp; (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 Tardieu urn:md5:f1deaddd6ade03d5d3be12e7d2026fa8 2009-12-02T12:46:07+01:00 Samuel 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 Blanc urn:md5:bb82d071c136d8af17290dd55c442f54 2009-08-28T18:59:46+02:00 Gilles Blanc <p>Eh bien, tu t'es lâché dis-moi ! ^^&nbsp; 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 Foubet urn:md5:8ed4db9e4007ff40dd7f51f03cbeb9fd 2009-08-28T17:25:01+02:00 Patrick 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 &lt;stdio.h&gt;</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=&lt;%s&gt; b=&lt;%s&gt; ",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=&lt;256789&gt; b=&lt;256789&gt;<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&amp;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 Blanc urn:md5:b65fed26bf720f7b905f868b9e0d1afc 2009-08-27T11:40:28+02:00 Gilles 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 Foubet urn:md5:36eda3d9259d65482608334d76efb407 2009-08-27T11:15:26+02:00 Patrick 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 Foubet urn:md5:fd6721cdc4cf1a41d8f2b855e41221e0 2009-08-26T17:43:00+02:00 Patrick 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 Blanc urn:md5:069a7f1c6af78e9fe46935e5f1bbce41 2009-05-28T16:38:24+02:00 Gilles Blanc <p>Aaaahhh, bien vu l'expert !&nbsp; :)</p> au détour d'une macro crasseuse - Sam urn:md5:1a9dba419d64cd97a7b52ee845ec5ecd 2009-05-27T18:45:08+02:00 Sam <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 - Sam urn:md5:dbbf8c54ac5471165a019a176c7b2805 2009-05-27T18:31:41+02:00 Sam <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>