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;
}
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


0