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

  FORUM HardWare.fr
  Programmation
  C++

  Du C au C++ avec STL: probleme resolu mais non compris

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Du C au C++ avec STL: probleme resolu mais non compris

n°297159
YungMakko
Posté le 30-01-2003 à 16:55:09  profilanswer
 

Salut a tous,
 
Voila le probleme (sous Visual Studio 6, SP5, utilisation de STLport au lieu de l'implementation STL de Microsoft qui est pourrie  :kaola: ):
J'ai une fonction C++, qui a comme parametre une reference sur un object string. J'affecte a ce string un buffer temporaire char* alloue avec un new, puis je detruit ce buffer (ne pas me demander pourquoi une telle manipe horrible, je suis malheureusement oblige dans ce cas la).
Tout semble marcher, mais quand j'arrive dans le destructeur du string, j'ai un plantage (memoire corrompue)  :heink: .
Si je remplace l'affectation du string (operateur =), par l'operateur +=, tout rentre dans l'ordre, plus de plantage  :pt1cable:  
 
Voici un extrait du bout de code:
 

Code :
  1. void CMyClass::MyFunction(string& strLine)
  2. {
  3.     blablablabla
  4.     ...
  5.     PSTR pTmpLine = new CHAR[nLineSize+1];
  6.     strncpy(pTmpLine,m_pMapData,nLineSize);
  7.     *(pTmpLine+nLineSize) = '\0';
  8. #if _CA_MARCHE_
  9.     strLine = "";  // Code qui fonctionne
  10.     strLine += pTmpLine;
  11. #else
  12.     strLine = pTmpLine; // Code qui cause le plantage
  13. #endif
  14.     delete [] pTmpLine;
  15. }
  16. int main()
  17. {
  18.    CMyClass  myObject;
  19.    string    strBuffer;
  20.    myObject.MyFunction(strBuffer);
  21.    return 0;
  22. } // Quand il y a plantage, c'est ici (appel du destructeur de strBuffer)


 
Est ce qu'un guru en STL pourrait m'aider?  :D  
 
Merci d'avance!!!  :jap:


Message édité par YungMakko le 30-01-2003 à 16:56:10

---------------
In tartiflette, we trust!
mood
Publicité
Posté le 30-01-2003 à 16:55:09  profilanswer
 

n°297163
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:06:10  profilanswer
 

c'est quoi les CHAR, PSTR? les string sont seulement compatibles avec les char et les char*. que dit ton débugger pour le plantage? (m'est d'avis que ca devrait meme pas compiler)
 
moi tout fonctionne bien. mettre le '\0' apres strncpy ne sert a rien.

n°297169
YungMakko
Posté le 30-01-2003 à 17:14:47  profilanswer
 

++Taz a écrit :

c'est quoi les CHAR, PSTR? les string sont seulement compatibles avec les char et les char*. que dit ton débugger pour le plantage? (m'est d'avis que ca devrait meme pas compiler)
 
moi tout fonctionne bien. mettre le '\0' apres strncpy ne sert a rien.


 
Ah oui pardon, c'est juste des typedefs.  :D  
 
typedef PSTR   char*;
typedef CHAR   char;
 
Le message d'erreur concerne le CRT , et indique un block dans le heap qui est corrompu.


Message édité par YungMakko le 30-01-2003 à 17:15:37

---------------
In tartiflette, we trust!
n°297180
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:26:54  profilanswer
 

:heink: ca vient de ton compilo ou alros t'es parti dans le decor quelque part.
 
tu peux essayer  
 
strLine=string(pstrLine);  
c'est à dire expliciter le constructeur

n°297194
YungMakko
Posté le 30-01-2003 à 17:33:17  profilanswer
 

++Taz a écrit :

:heink: ca vient de ton compilo ou alros t'es parti dans le decor quelque part.
 
tu peux essayer  
 
strLine=string(pstrLine);  
c'est à dire expliciter le constructeur


 
Merci; mais meme erreur. Bon, ca me rassure, c'est bien le compilo ou alors l'implementation STL qui deconne: j'obterai volontier pour le compilateur, vu que STLport est repute pour sa robustesse et que Visual 6 gere tres mal les templates.


---------------
In tartiflette, we trust!
n°297201
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:38:44  profilanswer
 

et t'as zeros warnings à la compilation?

n°297216
YungMakko
Posté le 30-01-2003 à 17:45:18  profilanswer
 

++Taz a écrit :

et t'as zeros warnings à la compilation?


 
Ouaip, aucun warning (niveau par default: Level 3).
Avec les STL fournit avec Visual j'avais encore bien plus de problemes que cela. C'etait du delire, c'est pour ca que je suis passe a STLport, ca a resolu d'un coup plein de bugs. Sauf ce nouveau qui est apparu. Mais dans l'ensemble, ca va quand meme bien mieux qu'avant.


---------------
In tartiflette, we trust!
n°297233
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:53:44  profilanswer
 

tu peux aussi essayer celle de SGI.
mais la je vois pas ou est le problème si ce n'est au niveau du compilateur

n°297257
YungMakko
Posté le 30-01-2003 à 18:04:39  profilanswer
 

++Taz a écrit :

tu peux aussi essayer celle de SGI.
mais la je vois pas ou est le problème si ce n'est au niveau du compilateur


 
Merci bcp quand meme!  STLport se base justement sur l'implementation de SGI. Je doute doncm que ca change grand chose. Mais ce n'est pas grave, ca marche comme ca. Je vais voir mon code sous UNIX, la ca devrait fonctionner dans les 2 cas.


---------------
In tartiflette, we trust!
n°297261
Taz
bisounours-codeur
Posté le 30-01-2003 à 18:06:39  profilanswer
 

moi ca marche aussi avec gcc sous windows (mingw)

mood
Publicité
Posté le 30-01-2003 à 18:06:39  profilanswer
 

n°297265
gatorette
Posté le 30-01-2003 à 18:08:47  profilanswer
 

[fixed][/fixed]Sous VisualC++ 6.0 (pas de ServicePack) avec l'implementation STL de Microsoft, j'ai essayé ça :

Code :
  1. #include <string>
  2. static char m_pMapData[] = "cool!";
  3. int main(int argc, char* argv[])
  4. {
  5. std::string strLine;
  6. char *pTmpLine = new char[strlen(m_pMapData) + 1];
  7. strncpy( pTmpLine, m_pMapData, strlen(m_pMapData) + 1 ); // '+1' pour que strncpy me rajoute le '\0'
  8. strLine= pTmpLine;
  9. delete[] pTmpLine;
  10. return 0;
  11. }


 
J'ai fait un truc qui ressemble beaucoup à ton programme et (bien évidemment) ça marche. Il semble donc que ce ne soit pas un problème du compilo...
 
Le mieux est encore de regarder en mode pas à pas ce qui se passe en mémoire (et notamment dans strLine). Peut être surveiller aussi ce que tu as dans pMapData ?


---------------
each day I don't die is cheating
n°297286
YungMakko
Posté le 30-01-2003 à 18:31:08  profilanswer
 

Bon, dur dur.  
m_pMapData est un pointeur sur un fichier mappe en memoire.
ca ne devrait rien changer de toute facon.
Je cherche, il doit en effet y avoir un bug ailleurs dans mon code, mais c'est bizard qu'avec l'operateur +=, le probleme ne se pose pas aussi.
Je cherche...  
 


---------------
In tartiflette, we trust!
n°297293
YungMakko
Posté le 30-01-2003 à 18:34:37  profilanswer
 

gatorette a écrit :

[fixed][/fixed]Sous VisualC++ 6.0 (pas de ServicePack) avec l'implementation STL de Microsoft, j'ai essayé ça :
[cpp
strncpy( pTmpLine, m_pMapData, strlen(m_pMapData) + 1 ); // '+1' pour que strncpy me rajoute le '\0'
 
}[/cpp]
 


 
Je n'ai pas mis de +1, car m_pMapData est un fichier mappe, est pas une chaine de charactere. Donc il n'y a pas de '\0' en fin de la chaine desiree.


---------------
In tartiflette, we trust!
n°297638
gatorette
Posté le 31-01-2003 à 00:27:06  profilanswer
 

Et en pas à pas, ça donne quoi ? Tout semble bien ?


---------------
each day I don't die is cheating
n°297671
Musaran
Cerveaulté
Posté le 31-01-2003 à 04:16:58  profilanswer
 

Et avec ça ?

Code :
  1. strLine = string(pstrLine, strlen(pstrLine));


Message édité par Musaran le 01-02-2003 à 06:08:27

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°297694
HelloWorld
Salut tout le monde!
Posté le 31-01-2003 à 09:01:15  profilanswer
 

Dans le même genre, si quelqu'un pouvait me dire pourquoi ce code compile alors qu'il ne fonctionne pas :

Code :
  1. #include <iostream>
  2. #include <string>
  3. int main( void )
  4. {
  5.         std::string s;
  6.         s = 1;
  7.         std::cout << s << std::endl;
  8.         return 0;
  9. }


teste sur Linux RedHat 7.3, gcc 3.2


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°297757
Kristoph
Posté le 31-01-2003 à 10:35:37  profilanswer
 

Ca veux dire quoi qu'il ne fonctionne pas ? core dump ? Affiche rien ?
 
D'après ce que je sais de "string", je prédis qu'il ne se passe rien ou presque car "s = 1" correspond à operator =(char c) qui va créer une chaine de longueur 1 ne contenant que le caractère c. Et donc, tu te retrouves avec cette chaine : "\1". Bien sur, \1 n'est pas affichable :)

n°297838
HelloWorld
Salut tout le monde!
Posté le 31-01-2003 à 12:56:02  profilanswer
 

Yep, sous entendu que "la conversion de 2 en "2" ne fonctionne pas"
Il affiche un car a la con.
C'est bizarre ... je lui file un int, il utilise l'operateur =(char) sans me fouttre un avertissement ... pourtant la conversion int => char donne lieu a un warning normalement nan ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°297909
Kristoph
Posté le 31-01-2003 à 14:02:24  profilanswer
 

Ca doit etre parceque 1 n'est pas un int mais représente le chiffre 1. Si tu avais int a = 1; s = a; peut-etre alors aurait eu un warning.

n°297952
HelloWorld
Salut tout le monde!
Posté le 31-01-2003 à 14:44:33  profilanswer
 

J'ai testé :

Code :
  1. #include <iostream>
  2. #include <string>
  3. int main( void )
  4. {
  5.     std::string s;
  6.     int n = 1;
  7.     s = 1L;
  8.     s = int(1);
  9.     s = n;
  10.     s = n;
  11.     std::cout << s << std::endl;
  12.     return 0;
  13. }
  14. g++ -Wall -o teststr teststr.cpp


 
0 erreur, 0 warning ... :??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°297999
Kristoph
Posté le 31-01-2003 à 15:19:56  profilanswer
 

C'est dommage n'est ce pas :)
 
Mais bon, si tu veux convertir un entier en chaine de caractères, il y a d'autres moyens pour ça :  
 
Edit : c'est deprecié, utilise sstream à la place.


Message édité par Kristoph le 31-01-2003 à 15:23:57
mood
Publicité
Posté le   profilanswer
 


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

  Du C au C++ avec STL: probleme resolu mais non compris

 

Sujets relatifs
[c] g un doute sur la fonction pow... (resolu)[C, Allegro] Problème avec bitmaps !!
problème de version vba excel (97 et 2002)[FORUM] Problème avec mon forum PHP bb
[PHP] question toute bete [resolu]Problème avec GD
[[Java]] -- Un gros probleme entre méthodes.[oracle] problème d'installation Oracle8i + questions de newbie
Probleme avec forum phpbb ?Un petit probleme de syntaxe ... .LinkedCell
Plus de sujets relatifs à : Du C au C++ avec STL: probleme resolu mais non compris


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