🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #15477

Re: conjugaison et autres exos sur les chaines [Was : Un système de conj...]

#15477
From: Antoine Leca
Date: Thu, 22 Sep 2005 15:00
96 lines
6017 bytes
En <news:mn.b3997d59480be176.31483@laposte.net>,
    Pierre Maurette va escriure:
> Je savais que le passage par les double �tait foireux, je suis all� au
> plus rapide en utilisant un truc abominable, j'ai test� aux limites
> :-(

Avec quelle machine, quelle compilo, quelle libc ?
Chez moi (P4, gcc/MingW, MSVCRT, en magouillant pour utiliser les double et
sqrt()), c'est off by 1...


> const uintmax_t borne =
>    UINTMAX_MAX >> (sizeof(UINTMAX_MAX) * CHAR_BIT / 2);
>
> Je ne sais pas si c'est toujours bon.

C'est nettement moins mauvais. Cela va foir� sur une machine avec un num�ro
impair de bits, mais je ne pense pas que ce soit un souci. Cela va foirer
aussi sur une machine qui a des bits inutilis� (en d'autres termes,
sizeof(uintmax_t)*CHAR_BIT n'est PAS le nombre de bits significatifs, il y
aurait du remplissage interne); pas courant du tout, mais cela peut arriver.


> Il faut quand m�me se rappeler que l'existaence d'un type de
> <inttypes.h> induit des garanties quant � son format.
> Pas de padding, et compl�ment � 2 pour les sign�s.

SEULEMENT pour les types intN_t. Les autres, intmax_t ou uint_atleastN_t
etc., n'ont pas ces contraintes et poeuvent ne pas les respecter. Quant aux
machines qui ne remplissent pas les contraintes (genre PDP-10 ou Unisys), il
leur suffit de ne _pas_ fournir les types intN_t, ce qui fera foirer les
programmes qui exigent/s'attendent � une machine � r�guli�re �.


>> Tu peux faire la m�me chose avec
>>         pvaleur+=strcpsn(pvaleur, "- \f\n\r\t\v");
>> L'avantage, c'est que comme ce n'est pas � �vident �, tu te sens
>> oblig� de mettre un commentaire, qui pourrait faire comprendre
>> l'utilit� de cette op�ration (il se trouve que j'ai une id�e du
>> pourquoi, mais pas forc�ment tous ceux qui nous lisent).
> Certes. C'�tait un peu un gag.

strcspn() (oui, c'�tait un gag, mais de ma part) ou le test pour supprimer
le signe - (qui a son importance, si tu le sautes cela va faire des trucs
bizarres.)


>>>   entier = strtoumax(pvaleur, NULL, 0);
>>
> Je me suis tromp� sur le sens du 0, j'aurais
> du utiliser 10, et modifier d'ailleurs le texte dans usage().

Il faut utiliser le second param�tre, et agir si strtoxxx() n'a pas su
convertir la totalit� de l'argument...


>>>   if(errno || (entier > borne))
>>>             puts("Oh my God, c'est h�naurme !");
>>
>> Ou bien sqrtl a eu un probl�me...
> Oui. J'ai �t� tent� par un if ((errno == ERANGE)...

Mauvaise id�e.

D'abord, si tu veux utiliser errno, en dehors d'#inclure <errno.h> sinon �a
hurle, il faut toujours le remettre � 0 avant l'op�ration que tu veux
tester. On ne sait jamais ce qui peux tra�ner, ici l'appel ant�rieur �
sqrt() semble inoffensif mais ...

Ensuite, ne pr�suppose jamais que l'impl�mentation va respecter la norme si
par ailleurs tu peux �crire un code � peine diff�rent (ici, ne _pas_ tester
sp�cifquement ERANGE) qui peut rattraper au passage des petites
variations... donc exit le == ERANGE.

Enfin, en l'occurence le test de errno n'apporte rien: en cas de
d�bordement, strtoxxx() va renvoyer UINTmachin_MAX, qui va faire sauter le
cocotier de l'autre c�t�. Et le cas o� la conversion a loup� compl�tement
(return 0) n'est pas sens� positionner errno d'apr�s la norme (genre de cas
o� tu as une chance sur trois d'avoir l'impl�mentation qui se gourre).


>> � propos, que donne ton programme sur ta machine pour icarre
>> 4294967296 ?
> Pourquoi ? Il me donne ce que j'attendais, c'est � dire :
> Oh my God, c'est hainaurme !

Bon. Alors essaye de remplacer ton code par

  const uintmax_t borne = sqrt((double)UINTMAX_MAX);


>> Exercice compl�mentaire pour ceux qui n'ont rien �
>> faire : Expliquer pourquoi. ;-)


Antoine
Technical Details
Message-ID: <dgugtk$gr9$1@shakotay.alphanet.ch>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!news.moat.net!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail
References: <1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <mn.837a7d59123d924a.15512@YOURBRAnoos.fr> <432adddf$0$17220$8fcfb975@news.wanadoo.fr> <mn.84407d597cfa6e6e.15512@YOURBRAnoos.fr> <432b2a92$0$7861$8fcfb975@news.wanadoo.fr> <432c19e0$0$1710$8fcfb975@news.wanadoo.fr> <432cad90$0$27422$8fcfb975@news.wanadoo.fr> <432d1b7c$0$1743$8fcfb975@news.wanadoo.fr> <432d3117$0$1742$8fcfb975@news.wanadoo.fr> <mn.93877d590449a7bc.15512@YOURBRAnoos.fr> <432d7667$0$17248$8fcfb975@news.wanadoo.fr> <mn.94047d599f0cc076.15512@YOURBRAnoos.fr> <432da70c$0$1735$8fcfb975@news.wanadoo.fr> <mn.94c47d590202e83a.15512@YOURBRAnoos.fr> <43315679$0$27421$8fcfb975@news.wanadoo.fr> <mn.ad0b7d59687aaf3b.31483@laposte.net> <dgu24d$ma4$1@shakotay.alphanet.ch> <mn.b3997d59480be176.31483@laposte.net>

Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,b21b26167a936e28
X-Google-Attributes: gidf9822,public
X-Google-Language: FRENCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!news.moat.net!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail
From: "Antoine Leca" <root@localhost.invalid>
Newsgroups: fr.comp.lang.c
Subject: Re: conjugaison et autres exos sur les chaines [Was : Un système de conj...]
Date: Thu, 22 Sep 2005 17:00:01 +0200
Organization: Posted through ALPHANET (http://www.alphanet.ch/)
Lines: 97
Sender: antoinel@143.red-217-127-250.staticip.rima-tde.net
Message-ID: <dgugtk$gr9$1@shakotay.alphanet.ch>
References: <1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <mn.837a7d59123d924a.15512@YOURBRAnoos.fr> <432adddf$0$17220$8fcfb975@news.wanadoo.fr> <mn.84407d597cfa6e6e.15512@YOURBRAnoos.fr> <432b2a92$0$7861$8fcfb975@news.wanadoo.fr> <432c19e0$0$1710$8fcfb975@news.wanadoo.fr> <432cad90$0$27422$8fcfb975@news.wanadoo.fr> <432d1b7c$0$1743$8fcfb975@news.wanadoo.fr> <432d3117$0$1742$8fcfb975@news.wanadoo.fr> <mn.93877d590449a7bc.15512@YOURBRAnoos.fr> <432d7667$0$17248$8fcfb975@news.wanadoo.fr> <mn.94047d599f0cc076.15512@YOURBRAnoos.fr> <432da70c$0$1735$8fcfb975@news.wanadoo.fr> <mn.94c47d590202e83a.15512@YOURBRAnoos.fr> <43315679$0$27421$8fcfb975@news.wanadoo.fr> <mn.ad0b7d59687aaf3b.31483@laposte.net> <dgu24d$ma4$1@shakotay.alphanet.ch> <mn.b3997d59480be176.31483@laposte.net>
NNTP-Posting-Host: 143.red-217-127-250.staticip.rima-tde.net
Mime-Version: 1.0
Content-Type: text/plain;
 charset="iso-8859-15"
Content-Transfer-Encoding: 8bit
X-Trace: shakotay.alphanet.ch 1127401205 17257 217.127.250.143 (22 Sep 2005 15:00:05 GMT)
X-Complaints-To: usenet@alphanet.ch
NNTP-Posting-Date: Thu, 22 Sep 2005 15:00:05 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506