Problème avec les flux

nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008 - 8 juil. 2006 à 18:29
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 - 9 juil. 2006 à 12:46
Bonjour, j'ai le code suivant :

struct txt{
const char* texte;


};




int main(){
stringstream message,message2;
int var1=5,var2=7;
txt txtniv;


message<<"numero ";
message<<var1;
txtniv.texte=message.str().c_str();
cout<<txtniv.texte<<endl;
message2<<"voici le ";
message2<<var2;
txtniv.texte2=message2.str().c_str();
cout<<txtniv.texte<<endl;
cout<<txtniv.texte2<<endl;}


Cependant, je ne comprend pas pourquoi, ce qui s'affiche sur la console est :
voici le 7
voici le 7


alors que ca devrait etre
numero 5
voici le 7


Comment faire pour obtenir cela ?


Merci d'avance

7 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
8 juil. 2006 à 18:39
Peut etre a cause du const dans la structure
struct txt{
const char* texte;};
Essaye en enlevant le const
++
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
8 juil. 2006 à 19:51
non ca ne change rien

(le nouveau code source est :
#include <fstream>
#include <cstdlib>
#include
#include <sstream>




using namespace std;


struct txt{
char *texte;
char *texte2;


};




int main(){
stringstream message,message2;
int var1=5,var2=7;


txt txtniv;


message<<"numero ";
message<<var1;
txtniv.texte=(char*)message.str().c_str();


message2<<"numero ";
message2<<var2;
txtniv.texte2=(char*)message2.str().c_str();


cout<<txtniv.texte<<endl;
cout<<txtniv.texte2<<endl;


system("PAUSE");
}
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 juil. 2006 à 01:02
Tu programmes avec DevCpp ? On dirait un bug. Le programme a pas le meme comportement sous DevCpp et VC express.


J'ai fais tourner ce programme:

message<<"numero ";

message<<var1;

txtniv.texte=(char*)message.str().c_str();


message2<<"numero ";

message2<<var2;

txtniv.texte2=(char*)message2.str().c_str();


cout<<(long)txtniv.texte<<endl;

cout<<(long)txtniv.texte2<<endl;

cout<<(long)message.str().c_str()<<endl;

cout<<(long)message2.str().c_str()<<endl;

cout<<message.str().c_str()<<endl;

cout<<message2.str().c_str()<<endl;

cout<<txtniv.texte<<endl;

cout<<txtniv.texte2<<endl;


Et j'obtiens ca sous devcpp:

4013788

4013788

4013788

4013788

numero 5

numero 7

numero 7

numero 7

Appuyez sur une touche pour continuer...


C'est donc totalement délirant.


Sous visual:

1244276

1244316

1244356

1244396

numero 5

numero 7


Appuyez sur une touche pour continuer...


Donc je pige PAS DU TOUT.
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
9 juil. 2006 à 02:27
J'ai essayé avec gcc et VC 2005, j'obtiens les mêmes problèmes avec le simple code suivant :

#include
#include <sstream>
#include <string>
using namespace std;

int main() {
ostringstream message( "Chaine quelconque" );
cout << message.str() << endl;
cout << message.str().c_str() << endl;
const char* tmp = message.str() .c_str();
cout << tmp << endl;
}

le problème viendrait de str() qui renvoit un objet temporaire std::string, dont on récupère l'adresse de la chaine interne par c_str(). Cet objet est détruit juste après l'affectation à tmp.
tmp pointe ensuite sur une zone ou il n'y a plus rien pour le cout qui suit (le debug sous VC2005 indique un pointeur invalide)

Le seul moyen que j'ai pour le moment pour t'éviter le problème est d'utiliser simplement std::string.

par exemple
string tmpStr = message.str();
const char* tmp = tmpStr.c_str();
fonctionne.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 juil. 2006 à 09:36
Oue en effet, j'avais pas pensé a ca, j'ai été voir sur le doc, c'est
bien un objet temporaire qui est retourné. Donc pas d'autre solution
que de récupérer en string ou de créer un buffer de copier les données
dedans.
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
9 juil. 2006 à 11:51
ok merci, mais j'ai besoin que ce soit en char* car après c'est traité dans une fonction (qui affiche le texte à l'écran, voir tutorial de Nehe n°43), est ce qu'une conversion est possible ?
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
9 juil. 2006 à 12:46
Dans ce tuto, ils utilisent déjà les std::string.
Tu devrais pouvoir utiliser de std::string dans ta struct.
et lors de l'appel à la fonction (glPrint ou freetype::print)
faire la conversion à ce moment par .c_str()
Je n'ai pas vu de fonction prenant directement une struct de 2 char* directement ?
0
Rejoignez-nous