OVH Cloud OVH Cloud

Beuuurk !

87 réponses
Avatar
Cyrille Szymanski
En me balladant tranquillement dans les sources de la libc de
FreeBSD, j'ai rencontré un petit bout de code effrayant au
détour de malloc.c :

/* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;

C'est pas très beau ça quand même, mais on dirait que ça
fonctionne... pour combien de temps ?

--
cns

10 réponses

5 6 7 8 9
Avatar
mips
On Tue, 27 Apr 2004 07:16:51 +0000 (UTC)
(Thomas Pornin) wrote:

Plutôt que de répéter toujours les mêmes arguments, vous devriez
tous aller lire :
[COUIC]

3. les divers exemples présentés dans le K&R.


for (i=0; i<lim-1 && (c=getchar())!='n' && c!= EOF; ++i)
s[i] = c;

Genre ca ?

Et ensuite, plutôt que de prêter allégeance à l'une de ces
différentes religions, essayez de réfléchir par vous-même.


C'est ce que je fais.

Pour l'exemple au-dessus ca se traduit par l'utilisation d'une boucle
while qui (toujours selon moi) est bien plus lisible.

mips

Avatar
mips
On Tue, 27 Apr 2004 10:55:05 +0200
Marwan Burelle wrote:

On Sat, 24 Apr 2004 18:29:59 +0200
mips wrote:

Comme quoi manipuler ce genre d'expression en faisant attention
aux effets de bord est loin d'être trivial.
Ce qui tombe pile poil dans mon discours.



Ben, non, justement ...

On a un cas parfait d'une simplification hâtive.


Ce qui tombe dans mon discours ce que sur une chose soit disant si
simple quelqu'un a quand meme reussi a se rater. Un volontaire pour
traiter Michel de neophyte ? :)

mips



Avatar
Arnaud Launay
Le Tue, 27 Apr 2004 18:48:34 +0200, mips écrivit:
Ce qui tombe dans mon discours ce que sur une chose soit disant si
simple quelqu'un a quand meme reussi a se rater. Un volontaire pour
traiter Michel de neophyte ? :)


Mips, tu es un neophyte.

Arnaud.

Avatar
Thierry Thomas
Mardi 27 avril 2004 à 16:38 GMT, mips a écrit :
Enfin, pour moi, ce n'est pas franchement un exemple particulier de
code illisible.


La encore j'ai un doute sur la comprehension de ce que j'appelle
"illisible".


#v+
int i,j,d;main(){for(;i<25;i++)for(jH;j;putchar(!j?10:" #"[(d<150&&d>81)||(d<150&&(abs(24-j)<2||(i>12&&(abs(j-i-12)<2||abs(48-j-i-12)<2))))]))d=(24-j)*(25-(--j))+(12-i)*(12-i);}
#v-

On peut faire beaucoup plus illisible (je le tiens de l'auteur de giram,
qui en a une petite collection), mais j'ai juste choisi celui-ci pour le
résultat.
--
Th. Thomas.


Avatar
mips
On Tue, 27 Apr 2004 18:07:32 +0000 (UTC)
Thierry Thomas wrote:

Mardi 27 avril 2004 à 16:38 GMT, mips a écrit :
Enfin, pour moi, ce n'est pas franchement un exemple particulier
de code illisible.


La encore j'ai un doute sur la comprehension de ce que j'appelle
"illisible".


#v+
int i,j,d;main(){for(;i<25;i++)for(jH;j;putchar(!j?10:"
#"[(d<150&&d>81)||(d<150&&(abs(24-j)<2||(i>12&&(abs(j-i-12)<2||abs(
#48-j-i-12)<2))))]))d=(24-j)*(25-(--j))+(12-i)*(12-i);} v-

On peut faire beaucoup plus illisible (je le tiens de l'auteur de
giram, qui en a une petite collection), mais j'ai juste choisi
celui-ci pour le résultat.


Oui mais la ce n'est plus du codage, c'est du vice ;)

mips



Avatar
mips
On Tue, 27 Apr 2004 19:09:45 +0200
Cyril Guibourg wrote:

Fais gaffe, avec Mipsounet, ce genre de remarque peut provoquer chez
lui un accès de colère incontrôlable qui le conduit a frapper les
gens.


J'evite avec sado-Arnaud. Avec lui c'est toujours sexuel ...

mips

Avatar
mips
On Tue, 27 Apr 2004 20:39:10 +0200
Cyril Guibourg wrote:

mips writes:

Oui mais la ce n'est plus du codage, c'est du vice ;)


C'est un truc de Perleux


Ah ! Pour une fois que ce n'est pas moi qui le dit :)

mips


Avatar
Arnaud Launay
Le Tue, 27 Apr 2004 20:40:02 +0200, Cyril Guibourg écrivit:
J'evite avec sado-Arnaud. Avec lui c'est toujours sexuel ...
Bof, en version SM tu peux toujours donner des baffes :-))



Ben oui mais non, parce que je suis juste S, j'ai laisse le M a
mips, d'ailleurs, a Mips, meme.

Arnaud.


Avatar
Cyrille Szymanski
On 2004-04-27, mips wrote:
for (i=0; i<lim-1 && (c=getchar())!='n' && c!= EOF; ++i)
s[i] = c;

Genre ca ?


Le C n'a a ma connaissance pas de moyen propre d'exécuter une séquence
A - test - (B - A - test)*

Pourtant ce genre de construction se rencontre très souvent (par
exemple comme ci-dessus) :
A (acquisition) : c=getchar(); ++i;
test : (c!='n' && c!=EOF && i<lim-1)
B (traitement) : s[i] = c;

En tout cas, même le code suivant me donne moins mal à la tête même si
c'est pas comme-ça que je l'écrirais :

for(i=0, c=getchar(); c!='n' && c!=EOF && i<lim-1; c=getchar())
s[i++] = c;


--
cns

Avatar
pornin
According to mips :
for (i=0; i<lim-1 && (c=getchar())!='n' && c!= EOF; ++i)
s[i] = c;

Genre ca ?


C'est un exemple à méditer. J'ai bien dit "méditer". Je n'ai pas dit
"copier". Ne pas copier aveuglément est l'essence même de la réflexion
personnelle.

Dans ce cas précis, je trouve le code assez clair : une boucle sur i
(de 0 à lim-2), on lit des caractères jusqu'à un retour à la ligne
ou la fin du fichier, et on les stocke dans le tableau s[].

Je n'ai pas de mal à lire ce code parce que les && sont bien visibles
(grâce aux espaces autour) et se lisent "naturellement" de gauche à
droite. Les "i=0", "i<lim-1" et "++i" sont idiomatiques d'une boucle
"for" et se reconnaissent "par réflexe" dès qu'on a fait un peu de C.


Pour l'exemple au-dessus ca se traduit par l'utilisation d'une boucle
while qui (toujours selon moi) est bien plus lisible.


Le plus lisible serait d'utiliser fgets() plutôt qu'une boucle à la
main : fgets(s, lim, stdin);
Ce serait aussi plus rapide (fgets() a accès aux structures internes
associées au "FILE *" utilisé, notamment les buffers).

Si je devais écrire la boucle (genre, on me demande de réimplémenter
fgets()), je le ferais probablement ainsi :

for (i = 0; i < (lim - 1); s[i ++] = c) {
c = getchar();
if (c == 'n' || c == EOF)
break;
}

parce que c'est la forme qui met en exergue le fait que la condition
principale est sur l'index "i", et que le fait de rencontrer un 'n'
ou un EOF est un "arrêt prématuré".


--Thomas Pornin

5 6 7 8 9