Partage
  • Partager sur Facebook
  • Partager sur Twitter

Streamsize

    16 août 2024 à 14:05:51

    Bonjour à tous, j'espère que vous allez bien. 

    J'ai une petite question à poser. J'ai rencontré lors de mon apprentissage un type en c++ qui s'appelle sts::streamsize, mais je ne comprends pas très bien ce que ça fait et comment ça fonctionne. 

    Quelqu'un pour m'éclairer ?

    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2024 à 16:27:29

      https://en.cppreference.com/w/cpp/io/streamsize

      C'est un type semblable à std::size_t sauf qu'il est signé. Il sert a désigner des tailles dans les fonctions de flux.

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        19 août 2024 à 23:39:16

        Je serais curieux de savoir pourquoi ils n'ont pas utilisé un size_t ? (comme dans les std::string ou std::vector par exemple)

        Pourquoi avoir besoin de nombres négatifs ? J'ai lu dans la doc dont tu parles que c'est utilisé uniquement dans le constructeur de std::strstreambuf, mais je ne vois pas vraiment pourquoi.

        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          20 août 2024 à 11:29:51

          Il y a des débats récurrents entre signé et non signé depuis bien longtemps... Je pense que c'est un des trucs qui n'avait pas été harmonisé ou qui a été tranché dans ce sens.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            2 septembre 2024 à 11:50:37

            Fvirtman a écrit:

            Pourquoi avoir besoin de nombres négatifs ?

            La peur de ne pouvoir détecter une soustraction plus grande que la valeur courante ?

            Rien qu'une assertion + test unitaires ne puisse résoudre.

            -
            Edité par Deedolith 2 septembre 2024 à 11:52:40

            • Partager sur Facebook
            • Partager sur Twitter
              2 septembre 2024 à 18:08:00

              Fvirtman a écrit:

              Je serais curieux de savoir pourquoi ils n'ont pas utilisé un size_t ? (comme dans les std::string ou std::vector par exemple)

              Pourquoi avoir besoin de nombres négatifs ? J'ai lu dans la doc dont tu parles que c'est utilisé uniquement dans le constructeur de std::strstreambuf, mais je ne vois pas vraiment pourquoi.


              Et dans l'implémentation gcc https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B98/strstream.cc (lignes 55 et suivantes) le constructeur utilise une taille minimum de 16
                strstreambuf::strstreambuf(streamsize initial_capacity)
                : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(true),
                  _M_frozen(false), _M_constant(false)
                {
                  streamsize n = std::max(initial_capacity, streamsize(16));  // XXXXXXXXXXXXXXXXX
              
                  char* buf = _M_alloc(n);
                  if (buf)
                    {
              	setp(buf, buf + n);
              	setg(buf, buf, buf);
                    }
                }

              les autres constructeurs qui ont un streamsize en parametre passent par _M_setup, exemple ligne 83

                strstreambuf::strstreambuf(char* get, streamsize n, char* put) throw ()
                : _Base(), _M_alloc_fun(0), _M_free_fun(0), _M_dynamic(false),
                  _M_frozen(false), _M_constant(false)
                { _M_setup(get, put, n); }
              

              lequel en tire une valeur N qui est toujours positive (l 319)

                void
                strstreambuf::_M_setup(char* get, char* put, streamsize n) throw ()
                {
                  if (get)
                    {
              	size_t N = n > 0 ? size_t(n) : n == 0 ? strlen(get) : size_t(INT_MAX);
              
              	if (put)
              	  {
              	    setg(get, get, put);
              	    setp(put, put + N);
              	  }
              	else
              	  setg(get, get, get + N);
                    }
                }






              -
              Edité par michelbillaud 2 septembre 2024 à 18:13:24

              • Partager sur Facebook
              • Partager sur Twitter

              Streamsize

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown