"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
"Pierre Maurette" <maurettepierre@wanadoo.fr> wrote in message
news:424fa34b$0$13634$636a15ce@news.free.fr...
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 ;-))
"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
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
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
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
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.
- 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
Vincent Burel a écrit :
"Pierre Maurette" <maurettepierre@wanadoo.fr> 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.
- 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.
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.
On voit beaucoup^d'erreurs de débutants causées par cette simplification tableau == pointeur, évidemment fausse.
-- Pierre
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)
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
"Pierre Maurette" <maurettepierre@wanadoo.fr> wrote in message
news:424fb168$0$17287$636a15ce@news.free.fr...
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)
"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)
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...
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/
>> 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.
>> 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.
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
"AMcD®" <arnold.mcdonald@free.fr> wrote in message
news:424fe42b$0$26374$636a15ce@news.free.fr...
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 !? :-)
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
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 :
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
On 2005-04-03, Vincent Burel <vincent.burel@spam-wanadoo.fr> 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 :
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".
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 :
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
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
Vincent Burel wrote:
"Stephane Legras-Decussy" <admin@dtc.fr> wrote in message
news:424f588d$0$28545$626a14ce@news.free.fr...
Vincent Burel <vincent.burel@spam-wanadoo.fr> a écrit dans le
message : 424ee33f$0$3132$8fcfb975@news.wanadoo.fr...
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...