>> char ch1[] = "bonjour"; char* ch2 = "bonjour"; Attention, ch1 est modifiable (c'est un tableau), ch2 est une chaîne constante. Modifier un caratère dans ch1 est possible, dans ch2 c'est interdit. Selon le compilateur, ça crashera ou pas. Si ça ne crashe pas, ce n'estg que de la chance. Ce n'est pas votre question, mais ça peut être utile.
pas du tout , les 2 écritures sont équivalentes. et le compilateur traduit l'une comme l'autre, exactement de la même manière. Ici ce sont les pointeur ch1 et ch2 qu l'on ne peut pas modifier, mais l'on peut faire ch1[2]=ch2[3]=0; sans problème.
non, normalement on ne peut pas sur la 2e écriture, parce que le bloc mémoire pointé par ch2 peut se trouver dans une zone en lecture seule. Tout dépend de l'implémentation du compilo, AMA dans la norme (je l'ai pas sous la main) c'est précisé que le comportement est indéfini. En fait pour des raisons de clarté il faudrait écrire const char* ch2="bonjour";
- Un rappel: en C, il n'y a de passage de paramètre que par valeur. Libre au programmeur de passer un pointeur (par valeur). MAIS ... - ... Mais il faut admettre (et non pas expliquer, on ne s'en sort pas)
bien sur que si qu'on s'en sort ! le tableau n'est pas un type de variable en "C" c'est une macro très pratique qui permet de déclarer du pointer auto-alloué. c'est tout.
fr.comp.lang.c en ISO/ANSI C fr.comp.lang.c++ en ISO/ANSI C++ (et ne pas confondre les deux ;-))
pourtant y'a a peu près les même intervenants :-)
VB
>> char ch1[] = "bonjour";
char* ch2 = "bonjour";
Attention, ch1 est modifiable (c'est un tableau), ch2 est une chaîne
constante. Modifier un caratère dans ch1 est possible, dans ch2 c'est
interdit. Selon le compilateur, ça crashera ou pas. Si ça ne crashe pas,
ce n'estg que de la chance. Ce n'est pas votre question, mais ça peut
être utile.
pas du tout , les 2 écritures sont équivalentes. et le compilateur traduit
l'une comme l'autre, exactement de la même manière. Ici ce sont les
pointeur
ch1 et ch2 qu l'on ne peut pas modifier, mais l'on peut faire
ch1[2]=ch2[3]=0; sans problème.
non, normalement on ne peut pas sur la 2e écriture, parce que le bloc
mémoire pointé par ch2 peut se trouver dans une zone en lecture seule. Tout
dépend de l'implémentation du compilo, AMA dans la norme (je l'ai pas sous
la main) c'est précisé que le comportement est indéfini.
En fait pour des raisons de clarté il faudrait écrire
const char* ch2="bonjour";
- Un rappel: en C, il n'y a de passage de paramètre que par valeur.
Libre au programmeur de passer un pointeur (par valeur). MAIS ...
- ... Mais il faut admettre (et non pas expliquer, on ne s'en sort pas)
bien sur que si qu'on s'en sort ! le tableau n'est pas un type de variable
en "C" c'est une macro très pratique qui permet de déclarer du pointer
auto-alloué. c'est tout.
fr.comp.lang.c en ISO/ANSI C
fr.comp.lang.c++ en ISO/ANSI C++
(et ne pas confondre les deux ;-))
>> char ch1[] = "bonjour"; char* ch2 = "bonjour"; Attention, ch1 est modifiable (c'est un tableau), ch2 est une chaîne constante. Modifier un caratère dans ch1 est possible, dans ch2 c'est interdit. Selon le compilateur, ça crashera ou pas. Si ça ne crashe pas, ce n'estg que de la chance. Ce n'est pas votre question, mais ça peut être utile.
pas du tout , les 2 écritures sont équivalentes. et le compilateur traduit l'une comme l'autre, exactement de la même manière. Ici ce sont les pointeur ch1 et ch2 qu l'on ne peut pas modifier, mais l'on peut faire ch1[2]=ch2[3]=0; sans problème.
non, normalement on ne peut pas sur la 2e écriture, parce que le bloc mémoire pointé par ch2 peut se trouver dans une zone en lecture seule. Tout dépend de l'implémentation du compilo, AMA dans la norme (je l'ai pas sous la main) c'est précisé que le comportement est indéfini. En fait pour des raisons de clarté il faudrait écrire const char* ch2="bonjour";
- Un rappel: en C, il n'y a de passage de paramètre que par valeur. Libre au programmeur de passer un pointeur (par valeur). MAIS ... - ... Mais il faut admettre (et non pas expliquer, on ne s'en sort pas)
bien sur que si qu'on s'en sort ! le tableau n'est pas un type de variable en "C" c'est une macro très pratique qui permet de déclarer du pointer auto-alloué. c'est tout.
fr.comp.lang.c en ISO/ANSI C fr.comp.lang.c++ en ISO/ANSI C++ (et ne pas confondre les deux ;-))
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer une constante, alors même que vous ne l'avez pas spécifier par le mot clef const. c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que char* ch="bonjour" compile, puisqu'il y a un cast implicite entre un char const * ("bonjour") et un char * (ch) ... Des conversions de ce type sont très dangereuses (et il y en a d'autres en C...) D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un code vu dans beaucoup de sources, hélas.
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux
puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer
une constante, alors même que vous ne l'avez pas spécifier par le mot clef
const.
c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que
char* ch="bonjour"
compile, puisqu'il y a un cast implicite entre un char const * ("bonjour")
et un char * (ch) ... Des conversions de ce type sont très dangereuses (et
il y en a d'autres en C...)
D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un
code vu dans beaucoup de sources, hélas.
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer une constante, alors même que vous ne l'avez pas spécifier par le mot clef const. c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que char* ch="bonjour" compile, puisqu'il y a un cast implicite entre un char const * ("bonjour") et un char * (ch) ... Des conversions de ce type sont très dangereuses (et il y en a d'autres en C...) D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un code vu dans beaucoup de sources, hélas.
Alexandre
"Jean Pierre Daviau" a écrit dans le message de news: g7c4e.24778$
Pourquoi
ch1[2]=ch2[3]=0; est-il considéré comme ch1[2]=ch2[3]= ' '; par borland 5.5 winXP?
ben 0 et ' ' sont de la même valeur. Il n'y a qu'une seule différence : ' ' est un const char 0 est un const int.
"Jean Pierre Daviau" <Once@WasEno.ugh> a écrit dans le message de news:
g7c4e.24778$5A5.571745@weber.videotron.net...
Pourquoi
ch1[2]=ch2[3]=0;
est-il considéré comme
ch1[2]=ch2[3]= ' '; par borland 5.5 winXP?
ben 0 et ' ' sont de la même valeur. Il n'y a qu'une seule différence :
' ' est un const char
0 est un const int.
"Jean Pierre Daviau" a écrit dans le message de news: g7c4e.24778$
Pourquoi
ch1[2]=ch2[3]=0; est-il considéré comme ch1[2]=ch2[3]= ' '; par borland 5.5 winXP?
ben 0 et ' ' sont de la même valeur. Il n'y a qu'une seule différence : ' ' est un const char 0 est un const int.
Pierre Maurette
Jean Pierre Daviau a écrit :
| faire ch1[2]=ch2[3]=0; sans problème.
Avec Borland.
Si je compile avec DEVC++ et que je roule dans un dos prompt : crash
C'est clair (la phrase citée était déjà une citation, pas de moi). En fait, ça pète sous gcc Windows, gcc Linux, MS VC7.1, MS VC 8.0 en mode 64bits... (etc. j'imagine ....) -- Pierre
Jean Pierre Daviau a écrit :
| faire ch1[2]=ch2[3]=0; sans problème.
Avec Borland.
Si je compile avec DEVC++ et que je roule dans un dos prompt : crash
C'est clair (la phrase citée était déjà une citation, pas de moi). En
fait, ça pète sous gcc Windows, gcc Linux, MS VC7.1, MS VC 8.0 en mode
64bits...
(etc. j'imagine ....)
--
Pierre
Si je compile avec DEVC++ et que je roule dans un dos prompt : crash
C'est clair (la phrase citée était déjà une citation, pas de moi). En fait, ça pète sous gcc Windows, gcc Linux, MS VC7.1, MS VC 8.0 en mode 64bits... (etc. j'imagine ....) -- Pierre
Vincent Burel
"AMcD®" wrote in message news:425180d8$0$13901$
Jean-Claude BELLAMY wrote: > Dans le message news:42512c16$0$13905$ , > AMcD® s'est ainsi exprimé: > >> [...] >> Par exemple, moi, j'attends toujours que l'immense Mr Bellamy me >> montre sa version Delphi de mon bout de code ou, au minimum, qu'il >> retire ses insultes déplacées et reconnaisse ses torts. > > Mais p..n de b..l de m...e, (;-) ) je ne vais pas retirer d'insultes > vu que je ne t'ai pas insulté !
Bah non, me traiter de raciste, d'intégriste, etc. Ce ne n'est pas des insultes.
> Je me suis insurgé contre les oeillères "ayatollesques et > intégristes" de certains, pour lesquels en dehors du C il n'y a pas > de salut. Et je persiste et signe ...
Sauf que moi, je n'ai pas d'oeillères.
[...]
Avant que cette dicussion s'envenime, je propose de nommer un médiateur ! :-) VB
"AMcD®" <arnold.mcdonald@free.fr> wrote in message
news:425180d8$0$13901$636a15ce@news.free.fr...
Jean-Claude BELLAMY wrote:
> Dans le message news:42512c16$0$13905$636a15ce@news.free.fr ,
> AMcD® <arnold.mcdonald@free.fr> s'est ainsi exprimé:
>
>> [...]
>> Par exemple, moi, j'attends toujours que l'immense Mr Bellamy me
>> montre sa version Delphi de mon bout de code ou, au minimum, qu'il
>> retire ses insultes déplacées et reconnaisse ses torts.
>
> Mais p..n de b..l de m...e, (;-) ) je ne vais pas retirer d'insultes
> vu que je ne t'ai pas insulté !
Bah non, me traiter de raciste, d'intégriste, etc. Ce ne n'est pas des
insultes.
> Je me suis insurgé contre les oeillères "ayatollesques et
> intégristes" de certains, pour lesquels en dehors du C il n'y a pas
> de salut. Et je persiste et signe ...
Sauf que moi, je n'ai pas d'oeillères.
[...]
Avant que cette dicussion s'envenime, je propose de nommer un médiateur !
:-)
VB
Jean-Claude BELLAMY wrote: > Dans le message news:42512c16$0$13905$ , > AMcD® s'est ainsi exprimé: > >> [...] >> Par exemple, moi, j'attends toujours que l'immense Mr Bellamy me >> montre sa version Delphi de mon bout de code ou, au minimum, qu'il >> retire ses insultes déplacées et reconnaisse ses torts. > > Mais p..n de b..l de m...e, (;-) ) je ne vais pas retirer d'insultes > vu que je ne t'ai pas insulté !
Bah non, me traiter de raciste, d'intégriste, etc. Ce ne n'est pas des insultes.
> Je me suis insurgé contre les oeillères "ayatollesques et > intégristes" de certains, pour lesquels en dehors du C il n'y a pas > de salut. Et je persiste et signe ...
Sauf que moi, je n'ai pas d'oeillères.
[...]
Avant que cette dicussion s'envenime, je propose de nommer un médiateur ! :-) VB
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer une constante, alors même que vous ne l'avez pas spécifier par le mot clef const. c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que char* ch="bonjour" compile, puisqu'il y a un cast implicite entre un char const * ("bonjour") et un char * (ch) ... Des conversions de ce type sont très dangereuses (et il y en a d'autres en C...) D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un code vu dans beaucoup de sources, hélas.
En fait, on pourra se forcer à faire des: const char* NomAuteur = "Jules César"; et là, ça ne me gêne pas que ce soit une globale (shame on me !), et en tous cas de les regrouper, et des char octet[] = "0000.0000"; modifiables... -- Pierre
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux
puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer
une constante, alors même que vous ne l'avez pas spécifier par le mot clef
const.
c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que
char* ch="bonjour"
compile, puisqu'il y a un cast implicite entre un char const * ("bonjour")
et un char * (ch) ... Des conversions de ce type sont très dangereuses (et
il y en a d'autres en C...)
D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un
code vu dans beaucoup de sources, hélas.
En fait, on pourra se forcer à faire des:
const char* NomAuteur = "Jules César";
et là, ça ne me gêne pas que ce soit une globale (shame on me !), et en
tous cas de les regrouper, et des
char octet[] = "0000.0000";
modifiables...
--
Pierre
ce que j'ai dit reste vrai sauf dans cette exemple tiré par les cheveux puisque ici le 'C' dans le cas de ch2, fait comme si vous vouliez déclarer une constante, alors même que vous ne l'avez pas spécifier par le mot clef const. c'est l'exception qui confirme la règle
ce qui est anormal, c'est surtout que char* ch="bonjour" compile, puisqu'il y a un cast implicite entre un char const * ("bonjour") et un char * (ch) ... Des conversions de ce type sont très dangereuses (et il y en a d'autres en C...) D'ailleurs est-ce toujours le cas en C99 ? Je pense que oui car c'est un code vu dans beaucoup de sources, hélas.
En fait, on pourra se forcer à faire des: const char* NomAuteur = "Jules César"; et là, ça ne me gêne pas que ce soit une globale (shame on me !), et en tous cas de les regrouper, et des char octet[] = "0000.0000"; modifiables... -- Pierre