IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

classe temporaire : étendre la durée de vie


Sujet :

C++

  1. #1
    screetch
    Invité(e)
    Par défaut classe temporaire : étendre la durée de vie
    bonjou, j'ai un petit problème avec mon essai de classe de formattage de chaine; j'essaye de faire la chose suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
    	const char *f = format<>("int value : %d\n") & 12;
    	printf("%s\n", f);
    	return 0;
    }
    le probleme c'est que format<> qui contient ici la chaîne est un temporaire qui sera détruit après l'opération, et donc f pointe potentiellement sur du caca. Je me demande si vous avez des idées brillantes pour corriger ce problème; le but serait de réussir a prolonger la vie de la chaîne pour qu'elle aie le scope de la fonction...

    la classe format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    template< size_t SIZE = 512 >
    class format
    {
    	typedef char ARRAY[SIZE];
    public:
    	ARRAY m_format;
    	char *m_pattern;
    public:
    	void findFormat()
    	{
    		while(m_pattern && *m_pattern && (m_pattern[1] == '%' || m_pattern[0] != '%'))
    			m_pattern++;
    		if(m_pattern && !*m_pattern)
    			m_pattern = 0;
    	}
    public:
    	format(const char *f)
    	{
    		strncpy(m_format, f, SIZE);
    		m_pattern = m_format;
    		findFormat();
    	}
    	~format()
    	{
    		//*m_format = 0;
    	}
    	operator const char*() { return m_format; }
    };
    l'opérateur & a peu d'importance

    des idées brillantes ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
    	format<> f("int value : %d\n") & 12;
    	printf("%s\n", f.get());
    	return 0;
    }
    Boost ftw

  3. #3
    screetch
    Invité(e)
    Par défaut
    ca ne compile pas, il faudrait faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    format<> f = format<>("int value : %d\n") & 12;
    ce qui est un peu redondant. je cherche justement a eviter le fortmat<> en double

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
    	auto f = format<>("int value : %d\n") & 12;
    	printf("%s\n", f.get());
    	return 0;
    }
    ?
    Boost ftw

  5. #5
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from futur import auto;
    le problème ici c'est "futur".

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    AUTO(f, format<>("int value : %d\n") & 12) sinon si tu veux un truc qui marche sur compilateurs plus mainstreams (avec AUTO une macro)
    Boost ftw

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    C'est en autre pour éviter ce genre de déconvenues que l'on préfère les std::string : on n'a pas à se préoccuper de la mémoire.
    Accessoirement, tu devrais jeter un oeil à boost.format. En spécifiant %d, tu répètes une information que le compilateur connait déjà. Oublis le C, embrasse le C++.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    screetch
    Invité(e)
    Par défaut
    je suis contre l'allocation dynamique pour un temporaire...

    et je questionne fortement "boost::format" sur l'utilisation de l'opérateur %...

  9. #9
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    C'est en autre pour éviter ce genre de déconvenues que l'on préfère les std::string : on n'a pas à se préoccuper de la mémoire.
    Accessoirement, je reviens la dessus pour dire que les std::string ont le même problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char *str = std::string("blabla").c_str();
    printf("%s\n", str);
    ce n'est pas un problème d'allocation statique ou dynamique donc...

  10. #10
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char *str = std::string("blabla").c_str();
    printf("%s\n", str);
    Pourquoi tu n'écris pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const std::string str = std::string("blabla");
    printf("%s\n", str.c_str());
    Et si le but est d'éviter la copie de chaîne, trois solutions :
    - utiliser une classe chaîne à comptage de référence
    - passer la chaîne en paramètre in-out de ta fonction
    - être un guru, écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const std::string& str = std::string("blabla");
    printf("%s\n", str.c_str());
    et le commenter. Cf most important const

Discussions similaires

  1. durée de vie d'un temporaire
    Par renoo dans le forum C++
    Réponses: 2
    Dernier message: 04/01/2015, 18h42
  2. Réponses: 9
    Dernier message: 17/10/2012, 16h34
  3. durée de vie d'une table temporaire
    Par hypothese dans le forum Administration
    Réponses: 1
    Dernier message: 01/07/2008, 17h58
  4. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33
  5. prob de durée de vie de IDvdGraphBuilder
    Par Chaksss dans le forum DirectX
    Réponses: 11
    Dernier message: 30/12/2004, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo