Facilito, todo consiste en:
- Usar el compilador que para eso está (-Wall -ggdb)
- No strippear los binarios
Veras como todo va mejor en general...
En este caso la variable valor de PerlinNoise no está inicializada. Dependiendo
del valor previamente almacenado en la pila (que no depende precisamente de la
arquitectura) tendrás un resultado normal (cuando valor es muy próximo a 0) o
disparatado.
Por otro lado:
- No necesitas allocatar, copiar y liberar. Lo puedes hacer directamente sobre
el array de pixels.
- Las funciones de interpolación cuando hay redondeo por arriba pueden dar
valores mayores que b.
Salud,
Paco
-----Mensaje original-----
De: [EMAIL PROTECTED] en nombre de Sergio
Enviado el: sáb 18/08/2007 16:41
Para: Crysol >> Lista Crysol
Asunto: [CRySoL] ¿Cuestión de arquitecturas? Qué coj*nes pasa aquí? AYUDA!!!
Hola a todos, gurús del C, de PPC y x86 :)
Estos días me he dedicado a leer un poco sobre generación procedural de
texturas.
Al fin y al cabo, esto es empollar un poco de matemáticas, leer a gente como
Ken Perlin, y mucha imaginación. Pero, oh problema, cuando me topo con una
situación la cual sobrepasa mi raciocinio (no es difícil tampoco...).
Veréis, expongo "mi" problema:
Obviamente, cuando vamos a hacer un programa portable entre arquitecturas
big/little endian, tenemos que tener en cuenta el orden de los bits. Aunque
aquí, las operaciones son con colores RGB y se almacenan en un entero si
signo de 32Bits, con lo cual, quizá falle el alfa, o los colores no son los
que queremos, pero el algoritmo habría de mostrar "algo" coherente,
independientemente del orden de los bits en el Uint32 (ARGB)...
Muy bien, y si ahora os digo que en PPC el código funciona correctamente y
que el x86 no funciona si no pongo una instrucción (por ejemplo printf() )
antes de devolver el valor del color, ¿por qué pasa esto? YO, NO TENGO NI
IDEA.
Para muestra un botón:
----------------------------------------------------------------------------
Uint32 color_agua (double valor){
Uint32 aux;
Uint32 r=(Uint32) InterLin(34, 255, valor) & 0xFF;
Uint32 g=(Uint32) InterLin(62 , 255, valor) & 0xFF;
Uint32 b=(Uint32) InterLin(90, 255, valor) & 0xFF;
printf("."); ///////////////////////// <----- ???????
aux = (r << 16) | (g << 8) | b;
return aux; // Uso aux por pura paranoia.
}
----------------------------------------------------------------------------
Si os digo que en PPC funciona, pero que si en x86 quito el printf() ya no
funciona correctamente ... ¿lo creéis?
Seguro que es trivial, pero que alguien me ilumine.
Adjunto el código fuente (requiere SDL), por favor, echadle un vistazo y
decidme algo. Probad a comentar el printf de esta función.
Un saludo,
Sergio.
_______________________________________________
CRySoL mailing list
http://crysol.inf-cr.uclm.es/
https://arco.inf-cr.uclm.es/cgi-bin/mailman/listinfo/crysol