Примечание
MATLAB ® предоставляет API, использующий современную семантику C++ и шаблоны проектирования, API данных MATLAB. MathWorks рекомендует создавать функции MEX с помощью этого API. Дополнительные сведения см. в разделе Приложения C++ MEX.
Если функции MEX должны выполняться в MATLAB R2017b или ранее, необходимо использовать функции C Matrix API в приложениях C++. Функции MEX, созданные с помощью C Matrix API, поддерживают все стандарты языка C++. В этом разделе рассматриваются конкретные проблемы языка C++, которые необходимо учитывать при создании и использовании файлов MEX.
Примеры кода MATLAB C можно использовать в приложениях C++. Например, см. mexcpp.cpp в примере класса C++, который содержит операторы C и C++.
В примерах исходного кода MATLAB C++ используется .cpp расширение файла. Расширение .cpp однозначен и распознается компиляторами C++. Другие возможные расширения: .C, .cc, и .cxx.
Чтобы построить файл C++ MEX, введите:
mex filename.cpp
где filename имя файла исходного кода в пути MATLAB.
Файл C++ MEX можно запустить только в системах с той же версией MATLAB, в которой был скомпилирован файл.
Не используйте mxFree или mxDestroyArray функции в деструкторе C++ класса, используемого в MEX-функции. Если функция MEX выдает ошибку, MATLAB очищает переменные файла MEX, как описано в разделе Автоматическая очистка временных массивов в файлах MEX.
Если возникает ошибка, которая приводит к выходу объекта из области действия, MATLAB вызывает деструктор C++. Освобождение памяти непосредственно в деструкторе означает, что и MATLAB, и деструктор освобождают одну и ту же память, что может повредить память.
Используя cout или язык C printf функция не работает так, как ожидалось в файлах C++ MEX. Используйте mexPrintf вместо этого функция.
Файл MEX mexcpp.cpp показывает, как использовать код C++ с файлом MEX языка C. В примере используются функции из C Matrix API. Он использует функции-члены, конструкторы, деструкторы и iostream включить файл.
Функция определяет класс myData с функциями-членами display и set_dataи переменные v1 и v2. Он создает объект d класса myData и отображает инициализированные значения v1 и v2. Затем он устанавливает v1 и v2 и отображает новые значения. Наконец, delete оператор очищает объект.
Чтобы создать этот пример, скопируйте файл по пути MATLAB и в командной строке введите:
mex mexcpp.cppСинтаксис вызова: mexcpp(num1, num2).
mexatexit.cpp В примере показаны функции обработки файлов C++. Сравните его с примером кода C mexatexit.c, которая использует mexAtExit функция.
В примере C++ используется fileresource для обработки функций открытия и закрытия файлов. Функция MEX вызывает деструктор для этого класса, который закрывает файл данных. В этом примере также печатается сообщение на экране при выполнении операций над файлом данных. Однако в этом случае единственной выполняемой операцией С-файла является операция записи, fprintf.
Чтобы построить mexatexit.cpp MEX-файл, скопируйте файл в путь MATLAB и введите:
mex mexatexit.cppТип:
z = 'for the C++ MEX-file'; mexatexit(x) mexatexit(z) clear mexatexit
Writing data to file. Writing data to file.
Отображение содержимого matlab.data.
type matlab.datamy input string for the C++ MEX-file
Пример кода C регистрирует mexAtExit для выполнения задач очистки (закрытия файла данных) при очистке файла MEX. В этом примере выполняется печать сообщения на экране с помощью mexPrintf при выполнении операций с файлами fopen, fprintf, и fclose.
Чтобы построить mexatexit.c MEX-файл, скопируйте файл в путь MATLAB и введите:
mex mexatexit.cВыполните пример.
x = 'my input string';
mexatexit(x)
Opening file matlab.data. Writing data to file.
Очистите файл MEX.
clear mexatexitClosing file matlab.data.
Отображение содержимого matlab.data.
type matlab.datamy input string