 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ludo Guest
|
Posted: Wed Jan 14, 2004 1:16 pm Post subject: Ca marchait, ça marche plus ! |
|
|
Bonjour,
Je programme en Visual C++ 6 et j'ai un problème (normal sinon j'écrirai
pas...). En fait il y a plusieurs mois j'ai écris un petit programme et il
marchait très bien (en débug et en exe). Seulement depuis un petit moment
l'exe bugue sur une erreur dans msvcrtd.dll et le debug m'indique que
l'erreur se situe sur les lignes
char* heuref;
itoa(12,heuref,10);
je tiens à préciser que je n'ai fait aucune modification de code (de toute
façon ces lignes devraient fonctionner) alors comment puis-je faire pour
résoudre mon problème ? La dll est bien présente, faut-il que je la mette à
jour ? Peut-être un programme me l'a remplacé par une version compatible ?
Le problème vient-il bien de ce fichier ?
Merci par avance.
|
|
| Back to top |
|
 |
Martinez Jerome Guest
|
Posted: Wed Jan 14, 2004 2:12 pm Post subject: [HS]Re: Ca marchait, ça marche plus ! |
|
|
Ludo wrote:
| Quote: | Bonjour,
Je programme en Visual C++ 6 et j'ai un problème (normal sinon j'écrirai
pas...). En fait il y a plusieurs mois j'ai écris un petit programme et il
marchait très bien (en débug et en exe). Seulement depuis un petit moment
l'exe bugue sur une erreur dans msvcrtd.dll et le debug m'indique que
l'erreur se situe sur les lignes
char* heuref;
itoa(12,heuref,10);
|
1/Le rapport avec le C++?
C'est du C ca...
2/Pas bien de ne pas reserver de la memoire avant d'utiliser un
pointeur... b.a.ba du C ;-)
| Quote: |
je tiens à préciser que je n'ai fait aucune modification de code
|
.... Et tu as eu beaucoup de chance de tomber sur une zone memoire libre...
| Quote: | (de toute
façon ces lignes devraient fonctionner)*
|
absolument pas.
| Quote: | alors comment puis-je faire pour
résoudre mon problème ?
|
coder correctement en faisant attention a la memoire :)
| Quote: | La dll est bien présente, faut-il que je la mette à
jour ? Peut-être un programme me l'a remplacé par une version compatible ?
Le problème vient-il bien de ce fichier ?
|
Non, seulement de toi.
|
|
| Back to top |
|
 |
Ludo Guest
|
Posted: Wed Jan 14, 2004 4:44 pm Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
"Martinez Jerome" <jerome.martinez (AT) aenlever-orangefrance (DOT) com> a écrit dans
le message de news: bu3ip0$2111 (AT) news (DOT) rd.francetelecom.fr...
| Quote: | Ludo wrote:
Bonjour,
Je programme en Visual C++ 6 et j'ai un problème (normal sinon j'écrirai
pas...). En fait il y a plusieurs mois j'ai écris un petit programme et
il
marchait très bien (en débug et en exe). Seulement depuis un petit
moment
l'exe bugue sur une erreur dans msvcrtd.dll et le debug m'indique que
l'erreur se situe sur les lignes
char* heuref;
itoa(12,heuref,10);
1/Le rapport avec le C++?
C'est du C ca...
2/Pas bien de ne pas reserver de la memoire avant d'utiliser un
pointeur... b.a.ba du C ;-)
je tiens à préciser que je n'ai fait aucune modification de code
... Et tu as eu beaucoup de chance de tomber sur une zone memoire libre...
(de toute
façon ces lignes devraient fonctionner)*
absolument pas.
alors comment puis-je faire pour
résoudre mon problème ?
coder correctement en faisant attention a la memoire :)
La dll est bien présente, faut-il que je la mette à
jour ? Peut-être un programme me l'a remplacé par une version compatible
?
Le problème vient-il bien de ce fichier ?
Non, seulement de toi.
|
Merci pour tes conseils mais dans tout ça tu ne m'as pas dit comment bien
coder ces lignes...
|
|
| Back to top |
|
 |
