void*
АргументыMATLAB® поддерживает подписи C++ с void*
входные параметры или которые возвращают void*
выходные параметры . void*
объект является непрозрачным объектом. Вы не можете создать void*
аргумент в MATLAB. Только можно передать void*
возвращаемый аргумент, как введено к функции, которая берет соответствующий void*
входной параметр. MATLAB не поддерживает преобразование типа void*
к типам данных MATLAB.
void*
Возвратите типыMATLAB задает void*
выведите в файле определения библиотеки путем определения аргумента MLTYPE
как один из них:
typedef
от библиотеки. Используйте для скалярного выхода только.
Если void*
имеет typedef
заданный в библиотеке, MATLAB задает MLTYPE
как новое имя типа в typedef
оператор.
Если нет никакого typedef
, выбрал тип MATLAB формата clib. 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 смотрите пусто* Типы аргумента. Отображение данных может быть разломано на эти случаи.
Фундаментальные типы
clib.array
типы
Типы для классов C++ в библиотеке
void*
typedef
Следующие темы включают демонстрационные операторы заголовочного файла, содержащие функции с void*
входные параметры. Предположения о типах аргумента основаны на документации библиотеки. 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
ВводreadArray
аргумент в этом readRaw
функция может быть задана как clib.array
ввод.
class TaskHandle; int32 readRaw (TaskHandle tHandle, void *readArray, uInt32 arraySizeInBytes);
Аргумент Define void *readArray
как вход типа clib.array.libname.Int
с размером arraySizeInBytes
.
defineArgument(readRawDefinition, "readArray", "clib.array.libname.Int", ... "input", "arraySizeInBytes");
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; .... }
Аргумент Define void *userdata
как входной скаляр класса clib.lib.cv.ogl.Texture2D
.
defineArgument(setDrawCallbackDefinition, "userdata", "clib.lib.cv.ogl.Texture2D", ... "input", 1);
void*
typedef
in
аргумент в этом setRemoteTimeout
функция может быть задана с помощью существующего typedef
для void*
.
typedef void* sessionHandle; void setRemoteTimeout(sessionHandle in);
Аргумент Define 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 не поддерживает стандарт C++ delete
оператор для void*
возвратите типы.
Для получения дополнительной информации смотрите Пожизненное управление Объектами C++ в MATLAB.