Promoción de enteros en C++

Un problema particularmente molesto me ocurrió ayer mientras programaba el sistema de evaluación de individuos de la tesis. Había escrito el siguiente fragmento de código:


for (int i = 0; i < reqs.size() - 1; i++)
std::cout << reqs[i].first.toString() << " - ";

cuya idea es, básicamente, imprimir todos los elementos de
reqs a excepción del último, para que no quede un guión colgando al final.

Al ejecutar el código, funcionaba bien en general; pero al probarlo con un vector vacío, fallaba con un error indicando acceso a una posición inexistente. Después de un tiempo de meditación (excesivamente largo!), pude darme cuenta de lo que originaba el problema. reqs.size() devuelve un tamaño del tipo size_t, que por lo general es un typedef de unsigned int. Al restarle uno, de acuerdo a las reglas de promoción, se le resta como si fuera una resta de unsigned ints, por lo que la resta actuaba en forma modular y terminaba tratando de acceder a la posición 232 – 1 (la que obviamente no existía en el vector).

En otro contexto completamente diferente, una tesis interesante de un graduado de la CMU en la que calcula, en base a un diseño concreto, el costo que tomaría absorber el dióxido de carbono de la atmósfera. Yo consideraba que era algo que debía ser completamente infactible, pero parece ser que podría hacerse por un costo de U$S 200 por tonelada de CO2. Obviamente es más costoso que secuestrarlo en una central térmica, pero podría ser una solución para la captura de fuentes distribuidas, como es el caso del transporte automotor en general.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s