void*
и void**
АргументыMATLAB® подписи C++ поддержек, которые имеют void*
входные параметры или которые возвращают void*
выходные параметры . void*
возвратите тип и void**
тип параметра является непрозрачными объектами.
Вы не можете создать void*
и void**
типы в MATLAB. Вместо этого можно использовать библиотечные функции C++ с этими типами:
Если void*
задан с typedef
(или using
) ключевое слово, затем MATLAB присваивает typedef
назовите как MLTYPE
.
Издатели могут присвоить тип MATLAB void*
тип путем определения MLTYPE
в файле определения библиотеки.
Пользователи MATLAB могут передать 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.mlx
покажите вам, как обработать каждый случай.
Документация для 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);
void**
Типы входного параметраMATLAB возвращает void*
аргумент для void**
параметры. Если void *
задан при помощи typedef
или using
оператор, затем MATLAB автоматически присваивает typedef
или using
назовите как MLTYPE
. В противном случае можно присвоить тип MATLAB существующему void*
введите в библиотеке путем определения MLTYPE
в файле определения библиотеки.
Этот демонстрационный заголовочный файл содержит функции с void**
параметры. Следующие темы показывают вам, как можно задать эти типы при помощи операторов из сгенерированного файла определения библиотеки для примера. Предположения о типах аргумента основаны на документации библиотеки.
class HClass{}; typedef void* handle; void getHandle(handle* out){ *out = new HClass(); } using ghandle = void*; void getGHandle(ghandle* out){ *out = new HClass(); } void getNewHandle(void** out){ *out = new int(1); } typedef void* ptr; void getPointer(void** out){ *out = new int(2); }
void*
typedef
или using
Оператор от библиотекиout
аргумент в getHandle
функция задана как указатель на void*
введите handle
. Для интерфейсной библиотеки lib
, MATLAB использует существующий typedef
оператор, чтобы задать out
как выходной скаляр типа clib.lib.handle
.
defineArgument(getHandleDefinition, "out", "clib.lib.handle", "output", 1);
out
аргумент в getGHandle
функция задана как указатель на void*
переменная ghandle
заданный using
оператор. MATLAB использует существующий using
оператор, чтобы задать out
как выходной скаляр типа clib.lib.ghandle
.
defineArgument(getGHandleDefinition, "out", "clib.lib.ghandle", "output", 1);
void*
void**
параметр getNewHandle
определение потребностей.
%defineArgument(getNewHandleDefinition, "out", <MLTYPE>, "output", 1);
Можно задать новый тип, например, clib.lib.NewHandle
.
defineArgument(getNewHandleDefinition, "out", "clib.lib.NewHandle", "output", 1);
void*
typedef
void**
параметр getNewHandle
определение потребностей.
%defineArgument(getPointerDefinition, "out", <MLTYPE>, "output", 1);
Поскольку существует typedef
для void*
названный ptr
, можно использовать это, чтобы задать out
параметр как скалярное значение типа clib.lib.ptr
.
defineArgument(getPointerDefinition, "out", "clib.lib.ptr", "output", 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**
АргументыМожно передать владение памяти о void*
аргумент к библиотеке при помощи 'ReleaseOnCall'
аргумент значения имени в defineArgument (FunctionDefinition)
или defineArgument (MethodDefinition)
.
Можно передать владение памяти о void*
выведите к MATLAB при помощи 'DeleteFcn'
аргумент значения имени в defineOutput (FunctionDefinition)
или defineOutput (MethodDefinition)
. Средство удаления может быть пользовательской функцией или стандартом C++ delete
оператор для void*
возвратите типы.
Для скалярного void**
выходные аргументы, используйте 'DeleteFcn'
аргумент в defineArgument (FunctionDefinition)
или defineArgument (MethodDefinition)
. Для примера смотрите, Управляют Памятью о Двойном Входном параметре Указателя.
Если у вас есть несколько void*
операторы определения типа, возможно задать функцию средства удаления, которая берет список этих аргументов определения типа как MLTYPE
для void*
входной параметр. Если вы присваиваете 'DeleteFcn'
только к одному void*
определение типа, возвращенное функцией, затем пользователь MATLAB, не может непосредственно вызвать эту функцию средства удаления при помощи того аргумента. MATLAB вызывает эту функцию, когда пользователь вызывает MATLAB delete
функция. Пользователь может, однако, непосредственно вызвать функцию средства удаления при помощи любого другого void*
аргументы определения типа.
Для получения дополнительной информации смотрите Пожизненное управление Объектами C++ в MATLAB.