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

1 2 3 4 5
Avatar
Vincent Burel
"Pierre Maurette" wrote in message
news:424fa34b$0$13634$
none a écrit :
> Salut à tous, je souhaiterais transmettre un tableau de chaines de
> caracteres d'une fonction à une autre. comment faire ?
Je reprends en partie ce qui vous a été répondu, non pas en expert mais
comme ayant tâté récemment de ces problèmes.
- Une chaîne de caractère:



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.

- 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
David MAREC
D'après machin::none:

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




Sub fonction_1(byval toto as string())
Dim i As Integer
For i = element To UBound(tableau) - 1
tableau(i) = tableau(i + 1)
Next
End Sub

Sub fonction_2()
var Toto(10) as string

toto(0)="a"
call fonction_1(Toto)


End Sub
Avatar
Pierre Maurette
Vincent Burel a écrit :
"Pierre Maurette" wrote in message


[...]
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.


Code de test:
char ch1[] = "bonjour";
char* ch2 = "bonjour";

ch1[1] = 'e'; /* OK */
ch2[1] = 'e'; /* crash */

En fait, ça crashe sous Gcc (Mingw), pas sous Borland 5.6. Et le crash
est normal au regard de la norme.

Ajoutez aux test:
char ch1[] = "bonjour";
char* ch2 = "bonjour";
char* ch3 = "bonjour";

printf("%dn", (ch1 == ch2));
printf("%dn", (ch1 == ch3));
printf("%dn", (ch2 == ch3));

j'imagine que ça dépend du compilo, mais chez moi c'est:
0
0
1

const char* ch2 = "bonjour";
char* ch2 = "bonjour";

sont équivalents.




- 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.


On voit beaucoup^d'erreurs de débutants causées par cette simplification
tableau == pointeur, évidemment fausse.

--
Pierre
Avatar
Vincent Burel
"Pierre Maurette" wrote in message
news:424fb168$0$17287$
Vincent Burel a écrit :
> 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.
Code de test:
char ch1[] = "bonjour";
char* ch2 = "bonjour";

ch1[1] = 'e'; /* OK */
ch2[1] = 'e'; /* crash */

En fait, ça crashe sous Gcc (Mingw), pas sous Borland 5.6. Et le crash
est normal au regard de la norme.



ok, y'a une distinction qui est fait par le compilo qui considère
implicitement ch2 comme un pointeur sur constante (ce qui n'est pas normal,
mais constitue une optimization d'espace j'imagine). Cependant,
fondamentalement, c'est le même type de déclaration. (Le fait que cela
crache ne peut être du qu'à une utilisation de mémoire protégé read only,
donc dépendant aussi de l'O/S)

const char* ch2 = "bonjour";
char* ch2 = "bonjour";

sont équivalents.



oui, mais ca c'est encore une bizarreté du langage.
On voit beaucoup^d'erreurs de débutants causées par cette simplification
tableau == pointeur, évidemment fausse.



ha ouai ! et quel type d'erreur le débutant peut faire quand il simplifie
array = pointer !? :-)

VB
Avatar
Matt
David MAREC a écrit :
D'après machin::none:


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





Sub fonction_1(byval toto as string())
Dim i As Integer
For i = element To UBound(tableau) - 1
tableau(i) = tableau(i + 1)
Next
End Sub

Sub fonction_2()
var Toto(10) as string

toto(0)="a"
call fonction_1(Toto)


End Sub




Bonjour,

Lire le sujet de la discussion : en C-ANSI.
Dommage,

Matt...
Avatar
AMcD®
>> 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.



Hum, équivalent, pas vraiment.

char* sz2 = "yo !"

définit une variable pointeur recevant l'adresse de la chaîne "yo". Cette
chaîne, tableau de char en mémoire, est constante, tu ne peux pas la
modifier. Mais le pointeur lui, n'est pas constant. Rien ne t'empêche de
faire :

char *sz3;

sz3 = "Pfff!";
sz2 = sz3;

ou

sz2 = "biniou"

Mais pas

wsprintf(sz2,"%s","AMcD")

ou

sz2[2] = 'a'

ou

strcpy(sz2,"aïe")

quand tu fais :

char sz1[] = "arf"

sz1 est un pointeur constant vers le début du tableau de char en mémoire
constituant la chaîne "arf". Donc,

sz1 = "mdr"

est impossible. Mais tu peux modifier le contenu du tableau, lui n'est pas
constant. Par exemple :

strcpy(sz1,"mdr")

ou

sz1[2] = 'z'

ou

wsprintf(sz1,"%s","erf!")

Si tu trouves que c'est équivalent... Ce qui est un peu triste, c'est que
pas mal de compilo vont compiler sans broncher le sz2[2] = 'a' vu ci-dessus.
Par contre, ça crashe au runtime. C'est déjà ça :-).

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.



J'ai quand même du mal à te suivre. Pas de type tableau ? Un tableau est une
structure de données constituée d'éléments du même type. Après, que le C te
renvoie un pointeur dessus pour le manipuler, qu'est-ce que ça change ? En
mémoire, t'as un tableau.

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
David MAREC
D'après Matt:

Lire le sujet de la discussion : en C-ANSI.



Et d'après vous, qui l'a bien lu ?
Avatar
Vincent Burel
"AMcD®" wrote in message
news:424fe42b$0$26374$
>> char ch1[] = "bonjour";
>> char* ch2 = "bonjour";



J'ai quand même du mal à te suivre. Pas de type tableau ? Un tableau est


une
structure de données constituée d'éléments du même type. Après, que le C


te
renvoie un pointeur dessus pour le manipuler, qu'est-ce que ça change ? En
mémoire, t'as un tableau.



certainement, mais y'a des langage ou le tableau est un vrai type. que tu
peux passer par copy à des fonctions, ou copier par affectation simple. En
"C" le type tableau est particulier et ne correspond ni à une variable
normale, ni exactement à un pointeur auto-alloué... mais j'aime bien cette
éternelle discussion, parce qu'elle fait perdre un temps fou et qu'elle
rameute du monde :-) un vrai troll :-)

ceci dit la clef de voute de votre démonstration, a Toi et Mr Maurette,
c'est de dire que l'équivalence pointeur-tableau est fausse car si l'on
déclare char * ch2="bonjour"; alors on ne peut pas écrire dedans...
contrairement à une déclaration de type char ch1[]="bonjour"; Dans le
premier cas y'a déclaration implicite de constante, c'est une singularité
qui ne remets pas en cause le fait que tu considère ton tableau comme un
pointeur sur un espace mémoire indexable...

d'un autre coté si tableau1[100] et tableau2[100] sont considérés comme deux
variables tableaux, alors pourquoi ne peut on pas affecter un tableau à
l'autre comme on le fait avec n'importe quelle autre type de variable !?
tableau1=tableau2 ne copie pas le contenu du tableau2 and la variable
tableau1... bizarre non !? :-)

VB
Avatar
Cyrille Szymanski
On 2005-04-03, Vincent Burel wrote:
char ch1[] = "bonjour";
char* ch2 = "bonjour";



ok, y'a une distinction qui est fait par le compilo qui considère
implicitement ch2 comme un pointeur sur constante (ce qui n'est pas normal,
mais constitue une optimization d'espace j'imagine).



Non non, c'est explicité dans la norme ça. La norme garantit que ch1 est
modifiable, mais ne dit rien sur ch2.

Je pense qu'il y a une référence dans la FAQ de fclc mais je ne suis plus très
sûr. En tout cas :

http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc007.html#tableau-pointeur
http://www.isty-info.uvsq.fr/~rumeau/fclc/fclc005.html#q_9

Cependant, fondamentalement, c'est le même type de déclaration. (Le fait que
cela crache ne peut être du qu'à une utilisation de mémoire protégé read
only, donc dépendant aussi de l'O/S)



C'est exactement cela, certains compilateurs vont allouer de l'espace sur la
pile et ch2 sera modifiable, d'autres vont mettre ces données sur le tas
(modifiable aussi) et d'autres vont mettre ça dans une zone en lecture seule.

Ce qui cause un flottement c'est qu'on fait une déclaration et une
initialisation en même temps.

char ch1[] = "bonjour";

C'est tout simplement la déclaration d'un tableau de taille 8 qui est ensuite
initialisé pour contenur la chaîne "bonjour", alors que :

char *ch2 = "bonjour";

c'est tout simplement la déclaration d'un pointeur (généralement un int) qui
est ensuite initialisé vers un espace contenant la chaîne "bonjour".

--
Cyrille Szymanski
Avatar
Arnaud Debaene
Vincent Burel wrote:
"Stephane Legras-Decussy" wrote in message
news:424f588d$0$28545$

Vincent Burel a écrit dans le
message : 424ee33f$0$3132$
y'a pas de tableau en "C" , y'a des pointeur typés avec possibilité
d'accrocher un indice, mais y'a pas de variable de type tableau.



int tab[10];

sizeof(tab) / sizeof *(tab) donne le nombre d'élément, soit 10...

c'est pas mal pour un langage qui connait pas les tableaux...

tab n'est pas un pointeur, c'est bien un tableau, CQFD...



ha ouai, y'a en encore des gens qui utilise "CQFD" sans savoir ce que
cela veut dire !

Alors Ce Qu'il Faut Démontrer :


<snip>

Plutôt que de continuer à te ridiculiser, tu ferais mieux de lire la
norme...


Arnaud
1 2 3 4 5