A qui la faute : vc++, bcb ou linux, gcc ?

A qui la faute : vc++, bcb ou linux, gcc ? - C++ - Programmation

Marsh Posté le 20-11-2002 à 16:19:10    

salut,
 
j'avais un très joli seg fault sous linux et j'ai eu un peu de mal a le trouver. Ca venait du code suivant :

Code :
  1. string s;
  2. s.reserve(128);
  3. strftime((char *)s.c_str(), 30, "%d/%m/%y  %H:%M:%S", RealTime);


 
en fait sous win avec vc++ ou bcb pas de probleme. Alors que sous linux avec gcc => plantage.
Avec un cout << s.capacity() on voit tout de suite que sous win la chaine est allouee mais pas sous linux. Il faut en fait soit faire un s.resize ou apres le reserve initialiser la chaine :
s = "glop" et la pas de pb.
 
Alors c'est quoi ce delire ?

Reply

Marsh Posté le 20-11-2002 à 16:19:10   

Reply

Marsh Posté le 20-11-2002 à 17:13:00    

enleve ton cast et regardes ce que te dis ton compilateur


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-11-2002 à 17:54:59    

Taz@PPC a écrit a écrit :

enleve ton cast et regardes ce que te dis ton compilateur




 
gcc ->  passing `const char *' as argument 1 of `strftime(char *, unsigned int, const char *, const tm *)' discards qualifiers
 
et vc++ -> error C2664: 'strftime' : cannot convert parameter 1 from 'const char *' to 'char *'
 
ben voila et c'est normal, fo caster

Reply

Marsh Posté le 20-11-2002 à 20:26:50    

:pt1cable:  :heink:  :lol:  :lol:  si c_str() renvoie un const char * c'est pas pour des prunes, c'est jsutement parce qu'on peut pas ecrire dedans
 
c'est un pointeur vers une zone allouée en plus de la représentation interne de la string afin d'offrir un compatibilité avec cstring par exemple
 
 


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-11-2002 à 21:42:42    

hellbilly a écrit a écrit :

ben voila et c'est normal, fo caster




caster un const char *  :ouch:  :pt1cable:  
 
et tu t'étonnes d'avoir un segmentation fault ???
ne me dis pas que t'as pas eu un warning en compilant ??


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-11-2002 à 23:17:37    

d'ailleurs il vaut mieux faire un const_cast


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 21-11-2002 à 04:11:43    

Les cast sont dangereux.
Ils ont l'air serviables, mais ils attendent qu'on ait le dos tourné pour nous mordre.
 
En toute logique, on ne copie pas manuellement une chaîne C dans une string C++.
On peut écrire dans un buffer, puis initialiser une string avec.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 21-11-2002 à 12:21:31    

Harkonnen a écrit a écrit :

 
caster un const char *  :ouch:  :pt1cable:  
 
et tu t'étonnes d'avoir un segmentation fault ???
ne me dis pas que t'as pas eu un warning en compilant ??




les const c'est juste pour faire des verifications au niveau de la compilation. A l'execution ca ne change rien. Ce que je voulais savoir c'est pourquoi quand je fais un reserve, aucune allocation n'est faite.
 
Musaran-> ouais mais c'est lourd de devoir passer a chaque fois par un buffer intermediaire pour initialiser une string.
 
Et pis pourquoi ca marche sans probleme sous Win et pas sous Linux?

Reply

Marsh Posté le 21-11-2002 à 14:58:50    

hellbilly a écrit a écrit :

 
les const c'est juste pour faire des verifications au niveau de la compilation. A l'execution ca ne change rien. Ce que je voulais savoir c'est pourquoi quand je fais un reserve, aucune allocation n'est faite.
 
Musaran-> ouais mais c'est lourd de devoir passer a chaque fois par un buffer intermediaire pour initialiser une string.
 
Et pis pourquoi ca marche sans probleme sous Win et pas sous Linux?




 
L'implementation de la string est libre. L'important est de suivre le standard, et le standard c'est que le pointeur renvoyé par c_str() est const char *, il n'y donc pas lieu d'y ecrire.
 
Rien, Absolument rien, ne te garenti que le pointeur renvoyé par c_str pointe sur la memoire allouee pour la string.
Certaines implementations de string ont deux buffers, l'un fixe pour les petites chaines, et l'autre variable.
 
ta commende reserve provoque alors l'allocation du grand buffer, mais la chaine de ta string n'en ayant pas besoin, c_str te renvoie un pointeur sur le petit buffer...
 
