telarañas

19 views
Skip to first unread message

Daniel Gutson

unread,
Jun 22, 2020, 12:50:27 PM6/22/20
to cppba
Cómo iterar del primer al último entero? (de cualquier tamaño), siendo la variable de iteracion del mismo tipo de dato?

suponganse que quiero llamar a funcion(entero).
Suponganse que es el tipo de dato int. No vale usar tipos de datos mas grandes, asuman que no existen.

--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

Martin Galvan

unread,
Jun 22, 2020, 10:18:42 PM6/22/20
to CyC++ Buenos Aires
El lunes, 22 de junio de 2020, 13:50:27 (UTC-3), Daniel Gutson escribió:
Cómo iterar del primer al último entero? (de cualquier tamaño), siendo la variable de iteracion del mismo tipo de dato?

No entendi la pregunta. ¿Te referis a algo como esto?

template <typename T>
void f()
{
   
static constexpr auto Min = std::numeric_limits<T>::min();
   
static constexpr auto Max = std::numeric_limits<T>::max();

   
for (auto i = Min; i <= Max; ++i)
   
{
        funcion
(i);
   
}
}


Carlos Bederián

unread,
Jun 22, 2020, 10:20:05 PM6/22/20
to CPPBA
template<typename T, class = typename std::enable_if<std::is_integral<T>::value>::type>
void full_loop() {
    constexpr T start = std::numeric_limits<T>::lowest();
    T i = start;
    do {
        f(i);
        i++;
    } while (i != start);
}


--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/CAFdMc-1kMHc0XYgnFBFXxDLzk%2BzkJRrEN0f9WOBVru9XV-gtpQ%40mail.gmail.com.

Carlos Bederián

unread,
Jun 22, 2020, 10:23:44 PM6/22/20
to CPPBA
On Mon, Jun 22, 2020 at 11:18 PM Martin Galvan <omgal...@gmail.com> wrote:
    for (auto i = Min; i <= Max; ++i)

El problema al que se refiere Daniel es que i <= Max es true. 
Message has been deleted

Martin Galvan

unread,
Jun 22, 2020, 10:27:55 PM6/22/20
to CyC++ Buenos Aires
Que bolu, tenes razon. No me di cuenta de eso.

De todas formas me da un poco de intriga lo otro que puso sobre el int, y que no tenes tipos mas grandes.. Esa parte no entendi.

Martin Galvan

unread,
Jun 22, 2020, 10:31:25 PM6/22/20
to CyC++ Buenos Aires
De todas formas, si no entendi mal, en este ejemplo estas asumiendo que i va a hacer wraparound y va a terminar siendo igual a start. Pero si i es signed, entiendo que el overflow es undefined behavior, no?
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cp...@googlegroups.com.

Carlos Bederián

unread,
Jun 22, 2020, 10:42:48 PM6/22/20
to CPPBA
La verdad pensaba que C++20 iba a asumir wraparound junto con two's complement, pero sí, viendo el estándar sigue siendo UB.
En fin, en ese caso la forma es:

    for (auto i = std::numeric_limits<T>::lowest(); ; ++i) {
        f(i);
        if (i == std::numeric_limits<T>::max()) {
            break;
        }
    }


Probablemente haya alguna forma más elegante.

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/36da5329-1d9d-4d85-88c4-d8008fede9d0o%40googlegroups.com.
Message has been deleted
Message has been deleted
Message has been deleted

Martin Galvan

unread,
Jun 22, 2020, 11:05:17 PM6/22/20
to CyC++ Buenos Aires
Mepa que seria mas eficiente asi:

template <typename T>
void f()
{
   
static constexpr auto Min = std::numeric_limits<T>::min();
   
static constexpr auto Max = std::numeric_limits<T>::max();


    T i
;

   
for (i = Min; i < Max; ++i)
   
{
        funcion
(i);
   
}

   
// Aca i vale Max
    funcion
(i);
}

RFOG

unread,
Jun 23, 2020, 4:21:48 AM6/23/20
to cp...@googlegroups.com
int a=0;
while(true)
{
whatever(a);
a++; //separada de la llamada para que sea la última instrucción ejecutada para poder consultar en ensamblador.
if(instrucción ensamblador para detectar bit de overflow)
break;
}

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

RFOG

unread,
Jun 23, 2020, 4:24:07 AM6/23/20
to cp...@googlegroups.com
oops, si se quiere recorrer el dominio completo de int, debería ser unsigned:

unsigned int a=0;

Martin Galvan

unread,
Jun 23, 2020, 10:24:36 AM6/23/20
to CyC++ Buenos Aires
El martes, 23 de junio de 2020 a las 5:21:48 UTC-3, RFOG escribió:
if(instrucción ensamblador para detectar bit de overflow)

Bueno pero ahi ya no es portable. Ademas, si el signed overflow es UB, el estandar dice que puede pasar cualquier cosa. Capaz ese overflow te formatea el disco, y para el estandar esta todo bien..

Si fuera unsigned no hay overflow; el estandar garantiza que se hace un wraparound y volves a 0.

Daniel Gutson

unread,
Jun 23, 2020, 10:28:19 AM6/23/20
to cppba
Esta es la solución que más me gusta.

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages