🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#15474
From: Pierre Maurette
Date: Thu, 22 Sep 2005 13:21
148 lines
8380 bytes
Antoine Leca, le 22/09/2005, a �crit :
[...]
Vindiou !!! Des corrections de l'Emmanuel et de l'Antoine ! C'est la 
f�te au village ! J'va fair p�ter l'sauvignon et m'occuper d'la Marie, 
ten !

>> void usage(void)
>> {
>>   puts("[...]");
>>   exit(EXIT_SUCCESS);
>
> L'usage() est de ne pas indiquer cela comme un succ�s...
Ah, bon. Je pensais le contraire. Je pensais m�me l'avoir lu ici. En 
fait, je pensais que dans le contexte, je sors proprement apr�s avoir 
affich� mon message, et que vu de l'OS, le programme se sera termin� 
"normalement".
En d'autres termes, le programme a fait tout ce que je souhaitais, 
c'est l'utilisateur qui a d�conn�, et je lui ai signifi�.

Bien entendu, si le programme n'�tait pas une "commande" (utilis� au 
clavier), j'imaginerais d�finir un code de retour explicite, un 
EXIT_COMMANDERROR par exemple. Mais alors, quand j'affiche que le 
nombre est trop grand, dois-je renvoyer un EXIT_RANGEERROR ?

Je ne suis pas convaincu compl�tement, et je suis bien malheureux, 
parce que le bons sens veut que ce ne soit pas moi qui ait raison.

Il se trouve que je n'ai jamais exploit� de code de retour directement, 
hors des fonctions Windows:

unsigned long TermStatus;
CreateProcess(NULL,cmd.c_str(),NULL,NULL,false,0,NULL,NULL,&si,&pi);
do
  {
  GetExitCodeProcess(pi.hProcess, &TermStatus);
  }while(TermStatus == STILL_ACTIVE);


[...]
>
>> #include <errno.h>
>
> Quelle utilit� ?
Aucune.
Scorie d'une correction de derni�re seconde. C'�tait au d�part:
if((errno == ERANGE) || (entier > borne))



