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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°249705
hellbilly
free smile
Posté le 20-11-2002 à 16:19:10  profilanswer
 

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 ?

mood
Publicité
Posté le 20-11-2002 à 16:19:10  profilanswer
 

n°249778
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 20-11-2002 à 17:13:00  profilanswer
 

enleve ton cast et regardes ce que te dis ton compilateur


---------------
du bon usage de rand [C] / [C++]
n°249863
hellbilly
free smile
Posté le 20-11-2002 à 17:54:59  profilanswer
 

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

n°250032
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 20-11-2002 à 20:26:50  profilanswer
 

: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++]
n°250091
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-11-2002 à 21:42:42  profilanswer
 

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)
n°250240
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 20-11-2002 à 23:17:37  profilanswer
 

d'ailleurs il vaut mieux faire un const_cast


---------------
du bon usage de rand [C] / [C++]
n°250378
Musaran
Cerveaulté
Posté le 21-11-2002 à 04:11:43  profilanswer
 

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
n°250530
hellbilly
free smile
Posté le 21-11-2002 à 12:21:31  profilanswer
 

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?

n°250656
BENB
100% Lux.
Posté le 21-11-2002 à 14:58:50  profilanswer
 

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
n°250689
hellbilly
free smile
Posté le 21-11-2002 à 15:36:58  profilanswer
 

merci bcp
:jap:  
 

BENB a écrit a écrit :

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




 
bah we et encore heureux !  :)

mood
Publicité
Posté le 21-11-2002 à 15:36:58  profilanswer
 

n°250784
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 21-11-2002 à 16:26:10  profilanswer
 

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++]
n°251181
hellbilly
free smile
Posté le 22-11-2002 à 08:47:19  profilanswer
 

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.
 

n°251202
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 22-11-2002 à 09:31:00  profilanswer
 

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)
n°251241
hellbilly
free smile
Posté le 22-11-2002 à 10:34:49  profilanswer
 

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é


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

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

 

Sujets relatifs
acceder a un mysql sous linux a partir d'une appli java sous windowsProgrammation avec le framebuffer du noyau Linux
je recherche unediteur C sous linux[Linux] aide sur rexec
probleme sous linux[Postgres] commande linux
ODBC / Linux / Phpcomment recuperer la taille de la console en c sous linux?
Portage win -> linux aie aie ! Opengl en C compilé sous Linux pour exécution sous windows?
Plus de sujets relatifs à : A qui la faute : vc++, bcb ou linux, gcc ?


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