MATLAB® Версия 8.4 (R2014b) изменяет тип данных указателей на графические объекты с double к объекту.
До версии 8.4 файлы MEX использовали функции библиотеки API на C/C + + и Фортран mexGet и mexSet, которые объявляют входной аргумент указателя как тип double. Если ваша MEX-функция использует mexGet или mexSetMATLAB отображает следующую ошибку.
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.
Чтобы обновить файл MEX, рассмотрите одно или несколько из следующих действий.
mexGet и mexSet ФункцииЧтобы обновить файл MEX, чтобы использовать графический объект, замените вызовы на mexGet с mxGetProperty и вызовы в mexSet с mxSetProperty. В следующих списках программ показан пример исходного файла MEX до и после.
Следующий код использует mexCallMATLAB чтобы создать график, который возвращает графический указатель переменной plhs[0]. Чтобы изменить цвет линии, пример использует mxGetScalar для преобразования указателя в double, затем передает его в mexGet и mexSet.
#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);
}
}
Когда вы создаете этот файл MEX, MATLAB отображает сообщение об ошибке.
Чтобы изменить исходный файл, внесите следующие изменения. Этот код использует переменную plhs[0] в mxGetProperty чтобы получить Color свойство непосредственно. Нет необходимости создавать промежуточное 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);
}
}
Чтобы создать этот файл MEX, введите:
mex mymex.cBuilding with 'Microsoft Visual C++ 2012 (C)'. MEX completed successfully.
Также можно создать исходный исходный файл путем следования шагам в I Want to Rebuild Source Файлы Кода.
mex Автоматическое преобразование типа указателяЕсли ваша MEX-функция использует mexCallMATLAB или mexGetVariable функции, чтобы получить графический указатель и передать указатель в mexGet и mexSet API, затем MATLAB автоматически обнаруживает это поведение, и ваша MEX-функция продолжает правильно выполняться. Вы знаете, что ваша MEX-функция использует этот шаблон, если функция выполняется без ошибок.
Если вы перестроите этот файл MEX в MATLAB R2014b или более поздней версии, MATLAB отобразит сообщение об ошибке. Чтобы перестроить файл, следуйте инструкциям в Replace mexGet и mexSet Functions или I Want to Rebuild MEX Source Code Files.
Если вы перестраиваете исходные файлы MEX в MATLAB R2014b или позже, MATLAB отображает сообщение об ошибке.
Вы можете использовать mex флаг совместимости команд, -DMEX_DOUBLE_HANDLE, чтобы создать файл MEX для работы с графическими объектами. Если MEX-функция вызывает функцию, которая возвращает графический указатель, используя mexCallMATLAB или mexGetVariable MATLAB автоматически обнаруживает и преобразует тип указателя. Чтобы создать исходный файл, mymex.c, тип:
mex -DMEX_DOUBLE_HANDLE mymex.c
Если вы передаете графический указатель в MEX-функцию, преобразуйте указатель в double перед вызовом функции. Для получения дополнительной информации смотрите I Do Not Have MEX Source Code File.
Если вы получите ошибку времени выполнения и у вас нет исходного кода, можно использовать следующее решение. Используйте это решение только для MEX-функций, которые берут указатель на графику в качестве входного параметра.
Прежде чем вы передадите графический указатель в MEX-функцию, сначала преобразуйте указатель в двойной. Для примера, если вы вызываете MEX-функцию mymex:
Y = 1:10; h = plot(Y); mymex(h)
затем добавьте оператор для преобразования указателя h удвоить:
Y = 1:10; h = plot(Y); h = double(h); mymex(h)