• Martes 14 de Abril de 2026, 01:56

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - RossaRamos

Páginas: [1]
1
Matlab / mxFree
« en: Jueves 23 de Abril de 2009, 03:32 »
Hola a todos,

estoy realizando una interfaz entre MATLAB y C y tengo un problema con mxFree, espero que podais ayudarme, porque esto de hacer una interfaz sola sin ayuda es un rollo, cuando ademas en los foros casi nadie contesta a estas preguntas, a parte de no saber nunca donde escrbirlas, si en el de Matlab o en el de C.

Bueno os pongo la parte del codigo que me da error:

Código: C++
  1. [code=matlab]void mexFunction(int nlhs,mxArray**plhs,int nrhs,mxArray **prhs)
  2. {
  3.     mxArray *param_in[5];
  4.     void *new_pr=NULL;
  5.     double TerrStation[3]={0,0,0};
  6.     struct *Earth_station station;
  7.    
  8.     d2r=3.14/180;
  9.     station->h=0;
  10.     station->lat=72.03;
  11.     station->lon=23.43;
  12.    
  13.     //bueno tendria que incluir como calculo los parametros rc y e_sq, pero vienen de un cuadro de dialogo, mas sucesivas operaciones, y realmente lo que me interesa no es eso
  14.  
  15.     TerrStation[0] = (rc+station->h)*cos(station->lat*d2r)*cos(station->lon*d2r);
  16.     TerrStation[1] = (rc+station->h)*cos(station->lat*d2r)*sin(station->lon*d2r);
  17.     TerrStation[2] = (rc*(1-e_sq)+station->h)*sin(station->lat*d2r);//*ones(size(Y));  
  18.     param_in[0]=mxCreateDoubleMatrix(3,1,mxREAL);
  19.    if(param_in[0]!=NULL)
  20.    {
  21.         new_pr=mxCalloc(3,sizeof(double));
  22.         if(new_pr!=NULL)
  23.         {
  24.     new_pr=TerrStation;
  25.     mxSetData(param_in[0],new_pr);
  26.                 mexCallMATLAB(0,NULL,1,param_in,"plotterrstation");
  27.         }
  28.         mxFree(new_pr);              //AQUI ME DA UN EXCEPCION DESCONOCIDA; Y LA VERDAD ES QUE NO SE PORQUE OCURRE ESTO CADA VEZ QUE LLAMO A MXFREE. NECESITO RESERVAR MEMORIA Y DESPUES LIBERARLA PORQUE SE TRATA DE UN PROGRAMA BASTANTE GRANDE
  29.    }
  30.  return;
  31. }
[/code]


SABEIS A QUE SE DEBE ESTE ERROR?

2
C/C++ / Re: atof
« en: Martes 21 de Abril de 2009, 20:43 »
hola, gracias por tu respuesta. Ayer consegui hacerlo de otra forma y me funciona. Posiblemente el error es el que tu mencionas sobre la asignacion de memoria.

No tengo el programa ahora mismo aqui conmigo pero lo que hice creo que recordar que era algo asi.

Código: C++
  1.   void secondline(struct ORB *punt_sat,string data)
  2.  {
  3.      char conv[11];
  4.      double M=ZERO;
  5.      double E=ZERO;
  6.      double v=ZERO;
  7.      double rpd=ZERO;
  8.     double cons=ZERO;
  9.      int n=ZERO;
  10.      int i=ZERO;
  11.      ldiv_t ld;
  12.      string copy=data;
  13.    
  14.      data.copy(conv,8,43);
  15.     conv=NULL;
  16.      M=atof(conv);
  17.  
  18.     //y asi con todos...
  19.    return;
  20. }
  21.  
}

3
C/C++ / atof
« en: Lunes 20 de Abril de 2009, 18:24 »
estoy desesperada!! por favor, necesito de otros ojos,para poder ver el problema.

La funcion que os voy a poner la tenia mas que compilada y depurada con CODE::BLOCKS, pero cual ha sido mi sorpresa al ver que no me funciona como quiero con Microsoft Visual C++.

