Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1818 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Fonction avec parametre en char * et appel avec string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction avec parametre en char * et appel avec string

n°1662366
tomsoft
Posté le 22-12-2007 à 15:38:40  profilanswer
 

: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 ?

mood
Publicité
Posté le 22-12-2007 à 15:38:40  profilanswer
 

n°1662369
KangOl
Profil : pointeur
Posté le 22-12-2007 à 15:53:10  profilanswer
 

.c_str() :o

n°1662370
tomsoft
Posté le 22-12-2007 à 15:58:53  profilanswer
 

ne marche pas :/

 

invalid conversion from const char * to char *


Message édité par tomsoft le 22-12-2007 à 15:59:20
n°1662372
KangOl
Profil : pointeur
Posté le 22-12-2007 à 16:04:52  profilanswer
 

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

n°1662373
tomsoft
Posté le 22-12-2007 à 16:09:38  profilanswer
 

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 :/

n°1662374
KangOl
Profil : pointeur
Posté le 22-12-2007 à 16:10:41  profilanswer
 

std::stringstream

n°1662376
tomsoft
Posté le 22-12-2007 à 16:14:56  profilanswer
 

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

n°1662379
KangOl
Profil : pointeur
Posté le 22-12-2007 à 16:25:32  profilanswer
 

[:pingouino]
 

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

n°1662380
tomsoft
Posté le 22-12-2007 à 16:26:09  profilanswer
 

merci :jap:

n°1662381
KangOl
Profil : pointeur
Posté le 22-12-2007 à 16:26:48  profilanswer
 
mood
Publicité
Posté le 22-12-2007 à 16:26:48  profilanswer
 

n°1662385
tomsoft
Posté le 22-12-2007 à 16:40:13  profilanswer
 

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
n°1662387
Joel F
Real men use unique_ptr
Posté le 22-12-2007 à 16:41:50  profilanswer
 

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

n°1662392
tomsoft
Posté le 22-12-2007 à 16:53:26  profilanswer
 

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

n°1662503
Taz
bisounours-codeur
Posté le 23-12-2007 à 00:27:57  profilanswer
 

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]

n°1662701
jojoleping​ouin
Posté le 23-12-2007 à 22:49:19  profilanswer
 

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

n°1662757
tomsoft
Posté le 24-12-2007 à 10:43:14  profilanswer
 

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 ?

n°1662763
Jux_
Posté le 24-12-2007 à 11:18:27  profilanswer
 

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.

n°1662765
tomsoft
Posté le 24-12-2007 à 11:27:10  profilanswer
 

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

n°1662767
Jux_
Posté le 24-12-2007 à 11:31:50  profilanswer
 

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.

n°1662994
Taz
bisounours-codeur
Posté le 26-12-2007 à 08:55:03  profilanswer
 

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.

n°1663002
Jux_
Posté le 26-12-2007 à 09:44:42  profilanswer
 

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

n°1663035
Taz
bisounours-codeur
Posté le 26-12-2007 à 12:06:09  profilanswer
 

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.

n°1663054
Jux_
Posté le 26-12-2007 à 13:52:11  profilanswer
 

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 :)

n°1663061
Taz
bisounours-codeur
Posté le 26-12-2007 à 14:19:34  profilanswer
 

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());

n°1663067
neg'gwada
rafix 971
Posté le 26-12-2007 à 14:45:16  profilanswer
 

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 ---
n°1663068
red factio​n
Posté le 26-12-2007 à 14:48:48  profilanswer
 

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

n°1663069
Jux_
Posté le 26-12-2007 à 14:50:11  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fonction avec parametre en char * et appel avec string

 

Sujets relatifs
fonction conditionnelle ?requete SQL parse timestamp => 2 champs string
Utiliser un variable, lancer une fonction d'un autre movieclip?fonction saisie ligne sans limite
Appel en Javascript avec paramètres vers Phputiliser la fonction number_format() pour ajouter une virgule
DOM ->String[résolu] Automatiser une fonction excel sur vba
String[] : tableau de chaines de caractèresCMS fonction annuaire
Plus de sujets relatifs à : Fonction avec parametre en char * et appel avec string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR