je me pose une question concernant le double r=E9f=E9rencement d'une
variable en C:
peut-on consid=E9rer que un pointeur d'un pointeur (en C) est =E9quivalent
(au moins dans l'esprit) =E0 la notion de r=E9f=E9rence en C++
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité des paramètres passés par reference ou par pointeur dont on ne sait pas dire qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel { int value; struct cel* next; } cel;
C'est effectivement une faiblesse de la semantique de const que la constness ne se propage pas implicitement au delà de la premiere indirection. C'est d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec const char ** et qui donne un des prototypes irreguliers aux fonctions de la famille de strtol. Ce problème est réglé dans le langage D de Walter Bright, mais la solution casserait trop de code à être transposée en C.
-- Chqrlie.
"Marc Boyer" <Marc.Boyer@cert.onera.fr.invalid> a écrit dans le message de
news: slrnggtrpu.3a6.Marc.Boyer@gavarnie.cert.fr...
On 2008-10-29, xylo <public.jmm@free.fr> wrote:
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a
l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité
des
paramètres passés par reference ou par pointeur dont on ne sait pas dire
qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel {
int value;
struct cel* next;
} cel;
C'est effectivement une faiblesse de la semantique de const que la constness
ne se propage pas implicitement au delà de la premiere indirection. C'est
d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec
const char ** et qui donne un des prototypes irreguliers aux fonctions de la
famille de strtol. Ce problème est réglé dans le langage D de Walter
Bright, mais la solution casserait trop de code à être transposée en C.
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité des paramètres passés par reference ou par pointeur dont on ne sait pas dire qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel { int value; struct cel* next; } cel;
C'est effectivement une faiblesse de la semantique de const que la constness ne se propage pas implicitement au delà de la premiere indirection. C'est d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec const char ** et qui donne un des prototypes irreguliers aux fonctions de la famille de strtol. Ce problème est réglé dans le langage D de Walter Bright, mais la solution casserait trop de code à être transposée en C.
-- Chqrlie.
Marc Boyer
On 2008-11-03, Charlie Gordon wrote:
"Marc Boyer" a écrit dans le message de news:
On 2008-10-29, xylo wrote:
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité des paramètres passés par reference ou par pointeur dont on ne sait pas dire qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel { int value; struct cel* next; } cel;
C'est effectivement une faiblesse de la semantique de const que la constness ne se propage pas implicitement au delà de la premiere indirection. C'est d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec const char ** et qui donne un des prototypes irreguliers aux fonctions de la famille de strtol. Ce problème est réglé dans le langage D de Walter Bright, mais la solution casserait trop de code à être transposée en C.
Je voulais juste souligner à xylo que le "const" du C n'est pas équivalent au "in" algorithmique tel qu'il est souvent compris.
Marc Boyer -- Si tu peux supporter d'entendre tes paroles Travesties par des gueux pour exciter des sots IF -- Rudyard Kipling (Trad. André Maurois)
On 2008-11-03, Charlie Gordon <news@chqrlie.org> wrote:
"Marc Boyer" <Marc.Boyer@cert.onera.fr.invalid> a écrit dans le message de
news: slrnggtrpu.3a6.Marc.Boyer@gavarnie.cert.fr...
On 2008-10-29, xylo <public.jmm@free.fr> wrote:
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a
l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité
des
paramètres passés par reference ou par pointeur dont on ne sait pas dire
qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel {
int value;
struct cel* next;
} cel;
C'est effectivement une faiblesse de la semantique de const que la constness
ne se propage pas implicitement au delà de la premiere indirection. C'est
d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec
const char ** et qui donne un des prototypes irreguliers aux fonctions de la
famille de strtol. Ce problème est réglé dans le langage D de Walter
Bright, mais la solution casserait trop de code à être transposée en C.
Je voulais juste souligner à xylo que le "const" du C n'est pas
équivalent au "in" algorithmique tel qu'il est souvent compris.
Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Les n-uplets sont une methode pour retourner plusieurs valeurs qui a l'avantage d'utiliser une notation fonctionnelle et d'éviter l'ambiguité des paramètres passés par reference ou par pointeur dont on ne sait pas dire qu'ils sont "out" ou "in/out".
const char * => ne peut pas être in est C tout.
Dans ce cas facile, oui. Regardons d'un peu plus prêt.
typedef struct cel { int value; struct cel* next; } cel;
C'est effectivement une faiblesse de la semantique de const que la constness ne se propage pas implicitement au delà de la premiere indirection. C'est d'ailleurs la raison qui fait que le type char ** n'est pas compatible avec const char ** et qui donne un des prototypes irreguliers aux fonctions de la famille de strtol. Ce problème est réglé dans le langage D de Walter Bright, mais la solution casserait trop de code à être transposée en C.
Je voulais juste souligner à xylo que le "const" du C n'est pas équivalent au "in" algorithmique tel qu'il est souvent compris.
Marc Boyer -- Si tu peux supporter d'entendre tes paroles Travesties par des gueux pour exciter des sots IF -- Rudyard Kipling (Trad. André Maurois)
espie
In article , Marc Boyer wrote:
Je voulais juste souligner à xylo que le "const" du C n'est pas équivalent au "in" algorithmique tel qu'il est souvent compris.
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible.
(je pense typiquement a strstr ou strchr).
In article <slrnggu5j6.3a6.Marc.Boyer@gavarnie.cert.fr>,
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> wrote:
Je voulais juste souligner à xylo que le "const" du C n'est pas
équivalent au "in" algorithmique tel qu'il est souvent compris.
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es
*oblige* de mettre des cast pour les implementer, sinon, c'est impossible.
Je voulais juste souligner à xylo que le "const" du C n'est pas équivalent au "in" algorithmique tel qu'il est souvent compris.
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible.
(je pense typiquement a strstr ou strchr).
Antoine Leca
En news:genc76$1jk2$, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
(Les autres raisons sont pour partager du code, la raison de base des bibliothèques ; pour améliorer l'abstraction de l'environnement ; et pour éviter des chausses-trappes, « ne pas réinventer le fil à couper le beurre ».)
Antoine
En news:genc76$1jk2$1@biggoron.nerim.net, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es
*oblige* de mettre des cast pour les implementer, sinon, c'est
impossible.
(je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas
mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en
« C propre » ; en fait, c'est même une des raisons pour lesquelles le
concept même de bibliothèque standard existe dans la norme.
(Les autres raisons sont pour partager du code, la raison de base des
bibliothèques ; pour améliorer l'abstraction de l'environnement ; et pour
éviter des chausses-trappes, « ne pas réinventer le fil à couper le
beurre ».)
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
(Les autres raisons sont pour partager du code, la raison de base des bibliothèques ; pour améliorer l'abstraction de l'environnement ; et pour éviter des chausses-trappes, « ne pas réinventer le fil à couper le beurre ».)
Antoine
espie
In article <gendn2$1ac$, Antoine Leca wrote:
En news:genc76$1jk2$, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage, qui t'interdit de dire `je renvoie un truc qui en fait correspond a la meme zone qu'un de mes parametres, et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le resultat doit etre const, et sinon, ah ben non').
sans que ton langage te dise qu'il y a un souci...
In article <gendn2$1ac$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> wrote:
En news:genc76$1jk2$1@biggoron.nerim.net, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es
*oblige* de mettre des cast pour les implementer, sinon, c'est
impossible.
(je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas
mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en
« C propre » ; en fait, c'est même une des raisons pour lesquelles le
concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un
probleme d'expressivite du typage du langage, qui t'interdit de dire `je
renvoie un truc qui en fait correspond a la meme zone qu'un de mes parametres,
et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le
resultat doit etre const, et sinon, ah ben non').
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage, qui t'interdit de dire `je renvoie un truc qui en fait correspond a la meme zone qu'un de mes parametres, et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le resultat doit etre const, et sinon, ah ben non').
sans que ton langage te dise qu'il y a un souci...
Charlie Gordon
"Marc Espie" a écrit dans le message de news: genjoh$1kfu$
In article <gendn2$1ac$, Antoine Leca wrote:
En news:genc76$1jk2$, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage, qui t'interdit de dire `je renvoie un truc qui en fait correspond a la meme zone qu'un de mes parametres, et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le resultat doit etre const, et sinon, ah ben non').
sans que ton langage te dise qu'il y a un souci...
Tout à fait d'accord.
C'est bien dommage que le comité ne soit toujours pas enclin à combler cette lacune en introduisant dans la prochaine norme une forme même très primitive de surcharge qui permette de déclarer les fonctions de la librairie comme ceci:
long strtol(char *, char **, int); long strtol(const char*, const char **, int);
etc.
On pourrait aussi imaginer une syntaxe qui permette de definir la constness du resultat en fonction de celle effective d'un des parametres, ou une forme encore plus elaboree de specification de contraintes sur les parametres et le resultat, mais tout cela est hors d'atteinte :-(
-- Chqrlie.
"Marc Espie" <espie@lain.home> a écrit dans le message de news:
genjoh$1kfu$1@biggoron.nerim.net...
In article <gendn2$1ac$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> wrote:
En news:genc76$1jk2$1@biggoron.nerim.net, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es
*oblige* de mettre des cast pour les implementer, sinon, c'est
impossible.
(je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a
pas
mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en
« C propre » ; en fait, c'est même une des raisons pour lesquelles le
concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un
probleme d'expressivite du typage du langage, qui t'interdit de dire `je
renvoie un truc qui en fait correspond a la meme zone qu'un de mes
parametres,
et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le
resultat doit etre const, et sinon, ah ben non').
sans que ton langage te dise qu'il y a un souci...
Tout à fait d'accord.
C'est bien dommage que le comité ne soit toujours pas enclin à combler cette
lacune en introduisant dans la prochaine norme une forme même très primitive
de surcharge qui permette de déclarer les fonctions de la librairie comme
ceci:
long strtol(char *, char **, int);
long strtol(const char*, const char **, int);
etc.
On pourrait aussi imaginer une syntaxe qui permette de definir la constness
du resultat en fonction de celle effective d'un des parametres, ou une forme
encore plus elaboree de specification de contraintes sur les parametres et
le resultat, mais tout cela est hors d'atteinte :-(
"Marc Espie" a écrit dans le message de news: genjoh$1kfu$
In article <gendn2$1ac$, Antoine Leca wrote:
En news:genc76$1jk2$, Marc Espie va escriure:
Le const du C est notoirement buggue, au niveau typage.
Rien que pour certaines fonctions de la bibliotheque standard: tu es *oblige* de mettre des cast pour les implementer, sinon, c'est impossible. (je pense typiquement a strstr ou strchr).
C'est vrai, mais ce n'est pas forcément un bogue : je veux dire, il y a pas mal de choses dans la bibliothèque standard que l'on ne peut pas écrire en « C propre » ; en fait, c'est même une des raisons pour lesquelles le concept même de bibliothèque standard existe dans la norme.
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage, qui t'interdit de dire `je renvoie un truc qui en fait correspond a la meme zone qu'un de mes parametres, et je ne l'ai pas modifie, donc si celui-ci etait vraiment const, alors le resultat doit etre const, et sinon, ah ben non').
sans que ton langage te dise qu'il y a un souci...
Tout à fait d'accord.
C'est bien dommage que le comité ne soit toujours pas enclin à combler cette lacune en introduisant dans la prochaine norme une forme même très primitive de surcharge qui permette de déclarer les fonctions de la librairie comme ceci:
long strtol(char *, char **, int); long strtol(const char*, const char **, int);
etc.
On pourrait aussi imaginer une syntaxe qui permette de definir la constness du resultat en fonction de celle effective d'un des parametres, ou une forme encore plus elaboree de specification de contraintes sur les parametres et le resultat, mais tout cela est hors d'atteinte :-(
-- Chqrlie.
Antoine Leca
En news:genjoh$1kfu$, Marc Espie va escriure:
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage
Oui. Le vrai problème, c'est le sens réel de const, qui est un poil trop simpliste pour beaucoup des usages qu'on voudrait lui voir jouer (tout en étant, à l'égal des prototypes, un énorme progrès sur ce que l'on avait avant...)
Antoine
En news:genjoh$1kfu$1@biggoron.nerim.net, Marc Espie va escriure:
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un
probleme d'expressivite du typage du langage
Oui. Le vrai problème, c'est le sens réel de const, qui est un poil trop
simpliste pour beaucoup des usages qu'on voudrait lui voir jouer (tout en
étant, à l'égal des prototypes, un énorme progrès sur ce que l'on avait
avant...)
Je suis d'accord pour d'autres fonctions, mais la, c'est clairement un probleme d'expressivite du typage du langage
Oui. Le vrai problème, c'est le sens réel de const, qui est un poil trop simpliste pour beaucoup des usages qu'on voudrait lui voir jouer (tout en étant, à l'égal des prototypes, un énorme progrès sur ce que l'on avait avant...)