exponenta event banner

Использовать 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 в аргументе return.

defineOutput(getHandleDefinition, "RetVal", "clib.lib.handle");

Определить выходной аргумент из using Заявление

ghandle определяется с помощью using заявление. Как и с handle в предыдущем примере MATLAB автоматически создает тип typedef void* ghandle и использует его для определения MLTYPE как clib.libname.ghandle в аргументе return.

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* входные аргументы. Предположения о типах аргументов основаны на документации библиотеки. 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); 

Определить аргумент 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; 
.... 
} 

Определить аргумент 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); 

Определить аргумент 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* входной аргумент конструктора AMATLAB выводит следующее сообщение:

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.

Связанные темы