Categories
Code

Recovecos oscuros de C, C99 y C++

Advertencia: Post para coders. Puede producir dolor de cabeza. También puede contener información horriblemente equivocada, en cuyo caso se ruegan correcciones en los comentarios.
Hoy me he pasado un buen rato preguntandome por qué no funcionaba esto (recemos para que el WordPress no me destroce demasiado el codigo :P) :

#include <cstdio>
int main() 
{
    int i; float f=1.0f;
    i = *reinterpret_cast<float*>(&f);
    printf("i = 0x%0x\n", i);
    return 0;
}

Compilando sin optimización funcionaba como se esperaba, y con optimización daba un resultado distinto. Al principio pensé “un error del gcc, seguro”, pero me he puesto a buscar y resulta que no es un bug, sino una feature. ISO C tiene reglas en contra del aliasing de punteros que dicen que acceder a una variable mediante un puntero de un tipo incompatible es ilegal, asi que al activar las optimizaciones asume que esas cosas no pasan y genera un resultado incorrecto. Una solucion tí­pica es el clasico hack en el que se define una union de un int y un float, se escribe en un miembro y se lee en el otro, pero creo que el estandar dice que en este caso el resultado está definido por la implementación. Mala cosa. Tambien he leido por ahi que una buena opcion es usar memcpy, hacer una copia de lo que sea a otra posicion de memoria y te olvidas del aliasing.

Mas cositas. Programando en la uni el otro dia pensamos en lo bonito que seria disponer de tipos de tamaño fijo, como los uint8, int32, que todos hemos usado alguna vez. Pues bien, en C existen y en C++ no. Ahora alguien se puede preguntar “¿pero cómo? si C es un subconjunto de C++!”, pero esto no solo no es cierto, sino que desde la aparición de C99 hay incluso más diferencias (el estandar de C++ es del 98). En este caso, C99 especifica una cabecera stdint.h que define tipos con nombres como int8_t.

Por ultimo, una curiosidad del FAQ de C++: esta permitido hacer un cast de “Blah *” a “const Blah *”, pero no un cast de “Blah **” a “const Blah **”.

Y eso es todo por hoy. Si tenéis alguna historia similar que contar son bienvenidos los comentarios.

Categories
Code Demoscene Music

BCNParty 110

Este último fin de semana he estado en la BCNParty.

El jueves por la noche llegué con stage7 a Barcelona, donde shash nos recogió y nos llevó a su casa. stage7 habí­a terminado durante el viaje su tema para la compo de streamed music, una versión de mi track jarresco para la syltia (coop 4k Bauknecht/Necrostudios) que me encanta como ha quedado :D. Como llovía nos quedamos en casa de shash haciendo cosillas de la intro y viendo grandes éxitos en YouTube.

El viernes nos levantamos tarde y llegamos a la party sobre las 16:00. Sesión de partycoding, partycomposing-con-el-vim, y por la noche descanso para degustar la super sangria of the death que yomizmo preparó. Fueron unas horas geniales en las que los miembros de TimeScratchers nos deleitaron con un montón de chistes, mientras otros traducian los chistes al inglés (como razonable éxito ;) para que los sceners extranjeros pudieran entender algo.

El sábado era el día clave para terminar la intro, es decir, el último :D. Terminé el track como buenamente pude, a pesar de la completa falta de inspiración, y nos pusimos a sincronizarlo todo. No tuvimos demasiados problemas para conseguir el tamaño correcto, aunque hubo un momento de pánico cuando casi me cargo el sinte intentando sustituir la rutina de los ADSRs por un decay exponencial que iba mas o menos bien en mi maquina (40% de consumo aproximado de CPU, eso si :P) pero hacía sufrir demasiado al PC cuando lo pasé a windows. Todaví­a seguimos buscando el porqué. Resultado final: Red trip by Collapse and Necrostudios.

Entregamos la intro 15 minutos antes de las proyecciones, nos hicimos unos pintxos en el bar de enfrente del partyplace *muy* rápido y después de ver las compos nos fuimos de fiesta toda la noche. Llegamos justo a tiempo para desayunar en la estación y despedir a stage7, que se iba a las 8:00. Después a dormir un rato, lo justo para llegar a la entrega de premios.

Al final quedamos segundos. Personalmente estoy bastante contento con la intro teniendo en cuenta la carencia de ideas en los dias previos. Ha quedado algo bastante potable y bien terminado. El nivel de las compos en general fue un poco menor de lo esperado, pero al menos ganó una demo española y escena.org vuelve a estar online ;)

En resumen, la party ha estado muy bien a pesar de la falta de prods (lástima) y me lo he pasado genial. ¡Gracias a todos!

Categories
Code Demoscene

Inércia Demoparty 2006

Estoy en Portalegre (Portugal) con PpluX pasando unos dias en la Inercia. Ayer pasamos todo el dia en las conferencias del Games2006, un congreso sobre videojuegos en el que está enmarcada este año la party. Muchas gracias a la organización de la party por invitarme :D

Ahora mismo estamos en el partyplace, y me dispongo a empezar una 4k. Supongo que haré un refrito de algo, voy a dedicar un par de horitas a experimentar a ver si encuentro algo chulo con lo que llenar la intro.

Si tengo tiempo y ganas seguiré contando cosas de la party en posts sucesivos.

Categories
Code

Jugando con el SDK de Steinberg

Llevo toda la noche toqueteando el VSTi de ejemplo del SDK de Steinberg. La idea es empezar un nuevo sinte para intros de 64k que sea usable (y dejar congelado por el momento el de 4k, a falta de que un dia le haga una GUI). La documentación no es ninguna maravilla pero los fuentes de ejemplo están bastante bien.

El viaje comienza heredando de la clase AudioEffectX. Hay todo un mogollón de funciones virtuales que debo implementar para gestionar el paso de los parámetros desde el host y esas cosas. Todos los parámetros son floats en el intervalo [0.0, 1.0], y todos los datos de audio son floats (o doubles opcionalmente) en el intervalo [-1.0, 1.0].

De momento tampoco hay mucho más. Ah sí, también he estado mirando cosas del menú de configuración del WordPress que acabo de instalar para poder escribir todo esto ;)