OVH Cloud OVH Cloud

transmettre chaines de caracteres en C-ANSI

74 réponses
Avatar
Salut à tous, je souhaiterais transmettre un tableau de chaines de
caracteres d'une fonction à une autre. comment faire ?

Merci d'avance
Nico

PS : si je suis sur le mauvais forum, merci de m'en indiquer un qui
correspondrait mieux à ma question. :-)

10 réponses

4 5 6 7 8
Avatar
Alexandre
>> 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




Avatar
Alexandre
>> >> char ch1[] = "bonjour";
>> char* ch2 = "bonjour";



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.
Avatar
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.
Avatar
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
Avatar
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
Avatar
Pierre Maurette
Alexandre a écrit :
>> char ch1[] = "bonjour";
>> char* ch2 = "bonjour";



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
Avatar
Jean Pierre Daviau
Je suggère ED!
Avatar
Jean Pierre Daviau
Avatar
Pierre Maurette
Jean Pierre Daviau a écrit :
Je suggère ED!


L'épicier ?
--
Pierre
Avatar
AMcD®
Jean Pierre Daviau wrote:
Je suggère ED!



Et c'est qui ?

--
AMcD®

http://arnold.mcdonald.free.fr/
4 5 6 7 8