Erwann ABALEA Guest
|
Posted: Wed Jan 14, 2004 5:14 pm Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
On Wed, 14 Jan 2004, Ludo wrote:
| Quote: | "Martinez Jerome" <jerome.martinez (AT) aenlever-orangefrance (DOT) com> a écrit dans
le message de news: bu3ip0$2111 (AT) news (DOT) rd.francetelecom.fr...
Ludo wrote:
[...]
char* heuref;
itoa(12,heuref,10);
1/Le rapport avec le C++?
C'est du C ca...
2/Pas bien de ne pas reserver de la memoire avant d'utiliser un
pointeur... b.a.ba du C
[...]
Merci pour tes conseils mais dans tout ça tu ne m'as pas dit comment bien
coder ces lignes...
|
Pourtant, je vois bien une réponse de Jérôme... Pour te mettre un peu plus
sur la voie: "malloc()", ça devrait t'aider.
--
Erwann ABALEA <erwann (AT) abalea (DOT) com> - RSA PGP Key ID: 0x2D0EABD5
-----
Je pense qu'un lecteur assidu se reconnaitra. James, si tu veux que
je réponde à ton message, même pour te dire que je n'ai pas envie de te
répondre, laisse-moi une adresse de retour !
-+-DM in : Guide du Neuneu d'Usenet : Je t'aime moi non plus -+-
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Wed Jan 14, 2004 7:39 pm Post subject: Re: Ca marchait, ça marche plus ! |
|
|
| Quote: | char* heuref;
itoa(12,heuref,10);
|
Normal que ça ne marche pas.
Ton pointeur heuref n'est pas initialisé. ie qu'il "pointe" sur une adresse
mémoire aléatoire, donc dans certains cas, ça peut passer, et des fois non.
De plus, ici c'est 100% du C.
Si tu tiens à conserver un stockage en char* et l'utilisation de itoa, alors
il faut faire :
char heuref[11]; // tu reserves 10 caractères (+ le zéro final)
itoa(12,heuref,10);
mais l'emploi des objets du C++ serait nettement meilleur...
|
|
| Back to top |
|
 |
Guillaume Gourdin Guest
|
Posted: Wed Jan 14, 2004 9:34 pm Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
| Quote: | Merci pour tes conseils mais dans tout ça tu ne m'as pas dit comment bien
coder ces lignes...
|
En C++ :
string myString;
ostrstream myStream(myString);
myStream << 12; // maintenant myString == "12"
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Jan 14, 2004 11:45 pm Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
On Wed, 14 Jan 2004 15:12:48 +0100, Martinez Jerome
<jerome.martinez (AT) aenlever-orangefrance (DOT) com> wrote:
| Quote: | ... Et tu as eu beaucoup de chance de tomber sur une zone memoire libre...
|
Je dirais plutôt qu'il a eu beaucoup de malchance. L'idéal, quand on a
un bug, c'est qu'il se manifeste tout de suite. Il n'y a rien de pire
que les bugs "clignotants".
--
;-)
http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2
|
|
| Back to top |
|
 |
Ludo Guest
|
Posted: Thu Jan 15, 2004 7:06 am Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
| Quote: | Je dirais plutôt qu'il a eu beaucoup de malchance. L'idéal, quand on a
un bug, c'est qu'il se manifeste tout de suite. Il n'y a rien de pire
que les bugs "clignotants".
Merci pour cette compassion, ce bug est arrangé grâce à vous mais j'ai |
maintenant un autre bug avec des ajouts de CTimeSpan à des CTime et je me
demande si ça ne vient pas des changements d'heure hiver/été, je ferai appel
à vous si je ne trouve pas. Décidement ce programme me donne du fil à
retordre!
|
|
| Back to top |
|
 |
