MATLAB® Version 8.4 (R2014b) изменяет тип данных указателей на графические объекты от double
, чтобы возразить.
Перед Версией 8.4 файлы MEX использовали библиотечные функции Ссылки API C/C++ и Фортрана mexGet
и mexSet
, которые объявляют входной аргумент указателя как тип double
. Если ваша MEX-функция использует mexGet
или mexSet
, MATLAB отображает следующую ошибку.
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, рассмотрите один или несколько следующих действий.
Замена Функций mexSet и mexGet
Чтобы обновить файл 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 отображает “MEX-функцию устаревшую” ошибка.
Чтобы изменить исходный файл, сделайте следующие редактирования. Этот код использует переменный 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.c
Building with 'Microsoft Visual C++ 2012 (C)'. MEX completed successfully.
Также можно создать файл первоисточника путем выполнения шагов в, я Хочу Восстановить Файлы исходного кода MEX.
mex Автоматически Преобразовывает Тип Указателя
Если ваша MEX-функция использует mexCallMATLAB
или функции mexGetVariable
, чтобы получить графический указатель и передать указатель на mexGet
и API mexSet
, то MATLAB автоматически обнаруживает то поведение, и ваша MEX-функция продолжает выполняться правильно. Вы знаете, что ваша MEX-функция использует этот шаблон, если функция выполняется без ошибки.
Если вы восстанавливаете этот файл MEX в MATLAB R2014b или позже, MATLAB отображает “MEX-функцию устаревшую” ошибка. Чтобы восстановить файл, следуйте инструкциям или в Замене mexGet и Функциях mexSet, или в я Хочу Восстановить Файлы исходного кода MEX.
Если вы восстанавливаете свои исходные файлы MEX в MATLAB R2014b или позже, MATLAB отображает “MEX-функцию устаревшую” ошибка.
Вы можете смочь использовать флаг совместимости команды mex
, -DMEX_DOUBLE_HANDLE
, чтобы создать файл MEX, чтобы работать с графическими объектами. Если MEX-функция вызывает функцию, которая возвращает графический указатель с помощью mexCallMATLAB
или функций mexGetVariable
, MATLAB автоматически обнаруживает и преобразовывает тип указателя. Чтобы создать исходный файл, mymex.c
, введите:
mex -DMEX_DOUBLE_HANDLE mymex.c
Если вы передаете графический указатель на MEX-функцию, преобразовываете указатель на double
прежде, чем вызвать функцию. Для получения дополнительной информации смотрите, что у меня Нет Файла исходного кода MEX.
Если вы получаете ошибку времени выполнения, и у вас нет исходного кода, вы можете смочь использовать следующее обходное решение. Используйте это обходное решение только для MEX-функций, которые берут графический указатель в качестве входного параметра.
Прежде чем вы передадите графический указатель на MEX-функцию, сначала преобразуете указатель на двойное. Например, если вы вызываете MEX-функцию mymex
:
Y = 1:10; h = plot(Y); mymex(h)
затем добавьте оператор, чтобы преобразовать указатель h
, чтобы удвоиться:
Y = 1:10; h = plot(Y); h = double(h); mymex(h)