TRANSFORMER UN INT/DOUBLE... EN CHAINE DE CARACTÈRES DE TYPE STRING EN CPP [GCC]
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 2007
-
25 juil. 2003 à 08:30
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007
-
18 mai 2006 à 00:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007 18 mai 2006 à 00:08
Ooops désolé pour la réponse tardive...
Le inline c'est juste histoire d'optimiser. En fait, le compilateur reprend à chaque fois le code et le copie colle à l'endroit de l'appel de la fonction.
On peut oublier et supprimer le inline. Le code fonctionnera de la même manière, surtout si on appele peu cette fonction. D'ailleurs, le inline permet d'aller un peu plus vite, mais cela a un coût : le code est plus gros...
Pour info, ce code est tiré d'une classe CString que j'ai créée pour mes propres besoins. Si ça interresse qqu'un d'avoir CString, yakademander.
Ouala !
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 3 mai 2006 à 23:25
c'est posté en anglais, mais on avait bien compris que tu parlais français ;)
Cethywolf
Messages postés21Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention23 juillet 2006 2 mai 2006 à 13:48
Par contre, j'aimerais que explique le header de ton template, particulièrement "inline".
Merci.
Cethywolf
Messages postés21Date d'inscriptionjeudi 5 janvier 2006StatutMembreDernière intervention23 juillet 2006 2 mai 2006 à 13:34
Très simpa et pratique ce code, merci !
Encore mieux le template ^^
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007 7 oct. 2005 à 14:18
Ooops, désolé pour le post précédent... rédigé en langue de Shakespeare. Je me suis trompé de bonhomme. Molière s'est-il retourné dans sa tombe ?
Je traduis si qqun ne comprend pas.
Oualou !
hsaturn
Messages postés14Date d'inscriptionjeudi 6 octobre 2005StatutMembreDernière intervention 3 juin 2007 7 oct. 2005 à 14:16
// I think a lot better solution for this problem is to use templates :
// *********************************
// BEGIN OF YOU JUST NEED THAT
// *********************************
#include
#include <string>
#include <sstream>
using namespace std; // Ugly, but for a demo...
template< class T>
inline string to_string( const T & Value)
{
stringstream streamOut;
streamOut << Value;
return streamOut.str( );
}
// *********************************
// END OF YOU JUST NEED THAT
// *********************************
// *********************************
// BEGIN OF SMALL EXAMPLE
// *********************************
// Thus, you can convert almost all what you what to string.
// Also, this method may write for any kind of object if you provide a friend ostream operator <<
// Example
class cool
{
public:
cool(int i,string s) : mi(i),ms(s){};
// Note : just for that, you could have writte cout << mycool << endl;
cout << mycool << endl;
return 0;
}
// *********************************
// END OF SMALL EXAMPLE
// *********************************
lgammacurta
Messages postés1Date d'inscriptionmercredi 8 décembre 2004StatutMembreDernière intervention12 janvier 2005 12 janv. 2005 à 18:59
Merci pour cette astuce à la fois simple à mettre en oeuvre et efficace. J'ai cherché de mon côté un moyen pour convertir un int en string mais je n'avais rien trouvé d'aussi simple. Bien vu!
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 8 août 2003 à 19:02
Je suis d'accord avec Kirua.
En +, comme tu l'as dis, on peut toujours préciser ponctuellement.
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 8 août 2003 à 18:05
merci funto, je savais que pr les bib standards il ne fallait pas mettre le .h, mais je me souviens très nettement qu'une fois un test avait raté à cause de ça, mais il y avait probablement d'autres facteurs, peut-être que mon compilo était en mode C, qui c? ;-)
je trovue que c allourdir le code, quand on peut se passer d'une résolutino de portée, autant en profiter non? en cas de doute du compilo, il est facile de préciser ponctuellement non ?
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 8 août 2003 à 13:42
C'est vrai que ça enlève l'avantage du système de namespace...
Perso, j'aime pas les namespace, je préfère la bonne vieille méthode où on place un préfixe genre gl ou wx ou gtk_...
Et puis ce quelqu'un n'avait pas qu'à faire ça ! :D
cs_tibur
Messages postés101Date d'inscriptionsamedi 9 février 2002StatutMembreDernière intervention 5 mai 2009 8 août 2003 à 12:41
Concernant le "using namespace std;", Je pense qu'il faut eviter de l'utiliser, et plutot specifier directement std:: devant les fonctions de la STL.
Le but du namespace est de faire des 'packages' contenant des fonctions et des classes c++.
Cela evite d'avoir des conflits entre les noms de classes en integrant le travail de quelqu'un d'autre ...
(Genre si ce quelqu'un a codé une classe string ou list, elle va entrer en collision avec celle de la STL)
Enfin, tout ca pour dire que la clause 'using namespace' devrait etre contre indiquée la plupart du temps.
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 8 août 2003 à 10:17
Kirua >> il ne faut pas mélanger les bibliothèques C et C++ : pour utiliser les fonctions de gestion de chaînes de caractères du C (strcpy(), strcat(), strcmp()...etc) il faut faire un #include <string.h>.
Par contre, pour les headers de la bibliothèque standard du C++, il ne faut jamais mettre le .h, donc pour utiliser les string il faut faire :
#include <string>
using namespace std; // A mettre toujours si l'on utilise un fichier de la bibliothèque standard du C++, comme , <vector>...etc.
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 8 août 2003 à 02:29
oui VC++ aime pas trop le C++ conforme à ce que j'ai pu voir ;-)
c'est une chouette astuce, merci ! :-)
pr utiliser les string il faut pas inclure <string.h> ??
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 25 juil. 2003 à 11:41
Honte à moi !! Ca fait un bon moment que je le savais, et j'ai dû oublier de mettre using namespace std; quand j'ai fait le test !!
Merci bcp tibur ! Ca me sort 27 warnings mais ça marce qd même alors je m'en fous :D
cs_tibur
Messages postés101Date d'inscriptionsamedi 9 février 2002StatutMembreDernière intervention 5 mai 2009 25 juil. 2003 à 09:09
Ajoutes std:: devant les noms de types string et stringstream
ca te donnes :
std::string s;
std::stringstream sstr;
et pis aussi std::cout
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 25 juil. 2003 à 08:30
Ouais, c'est sympa, mais tout ça ne marche pas sous VC++ 6 :(
Y'a pas de "string" :( Dommage...
18 mai 2006 à 00:08
Le inline c'est juste histoire d'optimiser. En fait, le compilateur reprend à chaque fois le code et le copie colle à l'endroit de l'appel de la fonction.
On peut oublier et supprimer le inline. Le code fonctionnera de la même manière, surtout si on appele peu cette fonction. D'ailleurs, le inline permet d'aller un peu plus vite, mais cela a un coût : le code est plus gros...
Pour info, ce code est tiré d'une classe CString que j'ai créée pour mes propres besoins. Si ça interresse qqu'un d'avoir CString, yakademander.
Ouala !
3 mai 2006 à 23:25
2 mai 2006 à 13:48
Merci.
2 mai 2006 à 13:34
Encore mieux le template ^^
7 oct. 2005 à 14:18
Je traduis si qqun ne comprend pas.
Oualou !
7 oct. 2005 à 14:16
// *********************************
// BEGIN OF YOU JUST NEED THAT
// *********************************
#include
#include <string>
#include <sstream>
using namespace std; // Ugly, but for a demo...
template< class T>
inline string to_string( const T & Value)
{
stringstream streamOut;
streamOut << Value;
return streamOut.str( );
}
// *********************************
// END OF YOU JUST NEED THAT
// *********************************
// *********************************
// BEGIN OF SMALL EXAMPLE
// *********************************
// Thus, you can convert almost all what you what to string.
// Also, this method may write for any kind of object if you provide a friend ostream operator <<
// Example
class cool
{
public:
cool(int i,string s) : mi(i),ms(s){};
friend ostream &operator << (ostream &out,const cool &o);
private:
string ms;
int mi;
};
ostream &operator << (ostream &out,const cool &o)
{
out << "cool {" << o.mi << "," << o.ms << "};" << endl;
return out;
}
// An example of all that :
int main(int argc,char* argv[])
{
string sFloat=to_string(1.2);
string sLong=to_string(1234);
cool mycool(1,"Great");
// And this solves this problem too
// The following line may break your compiler !
//string sBad="cool"+"titi";
// This one is ok
string sOk=to_string("cool")+" isn't it ?";
cout << "float=" << sFloat << endl;
cout << "long=" << sLong << endl;
cout << "ok=" << sOk << endl;
string scool=to_string(mycool);
cout << "mycool=" << scool << endl;
// Note : just for that, you could have writte cout << mycool << endl;
cout << mycool << endl;
return 0;
}
// *********************************
// END OF SMALL EXAMPLE
// *********************************
12 janv. 2005 à 18:59
8 août 2003 à 19:02
En +, comme tu l'as dis, on peut toujours préciser ponctuellement.
8 août 2003 à 18:05
je trovue que c allourdir le code, quand on peut se passer d'une résolutino de portée, autant en profiter non? en cas de doute du compilo, il est facile de préciser ponctuellement non ?
8 août 2003 à 13:42
Perso, j'aime pas les namespace, je préfère la bonne vieille méthode où on place un préfixe genre gl ou wx ou gtk_...
Et puis ce quelqu'un n'avait pas qu'à faire ça ! :D
8 août 2003 à 12:41
Le but du namespace est de faire des 'packages' contenant des fonctions et des classes c++.
Cela evite d'avoir des conflits entre les noms de classes en integrant le travail de quelqu'un d'autre ...
(Genre si ce quelqu'un a codé une classe string ou list, elle va entrer en collision avec celle de la STL)
Enfin, tout ca pour dire que la clause 'using namespace' devrait etre contre indiquée la plupart du temps.
8 août 2003 à 10:17
Par contre, pour les headers de la bibliothèque standard du C++, il ne faut jamais mettre le .h, donc pour utiliser les string il faut faire :
#include <string>
using namespace std; // A mettre toujours si l'on utilise un fichier de la bibliothèque standard du C++, comme , <vector>...etc.
8 août 2003 à 02:29
c'est une chouette astuce, merci ! :-)
pr utiliser les string il faut pas inclure <string.h> ??
25 juil. 2003 à 11:41
Merci bcp tibur ! Ca me sort 27 warnings mais ça marce qd même alors je m'en fous :D
25 juil. 2003 à 09:09
ca te donnes :
std::string s;
std::stringstream sstr;
et pis aussi std::cout
25 juil. 2003 à 08:30
Y'a pas de "string" :( Dommage...