Задайте 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");

Задайте входной параметр как класс C++ в библиотеке

Можно задать 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);
}

Аргумент Define с 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);

Аргумент Define от нового имени типа для void*

void** параметр getNewHandle определение потребностей.

%defineArgument(getNewHandleDefinition, "out", <MLTYPE>, "output", 1);

Можно задать новый тип, например, clib.lib.NewHandle.

defineArgument(getNewHandleDefinition, "out", "clib.lib.NewHandle", "output", 1);

Аргумент Define от существующего 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.

Похожие темы