OVH Cloud OVH Cloud

help char* et char[xx]

20 réponses
Avatar
Vincent
bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?

merci

Vincent

10 réponses

1 2
Avatar
Bernie
Ben,

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

avec le prototype void ma_fonction(char* ptr)...
et si [30], je ferais ...

char toto[30];
ma_fonction(&(toto[0]));
cout << toto ; // toto modifié par ma_fonction

ai pas vérifié avec un compilo, mais il me semble que tout est ok,
rem, un bon bouquin avec plein d'astuces de ce type : C/C++, la bible du
programmeur aux Ed Reynald Goulet.

bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?

merci

Vincent




Avatar
Serge Paccalin
Le mercredi 6 juillet 2005 à 22:06, Vincent a écrit dans
fr.comp.lang.c++ :

bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!


Un passage de paramètre le fait systématiquement.

void ma_fonction(char *p)
{
strcpy(p,"Test");
}

...

char toto[300];
ma_fonction(toto); // passe l'adresse du tableau
cout << toto ; // contenu de toto modifié par ma_fonction

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction


Il faut que toto pointe sur quelque chose avant d'entrer dans la
fonction, puisque la fonction ne pourra pas rendre une valeur modifiée.

char *toto = malloc(300);
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
free(toto);

--
___________ 07/07/2005 09:19:45
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
Serge Paccalin
Le mercredi 6 juillet 2005 à 22:06, Vincent a écrit dans
fr.comp.lang.c++ :

bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!


Un passage de paramètre le fait systématiquement.

void ma_fonction(char *p)
{
strcpy(p,"Test");
}

...

char toto[300];
ma_fonction(toto); // passe l'adresse du tableau
cout << toto ; // contenu de toto modifié par ma_fonction

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction


Il faut que toto pointe sur quelque chose avant d'entrer dans la
fonction, puisque la fonction ne pourra pas rendre une valeur modifiée.

char *toto = (char *)malloc(300);
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
free(toto);

ou bien :

char *toto = new char[300];
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
delete [] toto;

--
___________ 07/07/2005 09:19:45
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
kanze
Vincent wrote:

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une
méthode qui veut un char*.

Comment passer du char[300] à un char* ? merci!!


Il y a une conversion implicite ; tu n'as donc rien à faire.

Comment passe t'on une chaine en paramètre dans une méthode?

cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?


Il faut bien affecter quelque chose à toto avant. Mais on peut
aussi passer un tableau directement :

char toto[ 30 ] ;
ma_fonction( toto ) ;
cout << toto ;

Seulement, si ton programme prend réelement des char* comme ça,
sans en prendre aussi la longueur, je crains qu'il soit sans
espoir.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
JBB
Le mercredi 6 juillet 2005 à 22:06, Vincent a écrit dans
fr.comp.lang.c++ :


bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!



Un passage de paramètre le fait systématiquement.

void ma_fonction(char *p)
{
strcpy(p,"Test");
}

...

char toto[300];
ma_fonction(toto); // passe l'adresse du tableau
cout << toto ; // contenu de toto modifié par ma_fonction


Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction



Il faut que toto pointe sur quelque chose avant d'entrer dans la
fonction, puisque la fonction ne pourra pas rendre une valeur modifiée.

char *toto = (char *)malloc(300);
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
free(toto);



C'est bien beau tout ça mais ça n'a rien avoir avec du C++, c'est du C.

ou bien :

char *toto = new char[300];
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
delete [] toto;



Là c'est mélangé.


Avatar
Serge Paccalin
Le jeudi 7 juillet 2005 à 10:35, JBB a écrit dans fr.comp.lang.c++ :

char *toto = (char *)malloc(300);
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
free(toto);



C'est bien beau tout ça mais ça n'a rien avoir avec du C++, c'est du C.


1. La bibliothèque C fait partie intégrante du C++, que ça te plaise ou
non.
2. Le cast sur malloc() est obligatoire en C++, inutile et gênant en C.
C'est visiblement une écriture C++.
3. cout << toto, c'est du C aussi ?

ou bien :

char *toto = new char[300];
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
delete [] toto;



Là c'est mélangé.


Mélangé avec quoi ?

--
___________ 07/07/2005 11:13:31
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763


Avatar
Pierre Maurette
bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?
Pour résumer, la méthode attend un pointeur (sur char) *non constant*.

Donc,
ma_fonction(toto);
ou plus explicitement
ma_fonction(&toto[0]);
vont fonctionner sans problème, comme déjà répondu.
Le fait que quand un tableau est un paramètre il devienne un pointeur
est à admettre comme un particularisme. Une struct ne contenant qu'un
tableau passera ce tableau normalement, par copie de valeurs, et donc
les modifications éventuelles n'agiront pas sur l'original.

Attention, dans le cas par exemple:
char* tata = "01234567890123456789012345678";
ça va certainement crasher à l'exécution (écriture dans une zone read
only).

Code à la noix pour illustrer:

class ttiti{public: char toto[30];};
// ou
//typedef struct ttiti {char toto[30];};

void f(char* tab){tab[5] = '';}
void g(ttiti titi){
titi.toto[5] = '';
std::cout << "Dans g(): " << titi.toto << std::endl;
}

int main(void)
{
char toto[30] = "je suis le ténébreux";
char* tata = "01234567890123456789012345678";
ttiti titi;
int i = -1;
while(i++, titi.toto[i] = toto[i]); // ouille ouille ouille
std::cout << toto << 't' << tata << 't' << titi.toto << std::endl;
f(&toto[0]);
//f(tata); //crash
//f(titi.toto); //OK
g(titi);
std::cout << toto << 't' << tata << 't' << titi.toto << std::endl;
return 0;
}

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette

Avatar
Stan
"Serge Paccalin" a écrit dans le message
de news: 2h9m2zmtplng$
Le jeudi 7 juillet 2005 à 10:35, JBB a écrit dans fr.comp.lang.c++ :

char *toto = (char *)malloc(300);
ma_fonction(toto); // passe le contenu du pointeur
cout << toto ; // bloc pointé par toto modifié par ma_fonction
free(toto);



C'est bien beau tout ça mais ça n'a rien avoir avec du C++, c'est du C.


1. La bibliothèque C fait partie intégrante du C++, que ça te plaise ou
non.
2. Le cast sur malloc() est obligatoire en C++, inutile et gênant en C.
C'est visiblement une écriture C++.
3. cout << toto, c'est du C aussi ?



Disons que lorsqu'on écrit un programme, vaut mieux employer
un style qui sucite le moins de doute possible dans l'esprit
de celui qui le relira ( y compris soi-même ).
C'est pour cette raison qu'il est préférable d'utiliser une écriture
idiomatique.

--
-Stan



Avatar
Vincent
Merci à tous,
char *toto;
char titi[20];
pour strcpy(toto,titi);
ca plantait parceque je n'avais pas fait de malloc de toto avec la longueur
de titi !

encore merci
Vincent


"Pierre Maurette" a écrit
dans le message de news:
bonjour,

J'ai récupéré un code que je dois maintenir et faire évoluer.
Il y à un char[300] qui est utilisé, je veux utiliser une méthode qui
veut un char*.
Comment passer du char[300] à un char* ? merci!!

Comment passe t'on une chaine en paramètre dans une méthode?
cette chaine est modifiée par la méthode du genre :

char *toto;
ma_fonction(toto);
cout << toto ; // toto modifié par ma_fonction

et avec un char toto[30] ?
Pour résumer, la méthode attend un pointeur (sur char) *non constant*.

Donc,
ma_fonction(toto);
ou plus explicitement
ma_fonction(&toto[0]);
vont fonctionner sans problème, comme déjà répondu.
Le fait que quand un tableau est un paramètre il devienne un pointeur est
à admettre comme un particularisme. Une struct ne contenant qu'un tableau
passera ce tableau normalement, par copie de valeurs, et donc les
modifications éventuelles n'agiront pas sur l'original.

Attention, dans le cas par exemple:
char* tata = "01234567890123456789012345678";
ça va certainement crasher à l'exécution (écriture dans une zone read
only).

Code à la noix pour illustrer:

class ttiti{public: char toto[30];};
// ou
//typedef struct ttiti {char toto[30];};

void f(char* tab){tab[5] = '';}
void g(ttiti titi){
titi.toto[5] = '';
std::cout << "Dans g(): " << titi.toto << std::endl;
}

int main(void)
{
char toto[30] = "je suis le ténébreux";
char* tata = "01234567890123456789012345678";
ttiti titi;
int i = -1;
while(i++, titi.toto[i] = toto[i]); // ouille ouille ouille
std::cout << toto << 't' << tata << 't' << titi.toto << std::endl;
f(&toto[0]);
//f(tata); //crash
//f(titi.toto); //OK
g(titi);
std::cout << toto << 't' << tata << 't' << titi.toto << std::endl;
return 0;
}

--
Pour répondre directement: enlever une lettre sur deux
wwaannaaddoooo -> wanadoo

Pierre Maurette




Avatar
Serge Paccalin
Le jeudi 7 juillet 2005 à 16:21, Stan a écrit dans fr.comp.lang.c++ :

Disons que lorsqu'on écrit un programme, vaut mieux employer
un style qui sucite le moins de doute possible dans l'esprit
de celui qui le relira ( y compris soi-même ).


Tout à fait. Et comme je répondais à une question, j'ai repris les
termes de la question, à savoir variables de type char * et char[].

Si j'avais dû le coder pour mon compte, c'était std::string à tous les
étages, et pas d'allocation explicite, que ce soit avec new ou malloc().

--
___________ 07/07/2005 17:56:56
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

1 2