Gabriel Dos Reis wrote:Dennis M. Ritchie -- l'inventeur du langage C -- dans son bouquin «
The C Programming Language », aussi connu comme le « White Book » ©
1978, est quand à lui très clair sur le cast de char* vers le type
pointer idione.
Ce nos jours, quand on regarde par exemple sur f.c.l.c, les gens
déconseillent (assez unanimement) vivement le cast en sortie du malloc
(ce qui pose des problèmes puisque le code en question ne peut pas
alors être compilé par un compilateur C++). Quelqu'un a-t-il une idée
de quand (et pourquoi) la ligne officielle du parti de ne pas mettre
de cast est apparue ?
Gabriel Dos Reis wrote:
Dennis M. Ritchie -- l'inventeur du langage C -- dans son bouquin «
The C Programming Language », aussi connu comme le « White Book » ©
1978, est quand à lui très clair sur le cast de char* vers le type
pointer idione.
Ce nos jours, quand on regarde par exemple sur f.c.l.c, les gens
déconseillent (assez unanimement) vivement le cast en sortie du malloc
(ce qui pose des problèmes puisque le code en question ne peut pas
alors être compilé par un compilateur C++). Quelqu'un a-t-il une idée
de quand (et pourquoi) la ligne officielle du parti de ne pas mettre
de cast est apparue ?
Gabriel Dos Reis wrote:Dennis M. Ritchie -- l'inventeur du langage C -- dans son bouquin «
The C Programming Language », aussi connu comme le « White Book » ©
1978, est quand à lui très clair sur le cast de char* vers le type
pointer idione.
Ce nos jours, quand on regarde par exemple sur f.c.l.c, les gens
déconseillent (assez unanimement) vivement le cast en sortie du malloc
(ce qui pose des problèmes puisque le code en question ne peut pas
alors être compilé par un compilateur C++). Quelqu'un a-t-il une idée
de quand (et pourquoi) la ligne officielle du parti de ne pas mettre
de cast est apparue ?
"Michel Michaud" writes:Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pour des raisons historiques, la norme exige que les
représentations des void* et de char* soient identiques. Selon
la norme, il y a conversion en void* ; dans la pratique, une
conversion en void* et une conversion en char* font faire
exactement la même chose.
Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void*
est un char*. Et un char* est capable d'adresser n'importe quel
octet. Quand on convertit un T* en char*, on met les bits
selecteurs d'octet du char* à zéro. Quand on convertit un char*
en T*, on ignore les bits selecteurs d'octet. (Au moins, c'est
comme ça que ça passait dans le seul cas que je connais.)
"Michel Michaud" <mm@gdzid.com> writes:
Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pour des raisons historiques, la norme exige que les
représentations des void* et de char* soient identiques. Selon
la norme, il y a conversion en void* ; dans la pratique, une
conversion en void* et une conversion en char* font faire
exactement la même chose.
Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void*
est un char*. Et un char* est capable d'adresser n'importe quel
octet. Quand on convertit un T* en char*, on met les bits
selecteurs d'octet du char* à zéro. Quand on convertit un char*
en T*, on ignore les bits selecteurs d'octet. (Au moins, c'est
comme ça que ça passait dans le seul cas que je connais.)
"Michel Michaud" writes:Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pour des raisons historiques, la norme exige que les
représentations des void* et de char* soient identiques. Selon
la norme, il y a conversion en void* ; dans la pratique, une
conversion en void* et une conversion en char* font faire
exactement la même chose.
Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void*
est un char*. Et un char* est capable d'adresser n'importe quel
octet. Quand on convertit un T* en char*, on met les bits
selecteurs d'octet du char* à zéro. Quand on convertit un char*
en T*, on ignore les bits selecteurs d'octet. (Au moins, c'est
comme ça que ça passait dans le seul cas que je connais.)
En réalité, je sais de source de première main ce qui se partiquait
dans l'entourage de Ricthie, mais au lieu de venir dire "le mec au
dessus de moi dit le contraire", j'ai pensé plutôt donner une source
que tout le monde pouvait vérifier, sur l'opinion et la pratique de
Ritchie.
fait. Non, James, tu ne faisais pas de
la rhétorique : tu mentais simplement.
En réalité, je sais de source de première main ce qui se partiquait
dans l'entourage de Ricthie, mais au lieu de venir dire "le mec au
dessus de moi dit le contraire", j'ai pensé plutôt donner une source
que tout le monde pouvait vérifier, sur l'opinion et la pratique de
Ritchie.
fait. Non, James, tu ne faisais pas de
la rhétorique : tu mentais simplement.
En réalité, je sais de source de première main ce qui se partiquait
dans l'entourage de Ricthie, mais au lieu de venir dire "le mec au
dessus de moi dit le contraire", j'ai pensé plutôt donner une source
que tout le monde pouvait vérifier, sur l'opinion et la pratique de
Ritchie.
fait. Non, James, tu ne faisais pas de
la rhétorique : tu mentais simplement.
Dans
news:,"Michel Michaud" writes:Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je disais
être d'accord sur le principe, c'était le sujet de discussion avant
que je change le titre...).
[...]Pour des raisons historiques, la norme exige que les représentations
des void* et de char* soient identiques. Selon la norme, il y a
conversion en void* ; dans la pratique, une conversion en void* et
une conversion en char* font faire exactement la même chose.
Je ne saisis pas trop là. « la norme exige », mais c'est seulement «
dans la pratique » que ce sera le cas ?
[...]Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void* est un
char*. Et un char* est capable d'adresser n'importe quel octet.
Quand on convertit un T* en char*, on met les bits selecteurs
d'octet du char* à zéro. Quand on convertit un char* en T*, on
ignore les bits selecteurs d'octet. (Au moins, c'est comme ça que ça
passait dans le seul cas que je connais.)
J'avoue que ton explication n'est pas suffisamment claire pour que je
comprenne vraiment, étant donné que je ne connais pas cette
architecture. Si tu te sens capable de faire mieux (en montrant des
bits peut-être...), j'apprécierais !
Là, je crois comprendre que tu considères certains bits comme
sélecteur de « groupes d'octets » et certains bits pour dire quel
octet dans le groupe est désiré (un peu comme si c'était des
segments).
Mais alors un T* qui aurait obligatoirement une adresse de la base
d'un groupe, aurait aussi ses bits déjà à 0... non ?
J'imagine qu'on peut vite devenir HS avec cette discussion, mais pas
si on revient toujours au principe de C++ et qu'on ajoute ton idée que
char* est équivalent à void*.
En C++, on doit pouvoir passer de T* à void* et puis pouvoir revenir à
T*. Si on met des bits à zéro quelque part dans ça, on ne pourra pas
les retrouver !
Dans
news:m2wtzhfys5.fsf@lns-vlq-27-82-254-120-221.adsl.proxad.net,
"Michel Michaud" <mm@gdzid.com> writes:
Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je disais
être d'accord sur le principe, c'était le sujet de discussion avant
que je change le titre...).
[...]
Pour des raisons historiques, la norme exige que les représentations
des void* et de char* soient identiques. Selon la norme, il y a
conversion en void* ; dans la pratique, une conversion en void* et
une conversion en char* font faire exactement la même chose.
Je ne saisis pas trop là. « la norme exige », mais c'est seulement «
dans la pratique » que ce sera le cas ?
[...]
Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void* est un
char*. Et un char* est capable d'adresser n'importe quel octet.
Quand on convertit un T* en char*, on met les bits selecteurs
d'octet du char* à zéro. Quand on convertit un char* en T*, on
ignore les bits selecteurs d'octet. (Au moins, c'est comme ça que ça
passait dans le seul cas que je connais.)
J'avoue que ton explication n'est pas suffisamment claire pour que je
comprenne vraiment, étant donné que je ne connais pas cette
architecture. Si tu te sens capable de faire mieux (en montrant des
bits peut-être...), j'apprécierais !
Là, je crois comprendre que tu considères certains bits comme
sélecteur de « groupes d'octets » et certains bits pour dire quel
octet dans le groupe est désiré (un peu comme si c'était des
segments).
Mais alors un T* qui aurait obligatoirement une adresse de la base
d'un groupe, aurait aussi ses bits déjà à 0... non ?
J'imagine qu'on peut vite devenir HS avec cette discussion, mais pas
si on revient toujours au principe de C++ et qu'on ajoute ton idée que
char* est équivalent à void*.
En C++, on doit pouvoir passer de T* à void* et puis pouvoir revenir à
T*. Si on met des bits à zéro quelque part dans ça, on ne pourra pas
les retrouver !
Dans
news:,"Michel Michaud" writes:Je suis d'accord sur le principe qu'il y avait certainement
un danger à ne pas forcer une conversion explicite des
pointeurs entre T* (T quelconque) et char*.
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je disais
être d'accord sur le principe, c'était le sujet de discussion avant
que je change le titre...).
[...]Pour des raisons historiques, la norme exige que les représentations
des void* et de char* soient identiques. Selon la norme, il y a
conversion en void* ; dans la pratique, une conversion en void* et
une conversion en char* font faire exactement la même chose.
Je ne saisis pas trop là. « la norme exige », mais c'est seulement «
dans la pratique » que ce sera le cas ?
[...]Quelqu'un peut-il me donner des exemples précis pour que je
comprenne un peu mieux les conversions T* -> char* et T1* ->
void* -> T2* ?
C'est assez simple, en fait. Au niveau le plus bas, un void* est un
char*. Et un char* est capable d'adresser n'importe quel octet.
Quand on convertit un T* en char*, on met les bits selecteurs
d'octet du char* à zéro. Quand on convertit un char* en T*, on
ignore les bits selecteurs d'octet. (Au moins, c'est comme ça que ça
passait dans le seul cas que je connais.)
J'avoue que ton explication n'est pas suffisamment claire pour que je
comprenne vraiment, étant donné que je ne connais pas cette
architecture. Si tu te sens capable de faire mieux (en montrant des
bits peut-être...), j'apprécierais !
Là, je crois comprendre que tu considères certains bits comme
sélecteur de « groupes d'octets » et certains bits pour dire quel
octet dans le groupe est désiré (un peu comme si c'était des
segments).
Mais alors un T* qui aurait obligatoirement une adresse de la base
d'un groupe, aurait aussi ses bits déjà à 0... non ?
J'imagine qu'on peut vite devenir HS avec cette discussion, mais pas
si on revient toujours au principe de C++ et qu'on ajoute ton idée que
char* est équivalent à void*.
En C++, on doit pouvoir passer de T* à void* et puis pouvoir revenir à
T*. Si on met des bits à zéro quelque part dans ça, on ne pourra pas
les retrouver !
"Michel Michaud" wrote in message
news:<4dPYc.9219$...Dans
news:,Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je
disais être d'accord sur le principe, c'était le sujet de
discussion avant que je change le titre...).
S'il n'y a pas de conversion, il n'y a pas de conversion
implicite. Si le compilateur ne sait pas le type cible (ce qui
est le cas en C K&R, ou pour les varargs), il ne peut pas y
avoir de conversion. Je croyais l'avoir dit, d'ailleurs.
Considérons une machine hypothétique de 16 bits, avec un
[... explication sur une architecture bien spéciale et encore
"Michel Michaud" <mm@gdzid.com> wrote in message
news:<4dPYc.9219$CG3.628245@news20.bellglobal.com>...
Dans
news:m2wtzhfys5.fsf@lns-vlq-27-82-254-120-221.adsl.proxad.net,
Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je
disais être d'accord sur le principe, c'était le sujet de
discussion avant que je change le titre...).
S'il n'y a pas de conversion, il n'y a pas de conversion
implicite. Si le compilateur ne sait pas le type cible (ce qui
est le cas en C K&R, ou pour les varargs), il ne peut pas y
avoir de conversion. Je croyais l'avoir dit, d'ailleurs.
Considérons une machine hypothétique de 16 bits, avec un
[... explication sur une architecture bien spéciale et encore
"Michel Michaud" wrote in message
news:<4dPYc.9219$...Dans
news:,Que la conversion soit implicite ou explicite, le comportement
est le même.
Pas en K&R C : il n'y aurait tout simplement pas de conversion
implicite pour les paramètres (et c'est sur ce sujet que je
disais être d'accord sur le principe, c'était le sujet de
discussion avant que je change le titre...).
S'il n'y a pas de conversion, il n'y a pas de conversion
implicite. Si le compilateur ne sait pas le type cible (ce qui
est le cas en C K&R, ou pour les varargs), il ne peut pas y
avoir de conversion. Je croyais l'avoir dit, d'ailleurs.
Considérons une machine hypothétique de 16 bits, avec un
[... explication sur une architecture bien spéciale et encore
N.B. Ça fait vraiment « vieux » de parler du PDP-10 comme si
tu y avais travaillé. Moi je n'ai connu que le PDP-11 :-)
N.B. Ça fait vraiment « vieux » de parler du PDP-10 comme si
tu y avais travaillé. Moi je n'ai connu que le PDP-11 :-)
N.B. Ça fait vraiment « vieux » de parler du PDP-10 comme si
tu y avais travaillé. Moi je n'ai connu que le PDP-11 :-)