Je suis on ne peut plus débutant en c/c++ , et je suis confronté à un
problème que je n'arrive pas à résoudre.
J'ai crée un petit client irc de base dans le but d'en faire une espèce de
robot à tout faire que j'améliorerai en fonction de mes idées du moment ...
ceci dit , 2 questions :
1) comment faire de mon programme un exe tournant en "toile de fond" ( cad
pas etre obligé de conserver la fenetre de ligne de cmd sous XP pour que le
prog tourne ) ?
2) apres un premier lancement , je voudrai crée un fichier de config
regroupant les infos principales ( server , channel , nickname .. )
permettant ensuite de relancer le client a partir de ce fichier sans avoir a
indiquer les arg en ligne de commande
void config_pass(int i , char* data)
{
FILE* Config;
Config = fopen("iBot.txt","w");
if (i == 1) { printf("Server : "); fputs(data, Config); fputs("\n",
Config); }
if (i == 2) { printf("Port : "); fputs(data, Config); }
if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("\n",
Config); */ }
( ... )
}
bon je me doute que ca doit être un peu fouilli et pas du tout optimisé ...
i correspond en gros au nombre d'arguments en ligne de commande
en fait , je cherche un moyen de faire le fichier iBot.txt de facon
convenable , parce que avec tous mes essais ( essais avec fputs / fwrite /
... enfin un peu tout ) , le data correspondant a la chaine de caractères de
chaque arg s'ecrit bien dans le fichier .txt , mais uniquement sur la
premiere ligne , et ce en effacant bien entendu ce qui avait été ecrit
précédemment
exemple : server irc.epiknet.org
port : 6667
->> donne en premiere ligne : 6667epiknet.org au deuxieme tour
donc en gros , j'aimerai savoir comment faire sauter une ligne pour avoir
chaque ch de caractères de chaque arg sur une ligne différente :)
bon je sais c c confus ... pardonnez mon langage de débutant , j'ai voulu
etre le plus clair possible
| Gabriel Dos Reis wrote: | | | > OK. Mais que #1 avec la correction ? | | Bin, du coup, je dirais que la ligne affiche 8, mais je suppose qu'il | doit y avoir un truc.
Oui. En C++, il afficherait 8 comme on s'y attendrait. En C99, cela peut reformater le disque dur. En C90, c'est une erreur. .
| > | | > | > Est-ce que #2 est bien formé ? | > | | > | J'aurais intuitivement dit oui, mais je suppose que la vérité est ailleur.
| > | > donc, "p" pointe sur un objet ? C'est ça ? Si oui, quelle sa durée de | > stockage ? | | Un objet temporaire qui existe jusqu'à la fin de l'exécution de | l'instruction ?
Ce n'est pas une durée de stockage, ça.
T'as rien de mieux a faire que de venir taper ta frime ici avec du C trop mal ecrit pour etre lisible et qui est l'exemple meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS, et ca ne rime a rien.
Microcosme, disais-je ...
MB
"Gabriel Dos Reis" <dosreis@cmla.ens-cachan.fr> a écrit dans le message
news: flk77jrhui.fsf@sel.cmla.ens-cachan.fr...
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
| Gabriel Dos Reis wrote:
|
|
| > OK. Mais que #1 avec la correction ?
|
| Bin, du coup, je dirais que la ligne affiche 8, mais je suppose qu'il
| doit y avoir un truc.
Oui. En C++, il afficherait 8 comme on s'y attendrait. En C99, cela peut
reformater le disque dur. En C90, c'est une erreur. .
| > |
| > | > Est-ce que #2 est bien formé ?
| > |
| > | J'aurais intuitivement dit oui, mais je suppose que la vérité est
ailleur.
| >
| > donc, "p" pointe sur un objet ? C'est ça ? Si oui, quelle sa durée de
| > stockage ?
|
| Un objet temporaire qui existe jusqu'à la fin de l'exécution de
| l'instruction ?
Ce n'est pas une durée de stockage, ça.
T'as rien de mieux a faire que de venir taper ta frime ici
avec du C trop mal ecrit pour etre lisible et qui est l'exemple
meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant
comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS,
et ca ne rime a rien.
| Gabriel Dos Reis wrote: | | | > OK. Mais que #1 avec la correction ? | | Bin, du coup, je dirais que la ligne affiche 8, mais je suppose qu'il | doit y avoir un truc.
Oui. En C++, il afficherait 8 comme on s'y attendrait. En C99, cela peut reformater le disque dur. En C90, c'est une erreur. .
| > | | > | > Est-ce que #2 est bien formé ? | > | | > | J'aurais intuitivement dit oui, mais je suppose que la vérité est ailleur.
| > | > donc, "p" pointe sur un objet ? C'est ça ? Si oui, quelle sa durée de | > stockage ? | | Un objet temporaire qui existe jusqu'à la fin de l'exécution de | l'instruction ?
Ce n'est pas une durée de stockage, ça.
T'as rien de mieux a faire que de venir taper ta frime ici avec du C trop mal ecrit pour etre lisible et qui est l'exemple meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS, et ca ne rime a rien.
Microcosme, disais-je ...
MB
Christophe Lephay
"_M.B._" a écrit dans le message de news:blp3g5$gqc$
T'as rien de mieux a faire que de venir taper ta frime ici avec du C trop mal ecrit pour etre lisible et qui est l'exemple meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS, et ca ne rime a rien.
Microcosme, disais-je ...
Mais pourquoi est-il si méchant... ;)
Chris
"_M.B._" <_mbinder@magicnet.com> a écrit dans le message de
news:blp3g5$gqc$1@news-reader4.wanadoo.fr...
T'as rien de mieux a faire que de venir taper ta frime ici
avec du C trop mal ecrit pour etre lisible et qui est l'exemple
meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant
comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS,
et ca ne rime a rien.
"_M.B._" a écrit dans le message de news:blp3g5$gqc$
T'as rien de mieux a faire que de venir taper ta frime ici avec du C trop mal ecrit pour etre lisible et qui est l'exemple meme de ce qu'il ne faut pas faire en C.
Tu construis ton argumentation sur la complexite du C en prenant comme exemple une exception qui confirme la regle.
C'est de la malhonnetete intellectuelle, c'est completement HS, et ca ne rime a rien.
Microcosme, disais-je ...
Mais pourquoi est-il si méchant... ;)
Chris
Gabriel Dos Reis
"_M.B._" writes:
| Tu construis ton argumentation sur la complexite du C en prenant | comme exemple une exception qui confirme la regle.
Cela répondait à l'assertion était que le C est plus facile à maîtrisé.
Et en passant, la question sur la durée ed stockage n'est pas l'exception qui confirme la règle.
-- Gaby
"_M.B._" <_mbinder@magicnet.com> writes:
| Tu construis ton argumentation sur la complexite du C en prenant
| comme exemple une exception qui confirme la regle.
Cela répondait à l'assertion était que le C est plus facile à maîtrisé.
Et en passant, la question sur la durée ed stockage n'est pas
l'exception qui confirme la règle.
| Tu construis ton argumentation sur la complexite du C en prenant | comme exemple une exception qui confirme la regle.
Cela répondait à l'assertion était que le C est plus facile à maîtrisé.
Et en passant, la question sur la durée ed stockage n'est pas l'exception qui confirme la règle.
-- Gaby
James Kanze
"Manu" writes:
|> Je suis on ne peut plus débutant en c/c++ , et je suis |> confronté à un problème que je n'arrive pas à |> résoudre.
|> J'ai crée un petit client irc de base dans le but d'en faire une |> espèce de robot à tout faire que j'améliorerai en fonction |> de mes idées du moment ...
|> ceci dit , 2 questions :
|> 1) comment faire de mon programme un exe tournant en "toile de fond" |> ( cad pas etre obligé de conserver la fenetre de ligne de cmd |> sous XP pour que le prog tourne ) ?
Ça dépend fortement du système. Je connais bien la réponse pour des systèmes Posix, mais je doute fort que ça t'aidera:-). Il faudrait donc démander dans un groupe spécialisé Windows.
|> 2) apres un premier lancement , je voudrai crée un fichier de |> config regroupant les infos principales ( server , channel , |> nickname .. ) permettant ensuite de relancer le client a partir de |> ce fichier sans avoir a indiquer les arg en ligne de commande
|> void config_pass(int i , char* data) |> { |> FILE* Config; |> Config = fopen("iBot.txt","w"); |> if (i == 1) { printf("Server : "); fputs(data, Config); fputs("n", |> Config); } |> if (i == 2) { printf("Port : "); fputs(data, Config); } |> if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("n", |> Config); */ } |> ( ... ) |> }
|> bon je me doute que ca doit être un peu fouilli et pas du tout |> optimisé ... i correspond en gros au nombre d'arguments en ligne |> de commande
|> en fait , je cherche un moyen de faire le fichier iBot.txt de facon |> convenable , parce que avec tous mes essais ( essais avec fputs / |> fwrite / ... enfin un peu tout ) , le data correspondant a la chaine |> de caractères de chaque arg s'ecrit bien dans le fichier .txt , |> mais uniquement sur la premiere ligne , et ce en effacant bien |> entendu ce qui avait été ecrit précédemment
|> exemple : server irc.epiknet.org |> port : 6667 |> ->> donne en premiere ligne : 6667epiknet.org au deuxieme tour
Bien, à ta place, je me servirai plutôt des ofstream que des FILE*. C'est plus facile. Mais dans l'occurance, les symtomes que tu décris suggère que tu as fermé et puis réouvert le fichier à chaque ligne. 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.
|> donc en gros , j'aimerai savoir comment faire sauter une ligne pour |> avoir chaque ch de caractères de chaque arg sur une ligne |> différente :)
int main( int argc, char** argv ) { int result = EXIT_FAILURE ; std::ofstream dest( "args.txt") ; if ( ! dest ) { std::cerr << "Le fichier "args.txt" n'a pas pu être créén" ; } else { for ( int i = 0 ; i < argc ; ++ i ) { dest << i << ": " << argv[ i ] << 'n' ; } dest.close() ; if ( dest ) { result = EXIT_SUCCESS ; } else { std::cerr << "Erreur d'écriture dans "args.txt"n" ; } } return result ; }
À adapter selon tes besoins.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
"Manu" <manu@nomail.com> writes:
|> Je suis on ne peut plus débutant en c/c++ , et je suis
|> confronté à un problème que je n'arrive pas à
|> résoudre.
|> J'ai crée un petit client irc de base dans le but d'en faire une
|> espèce de robot à tout faire que j'améliorerai en fonction
|> de mes idées du moment ...
|> ceci dit , 2 questions :
|> 1) comment faire de mon programme un exe tournant en "toile de fond"
|> ( cad pas etre obligé de conserver la fenetre de ligne de cmd
|> sous XP pour que le prog tourne ) ?
Ça dépend fortement du système. Je connais bien la réponse
pour des systèmes Posix, mais je doute fort que ça t'aidera:-). Il
faudrait donc démander dans un groupe spécialisé Windows.
|> 2) apres un premier lancement , je voudrai crée un fichier de
|> config regroupant les infos principales ( server , channel ,
|> nickname .. ) permettant ensuite de relancer le client a partir de
|> ce fichier sans avoir a indiquer les arg en ligne de commande
|> void config_pass(int i , char* data)
|> {
|> FILE* Config;
|> Config = fopen("iBot.txt","w");
|> if (i == 1) { printf("Server : "); fputs(data, Config); fputs("n",
|> Config); }
|> if (i == 2) { printf("Port : "); fputs(data, Config); }
|> if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("n",
|> Config); */ }
|> ( ... )
|> }
|> bon je me doute que ca doit être un peu fouilli et pas du tout
|> optimisé ... i correspond en gros au nombre d'arguments en ligne
|> de commande
|> en fait , je cherche un moyen de faire le fichier iBot.txt de facon
|> convenable , parce que avec tous mes essais ( essais avec fputs /
|> fwrite / ... enfin un peu tout ) , le data correspondant a la chaine
|> de caractères de chaque arg s'ecrit bien dans le fichier .txt ,
|> mais uniquement sur la premiere ligne , et ce en effacant bien
|> entendu ce qui avait été ecrit précédemment
|> exemple : server irc.epiknet.org
|> port : 6667
|> ->> donne en premiere ligne : 6667epiknet.org au deuxieme tour
Bien, à ta place, je me servirai plutôt des ofstream que des
FILE*. C'est plus facile. Mais dans l'occurance, les symtomes que tu
décris suggère que tu as fermé et puis réouvert le fichier
à chaque ligne. 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.
|> donc en gros , j'aimerai savoir comment faire sauter une ligne pour
|> avoir chaque ch de caractères de chaque arg sur une ligne
|> différente :)
int
main( int argc, char** argv )
{
int result = EXIT_FAILURE ;
std::ofstream dest( "args.txt") ;
if ( ! dest ) {
std::cerr << "Le fichier "args.txt" n'a pas pu être créén" ;
} else {
for ( int i = 0 ; i < argc ; ++ i ) {
dest << i << ": " << argv[ i ] << 'n' ;
}
dest.close() ;
if ( dest ) {
result = EXIT_SUCCESS ;
} else {
std::cerr << "Erreur d'écriture dans "args.txt"n" ;
}
}
return result ;
}
À adapter selon tes besoins.
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> Je suis on ne peut plus débutant en c/c++ , et je suis |> confronté à un problème que je n'arrive pas à |> résoudre.
|> J'ai crée un petit client irc de base dans le but d'en faire une |> espèce de robot à tout faire que j'améliorerai en fonction |> de mes idées du moment ...
|> ceci dit , 2 questions :
|> 1) comment faire de mon programme un exe tournant en "toile de fond" |> ( cad pas etre obligé de conserver la fenetre de ligne de cmd |> sous XP pour que le prog tourne ) ?
Ça dépend fortement du système. Je connais bien la réponse pour des systèmes Posix, mais je doute fort que ça t'aidera:-). Il faudrait donc démander dans un groupe spécialisé Windows.
|> 2) apres un premier lancement , je voudrai crée un fichier de |> config regroupant les infos principales ( server , channel , |> nickname .. ) permettant ensuite de relancer le client a partir de |> ce fichier sans avoir a indiquer les arg en ligne de commande
|> void config_pass(int i , char* data) |> { |> FILE* Config; |> Config = fopen("iBot.txt","w"); |> if (i == 1) { printf("Server : "); fputs(data, Config); fputs("n", |> Config); } |> if (i == 2) { printf("Port : "); fputs(data, Config); } |> if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("n", |> Config); */ } |> ( ... ) |> }
|> bon je me doute que ca doit être un peu fouilli et pas du tout |> optimisé ... i correspond en gros au nombre d'arguments en ligne |> de commande
|> en fait , je cherche un moyen de faire le fichier iBot.txt de facon |> convenable , parce que avec tous mes essais ( essais avec fputs / |> fwrite / ... enfin un peu tout ) , le data correspondant a la chaine |> de caractères de chaque arg s'ecrit bien dans le fichier .txt , |> mais uniquement sur la premiere ligne , et ce en effacant bien |> entendu ce qui avait été ecrit précédemment
|> exemple : server irc.epiknet.org |> port : 6667 |> ->> donne en premiere ligne : 6667epiknet.org au deuxieme tour
Bien, à ta place, je me servirai plutôt des ofstream que des FILE*. C'est plus facile. Mais dans l'occurance, les symtomes que tu décris suggère que tu as fermé et puis réouvert le fichier à chaque ligne. 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.
|> donc en gros , j'aimerai savoir comment faire sauter une ligne pour |> avoir chaque ch de caractères de chaque arg sur une ligne |> différente :)
int main( int argc, char** argv ) { int result = EXIT_FAILURE ; std::ofstream dest( "args.txt") ; if ( ! dest ) { std::cerr << "Le fichier "args.txt" n'a pas pu être créén" ; } else { for ( int i = 0 ; i < argc ; ++ i ) { dest << i << ": " << argv[ i ] << 'n' ; } dest.close() ; if ( dest ) { result = EXIT_SUCCESS ; } else { std::cerr << "Erreur d'écriture dans "args.txt"n" ; } } return result ; }
À adapter selon tes besoins.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
James Kanze
Fabien LE LEZ writes:
|> On Sat, 4 Oct 2003 18:03:26 +0200, "Manu" wrote:
|> >1) comment faire de mon programme un exe tournant en "toile de |> >fond" ( cad pas etre obligé de conserver la fenetre de ligne de |> >cmd sous XP pour que le prog tourne ) ?
|> fr.comp.os.ms-windows.programmation
Tu pourrais lui expliquer pourquoi.
|> >void config_pass(int i , char* data) |> >{ |> > FILE* Config; |> > Config = fopen("iBot.txt","w"); |> > if (i == 1) { printf("Server : ");
|> Tout ça est du C, pas du C++ -> fr.comp.lang.c
Ce n'est pas la façon idiomatique C++ de faire, mais c'est bien du C++ quand même.
|> Note pour éviter les trolls : un compilateur C++ compilera ce |> code, car il compile la plupart du code C, mais le code C++ pour |> faire ça serait très différent -- il utiliserait |> std::string, les fstream, etc.
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++.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Fabien LE LEZ <gramster@gramster.com> writes:
|> On Sat, 4 Oct 2003 18:03:26 +0200, "Manu" <manu@nomail.com> wrote:
|> >1) comment faire de mon programme un exe tournant en "toile de
|> >fond" ( cad pas etre obligé de conserver la fenetre de ligne de
|> >cmd sous XP pour que le prog tourne ) ?
|> fr.comp.os.ms-windows.programmation
Tu pourrais lui expliquer pourquoi.
|> >void config_pass(int i , char* data)
|> >{
|> > FILE* Config;
|> > Config = fopen("iBot.txt","w");
|> > if (i == 1) { printf("Server : ");
|> Tout ça est du C, pas du C++ -> fr.comp.lang.c
Ce n'est pas la façon idiomatique C++ de faire, mais c'est bien du
C++ quand même.
|> Note pour éviter les trolls : un compilateur C++ compilera ce
|> code, car il compile la plupart du code C, mais le code C++ pour
|> faire ça serait très différent -- il utiliserait
|> std::string, les fstream, etc.
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++.
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> On Sat, 4 Oct 2003 18:03:26 +0200, "Manu" wrote:
|> >1) comment faire de mon programme un exe tournant en "toile de |> >fond" ( cad pas etre obligé de conserver la fenetre de ligne de |> >cmd sous XP pour que le prog tourne ) ?
|> fr.comp.os.ms-windows.programmation
Tu pourrais lui expliquer pourquoi.
|> >void config_pass(int i , char* data) |> >{ |> > FILE* Config; |> > Config = fopen("iBot.txt","w"); |> > if (i == 1) { printf("Server : ");
|> Tout ça est du C, pas du C++ -> fr.comp.lang.c
Ce n'est pas la façon idiomatique C++ de faire, mais c'est bien du C++ quand même.
|> Note pour éviter les trolls : un compilateur C++ compilera ce |> code, car il compile la plupart du code C, mais le code C++ pour |> faire ça serait très différent -- il utiliserait |> std::string, les fstream, etc.
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++.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
James Kanze
Gabriel Dos Reis writes:
|> Loïc Joly writes:
|> | que le C++ (dans le sens son étendue est plus limitée, il |> | est plus facile de le maitriser complètement).
|> ce point n'est pas évident.
Je crois qu'il parlait de maîtriser le langage. Il est bien plus facile à maîtriser le langage C que le langage C++. En revanche, la maîtrise du langage n'est ni suffisant ni forcement nécessaire pour maîtriser la programmation dans ce langage, et à mon avis, il est bien plus simple à maîtriser la programmation en C++ qu'en C.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> writes:
|> | que le C++ (dans le sens son étendue est plus limitée, il
|> | est plus facile de le maitriser complètement).
|> ce point n'est pas évident.
Je crois qu'il parlait de maîtriser le langage. Il est bien plus
facile à maîtriser le langage C que le langage C++. En revanche,
la maîtrise du langage n'est ni suffisant ni forcement nécessaire
pour maîtriser la programmation dans ce langage, et à mon avis, il
est bien plus simple à maîtriser la programmation en C++ qu'en C.
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> | que le C++ (dans le sens son étendue est plus limitée, il |> | est plus facile de le maitriser complètement).
|> ce point n'est pas évident.
Je crois qu'il parlait de maîtriser le langage. Il est bien plus facile à maîtriser le langage C que le langage C++. En revanche, la maîtrise du langage n'est ni suffisant ni forcement nécessaire pour maîtriser la programmation dans ce langage, et à mon avis, il est bien plus simple à maîtriser la programmation en C++ qu'en C.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> struct Point make_point(int a, int b) |> { |> struct Point p = {{a, b}};
D'après mes souvenirs, c'est une erreur. On n'a pas (ou on n'avait pas) droit à plus de niveau de {} qu'il y avait de niveau dans les données à initialiser.
Si ça compile, tu as un problème de compilateur. D'abord, l'appel de set_value est illégal, parce que tu ne peux pas passer une struct Point à un int*. Ensuite, l'appel de print_value est illégal, parce que tu ne peux pas passer un void à un int*.
|> int *p = make_point(467, 39).coord; // #2
C'est effectivement une subtilité. Où d'ailleurs les compilateurs ne sont pas tous d'accord.
|> }
|> Que fait #1 ?
Erreur de compilation.
|> 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.)
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.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> writes:
|> struct Point make_point(int a, int b)
|> {
|> struct Point p = {{a, b}};
D'après mes souvenirs, c'est une erreur. On n'a pas (ou on n'avait
pas) droit à plus de niveau de {} qu'il y avait de niveau dans les
données à initialiser.
Si ça compile, tu as un problème de compilateur. D'abord, l'appel
de set_value est illégal, parce que tu ne peux pas passer une struct
Point à un int*. Ensuite, l'appel de print_value est illégal,
parce que tu ne peux pas passer un void à un int*.
|> int *p = make_point(467, 39).coord; // #2
C'est effectivement une subtilité. Où d'ailleurs les compilateurs
ne sont pas tous d'accord.
|> }
|> Que fait #1 ?
Erreur de compilation.
|> 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.)
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.
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> struct Point make_point(int a, int b) |> { |> struct Point p = {{a, b}};
D'après mes souvenirs, c'est une erreur. On n'a pas (ou on n'avait pas) droit à plus de niveau de {} qu'il y avait de niveau dans les données à initialiser.
Si ça compile, tu as un problème de compilateur. D'abord, l'appel de set_value est illégal, parce que tu ne peux pas passer une struct Point à un int*. Ensuite, l'appel de print_value est illégal, parce que tu ne peux pas passer un void à un int*.
|> int *p = make_point(467, 39).coord; // #2
C'est effectivement une subtilité. Où d'ailleurs les compilateurs ne sont pas tous d'accord.
|> }
|> Que fait #1 ?
Erreur de compilation.
|> 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.)
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.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Emmanuel Delahaye <emdelYOURBRA@noos.fr> writes:
|> In 'fr.comp.lang.c++', Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> wrote:
--
James Kanze mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Gabriel Dos Reis
James Kanze writes:
| Gabriel Dos Reis writes: | | |> #include <stdio.h> | | |> struct Point { | |> int coord[2]; | |> }; | | |> void print_value(int *p) | |> { | |> printf("%d", *p); | |> } | | |> void set_value(int *p, v) | |> { | |> *p = v; | |> } | | |> struct Point make_point(int a, int b) | |> { | |> struct Point p = {{a, b}}; | | D'après mes souvenirs, c'est une erreur.
c'est une erreur uniquement en K&R, mais pas en C90 et version ultérieure.
| On n'a pas (ou on n'avait | pas) droit à plus de niveau de {} qu'il y avait de niveau dans les | données à initialiser.
Ça c'est uniquement vrai en C K&R.
[...]
| |> 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.
| |> 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é. »
-- Gaby
James Kanze <kanze@alex.gabi-soft.fr> writes:
| Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> writes:
|
| |> #include <stdio.h>
|
| |> struct Point {
| |> int coord[2];
| |> };
|
| |> void print_value(int *p)
| |> {
| |> printf("%d", *p);
| |> }
|
| |> void set_value(int *p, v)
| |> {
| |> *p = v;
| |> }
|
| |> struct Point make_point(int a, int b)
| |> {
| |> struct Point p = {{a, b}};
|
| D'après mes souvenirs, c'est une erreur.
c'est une erreur uniquement en K&R, mais pas en C90 et version ultérieure.
| On n'a pas (ou on n'avait
| pas) droit à plus de niveau de {} qu'il y avait de niveau dans les
| données à initialiser.
Ça c'est uniquement vrai en C K&R.
[...]
| |> 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.
| |> 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.
| Gabriel Dos Reis writes: | | |> #include <stdio.h> | | |> struct Point { | |> int coord[2]; | |> }; | | |> void print_value(int *p) | |> { | |> printf("%d", *p); | |> } | | |> void set_value(int *p, v) | |> { | |> *p = v; | |> } | | |> struct Point make_point(int a, int b) | |> { | |> struct Point p = {{a, b}}; | | D'après mes souvenirs, c'est une erreur.
c'est une erreur uniquement en K&R, mais pas en C90 et version ultérieure.
| On n'a pas (ou on n'avait | pas) droit à plus de niveau de {} qu'il y avait de niveau dans les | données à initialiser.
Ça c'est uniquement vrai en C K&R.
[...]
| |> 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.
| |> 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é. »
-- Gaby
Gabriel Dos Reis
James Kanze writes:
[...]
| Tout à fait. Il a proposé une correction, mais je ne vois toujours | pas comment l'appel de set_value est légal, même après sa | correction.
Après la correction, c'est valide en C++, invalide en C90, et undefined behaviour en C99.
-- Gaby
James Kanze <kanze@alex.gabi-soft.fr> writes:
[...]
| Tout à fait. Il a proposé une correction, mais je ne vois toujours
| pas comment l'appel de set_value est légal, même après sa
| correction.
Après la correction, c'est valide en C++, invalide en C90, et
undefined behaviour en C99.