Много функций во внешних библиотеках передают аргументы ссылкой. Когда вы передаете ссылкой, вы передаете указатель на значение. В функциональной подписи аргументы указателя имеют имена, заканчивающиеся в Ptr
и PtrPtr
. Несмотря на то, что MATLAB® не поддерживает передачу ссылкой, можно создать аргумент MATLAB, названный объектом lib.pointer, который совместим с указателем C. Этот объект является экземпляром класса lib.pointer
MATLAB.
Часто, можно просто передать переменную MATLAB (передающий аргумент значением), даже когда подпись для этой функции объявляет, что аргумент указатель. Существуют времена, однако, когда полезно передать lib.pointer
указатель.
Вы хотите изменить данные во входных параметрах.
Вы передаете большие объемы данных, и вы хотите управлять, когда MATLAB делает копии данных.
Библиотека хранит и использует указатель, таким образом, вы хотите, чтобы функция MATLAB управляла временем жизни объекта lib.pointer
.
C представляет символы как 8-битные целые числа. Чтобы использовать символьный массив MATLAB в качестве входного параметра, преобразуйте строку в соответствующий тип и создайте voidPtr
. Например:
str = 'string variable'; vp = libpointer('voidPtr',[int8(str) 0]);
Синтаксис [int8(str) 0]
создает отключенную пустым указателем строку, требуемую функцией C. Чтобы считать строку и проверить тип указателя, войдите:
char(vp.Value) vp.DataType
ans = string variable ans = voidPtr
MATLAB автоматически преобразовывает аргумент, переданный значением в аргумент, переданный ссылкой, когда внешний прототип функции задает аргумент как указатель. Вызовите функцию, которая берет voidPtr
к строке как входной параметр с помощью следующего синтаксиса.
func_name([int8(str) 0])
Несмотря на то, что MATLAB преобразовывает аргумент от значения до указателя, это должно иметь правильный тип.
В целом MATLAB передает действительный адрес памяти каждый раз, когда вы передаете переменную библиотечной функции. Используйте объект lib.pointer
в случаях, где библиотека хранит указатель и получает доступ к буферу в зависимости от времени. В этих случаях гарантируйте, что MATLAB управляет временем жизни буфера, и препятствуйте тому, чтобы копии данных были сделаны. Следующий псевдокод является примером асинхронного сбора данных, который показывает, как использовать lib.pointer
в этой ситуации.
Предположим, что внешняя библиотека myLib
имеет следующие функции:
AcquireData(int points,short *buffer) IsAquisitionDone(void)
где buffer
объявляется можно следующим образом:
short buffer[99]
Во-первых, создайте lib.pointer
к массиву 99 точек:
BufferSize = 99; pBuffer = libpointer('int16Ptr',zeros(BufferSize,1));
Затем начните получать данные и ожидайте в цикле, пока он не будет сделан:
calllib('myLib','AcquireData,BufferSize,pbuffer) while (~calllib('myLib','IsAcquisitionDone') pause(0.1) end
Следующий оператор считывает данные в буфере:
result = pBuffer.Value;
Когда библиотека будет сделана с буфером, очистите переменную MATLAB:
clear pBuffer