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

Langage C++ Discussion :

Assert sous condition


Sujet :

Langage C++

  1. #1
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut Assert sous condition
    Bonjour,

    Si j'ai bien compris, assert(...) est désactivé en mode release.
    Si un assert(...) est mis après un if(...), que devient la condition en release ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <cassert>
    struct MyTag {};
     
    template<typename Tag>
    struct MaStructure
    {
    	MaStructure(int n) { if(std::is_same<Tag, MyTag>::value) assert(n > 0); }
    };
    Merci !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    assert est une macro
    suffit de savoir que le principe d'une macro est trivial : remplacer le code par ce qu'elle définit
    en release, assert définit rien
    tu auras donc un superbe if suivi de.. ton unique ;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Impec', merci Bousk !

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Allez je me lance pour un truc de folie furieuse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <cassert>
    struct MyTag {};
     
    template<typename Tag>
    struct MaStructure
    {
    //  MaStructure(int n) { assert((std::is_same<Tag, MyTag>::value) && (n > 0)); } // Wrong: Winjerome
        MaStructure(int n) { assert(!(std::is_same<Tag, MyTag>::value) || (n > 0)); } // Right: Médinoc
    };
    Édit: je suis allé trop vite

  5. #5
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    L'exemple était simplifié, en fait j'ai deux paramètres template qui sont des flags, plusieurs constructeurs etc.
    C'était plus pour comprendre l'idée, merci quand même

    PS : j'experimente une classe de base pour les représentations dans l'espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef TAG_H_INCLUDED
    #define TAG_H_INCLUDED
    //==============================================================================
    struct SizeTag {};
    struct PosTag  {};
    struct MoveTag {};
    //==============================================================================
    #endif // TAG_H_INCLUDED
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #ifndef POINT_H_INCLUDED
    #define POINT_H_INCLUDED
    //==============================================================================
    #include <array>
    #include <cassert>
    #include "Tag.h"
    //==============================================================================
    enum Side{ X = 0, Y = 1, Z = 2 };
    //==============================================================================
    template<typename Type, int dim, typename Tag>
    class Point
    {
    //------------------------------------------------------------------------------
    public:
        Point(const Type x, const Type y, const Type z)
        :   point_({{x, y, z}})
        {
            if(std::is_same<Tag, SizeTag>::value) assert(x > 0 && y > 0 && z > 0);
            static_assert(dim == 3, "3 parameters requested");
        }
        //--------------------------------------------------------------------------
        Point(const Type x, const Type y)
        :   point_({{x, y}})
        {
            if(std::is_same<Tag, SizeTag>::value) assert(x > 0 && y > 0);
            static_assert(dim == 2, "2 parameters requested");
        }
        //--------------------------------------------------------------------------
        Point(const Type x)
        :   point_({{x}})
        {
            if(std::is_same<Tag, SizeTag>::value) assert(x > 0);
            static_assert(dim == 1, "1 parameters requested");
        }
        //--------------------------------------------------------------------------
        Type operator[](const Side side) const
        {
            assert(side < dim && side >= 0);
            return point_[side];
        }
    //------------------------------------------------------------------------------
    private:
        std::array<Type, dim> point_;
    };
    //==============================================================================
    #endif // POINT_H_INCLUDED

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Citation Envoyé par foetus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert((std::is_same<Tag, MyTag>::value) && (n > 0));
    Attention, si la partie std::is_same<Tag, MyTag>::value est fausse, tu ne passes pas l'assert sans aucune raison.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le vrai équivalent de if(std::is_same<Tag, MyTag>::value) assert(n > 0); est assert(!(std::is_same<Tag, MyTag>::value) || (n > 0));.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Maintenant ça parait évident !
    Je vais devoir travailler la logique...
    Merci en tout cas Médinoc.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    cours de lycée option SI ou 1° année de prépa : table de vérités
    !(A && B) = !A || !B
    !(A || B) = !A && !B
    (A ^ B) = (A && !B) || (!A && B)

    après tu compliques, c'est exactement comme développer une multiplication, d'ailleurs la notation c'est . pour & et + pour |
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Intéressant ! Merci !
    (J'ai peut être arrêté un peut trop tôt l'école..)

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

Discussions similaires

  1. [VBA-E]feuille créée sous condition
    Par Angel79 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2006, 15h11
  2. Afficher un champ sous condition
    Par Cantalou dans le forum Access
    Réponses: 24
    Dernier message: 01/02/2006, 14h25
  3. Réponses: 8
    Dernier message: 14/01/2006, 15h17
  4. Pb Ouverture de formulaire sous condition.
    Par Phl98 dans le forum Access
    Réponses: 8
    Dernier message: 03/11/2005, 22h28
  5. Create function sous condition
    Par nbl dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/05/2005, 12h00

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