Extraño problema para acceder a los valores de una struct

Started by Windgate, November 03, 2009, 06:35:39 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Tengo declarado este tipo de dato:

TYPE tp_planeta;
int radio_fisico = 200; // Especifica el radio del modelo esférico 3D que forma el cuerpo del planeta
int radio_luminico = 300; // Especifica el radio de partículas de iluminación que rodea el planeta
int radio_orbita = 4000; // Especifica el radio orbital respecto de la escena
int min_emision = 500; // Especifica la mínima emisión de partículas por segundo
int max_emision = 500; // Especifica la máxima emisión de partículas por segundo
_Pcolor min_color = ( 0 , 100 , 100 , 100 ); // Especifica el color mínimo de las partículas de emisión del planeta
_Pcolor max_color = ( 0 , 255 , 255 , 255 ); // Especifica el color máximo de las partículas de emisión del planeta
_Pcolor fader_color = ( 0 , 31 , 127 , 255 );
END


Y la siguiente función a la que le llega un parámetro de ese tipo:

PROCESS planeta ( tp_planeta datos )
PRIVATE
_pos3d pos;
int hora;
int giro;
BEGIN
LOOP
hora = funcion_tiempo() % ( 3600 * 24 );
giro = ( hora * 360 ) / ( 3600 * 24 );
giro -= 90;
pos.y = ( datos.radio_orbita ) * ( sin ( 1000 * giro ) ) ;
pos.z = ( datos.radio_orbita ) * ( cos ( 1000 * giro ) );

M8E_POSMODEL ( planeta , pos );
FRAME;
END
END


El caso es que datos.radio_orbita vale 4000 y lo muestro por pantalla y me sale 4000, pero la función no funciona bien... En cambio si la escribo así:

PROCESS planeta ( tp_planeta datos )
PRIVATE
_pos3d pos;
int hora;
int giro;
int radio;
BEGIN
       radio = datos.radio_orbita;
LOOP
hora = funcion_tiempo() % ( 3600 * 24 );
giro = ( hora * 360 ) / ( 3600 * 24 );
giro -= 90;
pos.y = radio * sin ( 1000 * giro );
pos.z = radio * cos ( 1000 * giro );

M8E_POSMODEL ( planeta , pos );
FRAME;
END
END


Me funciona correctamente ???

He probado a abusar del paréntesis por si era problema de la prioridad de operandos, pero no es eso. Lo tengo solucionado con la variable intermedia radio, pero me parece un problema extraño... ¿El compilador se me ha vuelto locuelo?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

SOLUCIONADO PARCIALMENTE:

El dato tp_planeta se lo pasaba desde un proceso que justo después moría, supongo que de alguna manera le llegaba por referencia y esa memoria se liberaba... Le he puesto un LOOP FRAME; END para que no muera y funciona perfectamente.

En cualquier caso ahora mi duda es por qué afectaba la muerte del proceso padre... Es como si de alguna manera le estuviese pasando una referencia a la struct en lugar de una copia...

¿Los structs se pasan por referencia en Bennu? No tenía entendido que fuese así...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

No tendría por qué, se le pasa por referencia si le pasas el puntero, pero si no debería copiar los datos a la nueva variable y no depender del proceso.
La única vez que me pasó algo parecido fue un bug de Fénix.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

Tengo unas DLL del Bennupack 1.7, siendo Bennu3D no se pueden usar ningunas más modernas, quizás sea ese el problema...

En cualquier caso lo que hago es copiar el parámetro a una variable PRIVATE y trabajar con ella, funcionar funciona...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es