miércoles, 25 de febrero de 2009

Paso de objetos como argumentos a funciones variadic en Visual Studio 2005

Advertencia: éste es un artículo técnico, escrito por y dirigido a expertos en C++. No intenten esto en casa.
Supongamos que tengo una clase CL, con sus correspondientes métodos imprescindibles (constructor, constructor de copia, operador de asignación, destructor), 32 bytes de datos y un método Print, y sean a, b y c instancias de CL. Supongamos también que tengo una función variadic que recibe una cantidad arbitraria de objetos de la clase CL y ejecuta su método Print.
En código:

void Funcion(int iN,...)
{

if(iN)
{
CL a;
va_list argumentos;

va_start(argumentos,iN);

while(iN--)
{
a = va_arg(argumentos,CL);
a.Print();
}
va_end(argumentos);
}

}

(Sé que esto es algo que no debería hacerse jamás; es una de esas cosas que C++ permite, pero cuyo resultado no está definido. Dicho eso, sigamos adelante).

El código anterior NO funciona en la implementación de C++ que se incluye en Visual Studio 2005, ya que el compilador hace trampa: siempre pasa los objetos como punteros, no importa cómo los declare uno. Vale decir, si uno declara:
foo(CL a);
lo que el compilador realmente pasa a la función es un puntero a un objeto creado al hacer la llamada, no un objeto en sí mismo. Eso tiene sentido, ya que al pasar un puntero sólo tiene que poner 4 bytes en el stack, en lugar de los N = sizeof(CL) que tendría que pasar si pusiera el objeto completo en el stack. Sin embargo, el hecho de que realmente pase un puntero en el stack hace que las funciones variadic recorran incorrectamente el stack y salten al hiperespacio.
Así, pues, si llamamos a Función así:

Funcion(3,a,b,c);

al hacer va_arg el puntero en el stack avanzará al menos 32 bytes (32 == sizeof (CL)), siendo que en el stack sólo hay 16 (tres punteros + un int), y saltará a un agujero negro. Mala cosa.

La manera de resolver el problema es, por lo tanto, recibir siempre los objetos como punteros en las funciones variadic. Nuestra función quedaría:

void Funcion(int iN,...)
{

if(iN)
{
CL *a;
va_list argumentos;

va_start(argumentos,iN);

while(iN--)
{
a = va_arg(argumentos,CL *);
a->Print();
}
va_end(argumentos);
}

}

y asunto resuelto.
Por supuesto, si uno va a hacer una cosa así, resulta más sensato pasar los punteros directamente a la función:

Funcion(3,&a,&b,&c);

aunque, como la función es variadic, el compilador no tiene manera de chequear la consistencia de los argumentos. Sin embargo, la función , tal como la definimos, tiene la curiosa propiedad de que funciona exactamente igual si es llamada con punteros o con objetos (o incluso con referencias); es decir, tanto

Funcion(3,a,&b,c);

como

Funcion(3,a,b,c);

tendrán el mismo resultado.

miércoles, 28 de enero de 2009

Y hablando de Palm...

... ustedes no me creerán esto, pero en pleno 2002:
  • PalmOs era un sistema operativo de 16 bits.
  • Monotarea, por añadidura.
  • Palm no proporcionaba un IDE gratuito para el desarrollo en Windows.
  • El mejor IDE disponible, que costaba 450 dólares, no tenía ventanas pegables, ni autocompletar.
  • Palm no proporcionaba un mecanismo para explorar el contenido de la Palm desde el computador de escritorio.
Y tampoco creerán esto:
  • En pleno 2008, todo lo anterior seguía siendo cierto, excepto el autocompletar en el IDE.

A nadie debe extrañarle que programar para PalmOs fuera una labor dolorosa y desagradable. Nadie quería programar para esa porquería.

El mismo 2002, en Windows CE...
  • Windows CE era un sistema operativo de 32 bits.
  • Multitarea. Multihebra.
  • Microsoft proporcionaba DOS entornos de desarrollo (C/C++ y Visual Basic) de manera gratuita. Ambos excelentes (copias casi exactas de Visual C++ 6 y de Visual Basic 5, respectivamente).
  • Microsoft proporcionaba un software de sincronización con el escritorio que permitía explorar completamente el sistema de archivos.

¿Es sorprendente que Palm haya estado a punto de desaparecer del mercado?

Palm y WebOs

El nombrecito ese se presta a demasiados chistes como para hacer uno acá. Me cansa. Pero, bueno, ahí lo tenemos: el tantos años anunciado Nuevo Sistema Operativo de Palm, Basado En Linux. ¡Qué suenen las trompetas!
A mí, todo eso del JavaScript y el CSS me parece particularmente tonto. No importa lo que hagan, la programación para dispositivos móviles seguirá siendo distinta a la programación para equipos de escritorio, y los programadores que quieran pasar de un campo a otro necesitarán algunos meses de entrenamiento, si bien puede que sea algo menos traumático. Yo he visto pasar al menos dos grupos de proyecto que lo intentaron, uno en Visual Basic, otro en esa mierda difusa llamada ".NET", y ambos han sido grandes desastres. Por ahora, me sentaré a esperar tranquilamente que Mojo esté listo, y luego, ¡a sufrir!
Con todo, una observación. ¿No les asombra a ustedes esa manía de confundir el sistema operativo con su shell? Es comprensible que ese error lo cometa un usuario, pero, ¿que lo hagan programadores? Entiendo por qué al viejo Tannenbaum se le cayó el pelo.

viernes, 23 de enero de 2009

La plaga

Al salir esta mañana del condominio en el que vivo, había en el tablón de anuncios un mensaje de la administración, comunicándonos que se llevaría a cabo una fumigación de las áreas comunes para acabar con la plaga de incestos nocturnos.
¡Y no me habían avisado, los muy egoístas!

La esperanza en Obama

Acaba de asumir Obama, y las esperanzas que todos ponen en él me asustan un poco. Que va a acabar con las guerras, que terminará con la crisis económica, que la discriminación, que esto, aquello y lo de más allá. Si hasta la comunidad de activistas pro copyleft anda revolucionada con el falso anuncio de que los contenidos de la web de la Casa Blanca serán licenciados bajo Creative Commons.
Yo, como no podía ser menos, he recogido la opinión de los que normalmente no pueden expresarla: en este caso, la comunidad pedófila. En docechan (si no sabes lo que es NO lo averigües) un tipo ha escrito:
"Ahora que asumió Obama, esperemos que se dedique a perseguir a los verdaderos criminales".
Las negritas son suyas (huy, lo que he escrito).
Yo no comparto las espectativas de los que endiosan a Obama, pero comparto el deseo de quien escribió eso. Y es que bajo la administración Bush Jr. las cosas fueron ciertamente mal para todos los que no tienen una sexualidad "normal" y la expresaban en Internet: pedófilos, incestuosos, zoófilos, etc. Entre el 2002 y el 2005, una buena cantidad de sitios de discusión sobre pedofilia e incesto (sitios que, por lo demás, muchas veces ni siquiera contenían fotos o enlaces) se encontró de pronto sin financiamiento y tuvieron que cerrar; otros, cerraron sin previo aviso. Algunos de los comentaristas más activos incluso avisaron de que los estaban siguiendo, se sentían amenazados y debían retirarse. Muy poco de eso salió a la luz publica, porque ya se sabe, la gente que quiere acostarse con su madre no tiene derechos. Aunque la tormenta amainó a mediados del 2005, fue recién en 2006 cuando dio su último coletazo, con un caso que sí apareció en la prensa: el cierre de los sitios de la empresa Webe Web. Esa es otra historia, sin embargo.

Obama, por supuesto, no dirá jamás media palabra respecto al derecho a la libertad de expresión que tienen los pedófilos y gente de parecida ralea. Esperemos, sin embargo, que el recambio de los funcionarios se lleve a los que, en defensa de sus nociones personales de moralidad, arrasaron con los derechos garantizados por la constitución del país que les pagaba el sueldo.

viernes, 16 de enero de 2009

Feliz 2009

La próxima vez que pase tanto tiempo entre un post y otro, no lo duden: significa que preferí ver pornografía en lugar de escribir.
Y eso que no faltaron cosas sobre las que escribir, ¿eh? Desde los test del SIDA cuyo resultado no se informó hasta la bajada de Insulza, este verano ha sido pródigo en sabrosas incompencias que comentar. Tantas, en realidad, que no voy a comentar ninguna. No, ni siquiera el epic fail que acabó con la presidencia de Fernando Ubiergo y con el trabajo de su amigo Shuster. Tampoco el otro sonado epic fail de diciembre, la ley que combate la piratería desde un barco pirata. La tentación es grande, sin duda. Si no te habías enterado de esos dos, algo anda mal; ambas noticias direon la vuelta al mundo.
Pero bien... estoy de vuelta. Y tengo hiel acumulada.