effectivement le const est là pour la compilation, après que cela ne change rien a l'execution, c'est une affirmation un peu rapide !
 
Bien sur il n'y a pas de systeme de verification pour s'assurer à l'execution que tu ne le fait pas, mais tu entres dans le domaine des consequences indefinies...
 
Tu dis que cela se passe bien en Win32, en es-tu sur ?
Sur le cas que tu as testé peut-etre, mais attention aux effets de bords. Certaines implementations de strings font des references comptées, c'est dire que quand tu copies une string la chaine n'est pas copiée immediatement, mais uniquement quand l'une des deux chaines est modifiée...   Or si tu modifie la chaine par c_str() l'objet string n'est pas au courrant des modifications. De plus dans une prochaine release du compilo l'implementation de la string peut-etre modifiée... Et alors a toi de retrouver un bug dont l'orgine sera pour le moins mysterieuse...
 
caster un const char * ? oui, bien sur, je l'ai nsouvent fait...
Car je savais que la fonction (que je ne maitrisait pas) sous-jacente prenait un char * et ne le modifiait pas. Bien entendu ce cast etait documenté et faisait l'objet d'un jeu de tests pour s'assurer que la fonction sous-jacente ne se mettait a modifier la chaine...
 
Enfin pour conclure : a qui la faute ? a toi !


Message édité par BENB le 21-11-2002 à 15:03:54
Reply

Marsh Posté le 21-11-2002 à 15:36:58    

merci bcp
:jap:  
 

BENB a écrit a écrit :

 
 
Enfin pour conclure : a qui la faute ? a toi !




 
bah we et encore heureux !  :)

Reply

Marsh Posté le 21-11-2002 à 15:36:58   

Reply

Marsh Posté le 21-11-2002 à 16:26:10    

hellbilly a écrit a écrit :

 
les const c'est juste pour faire des verifications au niveau de la compilation. A l'execution ca ne change rien. Ce que je voulais savoir c'est pourquoi quand je fais un reserve, aucune allocation n'est faite.
 
Musaran-> ouais mais c'est lourd de devoir passer a chaque fois par un buffer intermediaire pour initialiser une string.
 
Et pis pourquoi ca marche sans probleme sous Win et pas sous Linux?




 
ptdr, tu comprends rien a rien mon gars...


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 22-11-2002 à 08:47:19    

Taz@PPC a écrit a écrit :

 
 
ptdr, tu comprends rien a rien mon gars...




 
Mais te gene pas, eclaire moi de ton immense savoir au lieu de balancer des posts aussi constructifs.
T'as un tres bon exemple avec BENB.
 

Reply

Marsh Posté le 22-11-2002 à 09:31:00    

hellbilly a écrit a écrit :

 
les const c'est juste pour faire des verifications au niveau de la compilation. A l'execution ca ne change rien.



Certes, mais si le "const" est la, c'est pour une bonne raison !
C'est comme si tu achetais une voiture à essence et que tu la faisais rouler au diesel parce que c'est moins cher !
 
Moi ce que je vois, c'est que tu utilises les avantages du C++ (la string), et la souplesse d'utilisation du C, pour un mélange batard et dont la fiabilité est aléatoire ! La preuve...
 
Quant au fait que ça fonctionne avec BCB ou VC++, regarde donc si tu n'as pas compilé en mode Debug, ça ne m'étonnerait pas du tout...
 
Enfin moi, si je souhaitais strftime(), il ne me serait jamais venu à l'idée d'utiliser une string, mais un bon vieux buffer des familles :

Code :
  1. char s[128] ;
  2. strftime(s, 30, "%d/%m/%y  %H:%M:%S", RealTime);


pas de cast, pas de warning, et 100% portable.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-11-2002 à 10:34:49    

Harkonnen a écrit a écrit :

 
Certes, mais si le "const" est la, c'est pour une bonne raison !
C'est comme si tu achetais une voiture à essence et que tu la faisais rouler au diesel parce que c'est moins cher !
 
Moi ce que je vois, c'est que tu utilises les avantages du C++ (la string), et la souplesse d'utilisation du C, pour un mélange batard et dont la fiabilité est aléatoire ! La preuve...




c'est vrai que ca m'apprendra a jouer les radins   :lol:  
et dans ce cas la, le mélange c/c++ ca faisait carrément dégueu, je l'accorde. Mais ce n'etait pas ma question.
 
[citation]
Quant au fait que ça fonctionne avec BCB ou VC++, regarde donc si tu n'as pas compilé en mode Debug, ça ne m'étonnerait pas du tout...
[/citation]
Compilé en mode release, desolé

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed