"Antoine Leca" wrote in message
news:cmnngg$tdh$En cmgg25$srs$, Charlie Gordon va escriure:
Evidemment, mais qui parle de malloc ?
Que se passe-t-il si n est piégé?
Mais pour ltostr, je suppose que ce que tu appelles un
valeur piégée de n est LONG_MIN...
veux-tu dire que snprintf ne sait pas faire ?
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
C'est lamentable.
standardiser sans mise en garde, c'est encourager l'usage.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
La version proposée de itoa() dans K&R est d'ailleurs beuguée
pour le cas de INT_MIN :
Où est le bogue?
Oui bien sûr, celui-là est connu.
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
"Antoine Leca" <root@localhost.gov> wrote in message
news:cmnngg$tdh$1@shakotay.alphanet.ch...
En cmgg25$srs$1@reader1.imaginet.fr, Charlie Gordon va escriure:
Evidemment, mais qui parle de malloc ?
Que se passe-t-il si n est piégé?
Mais pour ltostr, je suppose que ce que tu appelles un
valeur piégée de n est LONG_MIN...
veux-tu dire que snprintf ne sait pas faire ?
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
C'est lamentable.
standardiser sans mise en garde, c'est encourager l'usage.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
La version proposée de itoa() dans K&R est d'ailleurs beuguée
pour le cas de INT_MIN :
Où est le bogue?
Oui bien sûr, celui-là est connu.
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
"Antoine Leca" wrote in message
news:cmnngg$tdh$En cmgg25$srs$, Charlie Gordon va escriure:
Evidemment, mais qui parle de malloc ?
Que se passe-t-il si n est piégé?
Mais pour ltostr, je suppose que ce que tu appelles un
valeur piégée de n est LONG_MIN...
veux-tu dire que snprintf ne sait pas faire ?
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
C'est lamentable.
standardiser sans mise en garde, c'est encourager l'usage.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
La version proposée de itoa() dans K&R est d'ailleurs beuguée
pour le cas de INT_MIN :
Où est le bogue?
Oui bien sûr, celui-là est connu.
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
"Charlie Gordon" writes:fgets() date de la première libc,
Laquelle exactement ?
"Charlie Gordon" <news@chqrlie.org> writes:
fgets() date de la première libc,
Laquelle exactement ?
"Charlie Gordon" writes:fgets() date de la première libc,
Laquelle exactement ?
En cmnpeq$6ue$, Charlie Gordon va escriure:Evidemment, mais qui parle de malloc ?
Moi, quand je disais qu'une solution packagée (comme j'avais compris que
c'était ce que l'on voulait) serait lourde.
Évidemment, si c'est un simple remplaçant de snprintf("%ld", sz, n) avec la
base en plus, cela n'est plus un problème, mais ce n'est pas non plus aussi
intéressant, ÀMHA.
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
;-), même si je ne suis pas persuadé qu'une fonction supplètive de sprintf
recoive le même degré d'attention que cette dernière, au moins dans les
premières années de vie du standard (voir, par exemple, les « habiles »
différences sur le comportement de snprintf et de swprintf en cas de
débordements).
standardiser sans mise en garde, c'est encourager l'usage.
Peut être. En l'occurence, le bogue est tellement criant que ce n'est pas
évident. L'argument peut tenir pour strtok par exemple, mais là il y a bien
mise en garde.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des cycles en
éliminant le paramètre ?
</NAÏF>
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
Même en base 2, cela fait un nombre de 32768 bits pour n. Même à l'époque
(!), les processeurs ne manipulaient pas des quantités de cet ordre.
En cmnpeq$6ue$1@reader1.imaginet.fr, Charlie Gordon va escriure:
Evidemment, mais qui parle de malloc ?
Moi, quand je disais qu'une solution packagée (comme j'avais compris que
c'était ce que l'on voulait) serait lourde.
Évidemment, si c'est un simple remplaçant de snprintf("%ld", sz, n) avec la
base en plus, cela n'est plus un problème, mais ce n'est pas non plus aussi
intéressant, ÀMHA.
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
;-), même si je ne suis pas persuadé qu'une fonction supplètive de sprintf
recoive le même degré d'attention que cette dernière, au moins dans les
premières années de vie du standard (voir, par exemple, les « habiles »
différences sur le comportement de snprintf et de swprintf en cas de
débordements).
standardiser sans mise en garde, c'est encourager l'usage.
Peut être. En l'occurence, le bogue est tellement criant que ce n'est pas
évident. L'argument peut tenir pour strtok par exemple, mais là il y a bien
mise en garde.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des cycles en
éliminant le paramètre ?
</NAÏF>
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
Même en base 2, cela fait un nombre de 32768 bits pour n. Même à l'époque
(!), les processeurs ne manipulaient pas des quantités de cet ordre.
En cmnpeq$6ue$, Charlie Gordon va escriure:Evidemment, mais qui parle de malloc ?
Moi, quand je disais qu'une solution packagée (comme j'avais compris que
c'était ce que l'on voulait) serait lourde.
Évidemment, si c'est un simple remplaçant de snprintf("%ld", sz, n) avec la
base en plus, cela n'est plus un problème, mais ce n'est pas non plus aussi
intéressant, ÀMHA.
Et pour finir, si tu choisis la solution simple dans tous ces
cas-là, quel est l'avantage par rapport à la version évidente
programmée soi-même?
Sans doute moins de bugs ;-)
;-), même si je ne suis pas persuadé qu'une fonction supplètive de sprintf
recoive le même degré d'attention que cette dernière, au moins dans les
premières années de vie du standard (voir, par exemple, les « habiles »
différences sur le comportement de snprintf et de swprintf en cas de
débordements).
standardiser sans mise en garde, c'est encourager l'usage.
Peut être. En l'occurence, le bogue est tellement criant que ce n'est pas
évident. L'argument peut tenir pour strtok par exemple, mais là il y a bien
mise en garde.
Comment fais-tu dans le cas général si tu ne veux pas ramener la
bibliothèque mathématique au passage? Tu alloue sizeof(int) *
CHAR_BIT + 2 ?
Pas nécessairement, cela dépend de la base, qui est bien souvent
constante.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des cycles en
éliminant le paramètre ?
</NAÏF>
Mais il y en a un autre plus subtil dans reverse : cette fonction ne
marche pas pour des chaines de plus de INT_MAX caractères. Or à
l'époque, en mode 16 bits, c'était pas du tout impossible.
Même en base 2, cela fait un nombre de 32768 bits pour n. Même à l'époque
(!), les processeurs ne manipulaient pas des quantités de cet ordre.
snprintf() a eu une vie avant la norme ;-)
Les implémentations étaient incompatibles quant à la valeur de retour
en cas de troncature.
Il a bien fallu trancher.Il y a ainsi des différences entre versions
successives de la glibc par exemple.
Il y avait 3 possibilités :
1. renvoyer le nombre de caractères effectivement écrits avant le
' '. avantage: facile à implémenter.
inconvénient: il faut une autre méthode pour détecter la
troncature.
C'est très regrettable de n'avoir pas unifié le comportement...
J'imagine que le souci de compatibilité avec l'existant a primé ?
Personnellement, j'ai une préférence pour le cas 2. Et l'avoir
imposé pour snprintf() fait que l'implémentation dans le cas
swprintf() n'aurait pas dû être un obstacle, puisque les algorithmes
sont les mêmes... Gaby ou Antoine ont peut-être l'explication.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des
cycles en éliminant le paramètre ?
</NAÏF>
Eh bien oui !
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
snprintf() a eu une vie avant la norme ;-)
Les implémentations étaient incompatibles quant à la valeur de retour
en cas de troncature.
Il a bien fallu trancher.Il y a ainsi des différences entre versions
successives de la glibc par exemple.
Il y avait 3 possibilités :
1. renvoyer le nombre de caractères effectivement écrits avant le
' '. avantage: facile à implémenter.
inconvénient: il faut une autre méthode pour détecter la
troncature.
C'est très regrettable de n'avoir pas unifié le comportement...
J'imagine que le souci de compatibilité avec l'existant a primé ?
Personnellement, j'ai une préférence pour le cas 2. Et l'avoir
imposé pour snprintf() fait que l'implémentation dans le cas
swprintf() n'aurait pas dû être un obstacle, puisque les algorithmes
sont les mêmes... Gaby ou Antoine ont peut-être l'explication.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des
cycles en éliminant le paramètre ?
</NAÏF>
Eh bien oui !
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
snprintf() a eu une vie avant la norme ;-)
Les implémentations étaient incompatibles quant à la valeur de retour
en cas de troncature.
Il a bien fallu trancher.Il y a ainsi des différences entre versions
successives de la glibc par exemple.
Il y avait 3 possibilités :
1. renvoyer le nombre de caractères effectivement écrits avant le
' '. avantage: facile à implémenter.
inconvénient: il faut une autre méthode pour détecter la
troncature.
C'est très regrettable de n'avoir pas unifié le comportement...
J'imagine que le souci de compatibilité avec l'existant a primé ?
Personnellement, j'ai une préférence pour le cas 2. Et l'avoir
imposé pour snprintf() fait que l'implémentation dans le cas
swprintf() n'aurait pas dû être un obstacle, puisque les algorithmes
sont les mêmes... Gaby ou Antoine ont peut-être l'explication.
<NAÏF faux="oui">
Heu, si la base est bien souvent constante, pourrait-on gagner des
cycles en éliminant le paramètre ?
</NAÏF>
Eh bien oui !
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
Quelle mauvaise foi !
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
Quelle mauvaise foi !
dans le projet où la conversion doit être super rapide,
j'utilise une extension de gcc [...]
cela garde le code lisible et générique.
Je suis le seul à trouver qu'il y a quelque chose qui cloche, là ?
Quelle mauvaise foi !
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.
James Kanze writes:Gabriel Dos Reis writes:"Charlie Gordon" writes:
[...]
| > En ce qui concerne le itoa() classique (issu de MS-DOS je
| > pense), cet équivalent simple n'existe pas, ou plutôt on en
| > revient à sprintf() et un calcul de la longueur de la chaîne en
| > fonction des propriétés des types entiers; et quand tu en es là,
| > utiliser sprintf ou autre chose devient anecdotique, sans parler
| > de la lourdeur.
| Je ne crois pas que cet argument tienne : le fait qu'il existait
| déjà à l'époque une alternative correcte à gets(), en l'occurrence
| fgets() est la raison qui aurait dû conduire à exclure gets() de
| la norme ANSI.
Je crois que tu fais l'erreur colossale de croire que la norme était
écrite pour ne contenir que des choses « non bugguées ». Certains
aiment à dire que la charte du comité ANSI était de codifier la
partique existante, alors ... -- mais, en réalité c'est pas vrai, le
comité a fait mal d'inventions, y compris l'infame void* -> T* et
volatile.
La réalité est un peu plus complexe que ça, et codifier la pratique
existante faisait bien partie du cahier de charge. Mais c'est vrai que
dans le langage même, ils ont introduit un certain nombre d'innovations
dans le sens de plus de rigueur et de vérifications de côté du
compilateur.
Comme la conversion void* -> T* ?
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.
James Kanze <james.kanze@free.fr> writes:
Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
"Charlie Gordon" <news@chqrlie.org> writes:
[...]
| > En ce qui concerne le itoa() classique (issu de MS-DOS je
| > pense), cet équivalent simple n'existe pas, ou plutôt on en
| > revient à sprintf() et un calcul de la longueur de la chaîne en
| > fonction des propriétés des types entiers; et quand tu en es là,
| > utiliser sprintf ou autre chose devient anecdotique, sans parler
| > de la lourdeur.
| Je ne crois pas que cet argument tienne : le fait qu'il existait
| déjà à l'époque une alternative correcte à gets(), en l'occurrence
| fgets() est la raison qui aurait dû conduire à exclure gets() de
| la norme ANSI.
Je crois que tu fais l'erreur colossale de croire que la norme était
écrite pour ne contenir que des choses « non bugguées ». Certains
aiment à dire que la charte du comité ANSI était de codifier la
partique existante, alors ... -- mais, en réalité c'est pas vrai, le
comité a fait mal d'inventions, y compris l'infame void* -> T* et
volatile.
La réalité est un peu plus complexe que ça, et codifier la pratique
existante faisait bien partie du cahier de charge. Mais c'est vrai que
dans le langage même, ils ont introduit un certain nombre d'innovations
dans le sens de plus de rigueur et de vérifications de côté du
compilateur.
Comme la conversion void* -> T* ?
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.
James Kanze writes:Gabriel Dos Reis writes:"Charlie Gordon" writes:
[...]
| > En ce qui concerne le itoa() classique (issu de MS-DOS je
| > pense), cet équivalent simple n'existe pas, ou plutôt on en
| > revient à sprintf() et un calcul de la longueur de la chaîne en
| > fonction des propriétés des types entiers; et quand tu en es là,
| > utiliser sprintf ou autre chose devient anecdotique, sans parler
| > de la lourdeur.
| Je ne crois pas que cet argument tienne : le fait qu'il existait
| déjà à l'époque une alternative correcte à gets(), en l'occurrence
| fgets() est la raison qui aurait dû conduire à exclure gets() de
| la norme ANSI.
Je crois que tu fais l'erreur colossale de croire que la norme était
écrite pour ne contenir que des choses « non bugguées ». Certains
aiment à dire que la charte du comité ANSI était de codifier la
partique existante, alors ... -- mais, en réalité c'est pas vrai, le
comité a fait mal d'inventions, y compris l'infame void* -> T* et
volatile.
La réalité est un peu plus complexe que ça, et codifier la pratique
existante faisait bien partie du cahier de charge. Mais c'est vrai que
dans le langage même, ils ont introduit un certain nombre d'innovations
dans le sens de plus de rigueur et de vérifications de côté du
compilateur.
Comme la conversion void* -> T* ?
Ou comme l'introduction de « volatile » avec la sémantique qu'un objet
déclaré avec un type volatile pourrait voir sa valeur modifiée de
manière inconnue au compilateur ou pourrait avoir d'autres
« side effects » inconnus ? C'est vachement plus de vérification
et de rigeur ça.