C/Visual C - asignacion de memoria

 
Vista:

asignacion de memoria

Publicado por Rosa (17 intervenciones) el 03/03/2009 21:01:28
Hola! tengo un problemilla, para mi un problemon y espero que para alguno de vosotros sea realmente un problemilla y me podais ayudar...

a ver os escribo la funcion, bueno parte de ella:

struct ORB* rv2oe(struct SatVEC* sat, int nargin,struct ORB *origin)
{
int d=ZERO;
float mr=ZERO;
float mv=ZERO;
float n=ZERO;
double E=ZERO;
float *i_r=NULL;
float *i_y=NULL;
float *i_f=NULL;
float *var=NULL;
float mvar=ZERO;
float TrueAnomaly=ZERO;
ldiv_t ld;
struct ORB *current=NULL;

mr=lengthvec(sat->pos);
mv=lengthvec(sat->vel);

current=origin;

if(TWO!=nargin)
{
error(THREE);
}

while(current!=NULL)
{
current->a = 1/((2/mr)-pow(mv,2)/GM);
//Eccentricity
current->e =sqrt((pow(product(sat->pos,sat->vel),2)/(GM*current->a))+(pow(1-mr/current->a,2)));//sqrt(product(sat->pos,pow_vec(sat->pos,2))*a+(1-mr/pow(a,2)));

var=cross(sat->pos,sat->vel); //1
mvar=lengthvec(var);
i_f = scal_div(cross(sat->pos,sat->vel),mvar); //2
current->in = acos(*(i_f+TWO));
//Longitude of the ascending node Omega
current->o = atan2(*i_f,-(*(i_f+ONE)));
//ld=ldiv(o,2*PI); ///ACOTAR AL INTERVALO!!!
//o=(double)ld.rem;

//Argument of latitude u = w + Omega
//i_r = scal_div(sat->pos,mr); //3
i_y = cross(i_f,scal_div(sat->pos,mr));
mvar=*(i_y+TWO);
i_r = scal_div(sat->pos,mr);
current->u = atan2(*(i_r+TWO),mvar);
//ld=ldiv(u,2*PI); ///ACOTAR AL INTERVALO
//u =(double) ld.rem;

//Mean motion
n = sqrt(GM/pow(current->a,3)); .....

....

y las funciones a las que invoca:

FUNCION QUE CALCULA LA LONGITUD DE UN VECTOR.

float lengthvec(float vector[])
{
float L =ZERO;
if (NULL!=vector)
{
L=sqrt(pow(vector[ZERO],2)+pow(vector[ONE],2)+pow(vector[TWO],2));

}
else
{
error(FIVE);
}
return L;
}


FUNCION QUE CALCULA EL PRODUCTO VECTORIAL DE DOS VECTORES

float* cross(float v1[],float v2[])
{
float res[THREE];

res[ZERO]=(v1[ONE]*v2[TWO])-(v2[ONE]*v1[TWO]);
res[ONE]=-1*((v1[ZERO]*v2[TWO])-(v2[ZERO]*v1[TWO]));
res[TWO]=(v1[ZERO]*v2[ONE])-(v2[ZERO]*v1[ONE]);

return res;
}

FUNCION QUE CALCULA LA DIVISION DE UN VECTOR ENTRE UN ESCALAR

float* scal_div(float *vec,float len)
{
float res[THREE];

res[ZERO]=vec[ZERO]/len;
res[ONE]=vec[ONE]/len;
res[TWO]=vec[TWO]/len;

return res;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:asignacion de memoria

Publicado por Rosa (17 intervenciones) el 03/03/2009 21:07:02
ay!! que lo he enviado sin querer, sin decir cual es mi problema.

La cuestion es que a partir de la asignacion que hago a la variablen var, el resto de variables se van almacenando en la misma direccion de memoria con la consiguiente perdida de datos.

Asi como en la llamada a lengthvec para la asignacion de mvar, me cambia el valor del argumento de entrada, cosa que no entiendo y que no hace en otras ocasiones cuando invoco a esta funcion...pero esto es secundario, lo que mas me urge, me inquieta y preocupa, es a que puede deberse que a partir de una asignacion, el resto de variables se vayan sobreescribiendo sobre esa misma direccion. Puedo sospechar que se deba a que en las funciones que os incluyo tb, devuelva la direccion de una variable local, pero no encuentro la forma de solucionarlo...si alguien me pudiera guiar y decirme algun motivo de a que se puede deber eso, le estaria muy agradecida...porque llevo todo el dia con lo mismo, y ya sabeis que si no se termina algo, no se duerme bien...por la salud de mi suegno!!!

muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:asignacion de memoria

Publicado por ISAIAS DUQUE GOMEZ (46 intervenciones) el 03/03/2009 22:50:06
ésta es mi observación:

tu función "cross" no te regresa el arreglo completo. pruébalo así:

float *cross(float v1[],float v2[])
{
float *res=NULL; //CAMBIO

res[ZERO]=(v1[ONE]*v2[TWO])-(v2[ONE]*v1[TWO]);
res[ONE]=-1*((v1[ZERO]*v2[TWO])-(v2[ZERO]*v1[TWO]));
res[TWO]=(v1[ZERO]*v2[ONE])-(v2[ZERO]*v1[ONE]);
return res;
}

Así invocarías:

float *var=cross( Array_A , Array_B) ;

escribe si ya lo solucionaste...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:asignacion de memoria

Publicado por Tom (619 intervenciones) el 04/03/2009 09:23:12
No es buena idea devolver una variable local, cuando es un puntero (ya te diste cuenta).

Yo cambiaría

float* cross(float v1[],float v2[])

por

void cross(float v1[], float v2[], float res[]);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:asignacion de memoria

Publicado por Rosa (17 intervenciones) el 04/03/2009 11:05:45
era eso mismo!!

devuelvo el resultado en una variable pasada como argumento y problema solucionado!!

muchas gracias!!

lo que mas coraje me da, que esa era mi sospecha y como no me gustaba como quedaban las funciones, ni lo probé ayer. Me parecia que si lo hacia, perdia claridad el programa y que tan solo seria un chanchullo mio para solucionarlo.

muchas gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:asignacion de memoria

Publicado por Tom (619 intervenciones) el 05/03/2009 10:15:37
También podrías haber reservado memoria global en la función, pero eso complica las cosas, porque debes saber cuando liberarla.

float* cross(float v1[],float v2[])
{
float *res = calloc(THREE, sizeof(float));

res[ZERO]=(v1[ONE]*v2[TWO])-(v2[ONE]*v1[TWO]);
res[ONE]=-1*((v1[ZERO]*v2[TWO])-(v2[ZERO]*v1[TWO]));
res[TWO]=(v1[ZERO]*v2[ONE])-(v2[ZERO]*v1[ONE]);

return res;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar