Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Windgate on November 03, 2009, 06:35:39 AM

Title: Extraño problema para acceder a los valores de una struct
Post by: Windgate on November 03, 2009, 06:35:39 AM
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?
Title: Re: Extraño problema para acceder a los valores de una struct
Post by: Windgate on November 03, 2009, 06:39:50 AM
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í...
Title: Re: Extraño problema para acceder a los valores de una struct
Post by: Drumpi on November 03, 2009, 05:34:04 PM
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.
Title: Re: Extraño problema para acceder a los valores de una struct
Post by: Windgate on November 03, 2009, 07:54:31 PM
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...