Bertrand Motuelle Guest
|
Posted: Thu Jan 15, 2004 8:36 am Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
"Guillaume Gourdin" <nospam (AT) nospam (DOT) fr> wrote
| Quote: | Merci pour tes conseils mais dans tout ça tu ne m'as pas dit comment bien
coder ces lignes...
En C++ :
string myString;
ostrstream myStream(myString);
myStream << 12; // maintenant myString == "12"
|
Pas du tout
Ton exemple ne compile pas: les classes [io]strstream ne connaissent
pas std::string (elles fonctionnent avec des tableaux de caractères).
Et si tu voulais dire stringstream:
string myString;
ostringstream myStream(myString);
myStream << 12; // myString est toujours vide!
Pas de chance, ca ne marche pas non plus. stringstream fait une copie
de l'argument (ici myString) passé au constructeur. La ligne "myStream
<< 12;" n'a donc aucun effet sur myString.
Pour faire ce que voulais le posteur initial:
std::ostringstream oss;
oss << 12;
std::string heuref = oss.str();
(Hum, encore qu'ici 'std::string heuref("12");' ferait l'affaire)
Bertrand.
|
|
| Back to top |
|
 |
Guillaume Gourdin Guest
|
Posted: Thu Jan 15, 2004 9:49 am Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
| Quote: | Pour faire ce que voulais le posteur initial:
std::ostringstream oss;
oss << 12;
std::string heuref = oss.str();
|
Oui, mea culpa, j'ai posté trop vite. Et j'ai une question subsidiaire :
existe t'il un moyen d'indiquer la string d'un istringstream (et pas d'un
ostringstream) autrement que par le constructeur ?
Merci.
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Sat Jan 24, 2004 5:51 pm Post subject: Re: [HS]Re: Ca marchait, ça marche plus ! |
|
|
le Thursday 15 January 2004 10:49, [email]toto (AT) toto (DOT) com[/email] écrivit :
| Quote: | Pour faire ce que voulais le posteur initial:
std::ostringstream oss;
oss << 12;
std::string heuref = oss.str();
Oui, mea culpa, j'ai posté trop vite. Et j'ai une question subsidiaire :
existe t'il un moyen d'indiquer la string d'un istringstream (et pas d'un
ostringstream) autrement que par le constructeur ?
|
ouais,
ss.str("la nouvelle chaine à parser");
à noter que ça *copie* la string dans le stringstream, et que ça marche
aussi bien pour les (o|i|'')stringstream
Les stringstream se basent sur un stringbuf, qui fait tout par copie, quand
on sait ça on se rappelle plus facilement le comportement des stringstream.
--
Sam
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Sat Jan 24, 2004 6:17 pm Post subject: atoi // streams ([HS]Re: Ca marchait, ça marche plus !) |
|
|
le Thursday 15 January 2004 09:36, [email]tib.motuelle (AT) laposte (DOT) net[/email] écrivit :
| Quote: | Pour faire ce que voulais le posteur initial:
std::ostringstream oss;
oss << 12;
std::string heuref = oss.str();
|
qd ça commence à devenir un besoin fréquent, on peut en faire une fonction
(qui remplacera avantageusement les strtod, atoi, etc.., du C) :
#include
#include <typeinfo> // pour bad_cast
// un mini boost::lexical_cast
template<class T>
T val_from_string(std::string const& s) {
std::stringstream converter(s);
T ret;
converter >> ret >> std::ws; // eat white-space
if(!converter) // conversion impossible
throw std::bad_cast;
if(! converter.eof()) // s n'a pas été entierement converti
throw std::bad_cast;
return ret;
}
ça s'utilise comme ça :
double d = val_from_string<double> ("3.124e05");
il faudrait une classe d'exception plus précise que bad_cast, par exemple
copier celle de boost::lexical_cast ..
et si boost est dispo, il suffit simplement d'utiliser boost::lexical_cast.
double d = boost::lexical_cast<double, std::string> ("3.123e05") ;
Le seul bémol, c'est que c'est cette façon de convertir est évidemment bcp
plus lente (je verrai bien un facteur 10. peut être 100 ..) que le très
basique atoi.
Et donc si on a besoin de convertir en masse des nombres, il sera surement
nécessaire d'utiliser une fonction spécialisée.
(pas forcément atoi, on peut garder plus de polyvalence en modifiant
val_from_string pour passer en parametre le stream de conversion à
utiliser, pour en prendre un custom et le garder d'un appel au suivant en
vidant juste le buffer - ça devient je pense d'une vitesse acceptable.
genre 60% de atoi, ou du genre..)
--
Sam
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|