Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Actualizar archivos MEX para utilizar objetos gráficos

La versión 8,4 (la versión r2014b) cambia el tipo de datos de los identificadores a los objetos gráficos.MATLAB®doubleobject

Antes de la versión 8,4, los archivos MEX usaban las funciones de biblioteca de referencia de API de Fortran y C/C++ y, que declaran el argumento de identificador de entrada como tipo.mexGetmexSetdouble Si su función MEX utiliza o, muestra el siguiente error.mexGetmexSetMATLAB

Error using mex Deprecated MEX function mexGet|mexSet was called. Either update the source code to use mxGetProperty|mxSetProperty, OR rerun MEX with the -DMEX_DOUBLE_HANDLE added to the command line to enter compatibility mode.

Para actualizar su archivo MEX, considere una o más de las siguientes acciones.

Reemplazar y funcionesmexGetmexSet

Para actualizar un archivo MEX para usar un objeto de gráficos, reemplace las llamadas a con y las llamadas a con.mexGetmxGetPropertymexSetmxSetProperty Los listados de programas siguientes muestran un ejemplo de un archivo MEX antes y después de la fuente.

El código siguiente se usa para crear un trazado, que devuelve el identificador de gráficos en variable.mexCallMATLABplhs[0] Para cambiar el color de línea, el ejemplo se utiliza para convertir el identificador a a, a continuación, lo pasa a y.mxGetScalardoublemexGetmexSet

#include "mex.h"
#define RED   0
#define GREEN 1
#define BLUE 2

void fill_array(double *x)
{
    int i = 0;
    for(i = 0 ; i < 4 ; i++)
    {
        x[i] = i+1;
    }
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
   mxArray *color;
   int ret;
   double handle;
   mxArray *copycolor;
   double *acolor;
   
   mxArray *data = mxCreateDoubleMatrix(1,4,mxREAL);
   fill_array(mxGetPr(data));
   
   ret = mexCallMATLAB(1,&plhs[0],1,&data,"plot");
   if(!ret)
   {
      handle = mxGetScalar(plhs[0]);
color = mexGet(handle,"Color");
      copycolor = mxDuplicateArray(color);
      acolor = mxGetPr(copycolor);
      acolor[RED] = (1 + acolor[RED]) /2;
      acolor[GREEN] = acolor[GREEN]/2;
      acolor[BLUE] = acolor[BLUE]/2;
      
      mexSet(handle,"Color",copycolor);
      mxSetProperty(plhs[0],0,"Color",copycolor);
   }
}

Al compilar este archivo MEX, muestra el error "función MEX obsoleta".MATLAB

Para cambiar el archivo de origen, realice las siguientes modificaciones. Este código usa la variable para obtener la propiedad directamente.plhs[0]mxGetPropertyColor No es necesario crear una variable intermedia.handle

#include "mex.h"
#define RED   0
#define GREEN 1
#define BLUE  2

void fill_array(double *x)
{
    int i = 0;
    for(i = 0 ; i < 4 ; i++)
    {
        x[i] = i+1;
    }
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
   mxArray *color;
   int ret;
   
   mxArray *copycolor;
   double *acolor;
  
   mxArray *data = mxCreateDoubleMatrix(1,4,mxREAL);
   fill_array(mxGetPr(data));
   
   ret = mexCallMATLAB(1,&plhs[0],1,&data,"plot");
   if(!ret)
   {
      color = mxGetProperty(plhs[0],0,"Color");
      copycolor = mxDuplicateArray(color);
      acolor = mxGetPr(copycolor);
      acolor[RED] = (1 + acolor[RED]) /2;
      acolor[GREEN] = acolor[GREEN]/2; 
      acolor[BLUE] = acolor[BLUE]/2;
      
      mxSetProperty(plhs[0],0,"Color",copycolor); 
   }
}

Para compilar este archivo MEX, escriba:

mex mymex.c
Building with 'Microsoft Visual C++ 2012 (C)'. MEX completed successfully.

Como alternativa, puede compilar el archivo de código fuente original siguiendo los pasos descritos en.Quiero reconstruir archivos de código fuente MEX

Convierte automáticamente el tipo de identificadormex

Si la función MEX usa las funciones o para obtener un identificador de gráficos y pasar el identificador a la y API, a continuación, detecta automáticamente ese comportamiento y la función MEX continúa ejecutándose correctamente.mexCallMATLABmexGetVariablemexGetmexSetMATLAB Usted sabe que su función MEX utiliza este patrón si la función se ejecuta sin error.

Si reconstruye este archivo MEX en la versión r2014b o posterior, muestra el error "función MEX obsoleta".MATLABMATLAB Para reconstruir el archivo, siga las instrucciones en cualquiera de los dos o.Reemplazar y funcionesmexGetmexSetQuiero reconstruir archivos de código fuente MEX

Quiero reconstruir archivos de código fuente MEX

Si reconstruye sus archivos de origen MEX en la versión r2014b o posterior, muestra el error "función MEX obsoleta".MATLABMATLAB

Es posible que pueda usar el indicador de compatibilidad de comandos, para compilar el archivo MEX para trabajar con objetos gráficos.mex-DMEX_DOUBLE_HANDLE Si la función MEX llama a una función que devuelve un identificador de gráficos mediante las funciones o, detecta automáticamente y convierte el tipo de identificador.mexCallMATLABmexGetVariableMATLAB Para compilar el archivo de origen, escriba:mymex.c

mex -DMEX_DOUBLE_HANDLE mymex.c

Si pasa un identificador de gráficos a una función MEX, convierta el identificador a antes de llamar a la función.double Para obtener más información, consulte.No tengo MEX código fuente archivo

No tengo MEX código fuente archivo

Si obtiene un error en tiempo de ejecución y no tiene el código fuente, es posible que pueda usar la siguiente solución alternativa. Use esta solución solo para las funciones MEX que toman un identificador de gráficos como un argumento de entrada.

Antes de pasar un identificador de gráficos a la función MEX, primero convierta el identificador a un doble. Por ejemplo, si llama a la función MEX:mymex

Y = 1:10; h = plot(Y);  mymex(h) 

a continuación, agregue una instrucción para convertir el identificador a doble:h

Y = 1:10; h = plot(Y); h = double(h); mymex(h) 

Consulte también

|

Temas relacionados