martes, 4 de septiembre de 2007

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.

No hay comentarios: