Fonction avec parametre en char * et appel avec string - C++ - Programmation
Marsh Posté le 22-12-2007 à 15:58:53
ne marche pas
invalid conversion from const char * to char *
Marsh Posté le 22-12-2007 à 16:04:52
pourquoi cette conne de fonction prend un char* et pas un const char * ?
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
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
Marsh Posté le 22-12-2007 à 16:25:32
Code :
|
Marsh Posté le 22-12-2007 à 16:40:13
merci, il manquait juste un une conversion string vers char dans ton code
donc :
Code :
|
et merci encore
Marsh Posté le 22-12-2007 à 16:41:50
Et oh, RVO hein
Code :
|
Pas besoin de cet objet temporaire moche
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]
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 :
|
C'est nul.
Code :
|
C'est quand meme beaucoup mieux
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 ?
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.
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 ?
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.
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). |
Archi faux.
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...
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.
|
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; |
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
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 :
|
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?
c'est le pointeur qui n'est pas modifiable et non les données?
Marsh Posté le 26-12-2007 à 14:48:48
KangOl a écrit :
|
c la qu'on se dit que le c++ c vraiment du grand nimporte quoi ou on cherche a compliquer les choses sans raison ...
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.
Marsh Posté le 22-12-2007 à 15:38:40
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 :
Si j'apelle comme ceci :
ca marche, mais si :
la ca marche plus
quel cast faut-il faire ?