void* АргументыMATLAB® поддерживает сигнатуры C++ с void* входы или возврат void* выходы. A void* объект является непрозрачным объектом. Вы не можете создать void* аргумент в MATLAB. Вы можете пройти только void* возвращает аргумент как вход в функцию, которая принимает соответствующее void* вход. MATLAB не поддерживает литье типов void* к типам данных MATLAB.
void* Типы возвратаMATLAB задает void* выход в файл определения библиотеки путем определения аргумента MLTYPE как одно из следующего:
A typedef из библиотеки. Используйте только для скалярного выхода.
Если void* имеет typedef заданный в библиотеке, MATLAB задает MLTYPE как новое имя типа в typedef оператор.
Если нет typedef, выбрал тип MATLAB клиба формата PackageName.. TypeName, где TypeName может включать пространство имен.
Если библиотека не имеет соответствующего typedef оператор, можно задать void* с типом MATLAB.
Этот пример файла заголовка содержит функции с void* типы. В следующих разделах показано, как можно задать эти типы с помощью операторов из сгенерированного файла определения библиотеки для примера. Допущения о типах аргументов основаны на документации библиотеки.
typedef void* handle; handle getHandle(); using ghandle = void*; ghandle getGHandle(); void* getImagData(const int* pa); typedef void* data; void* getData();
typedef Из библиотекиhandle определяется typedef. MATLAB создает непрозрачный тип typedef void* handle.
handleDefinition = addOpaqueType(libnameDef, ... "typedef void* handle", "MATLABName", ... "clib.libname.handle", ... "Description", "clib.libname.handle Representation of C++ type void*.")
MATLAB автоматически использует этот тип для определения MLTYPE как clib.libname.handle в возвращаемом аргументе.
defineOutput(getHandleDefinition, "RetVal", "clib.lib.handle");
using Операторghandle определяется как using оператор. Как и в случае handle В предыдущем примере MATLAB автоматически создает тип typedef void* ghandle и использует его, чтобы определить MLTYPE как clib.libname.ghandle в возвращаемом аргументе.
ghandleDefinition = addOpaqueType(libnameDef, ... "typedef void* ghandle", "MATLABName", ... "clib.libname.ghandle", ... "Description", "clib.libname.ghandle Representation of C++ type void*.") defineOutput(getGHandleDefinition, "RetVal", "clib.libname.ghandle");
Область выхода getImagData необходимо определение.
%defineOutput(getImagDataDefinition, "RetVal", <MLTYPE>, <SHAPE>); ... %'<MLTYPE>' can be an existing typedef name for void* or a new typedef name to void*.
Можно задать новый тип, например clib.libname.ImagData и используйте его, чтобы определить RetVal как скалярное значение этого типа.
defineOutput(getImagDataDefinition, "RetVal", "clib.libname.ImagData", 1);
typedefОбласть выхода getData необходимо определение.
%defineOutput(getDataDefinition, "RetVal", <MLTYPE>, <SHAPE>); %'<MLTYPE>' can be an existing typedef name for void* or a new typedef name to void*.
Поскольку существует typedef для void* именованные data, можно использовать это для определения RetVal как скалярное значение типа clib.libname.data.
defineOutput(getDataDefinition, "RetVal", "clib.libname.data", 1);
void* Входные параметрыMATLAB пытается преобразовать базовые данные C++ void* аргумент к соответствующему типу C++. Для получения информации о отображении типов данных C++ и MATLAB, смотрите void * Типы аргументов. Данные, отображение могут быть разбиты на эти случаи.
Основные типы
clib.array типы
Типы для классов C++ в библиотеке
void*
typedef
Следующие темы включают примеры операторов файла заголовка, содержащих функции с void* входные параметры. Допущения о типах аргументов основаны на документации библиотеки. The defineArgument операторы в сгенерированном файле определения библиотеки definelibname.xml показать вам, как лечить каждый случай.
Документация для getAttribute указывает, что void *value указывает на данные C++ основного типа uint64_t и что это значение передается как возвращаемый аргумент.
class TaskHandle; int32 getAttribute(TaskHandle tHandle, int32 attribute, void *value);
MATLAB генерирует этот оператор для определения входного параметра value.
%defineArgument(getAttributeDefinition, "value", <MLTYPE>, <DIRECTION>, <SHAPE>); %'<MLTYPE>' can be primitive type, user-defined type, clib.array type, or %a list of existing typedef names for void*.
Определите value как скалярное возвращаемое значение типа uint64.
defineArgument(getAttributeDefinition, "value", "uint64", "output", 1);
clib.array НапечататьThe readArray аргумент в этой readRaw функция может быть задана как clib.array тип.
class TaskHandle; int32 readRaw (TaskHandle tHandle, void *readArray, uInt32 arraySizeInBytes);
Задайте void *readArray аргумента как вход типа clib.array.libname.Int с размером arraySizeInBytes.
defineArgument(readRawDefinition, "readArray", "clib.array.libname.Int", ... "input", "arraySizeInBytes");
The userdata аргумент в этой setDrawCallback функция может быть определена как класс в библиотеке.
void setDrawCallback(const String& winname,
OpenGlDrawCallback onOpenGlDraw,
void* userdata = 0)
void on_opengl(void* param) {
cv::ogl::Texture2D* backgroundTex = (cv::ogl::Texture2D*)param;
....
}
Задайте void *userdata аргумента как вход скаляр класса clib.lib.cv.ogl.Texture2D.
defineArgument(setDrawCallbackDefinition, "userdata", "clib.lib.cv.ogl.Texture2D", ... "input", 1);
void* typedefThe in аргумент в этой setRemoteTimeout функция может быть определена с помощью существующего typedef для void*.
typedef void* sessionHandle; void setRemoteTimeout(sessionHandle in);
Задайте in аргумента как вход скаляр typedef
sessionHandle.
defineArgument(setRemoteTimeoutDefinition, "in", "clib.libname.sessionHandle", "input", 1);
MATLABType как объект классаMATLAB отображает сообщение об объекте, недоступном без создания объекта класса, и предлагает другие значения для MATLABType. Кроме того, рассмотрите использование MATLABType который находится вне возможностей класса.
Например, предположим, что вы создаете файл определения библиотеки definelib.mlx из этого класса A.
class A {
public:
typedef void* handle;
A(void* arg1, handle arg2) {}
void* task1() {
int* x = new int(10);
return x;
}
handle task2() {
int* x = new int(10);
return x;
}
};MATLAB создает непрозрачный тип для typedef void* handle и определяет task2. Издатель создает новый непрозрачный тип clib.lib.A.NewHandle для void* task1 и A аргумент конструктора классов void* arg1.
addOpaqueType(libDef, "typedef void* A::handle", "MATLABName", "clib.lib.A.handle ", ... "Description", "clib.lib.A.handle Representation of C++ opaque type."); AConstructor1Definition = addConstructor(ADefinition, ... "A::A(void * in)", ... "Description", "clib.lib.A.A Constructor of C++ class A."); defineArgument(AConstructor1Definition, "arg1", "clib.lib.A.NewHandle", "input", 1); % '<MLTYPE>' can be primitive type, user-defined type, clib.array type, or a list of existing typedef names for void*. defineArgument(AConstructor1Definition, "arg2", "clib.lib.A.handle", "input", 1); % '<MLTYPE>' can be clib.lib.A.handle, primitive type, user-defined type, or a clib.array type. validate(AConstructor1Definition); task1Definition = addMethod(ADefinition, ... "A::handle A::task1()", ... "Description", "clib.lib.A.task1 Method of C++ class A."); defineOutput(task1Definition, "RetVal", "clib.lib.A.NewHandle", 1); % '<MLTYPE>' can be an existing typedef name for void* or a new typedef name to void*. validate(task1Definition); task2Definition = addMethod(ADefinition, ... "A::handle A::task2()", ... "Description", "clib.lib.A.task2 Method of C++ class A."); defineOutput(task2Definition, "RetVal", "clib.lib.A.handle", 1); validate(task2Definition);
Поскольку существует несколько void* входной параметр для A конструктораMATLAB отображает следующее сообщение:
clib.lib.A(clib.lib.A.Newhandle,clib.lib.A.handle)
Note: This constructor cannot create object clib.lib.A, if object clib.lib.A.Newhandle/
clib.lib.A.handle is not available without constructing object of clib.lib.A.
Consider using a MATLABType which is outside the scope of clib.lib.A.Как создать clib.lib.A объект для этого конструктора, задайте MATLABType как одно из следующего:
Примитивный тип, пользовательский тип или clib.array тип для arg1.
Примитивный тип, пользовательский тип, clib.array тип для arg2.
MATLABType который находится вне возможностей clib.lib.A.
void* АргументыМожно передать владение памятью void* аргумент в библиотеку, используя 'ReleaseOnCall' аргумент пары "имя-значение" в defineArgument (FunctionDefinition) или defineArgument (MethodDefinition).
Можно передать владение памятью void* выход в MATLAB с помощью 'DeleteFcn' аргумент имя-значение в defineOutput (FunctionDefinition) или defineOutput (MethodDefinition) функций. Делетер может быть пользовательской функцией. MATLAB не поддерживает стандартные delete C++ оператор для void* возвращаемые типы.
Для получения дополнительной информации смотрите Управление жизненным циклом объектов C++ в MATLAB.