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

  FORUM HardWare.fr
  Programmation

  CString en C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

CString en C++

n°30001
El_gringo
Posté le 09-05-2001 à 11:46:01  profilanswer
 

j'ai décidé de remplacer, dès que c'est possible, dans mon application, toutes les chaines de type char nomVar[unNombre], par des CString, qd même plus pratiques !
après avoir corrigé toutes les erreures de comilation, je lance mon prog...plantage violent, débordement mémoire je crois.
Avec le débugger, je vois que ce qui fait ce débordement, c'est les opération toute bêtes, du style:
m_tachesEnv[_index].arg1    = _Arg1;
ou les 2 sont de type CString.
 :gun:  
passer une seule fois sur ces opérations suffit à ce putain de débordement mémoire (et désolé pour mes débordements de langage à moi !)
 
Je suis sur que qqn à déja connu ça et connai la solution toute simple (on peut rêver, non ?)
Si c la cas, merci d'avance...

mood
Publicité
Posté le 09-05-2001 à 11:46:01  profilanswer
 

n°30004
n0mad
inscrit au XXe siècle
Posté le 09-05-2001 à 11:49:41  profilanswer
 

Verifie que les chaines se terminent par un '\0', c'est sans doute ça.


---------------
Pipiru piru piru pipiru pi
n°30005
El_gringo
Posté le 09-05-2001 à 11:53:44  profilanswer
 

Hé non, parce que j'utilise des fonctions de CString qui fonctionnent très bien, comme CString::Left, qui est censée me rendre une CString correctement terminée qd même j'imagine !
et c'est en attribuant la valeur rendue par cette fonction à une autre CString que ça foire !

n°30006
la viper
Posté le 09-05-2001 à 11:55:11  profilanswer
 

fait un tour sur la classe CStringArray .. tres pratique pour tout ce qui conserne les tableaux de CString  
 
@+ et bonne chance

n°30007
El_gringo
Posté le 09-05-2001 à 12:02:37  profilanswer
 

...merci, mais c pas un tableau de CString ce que je veux utiliser, c des CString tout court !

n°30025
El_gringo
Posté le 09-05-2001 à 12:33:13  profilanswer
 

En fait, à force de réflexion, j'en sais un peu plus...
Alors, l'erreur vient de la variable qui reçoit la CString.
Elle appartient à une structure dont voici la définition:
 
typedef struct _TACHE_ENV
      {
         CString   num
         eTYPE_ENV type;  
         CString   arg1;  
         CString   arg2;                
         CString   libelle;            
      } TACHE_ENV;
 
voilà, et j'ai un tableau d'éléments de cette structure:
 m_TabTachesEnv;
 
et si je demande: m_TabTachesEnv[1].arg1 = UneCString;
ça fait un débordement mémoire !?
 
Pourquoi ? qqn à une idée ?
Sachant que UneCString est correcte, et que la même attribution, avec un char arg1[255] dans la structure (et donc, bien sur un strcpy pr attribuer !) se passait très bien...
 
Help ! snif... :cry:

n°30031
El_gringo
Posté le 09-05-2001 à 12:43:36  profilanswer
 

Apparement, dès que j'utilise  
m_TabTachesEnv[1].arg1, même pour autr chose ( ex: .Empty())  
ça fait une plantage violent à l'execution !

n°30033
verdoux
And I'm still waiting
Posté le 09-05-2001 à 12:49:09  profilanswer
 

Comment construis tu ton tableau m_TabTachesEnv ?

n°30048
BENB
100% Lux.
Posté le 09-05-2001 à 15:44:38  profilanswer
 

Pourquoi utiliser des CStrings ?
les MFC ne sont plus supportees par Microsoft, et une classe string de la STL devrait correspondre a tes besoins non ?

n°30054
El_gringo
Posté le 09-05-2001 à 15:52:04  profilanswer
 

Verdoux a écrit a écrit :

Comment construis tu ton tableau m_TabTachesEnv ?




 
Tout bêtement comme ça :
 
TACHE_ENV m_TabTachesEnv[255];
 
ça pose un problème !?

mood
Publicité
Posté le 09-05-2001 à 15:52:04  profilanswer
 

n°30056
El_gringo
Posté le 09-05-2001 à 15:53:42  profilanswer
 

BENB a écrit a écrit :

Pourquoi utiliser des CStrings ?
les MFC ne sont plus supportees par Microsoft, et une classe string de la STL devrait correspondre a tes besoins non ?




 
Comment ça !? bien sur que si, elle sont supportées pas Miscrosoft les MFC...

n°30069
Amadeus
Posté le 09-05-2001 à 16:17:23  profilanswer
 

En fait ton erreur est d'avoir omis un point-virgule ->
 
typedef struct _TACHE_ENV  
      {  
         CString   num; // point-virgule ici!!!
         eTYPE_ENV type;  
         CString   arg1;  
         CString   arg2;                
         CString   libelle;              
      } TACHE_ENV;  
Ensuite tout marchera :)
 
C'est quand même bizarre que t'es pas eu un msg du type "missing ';' before identifier ..." !
 

El_gringo a écrit a écrit :

 
 
Comment ça !? bien sur que si, elle sont supportées pas Miscrosoft les MFC...



 

[edit]--Message édité par Amadeus--[/edit]

n°30076
El_gringo
Posté le 09-05-2001 à 14:25:36  profilanswer
 

Merci, mais ça aurai été trop beau, moi aussi j'y ai cru un moment, mais non, je l'ai juste viré en le collant, mais dans mon prog il y est...re snif !

n°30078
Amadeus
Posté le 09-05-2001 à 14:28:52  profilanswer
 

Tu peux nous montrer la partie de ton code où l'erreur apparaît ?
ça va être ainsi + facile de t'aider
 

El_gringo a écrit a écrit :

Merci, mais ça aurai été trop beau, moi aussi j'y ai cru un moment, mais non, je l'ai juste viré en le collant, mais dans mon prog il y est...re snif !



n°30084
El_gringo
Posté le 09-05-2001 à 14:36:32  profilanswer
 

bien sur, mais je te rappel que c une erreur d'execution, la seule façon de la localiser, c'est le debugger, sinon, tout ce qu'y me dis lui, c que mon application plante !
 
voila, ça c une partie, mais à chaque fois que je fais une opération sur un élément CString contenu dans ce tableau de structure, ça plante:
CString test = "zik";                   // marche bien (test)
   test = _Arg1;                        // marche bien (test)
   m_tachesEnv[_index].arg1.Empty();    // plante
   m_tachesEnv[_index].arg1 = _NoTache;  // plante

n°30085
grosmethos
Posté le 09-05-2001 à 14:38:31  profilanswer
 

tu n'avais qu'a bosser tes cours, voila maintenant t'es perdu!!!

n°30086
El_gringo
Posté le 09-05-2001 à 14:41:58  profilanswer
 

fait pas chier grosmétos, y a des gens sérieux qui essayent de travailler, alors je sais que que toi tu t'emmerde, mais moi j'essaye de bosser... :D  :D

n°30094
Amadeus
Posté le 09-05-2001 à 15:05:50  profilanswer
 

Le pb, je pense, est du au fait que les CString sont des classes qui passe leur temps à allouer et désallouer la mémoire alors les mettre comme membre d'une structure j'ai jammais essayé pasqu'une structure par "tradition" contient des types simples ou des pointeurs.
Essayes de modifier ta structure comme ça :
 
typedef struct _TACHE_ENV  
      {  
         CString*   num;
         eTYPE_ENV type;  
         CString*   arg1;  
         CString*   arg2;                
         CString*   libelle;              
      } TACHE_ENV;  
TACHE_ENV m_TabTachesEnv[255];  
for (int i=0; i<255; i++)
{
  m_TabTachesEnv[i].num = new CString("init" );  
  // pareil pour les 3 autres CString
}
puis tu utilises tes ptr :
 
*m_TabTachesEnv[i].num = "hello";
...
m_TabTachesEnv[i].num->Empty();
...
 
à la fin t'oublies pas de libérer la mém :
 
for (int i=0; i<255; i++)
{
  delete m_TabTachesEnv[i].num;  
  // pareil pour les 3 autres CString
}
 
C'est un peu plus (très peu) compliqué que ce que t'as fait mais ça marchera sans pb :)
 

El_gringo a écrit a écrit :

bien sur, mais je te rappel que c une erreur d'execution, la seule façon de la localiser, c'est le debugger, sinon, tout ce qu'y me dis lui, c que mon application plante !
 
voila, ça c une partie, mais à chaque fois que je fais une opération sur un élément CString contenu dans ce tableau de structure, ça plante:
CString test = "zik";                   // marche bien (test)
   test = _Arg1;                        // marche bien (test)
   m_tachesEnv[_index].arg1.Empty();    // plante
   m_tachesEnv[_index].arg1 = _NoTache;  // plante



 

[edit]--Message édité par Amadeus--[/edit]

n°30099
El_gringo
Posté le 09-05-2001 à 15:18:32  profilanswer
 

merci, en fait g trouvé mais vous pouviez pas trouver, j'avais pas pensé à mettre un truc...je faisait un memset sur tout le tableau a l'initialisation, et ça faisait des merdes  :D  :D  
 
Merci tt le monde qd même (et ton truc ça aurai marché aussi je pense Amadeus, malgré mon memset !)

n°30117
BENB
100% Lux.
Posté le 09-05-2001 à 16:24:05  profilanswer
 

El_gringo a écrit a écrit :

 
 
Comment ça !? bien sur que si, elle sont supportées pas Miscrosoft les MFC...




Non le support des MFC s'arrete avec velui de Visual 6.0... apres plus de MFC...

n°30121
El_gringo
Posté le 09-05-2001 à 16:34:14  profilanswer
 

bah, et si y a plus de MFC, y aura quoi !? plus que le SDK ?

n°30125
BENB
100% Lux.
Posté le 09-05-2001 à 16:51:06  profilanswer
 

Il y aura une nouvelle lib compatible C# (mais incompatible MFC)

n°30129
El_gringo
Posté le 09-05-2001 à 17:03:36  profilanswer
 

'fait chier, je vient d'apprendre à me servir des MFC pour un stage que je fais...

n°30131
verdoux
And I'm still waiting
Posté le 09-05-2001 à 17:03:44  profilanswer
 

El_gringo a écrit a écrit :

merci, en fait g trouvé mais vous pouviez pas trouver, j'avais pas pensé à mettre un truc...je faisait un memset sur tout le tableau a l'initialisation, et ça faisait des merdes  :D  :D  




 
Oui en c++, il faut y réfléchir plusieurs fois quand on veut bidouiller soi-même la mémoire (avec memset, malloc et autres) car le langage, via les constructeurs, fait déjà pas mal de trucs et quand il y a interférence, ça plante.
 
Par exemple en c++:
TACHE_ENV m_TabTachesEnv[255];
Va créer le tableau puis appeler le constructeur pour chaque struct TACHE_ENV qui à son tour va appeler les constructeurs des membres et notamment CString()  
 
C'est pas aussi simple qu'en C.

n°30135
zop
1 world, 1 web, 1 Windows
Posté le 09-05-2001 à 17:09:16  profilanswer
 

BENB a écrit a écrit :

Il y aura une nouvelle lib compatible C# (mais incompatible MFC)




 
On reconnaît bien là Microsoft :D :lol: :D

n°30138
oliv5
Pourquoi ? Parce que !
Posté le 09-05-2001 à 17:12:24  profilanswer
 

Bon, y en a marre. Y en a plein qui parlent de classes STL, ptain, elles ont l'air magiques et je sais pas ce que c'est ... J'en aurrais bien besoin, pour des arbres entre autre.
j'exige des explications :)

n°30140
BENB
100% Lux.
Posté le 09-05-2001 à 17:15:04  profilanswer
 

oliv5 a écrit a écrit :

Bon, y en a marre. Y en a plein qui parlent de classes STL, ptain, elles ont l'air magiques et je sais pas ce que c'est ... J'en aurrais bien besoin, pour des arbres entre autre.
j'exige des explications :)




je ne connais pas d'arbre dans la STL, mais il y a des map et la plupart des implementation ont des HashTable...

n°30141
oliv5
Pourquoi ? Parce que !
Posté le 09-05-2001 à 17:17:28  profilanswer
 

bah, tant pis, mais explique toujours. Ou c'est qu'on peut trouver ces lib. (c'est ca surtout, apres je verrais ce que je peux faire avec.) Pour le moment, je fais tout ou presque à la main (listes chainees, chaines de caracteres etc...)

n°30142
BENB
100% Lux.
Posté le 09-05-2001 à 17:20:52  profilanswer
 

STL > Livre en standard avec la plupart des compilo recents...
sgi distribue une version free je crois, et, RogueWave une version payante...

 

[edit]--Message édité par BENB--[/edit]

n°30146
oliv5
Pourquoi ? Parce que !
Posté le 09-05-2001 à 17:30:09  profilanswer
 

Ok, je vois ce dont il s'agit. J'ai deja essayé de m'en servir et VC++6 ne veut pas compiler le truc. c'est quoi qu'il faut inclure ?

n°30148
BENB
100% Lux.
Posté le 09-05-2001 à 17:36:58  profilanswer
 

oliv5 a écrit a écrit :

Ok, je vois ce dont il s'agit. J'ai deja essayé de m'en servir et VC++6 ne veut pas compiler le truc. c'est quoi qu'il faut inclure ?




par exemple pour une string
- > #include <string>
- > using namespace std; //je crois dans mon implementation y en a pas besoin...
- > string toto;
etc...

n°30158
BENB
100% Lux.
Posté le 09-05-2001 à 18:04:28  profilanswer
 

http://www.microsoft.com/france/vs [...] intro.html
 
voila la lib qui remplace (remplacera) les MFC...

mood
Publicité
Posté le   profilanswer
 


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

  CString en C++

 

Sujets relatifs
CString et la mémoire[Visual C++] classe CString
Plus de sujets relatifs à : CString en C++


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)