Partage
  • Partager sur Facebook
  • Partager sur Twitter

valarray et operator ==

C++/STL

    4 octobre 2018 à 19:31:55

    Bonjour OC,

    j'ai avancé sur la STL et j'en suis arrivé à valarray pour lequel je me suis fait un exemple basé sur le cours de Mathieu :

    valarray<complex<double>> d(10,5);
        valarray<complex<double>> e(8,5),f;
    
        auto y(d==e);
        for_each(begin(y),end(y),[](bool x){cout << x;});

    en partant du principe que l'opérateur == engendre un valarray de bool.

    or le code ne compile pas : il bugue à la ligne :

    for_each(begin(y),end(y),[](bool x){cout << x;});

    Pourriez-vous m'expliquer ce que je dois comprendre ?

    Evidemment , j'ai regardé dans la doc pour l'opérateur ==

    http://www.cplusplus.com/reference/valarray/valarray/operators/

    MERCI

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2018 à 19:58:42

      Salut,

      YES, man a écrit:

      or le code ne compile pas : il bugue à la ligne :

      for_each(begin(y),end(y),[](bool x){cout << x;});

      Pourriez-vous m'expliquer ce que je dois comprendre ?

      Qu'à moins de nous dire "ce qui bugue, nous ne pourrons sans doute pas t'aider ;)

      Tu devrais pourtant avoir l'habitude, depuis tout le temps que tu participe au forum:

      La première règle pour obtenir une aide efficace a toujours été "aides nous à t'aider".

      Dans le cas présent, ce serait pas mal si tu pouvais nous dire "ce qui bugue", histoire que l'on ne doive pas s'amuser à copier / coller / compiler ton code ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        4 octobre 2018 à 19:59:57

        Lu',

        std::begin et std::end ne fonctionnent que sur des collections/tableaux. Or ta variable 'y' est un bool "classique"...ça ne marcher donc, pas.

        • Partager sur Facebook
        • Partager sur Twitter

        Eug

          4 octobre 2018 à 20:07:23

          (@eugchriss en fait, l'operateur == de valarray retourne un tableau. valarray est un tableau tres particulier, puisque ses operateurs s'appliquent general sur chaque element du tableau. C'est une classe un peu... bref)

          @yes man

          Avec l'erreur, ca serait mieux. 

          J'ai testé ton code. En fait, operator == ne retourne pas un std::valarray<bool> a priori (j'ai testé gcc et clang), mais un type interne qui est convertible en valarray. Du coup, le type deduit par auto n'est pas utilisable directement avec begin/end.

          Il faut ecrire le type explicite.

          std::valarray<bool> y { d == e };
          

          (Arretes d'utiliser les parentheses pour l'initialisation des variables)

          Ou si tu veux utiliser auto :

          atuo y = std::valarray<bool>{ d == e };

          En pratique, std::valarray est un peu moisi, on l'utilise tres peu. On va préférer utiliser des libs de math. (C'est expliqué dans cppreference https://en.cppreference.com/w/cpp/numeric/valarray )

          • Partager sur Facebook
          • Partager sur Twitter
            8 octobre 2018 à 17:08:24

            Merci beaucoup pour votre aide, ça m'a beaucoup aidé.

            Du coup je ne connaissais pas cette histoire de type interne.

            Comment as-tu vu que cela retournait un type interne ?

            Pourtant même la doc de C++ dit que cela retourne un valarray de bool.

            Merci

            • Partager sur Facebook
            • Partager sur Twitter
              8 octobre 2018 à 17:26:50

              YES, man a écrit:

              Comment as-tu vu que cela retournait un type interne ?

              Par rapport au message d'erreur.

              • Partager sur Facebook
              • Partager sur Twitter
                10 octobre 2018 à 8:01:21

                Bonjour

                pour comprendre comment j'aurais pu comprendre par moi-même que c'est un type interne, je vous mets un des morceaux de code vers lequel le compilateur renvoie :

                template<class _Tp>
                    constexpr const _Tp*
                    begin(initializer_list<_Tp> __ils) noexcept
                    { return __ils.begin(); }
                
                  /**

                Pouvez-vous m'aider à comprendre ce message ? Notamment le mot clé : constexpr et noexcept que je vois souvent passer. Pourriez-vous m'expliquer à quoi servent ceux deux mots-clés ?

                Si je comprends, le type interne créé est un truc du genre "

                initializer_list<_Tp> __ils"     ?    

                Merci

                -
                Edité par pseudo-simple 10 octobre 2018 à 8:02:18

                • Partager sur Facebook
                • Partager sur Twitter
                  10 octobre 2018 à 10:53:10

                  Encore une fois, il faudrait que tu t'habitues à regarder du coté de la documentation:

                  Mais ce serait encore mieux que, au lieu d'aller voir un fichier de la bibliothèque standard vers lequel pointe l'erreur, tu apprenais à lire et à comprendre les erreurs que le compilateur émet (ou à nous le donner, dans le pire des cas):

                  Le compilateur n'est pas ton ennemi : bien au contraire! chaque fois qu'il ne comprend pas quelque chose, chaque fois que tu lui demande de faire quelque chose que les règles lui interdisent de faire, il essaye de t'expliquer ce qu'il ne comprend pas, ce qu'il ne peut pas faire au travers des erreurs qu'il émet.

                  Tu ne dois pas forcément t'intéresser à l'ensemble de l'expression template qu'il te donne (ni aux types qu'il a utilisé lors de l'évaluation de cette expression), mais tu dois toujours t'intéresser au sens général du message.

                  Avec un peu de pratique, tu te rendra compte qu'il te dit exactement tout ce que tu dois savoir ;)

                  -
                  Edité par koala01 10 octobre 2018 à 11:02:39

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

                  valarray et operator ==

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown