Fonction avec parametre en char * et appel avec string

Fonction avec parametre en char * et appel avec string - C++ - Programmation

Marsh Posté le 22-12-2007 à 15:38:40    

:hello:  
 
J'ai une fonction (a base d'opengl : glutBitmapCharacter) qui prend en parametre un char*, mais je voudrais lui envoyer une chaine de characteres
 
Prototype :

Code :
  1. void fonction (char * chaine);


 
Si j'apelle comme ceci :

Code :
  1. fonction ("Hello world" );


 
ca marche, mais si :

Code :
  1. string chaine = "hello";
  2. fonction (chaine);


 
la ca marche plus  :(  
 
quel cast faut-il faire ?

Reply

Marsh Posté le 22-12-2007 à 15:38:40   

Reply

Marsh Posté le 22-12-2007 à 15:53:10    

.c_str() :o

Reply

Marsh Posté le 22-12-2007 à 15:58:53    

ne marche pas :/

 

invalid conversion from const char * to char *


Message édité par tomsoft le 22-12-2007 à 15:59:20
Reply

Marsh Posté le 22-12-2007 à 16:04:52    

pourquoi cette conne de fonction prend un char* et pas un const char * ?

Reply

Marsh Posté le 22-12-2007 à 16:09:38    

je sais pas, mais :
 
char * charScore = const_cast<char*>(strScore.c_str());
 
marche,
 
reste un probleme, ma strign est formée comme ceci :
 
string strScore = "Score : " + score;
 
score etant un int,
 
tant que score = 0, ca affiche "Score :", mais des que je passe a 1, plus rien :/

Reply

Marsh Posté le 22-12-2007 à 16:10:41    

std::stringstream

Reply

Marsh Posté le 22-12-2007 à 16:14:56    

tu pourrais me donner juste un exemple de stringstream ?
 
je trouve pas grand chose sur le net :/

Reply

Marsh Posté le 22-12-2007 à 16:25:32    

[:pingouino]
 

Code :
  1. std::ostringstream oss;
  2. oss << "Score : " << score;
  3. function(const_cast<char*>(oss.str()));

Reply

Marsh Posté le 22-12-2007 à 16:26:09    

merci :jap:

Reply

Marsh Posté le 22-12-2007 à 16:26:48    

Reply

Marsh Posté le 22-12-2007 à 16:26:48   

Reply

Marsh Posté le 22-12-2007 à 16:40:13    

merci, il manquait juste un une conversion string vers char dans ton code ;)

 

donc :

Code :
  1. std::ostringstream oss;
  2. oss << "Score : " << score;
  3. string strScore = oss.str();
  4. function(const_cast<char*>(strScore.c_str());
 

et merci encore :d :love:


Message édité par tomsoft le 22-12-2007 à 16:40:32
Reply

Marsh Posté le 22-12-2007 à 16:41:50    

Et oh, RVO hein :o
 

Code :
  1. std::ostringstream oss;
  2. oss << "Score : " << score;
  3. function(const_cast<char*>(strScore.str().c_str());


 
Pas besoin de cet objet temporaire moche

Reply

Marsh Posté le 22-12-2007 à 16:53:26    

jpensais pas que ca aurait marché un truc comme ca :d

Reply

Marsh Posté le 23-12-2007 à 00:27:57    

const_cast<char*>
 
et boum, bien joué. La véritable solution, c'est:
- soit corriger la fonction C
- faire une copie propre de la chaine dans un vector<char> et passer en argument &v[0]

Reply

Marsh Posté le 23-12-2007 à 22:49:19    

const_cast<char*>, le meilleur ami de la string corrompue...
 
Sinon, la signature de ta fonction est definitivement pourrie:

Code :
  1. void fonction (char * chaine);

C'est nul.
 

Code :
  1. void fonction (const char * chaine);
  2. /* ou */
  3. void fonction (char * chaine, size_t taille);
  4. /* ou alors soyons fou */
  5. void fonction (const std::string & chaine);

C'est quand meme beaucoup mieux

Reply

Marsh Posté le 24-12-2007 à 10:43:14    

justement, quelle est la difference entre char * et const char * ?
 
une est "constante", mais concretement ? que peut-je faire ?
 
Je dirais que char * est un tableau de char, donc on envoi a la fonction l'adresse du tableau, donc si elle est declarée "const", on peut juste lire c'est ca ?

Reply

Marsh Posté le 24-12-2007 à 11:18:27    

En effet, const type* est un pointeur sur des données non modifiable.
Ce que tu fais en const castant le const char* renvoyé par c_str() est que tu autorises la fonction appellée a modifier cette chaine. Le hic c'est que cette chaine n'est qu'une representation interne de la std::string. Donc en prenant le risque de la modifier tu prend le risque de bousiller la string en question.

Reply

Marsh Posté le 24-12-2007 à 11:27:10    

parce qu'apres un cast d'une valeur renvoyée par c_str(), si je modifie la variable char *, ca modifie aussi ma chaine ?

Reply

Marsh Posté le 24-12-2007 à 11:31:50    

Oui, enfin ca modifiera la representation interne de la std::string. Donc par exemple ca pourrait tres bien foutre en l'air les infos de taille de la chaine par ex...( enfin pour ce genre de détail d'implémentation il faudrait plutot demander aux experts, je ne sais pas comment est implémenté une string dans le détail).
Ce qu'il faut retenir cest que si une fonction quelconque te renvoie un truc const c'est qu'il y a une raison, et const caster cette valeur pour en faire n'importe quoi apres n'est jamais une bonne idée.

Reply

Marsh Posté le 26-12-2007 à 08:55:03    

Jux_ a écrit :

Oui, enfin ca modifiera la representation interne de la std::string. Donc par exemple ca pourrait tres bien foutre en l'air les infos de taille de la chaine par ex...( enfin pour ce genre de détail d'implémentation il faudrait plutot demander aux experts, je ne sais pas comment est implémenté une string dans le détail).
Ce qu'il faut retenir cest que si une fonction quelconque te renvoie un truc const c'est qu'il y a une raison, et const caster cette valeur pour en faire n'importe quoi apres n'est jamais une bonne idée.

Archi faux.

Reply

Marsh Posté le 26-12-2007 à 09:44:42    

Ce qui est bien dans ce genre de cas c'est d'expliquer ce qui est "archi faux"... c'est legerement plus constructif.
 
D'ailleurs quand je dis:
 

Citation :

Ce qu'il faut retenir cest que si une fonction quelconque te renvoie un truc const c'est qu'il y a une raison, et const caster cette valeur pour en faire n'importe quoi apres n'est jamais une bonne idée.


 
Je ne vois pas en quoi cela est faux. Et pour ce qui est de mes supposition sur les std::string j'ai bien dis que cela restait des suppositions...

Reply

Marsh Posté le 26-12-2007 à 12:06:09    

Jux_ a écrit :

Ce qui est bien dans ce genre de cas c'est d'expliquer ce qui est "archi faux"... c'est legerement plus constructif.
 
D'ailleurs quand je dis:
 

Citation :

Ce qu'il faut retenir cest que si une fonction quelconque te renvoie un truc const c'est qu'il y a une raison, et const caster cette valeur pour en faire n'importe quoi apres n'est jamais une bonne idée.


 
Je ne vois pas en quoi cela est faux. Et pour ce qui est de mes supposition sur les std::string j'ai bien dis que cela restait des suppositions...


Je n'ai pas à me justifier, c'est toi qui fait des propositions, à toi de prouver qu'elles sont vraies.
 
Sur quels éléments tu te bases pour faire ces suppositions ?
Moi je me base sur la signature de la fonction qui renvoie un const char * et sur la norme qui dit en §21.3.7

const charT* c_str() const;
1 Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the
corresponding elements of the string controlled by *this and whose last element is a null character specified by
charT().
2 Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the returned
value as a valid pointer value after any subsequent call to a non-const member function of the class basic_string
that designates the same object as this.

Reply

Marsh Posté le 26-12-2007 à 13:52:11    

Je ne te demande pas de te justifier. Je dis juste que quand on dit a quelqu'un que ce qu'il raconte est faux, c'est une bonne chose de lui dire pourquoi. Cela arrive très souvent qu'une erreur soit commise "de bonne foi" et dans ce cas la ce n'est pas forcement évident de savoir le pourquoi du comment. En l'occurence ici je ne faisait qu'illustrer le genre d'erreur potentiel pouvant intervenir à cause d'un const_cast en précisant bien que ce n'était qu'une supposition...(d'ailleurs j'ai utilisé le mot "pourrait", donc c'était bien du domaine de l'hypothetique, je n'ai jamais dis "cest comme ça et stou" ). J'aurais tres bien pu illustrer ca par une classe Toto et une fonction Foo, mais c'est clairement moins parlant pour la personne qui pose la question...enfin ca m'aurait peut etre evité de me faire sauter dessus a pied joints :)

Reply

Marsh Posté le 26-12-2007 à 14:19:34    

me suis un peu emballé.
 
Mais bon j'ai cité le standard qui dit tout ce qu'il y a besoin de savoir.
Quitte à écrire un const_cast ici, autant le faire bien

Code :
  1. const_cast<char*> /* le responsable de cette corruption memoire est XXX, XXXX, bureau Z, qui aime le faire foueter avec le chat */ (s.c_str());

Reply

Marsh Posté le 26-12-2007 à 14:45:16    

Jux_ a écrit :

En effet, const type* est un pointeur sur des données non modifiable....


ce serait pas faux ça aussi par hazard?  :sweat:
c'est le pointeur qui n'est pas modifiable et non les données?


Message édité par neg'gwada le 26-12-2007 à 14:46:17

---------------
--- WinSplit Revolution ---
Reply

Marsh Posté le 26-12-2007 à 14:48:48    

KangOl a écrit :

[:pingouino]
 

Code :
  1. std::ostringstream oss;
  2. oss << "Score : " << score;
  3. function(const_cast<char*>(oss.str()));



c la qu'on se dit que le c++ c vraiment du grand nimporte quoi ou on cherche a compliquer les choses sans raison ...

Reply

Marsh Posté le 26-12-2007 à 14:50:11    

const char* p / char const* p = pointeur non constant sur des données constantes.
char * const p = pointeur constant sur des données non constantes.
const char* const p = pointeur constant sur des données constantes.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed