On 05 Oct 2003 17:17:44 +0200, James Kanze
wrote:Tu pourrais lui expliquer pourquoi.
Certes, je pourrais effectivement recopier la FAQ ici.
La norme C++ définit bien fopen, printf, etc. Elles font bien partie
de C++. Mais pour des raisons de compatibilité C, surtout. C'est du
C++, mais ce n'est pas comme ça qu'écrirait un bon programmeur C++.
Justement. A priori, les lecteurs de fclc++ ne connaissent pas
grand-chose à printf et compagnie (sauf s'ils ont fait du C avant),
On 05 Oct 2003 17:17:44 +0200, James Kanze <kanze@alex.gabi-soft.fr>
wrote:
Tu pourrais lui expliquer pourquoi.
Certes, je pourrais effectivement recopier la FAQ ici.
La norme C++ définit bien fopen, printf, etc. Elles font bien partie
de C++. Mais pour des raisons de compatibilité C, surtout. C'est du
C++, mais ce n'est pas comme ça qu'écrirait un bon programmeur C++.
Justement. A priori, les lecteurs de fclc++ ne connaissent pas
grand-chose à printf et compagnie (sauf s'ils ont fait du C avant),
On 05 Oct 2003 17:17:44 +0200, James Kanze
wrote:Tu pourrais lui expliquer pourquoi.
Certes, je pourrais effectivement recopier la FAQ ici.
La norme C++ définit bien fopen, printf, etc. Elles font bien partie
de C++. Mais pour des raisons de compatibilité C, surtout. C'est du
C++, mais ce n'est pas comme ça qu'écrirait un bon programmeur C++.
Justement. A priori, les lecteurs de fclc++ ne connaissent pas
grand-chose à printf et compagnie (sauf s'ils ont fait du C avant),
faudrait donc démander dans un groupe spécialisé Windows.
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
faudrait donc démander dans un groupe spécialisé Windows.
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
faudrait donc démander dans un groupe spécialisé Windows.
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > James Kanze writes:
| > [...]
| > | |> int *p = make_point(467, 39).coord; // #2
| > | C'est effectivement une subtilité. Où d'ailleurs les
| > | compilateurs ne sont pas tous d'accord.
| > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > d'autres subtilités en plus.
| C-à-d. La seule subtilité que je vois, c'est qu'on prend l'adresse
| d'un non-lvalue.
Où vois-tu que cette expression prend l'adresse d'une lvalue ?
| Le problème, si mes souvenirs sont corrects (ce qui est loins d'être
| certain), c'était qu'une expression du type :
| int i = make_point( 1, 2 ).coord[ 0 ] ;
| n'était pas légal avant (C90, K&R), parce que la définition formelle
| de [] dépend de la conversion implicite en pointeur, et que cette
| conversion ne se faisait que sur des lvalue.
Mais, mais ce n'est pas l'expression dont il est question.
| Et c'est vrai qu'en permettant ce genre d'expression, C a introduit
| le problème de la durée de vie des temporaires qu'on connaît si bien
| en C++.
et bien défini.
En fait, C99 a transformé les programmes explicitement marqués
invalides (en C90) en programmes ayant des fonctionnements
indéfinis. En général, c'est dans l'autre sens qu'on souhaite aller.
| > | |> Est-ce que #2 est bien formé ?
| > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | rappelle pas la réponse. (A priori, j'aurais dis non, parce que
| > | prendre l'adresse suppose un lvalue, et la valeur de retour
| > | d'une fonction n'est pas un lvalue.)
| > En C90, c'est formellement invalide et un diagnostic est
| > requis. Par contre c'est bien formé en C99.
| > | Mais je crois que C++ a le même problème. C'est donc qu'il n'y a
| > | pas de différence à cet égard.
| > Non, C++ n'a pas cette « subtilité. »
| Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté un
| coup d'oeil rapide, et je n'ai pas vu de différence entre C(99) et
| C++ quand il s'agit d'une variable membre non-statique.
De quelle limitation ?
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote in message
| news:<flu16npsr1.fsf@sel.cmla.ens-cachan.fr>...
| > James Kanze <kanze@alex.gabi-soft.fr> writes:
| > [...]
| > | |> int *p = make_point(467, 39).coord; // #2
| > | C'est effectivement une subtilité. Où d'ailleurs les
| > | compilateurs ne sont pas tous d'accord.
| > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > d'autres subtilités en plus.
| C-à-d. La seule subtilité que je vois, c'est qu'on prend l'adresse
| d'un non-lvalue.
Où vois-tu que cette expression prend l'adresse d'une lvalue ?
| Le problème, si mes souvenirs sont corrects (ce qui est loins d'être
| certain), c'était qu'une expression du type :
| int i = make_point( 1, 2 ).coord[ 0 ] ;
| n'était pas légal avant (C90, K&R), parce que la définition formelle
| de [] dépend de la conversion implicite en pointeur, et que cette
| conversion ne se faisait que sur des lvalue.
Mais, mais ce n'est pas l'expression dont il est question.
| Et c'est vrai qu'en permettant ce genre d'expression, C a introduit
| le problème de la durée de vie des temporaires qu'on connaît si bien
| en C++.
et bien défini.
En fait, C99 a transformé les programmes explicitement marqués
invalides (en C90) en programmes ayant des fonctionnements
indéfinis. En général, c'est dans l'autre sens qu'on souhaite aller.
| > | |> Est-ce que #2 est bien formé ?
| > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | rappelle pas la réponse. (A priori, j'aurais dis non, parce que
| > | prendre l'adresse suppose un lvalue, et la valeur de retour
| > | d'une fonction n'est pas un lvalue.)
| > En C90, c'est formellement invalide et un diagnostic est
| > requis. Par contre c'est bien formé en C99.
| > | Mais je crois que C++ a le même problème. C'est donc qu'il n'y a
| > | pas de différence à cet égard.
| > Non, C++ n'a pas cette « subtilité. »
| Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté un
| coup d'oeil rapide, et je n'ai pas vu de différence entre C(99) et
| C++ quand il s'agit d'une variable membre non-statique.
De quelle limitation ?
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > James Kanze writes:
| > [...]
| > | |> int *p = make_point(467, 39).coord; // #2
| > | C'est effectivement une subtilité. Où d'ailleurs les
| > | compilateurs ne sont pas tous d'accord.
| > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > d'autres subtilités en plus.
| C-à-d. La seule subtilité que je vois, c'est qu'on prend l'adresse
| d'un non-lvalue.
Où vois-tu que cette expression prend l'adresse d'une lvalue ?
| Le problème, si mes souvenirs sont corrects (ce qui est loins d'être
| certain), c'était qu'une expression du type :
| int i = make_point( 1, 2 ).coord[ 0 ] ;
| n'était pas légal avant (C90, K&R), parce que la définition formelle
| de [] dépend de la conversion implicite en pointeur, et que cette
| conversion ne se faisait que sur des lvalue.
Mais, mais ce n'est pas l'expression dont il est question.
| Et c'est vrai qu'en permettant ce genre d'expression, C a introduit
| le problème de la durée de vie des temporaires qu'on connaît si bien
| en C++.
et bien défini.
En fait, C99 a transformé les programmes explicitement marqués
invalides (en C90) en programmes ayant des fonctionnements
indéfinis. En général, c'est dans l'autre sens qu'on souhaite aller.
| > | |> Est-ce que #2 est bien formé ?
| > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | rappelle pas la réponse. (A priori, j'aurais dis non, parce que
| > | prendre l'adresse suppose un lvalue, et la valeur de retour
| > | d'une fonction n'est pas un lvalue.)
| > En C90, c'est formellement invalide et un diagnostic est
| > requis. Par contre c'est bien formé en C99.
| > | Mais je crois que C++ a le même problème. C'est donc qu'il n'y a
| > | pas de différence à cet égard.
| > Non, C++ n'a pas cette « subtilité. »
| Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté un
| coup d'oeil rapide, et je n'ai pas vu de différence entre C(99) et
| C++ quand il s'agit d'une variable membre non-statique.
De quelle limitation ?
writes:
| Fabien LE LEZ wrote in message
| news:...
| > On 05 Oct 2003 17:17:44 +0200, James Kanze
| > wrote:
| > >Tu pourrais lui expliquer pourquoi.
| > Certes, je pourrais effectivement recopier la FAQ ici.
| Il parlait de lancer un processus en toile de fond. Autant que je
| sache, la FAQ n'en parle pas.
elle pourrait en parler, si cela devenait un besoin.
kanze@gabi-soft.fr writes:
| Fabien LE LEZ <gramster@gramster.com> wrote in message
| news:<tav0ov4mfdht2sjr0sen8bueitct3iv08t@4ax.com>...
| > On 05 Oct 2003 17:17:44 +0200, James Kanze
| > <kanze@alex.gabi-soft.fr> wrote:
| > >Tu pourrais lui expliquer pourquoi.
| > Certes, je pourrais effectivement recopier la FAQ ici.
| Il parlait de lancer un processus en toile de fond. Autant que je
| sache, la FAQ n'en parle pas.
elle pourrait en parler, si cela devenait un besoin.
writes:
| Fabien LE LEZ wrote in message
| news:...
| > On 05 Oct 2003 17:17:44 +0200, James Kanze
| > wrote:
| > >Tu pourrais lui expliquer pourquoi.
| > Certes, je pourrais effectivement recopier la FAQ ici.
| Il parlait de lancer un processus en toile de fond. Autant que je
| sache, la FAQ n'en parle pas.
elle pourrait en parler, si cela devenait un besoin.
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > writes:
| > | Gabriel Dos Reis wrote in message
| > | news:...
| > | > James Kanze writes:
| > | > [...]
| > | > | |> int *p = make_point(467, 39).coord; // #2
| > | > | C'est effectivement une subtilité. Où d'ailleurs les
| > | > | compilateurs ne sont pas tous d'accord.
| > | > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > | > d'autres subtilités en plus.
| > | C-à-d. La seule subtilité que je vois, c'est qu'on prend
| > | l'adresse d'un non-lvalue.
| > Où vois-tu que cette expression prend l'adresse d'une lvalue ?
^
| Elle prend l'adresse d'une non-lvalue, comme j'ai dit. (Vue qu'on
| parle de C, j'utilise le vocabulaire de C.)
ma question devait plutôt s'écrire : où est-ce que tu vois qu'elle
prend l'adresse d'une non-lvalue ?
| > | Le problème, si mes souvenirs sont corrects (ce qui est loins
| > | d'être certain), c'était qu'une expression du type :
| > | int i = make_point( 1, 2 ).coord[ 0 ] ;
| > | n'était pas légal avant (C90, K&R), parce que la définition
| > | formelle de [] dépend de la conversion implicite en pointeur, et
| > | que cette conversion ne se faisait que sur des lvalue.
| > Mais, mais ce n'est pas l'expression dont il est question.
| Peut-être. Mais c'est bien l'expression qui a motivé le changement
| entre C90 et C99.
Dans cette discussion, il est question d'une expression donnée, pas
celle que quelqu'un pense aurait motivé quelque chose.
| > | Et c'est vrai qu'en permettant ce genre d'expression, C a
| > | introduit le problème de la durée de vie des temporaires qu'on
| > | connaît si bien en C++.
| > et bien défini.
| La durée de vie d'un temporaire n'est bien définie en C++ que depuis
| bien peu de temps (enfin, pour une assez grande valeur de peu, quand
| même),
l'essentiel est qu'elle soit bien définie.
| et il s'avère que même aujourd'hui, il y a des compilateurs qui ne
| l'implémentent pas. Du coup, de point de vue pratique, elle n'est
| pas encore bien définie, et elle pose des problèmes pour celui qui
| veut écrire du code portable.
je ne sais pas si cela t'a échappé, mais il s'agit du langage et non
de savoir programmer correctement ou de manière portable.
[...]
| > | > | |> Est-ce que #2 est bien formé ?
| > | > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | > | rappelle pas la réponse. (A priori, j'aurais dis non, parce
| > | > | que prendre l'adresse suppose un lvalue, et la valeur de
| > | > | retour d'une fonction n'est pas un lvalue.)
| > | > En C90, c'est formellement invalide et un diagnostic est
| > | > requis. Par contre c'est bien formé en C99.
| > | > | Mais je crois que C++ a le même problème. C'est donc qu'il
| > | > | n'y a pas de différence à cet égard.
| > | > Non, C++ n'a pas cette « subtilité. »
| > | Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté
| > | un coup d'oeil rapide, et je n'ai pas vu de différence entre
| > | C(99) et C++ quand il s'agit d'une variable membre non-statique.
| > De quelle limitation ?
| Qu'il y a un comportement défini ici en C++.
mais ça, tout le monde le sait. La question portait sur C.
| Parque pour l'instant, je ne vois aucune différence entre la règle
| C99 et la règle C++.
(1) est-ce que make_point(467, 39).coord est un objet ?
(2) est-ce que le pointeur obtenu par conversion de
make_point(467, 39).coord pointe sur un objet ?
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote in message
| news:<fl65j2ofme.fsf@sel.cmla.ens-cachan.fr>...
| > kanze@gabi-soft.fr writes:
| > | Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote in message
| > | news:<flu16npsr1.fsf@sel.cmla.ens-cachan.fr>...
| > | > James Kanze <kanze@alex.gabi-soft.fr> writes:
| > | > [...]
| > | > | |> int *p = make_point(467, 39).coord; // #2
| > | > | C'est effectivement une subtilité. Où d'ailleurs les
| > | > | compilateurs ne sont pas tous d'accord.
| > | > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > | > d'autres subtilités en plus.
| > | C-à-d. La seule subtilité que je vois, c'est qu'on prend
| > | l'adresse d'un non-lvalue.
| > Où vois-tu que cette expression prend l'adresse d'une lvalue ?
^
| Elle prend l'adresse d'une non-lvalue, comme j'ai dit. (Vue qu'on
| parle de C, j'utilise le vocabulaire de C.)
ma question devait plutôt s'écrire : où est-ce que tu vois qu'elle
prend l'adresse d'une non-lvalue ?
| > | Le problème, si mes souvenirs sont corrects (ce qui est loins
| > | d'être certain), c'était qu'une expression du type :
| > | int i = make_point( 1, 2 ).coord[ 0 ] ;
| > | n'était pas légal avant (C90, K&R), parce que la définition
| > | formelle de [] dépend de la conversion implicite en pointeur, et
| > | que cette conversion ne se faisait que sur des lvalue.
| > Mais, mais ce n'est pas l'expression dont il est question.
| Peut-être. Mais c'est bien l'expression qui a motivé le changement
| entre C90 et C99.
Dans cette discussion, il est question d'une expression donnée, pas
celle que quelqu'un pense aurait motivé quelque chose.
| > | Et c'est vrai qu'en permettant ce genre d'expression, C a
| > | introduit le problème de la durée de vie des temporaires qu'on
| > | connaît si bien en C++.
| > et bien défini.
| La durée de vie d'un temporaire n'est bien définie en C++ que depuis
| bien peu de temps (enfin, pour une assez grande valeur de peu, quand
| même),
l'essentiel est qu'elle soit bien définie.
| et il s'avère que même aujourd'hui, il y a des compilateurs qui ne
| l'implémentent pas. Du coup, de point de vue pratique, elle n'est
| pas encore bien définie, et elle pose des problèmes pour celui qui
| veut écrire du code portable.
je ne sais pas si cela t'a échappé, mais il s'agit du langage et non
de savoir programmer correctement ou de manière portable.
[...]
| > | > | |> Est-ce que #2 est bien formé ?
| > | > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | > | rappelle pas la réponse. (A priori, j'aurais dis non, parce
| > | > | que prendre l'adresse suppose un lvalue, et la valeur de
| > | > | retour d'une fonction n'est pas un lvalue.)
| > | > En C90, c'est formellement invalide et un diagnostic est
| > | > requis. Par contre c'est bien formé en C99.
| > | > | Mais je crois que C++ a le même problème. C'est donc qu'il
| > | > | n'y a pas de différence à cet égard.
| > | > Non, C++ n'a pas cette « subtilité. »
| > | Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté
| > | un coup d'oeil rapide, et je n'ai pas vu de différence entre
| > | C(99) et C++ quand il s'agit d'une variable membre non-statique.
| > De quelle limitation ?
| Qu'il y a un comportement défini ici en C++.
mais ça, tout le monde le sait. La question portait sur C.
| Parque pour l'instant, je ne vois aucune différence entre la règle
| C99 et la règle C++.
(1) est-ce que make_point(467, 39).coord est un objet ?
(2) est-ce que le pointeur obtenu par conversion de
make_point(467, 39).coord pointe sur un objet ?
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > writes:
| > | Gabriel Dos Reis wrote in message
| > | news:...
| > | > James Kanze writes:
| > | > [...]
| > | > | |> int *p = make_point(467, 39).coord; // #2
| > | > | C'est effectivement une subtilité. Où d'ailleurs les
| > | > | compilateurs ne sont pas tous d'accord.
| > | > C'est une erreur en C90, et c'est bien formé en C99, mais avec
| > | > d'autres subtilités en plus.
| > | C-à-d. La seule subtilité que je vois, c'est qu'on prend
| > | l'adresse d'un non-lvalue.
| > Où vois-tu que cette expression prend l'adresse d'une lvalue ?
^
| Elle prend l'adresse d'une non-lvalue, comme j'ai dit. (Vue qu'on
| parle de C, j'utilise le vocabulaire de C.)
ma question devait plutôt s'écrire : où est-ce que tu vois qu'elle
prend l'adresse d'une non-lvalue ?
| > | Le problème, si mes souvenirs sont corrects (ce qui est loins
| > | d'être certain), c'était qu'une expression du type :
| > | int i = make_point( 1, 2 ).coord[ 0 ] ;
| > | n'était pas légal avant (C90, K&R), parce que la définition
| > | formelle de [] dépend de la conversion implicite en pointeur, et
| > | que cette conversion ne se faisait que sur des lvalue.
| > Mais, mais ce n'est pas l'expression dont il est question.
| Peut-être. Mais c'est bien l'expression qui a motivé le changement
| entre C90 et C99.
Dans cette discussion, il est question d'une expression donnée, pas
celle que quelqu'un pense aurait motivé quelque chose.
| > | Et c'est vrai qu'en permettant ce genre d'expression, C a
| > | introduit le problème de la durée de vie des temporaires qu'on
| > | connaît si bien en C++.
| > et bien défini.
| La durée de vie d'un temporaire n'est bien définie en C++ que depuis
| bien peu de temps (enfin, pour une assez grande valeur de peu, quand
| même),
l'essentiel est qu'elle soit bien définie.
| et il s'avère que même aujourd'hui, il y a des compilateurs qui ne
| l'implémentent pas. Du coup, de point de vue pratique, elle n'est
| pas encore bien définie, et elle pose des problèmes pour celui qui
| veut écrire du code portable.
je ne sais pas si cela t'a échappé, mais il s'agit du langage et non
de savoir programmer correctement ou de manière portable.
[...]
| > | > | |> Est-ce que #2 est bien formé ?
| > | > | Il me semble qu'il y a eu une TC à ce sujet, mais je ne me
| > | > | rappelle pas la réponse. (A priori, j'aurais dis non, parce
| > | > | que prendre l'adresse suppose un lvalue, et la valeur de
| > | > | retour d'une fonction n'est pas un lvalue.)
| > | > En C90, c'est formellement invalide et un diagnostic est
| > | > requis. Par contre c'est bien formé en C99.
| > | > | Mais je crois que C++ a le même problème. C'est donc qu'il
| > | > | n'y a pas de différence à cet égard.
| > | > Non, C++ n'a pas cette « subtilité. »
| > | Est-ce que tu pourrais m'indiquais où il l'a éliminé ? J'ai jeté
| > | un coup d'oeil rapide, et je n'ai pas vu de différence entre
| > | C(99) et C++ quand il s'agit d'une variable membre non-statique.
| > De quelle limitation ?
| Qu'il y a un comportement défini ici en C++.
mais ça, tout le monde le sait. La question portait sur C.
| Parque pour l'instant, je ne vois aucune différence entre la règle
| C99 et la règle C++.
(1) est-ce que make_point(467, 39).coord est un objet ?
(2) est-ce que le pointeur obtenu par conversion de
make_point(467, 39).coord pointe sur un objet ?
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
En fait je suis parvenu a obtenir ce que je voulais avec un
fopen("fichier.txt", "a"); et non pas "w".
Les autres instructions marchaient parfaitement et j'obtiens donc à
présent le fichier tant voulu. D'une façon peut être pas très
orthodoxe , mais je ne suis ni puriste ni programmeur.
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
En fait je suis parvenu a obtenir ce que je voulais avec un
fopen("fichier.txt", "a"); et non pas "w".
Les autres instructions marchaient parfaitement et j'obtiens donc à
présent le fichier tant voulu. D'une façon peut être pas très
orthodoxe , mais je ne suis ni puriste ni programmeur.
Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.
En fait je suis parvenu a obtenir ce que je voulais avec un
fopen("fichier.txt", "a"); et non pas "w".
Les autres instructions marchaient parfaitement et j'obtiens donc à
présent le fichier tant voulu. D'une façon peut être pas très
orthodoxe , mais je ne suis ni puriste ni programmeur.