OVH Cloud OVH Cloud

Concatenation de chaines

13 réponses
Avatar
Zouplaz
Bonjour, y-a-t-il une bonne raison pour que :

temp = baseFileName + '_' + name

fonctionne bien (temp,baseFileName,name étant des std::string)

et que

temp = baseFileName + '_' + name + "_000"

ne fonctionne pas (en step/step avec le bebugger temp contient alors
n'importe quoi dès que cette ligne s'exécute).


Merci

10 réponses

1 2
Avatar
Jean-Marc Bourguet
Zouplaz writes:

Bonjour, y-a-t-il une bonne raison pour que :

temp = baseFileName + '_' + name

fonctionne bien (temp,baseFileName,name étant des std::string)

et que

temp = baseFileName + '_' + name + "_000"

ne fonctionne pas (en step/step avec le bebugger temp contient alors
n'importe quoi dès que cette ligne s'exécute).


Je n'en vois pas. Tu peux donner un exemple compilable minimum qui
reproduise le probleme?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Zouplaz
Jean-Marc Bourguet - :


Je n'en vois pas. Tu peux donner un exemple compilable minimum qui
reproduise le probleme?



Voici la méthode en entier, mais elle est pas compilable sans tout le reste
:

void Sprite2DAnimated::loadFrameSequence(std::string name,std::string
baseFileName)
{
std::string temp;
char c_num[4];
int img_num;
SpriteFrame* spf = NULL;
SDL_Surface* tempSurf;

SpriteFrameSequence* spfs = new SpriteFrameSequence(name);
m_frameSequences.insert(std::make_pair(name,spfs));

bool done = false;
img_num = 0;
while(!done)
{
itoa(img_num,c_num,10);
temp = baseFileName + '_' + name + "_000" + c_num + ".bmp";
tempSurf = SDL_LoadBMP(m_fileName.c_str());
if(tempSurf)
{
spf = new SpriteFrame();
spf->m_delay = 30;
spf->m_nextFrame = img_num+1;
spf->m_surf = tempSurf;
spfs->addFrame(spf);
img_num++;
}
else
done = true;
}

if(spf)
spf->m_nextFrame = 0;
currentFrameSequence = spfs;
}

Je me demande ce qui peut provoquer ce genre de problème...

PS : je sais, je sais itoa c'est pas standard !!

Avatar
Vincent Lascaux
Voici la méthode en entier, mais elle est pas compilable sans tout le
reste


Le but de la demande etait en partie de te forcer à isoler ton probleme dans
un code le plus court possible. Il y a fort à parier que ton probleme est du
à un acces douteux à la mémoire dans une autre partie du programme. La
démarche de supprimer des fonctionnalités et des bouts de code te permettra
de retrouver (avec de la patience et de la chance) l'endroit où est le code
qui met le systeme dans un état instable.

--
Vincent

Avatar
Christophe Lephay
Zouplaz wrote:
char c_num[4];
...

itoa(img_num,c_num,10);


Tu n'aurais pas un "débordement de tampon" ? Qu'est-ce que ça donne si tu
utilises un tampon plus grand style :

char c_num[30];

Chris

Avatar
Jean-Marc Bourguet
Zouplaz writes:

Jean-Marc Bourguet - :


Je n'en vois pas. Tu peux donner un exemple compilable minimum qui
reproduise le probleme?



Voici la méthode en entier, mais elle est pas compilable sans tout
le reste:


Il ne te reste plus qu'a ajouter ce qu'il faut pour que ca compile,
enlever ce qui n'est pas necessaire pour reproduire le probleme, dire
ce que tu observes et ce a quoi tu t'attendais.

Les deux premiers points, je ne vois pas pourquoi tout ceux qui
voudraient t'aider devrait le faire eux-meme, les deux autres, bien
souvent on ne pas pas deviner. En prime il y a une chance non
negligable que tu trouves la cause tout seul.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Zouplaz
Vincent Lascaux - :

Voici la méthode en entier, mais elle est pas compilable sans tout le
reste


Le but de la demande etait en partie de te forcer à isoler ton
probleme dans un code le plus court possible. Il y a fort à parier que
ton probleme est du à un acces douteux à la mémoire dans une autre
partie du programme. La démarche de supprimer des fonctionnalités et
des bouts de code te permettra de retrouver (avec de la patience et de
la chance) l'endroit où est le code qui met le systeme dans un état
instable.



Bon, voila le code le plus court qui reproduise le problème :

#include <string>

int main(int argc,char *argv[])
{
std::string truc;
std::string pouet;

pouet = "hello";
truc = pouet + ".000" + 'c' + "coucou" + pouet + ".toto";

return 0;
}

Un breakpoint sur return 0 montre que le contenu de la variable "truc" est
n'importe quoi.

Si je remplace par
truc = pouet + ".000" + 'c';

Ca marche, le contenu est "hello.000c"

Plateforme : Windows 2000 / Visual Studio Net 7.0 - Code ci dessus compilé
en mode SUBSYSTEM = CONSOLE.

Je pense que quelque chose doit merder dans les options de compilation mais
je n'utilise rien de spécial.


Avatar
Zouplaz
Zouplaz - :


Je pense que quelque chose doit merder dans les options de compilation
mais je n'utilise rien de spécial.



Je crois avoir trouvé, c'est le debugger qui déraille. Bindidon.

Avatar
Mickael Pointier
Bon, voila le code le plus court qui reproduise le problème :

#include <string>

int main(int argc,char *argv[])
{
std::string truc;
std::string pouet;

pouet = "hello";
truc = pouet + ".000" + 'c' + "coucou" + pouet + ".toto";

return 0;
}

Un breakpoint sur return 0 montre que le contenu de la variable
"truc" est n'importe quoi.

Si je remplace par
truc = pouet + ".000" + 'c';

Ca marche, le contenu est "hello.000c"

Plateforme : Windows 2000 / Visual Studio Net 7.0 - Code ci dessus
compilé en mode SUBSYSTEM = CONSOLE.


Tu es en Release, ou en Debug ?

Est-ce que ca fait pareil si tu _utilises_ "truc", par exemple en
rajoutant un cout<<truc; juste avant le "return 0;" ?

Mike

Avatar
Benoit Rousseau
Mickael Pointier wrote:
Bon, voila le code le plus court qui reproduise le problème :

#include <string>

int main(int argc,char *argv[])
{
std::string truc;
std::string pouet;

pouet = "hello";
truc = pouet + ".000" + 'c' + "coucou" + pouet + ".toto";

return 0;
}



Pourquoi n'utilises-tu pas un stringstream ?
Ici il me semble qu'un string est créé et dupliqué à chaque appele de
l'operateur '+'

Et tu pourras en plus entrer directement tes entiers dans le flux (plus
de itoa :-)


--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Zouplaz
Mickael Pointier - :


Tu es en Release, ou en Debug ?

Est-ce que ca fait pareil si tu _utilises_ "truc", par exemple en
rajoutant un cout<<truc; juste avant le "return 0;" ?



En debug. Il y a un bug dans le debugger de vsnet 2002 qui empêche la
visualisation correcte du contenu d'une std::string si elle fait + de 16
caractères. Il faut bidouiller un fichier pour que ça fonctionne.

Maintenant j'ai un autre problème du même genre : machaine.c_str()
fonctionne si la chaine fait moins de 16 char et pas si elle en fait
plus...

Je commence à fatiguer !

1 2