>> #include <inttypes.h>
>
>
> Contr�le C99 (__STDC_VERSION__>199901) avant d'utiliser <inttypes.h> de
> cette mani�re. Cet ent�te est pr�sent depuis de longues ann�es dans les
> environnements *nix, mais n'y d�finit qu'une petite partie de ce qui est
> dans le <inttypes.h> de C99, en gros les [u]intN_t.
Faut que je regarde �a de plus pr�s. Les types � taille exacte 
m'int�ressent, mais pas le C99 dans ce qu'il a de compatible avec rien 
(pour l'instant). J'essaie plut�t d'utiliser un tronc commun C90 et 
C++98, comme par exemple en castant le retour d'un malloc(). JE sais 
que c'est foireux, mais bon ...


>> int main(int argc, char * argv[])
>> {
>>   uintmax_t entier;
>>   char * pvaleur = NULL;
>>   const uintmax_t borne = sqrtl((long double)UINTMAX_MAX);
>
>  :-) En dehors du fait que tu passes un double � une fonction qui attend un
> long double, et que tu interpr�tes comme int cde qui est un long double
> (cela risque d'�tre rigolo, mais c'est facile � corriger), que se passe-t-il
> si UINTMAX_MAX est sup�rieur � [L]DBL_MAX ? Tu croises les doigts et tu
> esp�res que la conversion de l'infini renvoy� habituellement par sqrtl()
> dans un tel cas va �tre automatiquement traduit ?
>
> En fait, si le nombre de bits significatifs de UINTxxx_MAX est pair, cas
> courant, il se trouve que cette op�ration peut �tre facilement programm�e
> avec un d�calage tous les deux bits.
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 :-( 
sur un seul compilateur. Ce que j'avais en t�te, c'�tait bien d'arriver 
� 2^32 - 1, soit UINT32_MAX (par exemple), � partir de UINTMAX_MAX. 
Genre:
const uintmax_t borne =
   UINTMAX_MAX >> (sizeof(UINTMAX_MAX) * CHAR_BIT / 2);

Je ne sais pas si c'est toujours bon. 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. Ce qui 
me laisse un peu perplexe.

>>   while(pvaleur[0] == '-' || isspace(pvaleur[0])) pvaleur++;
>
> 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. Et puis je ne connais pas strcpsn(). Il 
se trouve que je je suis un peu les discussions r�currrentes sur les 
fonctions de m�moire et de cha�nes et leur cot� hyper dangereux, et que 
je me dis parfois qu'il serait souvent plus simple de faire vite fait 
un truc exactement adapt� � ce qu'on veut.


>>   entier = strtoumax(pvaleur, NULL, 0);
>
> Mmm.
> icarre 1e4 ne va pas faire ce qui est attendu, pas plus que icarre 012.
> icarre 0x64 peut surprendre aussi. icarre zero va renvoyer le bon r�sultat,
> mais c'est plut�t un hasard.
J'ai fait une connerie. Je me suis tromp� sur le sens du 0, j'aurais du 
utiliser 10, et modifier d'ailleurs le texte dans usage().


>>   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)...

>>   else
>>       printf("%" PRIuMAX "\n", entier * entier);
>>   return EXIT_SUCCESS;
>
> Autrement dit, tu retournes toujours "succ�s", que l'on ce soit tromp�
> d'arguments, que ce soit h�naurme, que le printf ait eu un probl�me ou
> quoique ce soit d'autre.
D�j� comment�. Sinc�rement, je n'ai jamais test� le retour du printf(). 
Si je le faisais, et que je d�cidais de sortir, je renverrais 
certainement un EXIT_FAILURE, ou le retour du printf(). Puisqu'il s'est 
pass� des trucs que j'ignore dans ce printf(), et que je ne ma�trise 
plus. Et, je me r�p�te, si j'affiche que le nombre saisi est trop 
grand, je ma�trise ce qui se passe.

> � propos, que donne ton programme sur ta machine pour icarre 4294967296 ?
> Exercice compl�mentaire pour ceux qui n'ont rien � faire : Expliquer
> pourquoi. ;-)
Pourquoi ? Il me donne ce que j'attendais, c'est � dire :
Oh my God, c'est hainaurme !
Si je force � l'affichage de entier * entier, j'ai bien 0. Et si je 
remplace par 4294967296, j'ai un gros nombre qui doit �tre le plus gros 
carr� parfait sous 64 bits. Non ?

-- 
Pierre Maurette
Technical Details
Message-ID: <mn.b3997d59480be176.31483@laposte.net>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!infeed-2.proxad.net!news18-e.free.fr!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>

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!news1.google.com!proxad.net!infeed-2.proxad.net!news18-e.free.fr!not-for-mail
Subject: Re: conjugaison et autres exos sur les chaines [Was : Un système de conj...]
From: "Pierre Maurette" <maurettepierre@wanadoo.fr>
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>
Newsgroups: fr.comp.lang.c
Message-ID: <mn.b3997d59480be176.31483@laposte.net>
X-Newsreader: MesNews/1.04.00.00
Date: Thu, 22 Sep 2005 15:21:57 +0200
MIME-Version: 1.0
X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}<qH-?#_Y$B9]$q1"~iUGtN#HVy?}7.`m&iKF>gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~
Reply-To: maurettepierre@wanadoo.fr
Content-Type: text/plain; charset="iso-8859-15"; format=flowed
Content-Transfer-Encoding: 8bit
X-Antivirus: avast! (VPS 0538-6, 21/09/2005), Outbound message
X-Antivirus-Status: Clean
Lines: 150
Organization: Guest of ProXad - France
NNTP-Posting-Date: 22 Sep 2005 15:20:22 MEST
NNTP-Posting-Host: 84.7.238.148
X-Trace: 1127395222 news18-e.free.fr 26362 84.7.238.148:3785
X-Complaints-To: abuse@proxad.net