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 :

variable de type double


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut variable de type double
    Bonjour,

    j'ai une variable de type double.
    cette variable est rattaché à un champ.
    Par défaut aujourd'hui ma variable affiche zéro. Maintenant je voudrais mettre mon champ à "vide" (ou NULL)

    J'ai effectué cette démarche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double test;
    test = NULL;
    mais après compilation, par défaut il m'affiche zéro au lieu de vide.
    Comment faire ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    NULL, c'est pour les pointeurs. Il faut donc que tu déclares ta variable comme pointeur (si possible intelligent).

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Null est destiné au pointeur. Il est plus ou moins équivalent à "&rien" (1).
    Or double n'est pas un pointeur. Un double à toujours une valeur, car c'est un type primitif.

    Par ailleurs, si tu es en C++11, préfères null_ptr à NULL.
    Le compilateur t'aurai hurlé dessus pour cause de conversion illégale.

    Pour représenter une variable potentiellement indéfinie, on préfère soit boost::optionnal, soit une implémentation à la main du concept, telle que:
    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
     
    template <typename T>
    class undefinable{
    private:
        bool defined;
        T lastContent;
     
    public:
        undefinable(T& value):defined(true), lastContent(value){}
        undefinable():defined(false){}
     
        bool isSet() const {return defined;}
    //j'utilise throw false pour simplifier, il vaut mieux creer une exception
        T operator() () const {if(defined) return lastContent; else throw false;}
     
        undefinable& operator= (const T& value) {
            defined=true;
             lastContent=value;
            return *this;
        }
        undefinable& unset() { defined = false; return *this;}
    }

    (1) Pour les linuxiens, je préfère dire &</dev/null>...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par leternel Voir le message
    Par ailleurs, si tu es en C++11, préfères null_ptr à NULL.
    Le compilateur t'aurai hurlé dessus pour cause de conversion illégale.

    Pour représenter une variable potentiellement indéfinie, on préfère soit boost::optionnal, soit une implémentation à la main du concept, telle que:
    On peut également utiliser, en C++, NaN.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    merci de vos réponses

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    En fait, c'est un problème qui est régulièrement rencontré lorsqu'il s'agit de travailler avec des base de données :

    Certains champs peuvent être "nuls", ce qui correspond à une "valeur indéfinie".

    Le problème, c'est que cette notion n'existe pas en tant que telle en C++.

    Par chance (enfin, si on peut s'exprimer ainsi), les requêtes SQL que l'on va générer ne sont, en définitive, que des chaines de caractères qu'il nous appartient de générer de manière automatique.

    La solution généralement employée pour représenter indéfinie d'indéfinie est de choisir une valeur (pourtant bel et bien définie ) clairement identifiable qui ne risque en aucun cas d'être utilisée pour autre chose (comprends : en tant que valeur réelle) et de faire un test au moment de la génération de la requête SQL.

    Il existe, en gros trois cas "principaux" :
    1. Le cas des pointeurs
    2. Le cas des réels
    3. Le cas des entiers
    Pour les pointeurs, nous disposons déjà d'une valeur permettant de représenter un pointeur invalide: NULL (nullptr en C++11) et cette valeur "ne pointant sur rien" est donc un candidat idéal pour représenter "quelque chose qui n'existe pas"

    Comme les pointeurs sont implicitement convertibles en un boléen de valeur false s'ils valent NULL (ou nullptr) et de valeur true s'il valent "autre chose", il est possible de générer la requête sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::stringstream ss;
    ss <<"insert into table set(champs1, champs2) "
       <<value(<<(ptr ? ptr->membre : "NULL");
    Pour les réels, il existe en effet une valeur représentant "Not A Number" (ceci n'est pas un nombre réel ) : NAN.

    Cette valeur (qui n'en représente pas une) est disponibles pour les type float, double et long double (si présents) dans numeric_limits, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <limits> sous la forme de std::numeric_limits<double>::quiet_NaN(); ou de std::numeric_limits<double>::signaling_NaN(); en fonction du système.

    Tu pourrais donc, effectivement, envisager de travailler sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static double const unsetDouble = std::numeric_limits<double>::quiet_NaN(); // respectivement std::numeric_limits<double>::signaling_NaN();
    std::stringstream ss;
    ss <<"insert into table set(champs1, champs2) "
       <<value(<<(mondouble == unsetDouble ? mondouble : "NULL");
    Enfin, pour les entiers, c'est souvent la valeur renvoyée par std::numeric_limits<type>::max() qui sera utilisée (std::string::npos, par exemple).

    Le principe est alors le même que pour les réels, mais en utilisant std::numeric_limits<type>::max() en lieu et place de std::numeric_limits<type>::quiet_NaN(); ou de std::numeric_limits<type>::signaling_NaN();
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/08/2011, 20h28
  2. Réponses: 4
    Dernier message: 06/08/2010, 22h13
  3. Réponses: 15
    Dernier message: 10/05/2007, 13h36
  4. problème d'overflow avec variable type double
    Par ben83 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 15/02/2007, 09h55
  5. Variable de type double
    Par Linaa dans le forum C
    Réponses: 16
    Dernier message: 21/01/2006, 13h04

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