la funcion es:

Código: C++
  1. void secondline(struct ORB *punt_sat,string data)
  2.  
  3. {
  4.     char *conv;
  5.     char *conv1={"0.000000"};
  6.     double M=ZERO;
  7.     double E=ZERO;
  8.     double v=ZERO;
  9.     double rpd=ZERO;
  10.     double cons=ZERO;
  11.     int n=ZERO;
  12.     int i=ZERO;
  13.     ldiv_t ld;
  14.     string copy=data;
  15.  
  16.     for(n=43;n<=50;n++)    //AQUI ME EMPEIZAN LOS PROBLEMAS
  17.     {
  18.         conv[i]=data[n];
  19.         data=copy;
  20.         i++;
  21.     }
  22.     M=atof(conv);
  23.     i=TWO;
  24.     for(n=26;n<=32;n++)
  25.     {
  26.        conv1[i]=data[n];
  27.        data=copy;
  28.        i++;
  29.     }
  30.     i=ZERO;
  31.     punt_sat->e=atof(conv1);
  32.     E=root_Kepler(M,punt_sat->e,0);
  33.    
  34.     v=atan2(sqrt(1-pow(punt_sat->e,2))*sin(E),(cos(E)-E));
  35.     for(n=52;n<=62;n++)
  36.     {
  37.        conv[i]=data[n];
  38.        i++;
  39.     }
  40.     i=ZERO;
  41.     rpd=atof(conv);
  42.     punt_sat->a=pow(GM*pow(spd/rpd/2/PI,2),1.0/3);
  43.     for(n=8;n<=15;n++)
  44.     {
  45.         conv[i]=data[n];
  46.         i++;
  47.     }
  48.     i=ZERO;
  49.     punt_sat->in=atof(conv);
  50.     for(n=17;n<=24;n++)
  51.     {
  52.        conv[i]=data[n];
  53.        i++;
  54.     }
  55.     i=ZERO;
  56.     punt_sat->o=atof(conv);
  57.     for(n=34;n<=41;n++)
  58.     {
  59.        conv[i]=data[n];
  60.        i++;
  61.     }
  62.     punt_sat->w=atof(conv);
  63.     punt_sat->u=punt_sat->w+v;
  64.  
  65.     return;
  66.     }
  67.  

pues bien, os cuento:

en primer lugar, en la funcion original los arrays de caracteres los tenia definidos como char conv[el numero de elementos], dependia de los datos que iba a leer. Y depurando con Visual C++, me los leia bien pero donde tenia como cadena "210.5676" al hacerle el atof, me devolvia "210.0000000", vamos me eliminaba mis decimales. Leyendo en internet, un tipo contesto una vez que en Visual C++ es mejor definir los arrays como punteros, tal y como lo tengo ahora mismo....ahora bien, que me pasa, en la primera lectura (primer for), cuando llega al elemento 47, me cambia e´l valor de data y por tanto, todo lo que hace a continuacion ya no esta bien...a que se puede deber??

gracias!

4
C/C++ / mexFunction
« en: Viernes 17 de Abril de 2009, 16:15 »
Hola,
necesito ayuda urgente y he visto que hace unos cuantos meses hubo una pregunta igual pero no entiendo la respuesta, asi que me veo obligada a formularla de nuevo, a ver si algun alma caritativa con muchos mas conociemientos que yo, me soluciona en un plis plas el mayor de mis problemas ahora mismo.

Mi problema en cuestion es que llamando desde MATLAB a una funcion en C, necesito recuperar un array de 361x181 y no se como hacerlo al tratarse de punteros dobles.

os pongo mi codigo para que explicarme mejor,ok?

Código: C++
  1.  
  2.  
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
   
   int buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])*sizeof(mxChar))+1;
   char *buf  = new char[buflen];    
   mxGetString(prhs[0], buf, buflen);
   
   
   if(strcmp("Simulate",buf)==0)
   {
       ....
    }
   else if(strcmp("loss",buf)==0)
   {
       if(nrhs=6)
       {
           float freq=ZERO;
           double *X[181];
           double *Y[181];
           double *Z[181];
           double *pos=NULL;
           struct SatVEC *sat;
           double **L=NULL;
           int ii=ZERO;
           int jj=ZERO;
           mwSize size_memo=65341;
           double *new_pr=NULL;
           
           freq=(float)mxGetScalar(prhs[1]);

           prhs[2]=mxCreateDoubleMatrix(361,181,mxREAL);         //AQUI!!!
           new_pr=(double*)mxCalloc(size_memo,sizeof(double));
           new_pr=X;
      X=mxGetPr(prhs[2]);
           
           prhs[3]=mxCreateDoubleMatrix(361,181,mxREAL);
           new_pr=(double*)mxCalloc(size_memo,sizeof(double));
           new_pr=Y;
           Y=mxGetPr(prhs[3]);
           
           prhs[4]=mxCreateDoubleMatrix(361,181,mxREAL);
           new_pr=(double*)mxCalloc(size_memo,sizeof(double));
           new_pr=Z;
           Z=mxGetPr(prhs[4]);

           pos=mxGetPr(prhs[5]);
           sat->pos[0]=*pos;
           sat->pos[1]=*(pos+1);
           sat->pos[2]=*(pos+2);
           
           L=loss(X,Y,Z,sat,freq);
           mxSetPr(plhs[0],*L);
       }
       else
       {
           mexErrMsgTxt("Errosinput arguments");
       }
  return;
   }
Código: C++
  1.  
  2.  

los parametros de entrada prhs[2],prhs[3] y prhs[4] son como  he dicho arrays procedentes de MATLAB de 361x181.  y me gustaria recuperarlos en C para pasarlos como parametros de entrada a la funcion loss, que la tengo definida como

double** loss(double *X[181],double *Y[181],double *Z[181],struct SatVEC *sat,float freq)

El codigo que  he puesto, es el ultimo que he probado pero todos los anteriores me han dado el mismo problema y es que cuando recupero la direccion con mxGetPr me devuelve un puntero y mis matrices estan definidas como  puntero a puntero....¿alguien sabe  como podria solucionarlo?

muchas gracias y espero de todo corazon una respuesta

Rosa

5
Matlab / dudas con la creacion de mex files
« en: Jueves 5 de Marzo de 2009, 12:11 »
Hola!!

a ver tengo unas cuantas dudas acerca de este tema...llevo dos dias leyendo y estudiando como funcionan las fucniones de manipulacion de arrays pero todavia me quedan algunas dudas.

En primer lugar, imaginaros que quiero incluir en matlab una  funcion que tengo programada en C y para ello creo la correspondiente mexFunction, pero esa funcion en C a la vez llama a otras funciones en C:
          Debo tener una mexFunction para cada funcion? o simplemente definiendo la correspondiente a la funcion raiz de este grupo lo tendria listo? o se define solo una mexFunction pero dentro de esta se debe hacer referencia al resto de funciones que se llamaran??

Por otro lado, los archivos de cabeceras con las declaraciones de las funciones hay que incluirlos dentro de la carpeta donde tengo mi programa??

Y otra cosita mas por ahora,...tengo muchas mas dudas pero estoy tan liada que no se como plantearlas...la otra es, partiendo que mi programa en C trabaja con varios tipos de estructuras para manejar los datos, mi pregunta es, si basta con incluir el fichero.h con la declaracion de estas estructuras, o en cambio tengo que definir una a una tb con la mexFunction??

Por favor, os pido que si sabeis algo, lo mas minimo, me sirve...de verdad, como decimos en mi tierra, estoy mas perdida que el barco del arroz!!! despues de hacer un proyecto en matlab, lo he tenido que traducir a C, para despues leer por ahi que existe una funcion en Matlab que te hace este trabajo, y ahora es el momento de crear la interfaz entre los dos...pero todo lo que leo es ingles, y cada vez que leo algo nuevo me hundo un poquito mas!

muchas gracias!!

Páginas: [1]