Многие функции во внешних библиотеках передают аргументы по ссылке. Когда вы проходите мимо ссылки, вы передаете pointer к значению. В сигнатуре функции указатель аргументов иметь имена, заканчивающиеся на Ptr
и PtrPtr
. Хотя MATLAB® не поддерживает передачу по ссылке, можно создать аргумент MATLAB, называемый lib.pointer object, который совместим с указателем на C. Этот объект является образцом MATLAB lib.pointer
класс.
Часто можно просто передать переменный MATLAB (передав аргумент по значению), даже когда сигнатура для этой функции объявляет аргумент указателем. Однако бывают случаи, когда полезно пройти lib.pointer
.
Необходимо изменить данные в входные параметры.
Вы передаете большие объемы данных, и вы хотите управлять, когда MATLAB делает копии данных.
Библиотека хранит и использует указатель, поэтому вы хотите, чтобы функция MATLAB контролировала время жизни lib.pointer
объект.
C представляет символы как 8-битные целые числа. Чтобы использовать символьный массив MATLAB в качестве входного параметра, преобразуйте строку в соответствующий тип и создайте voidPtr
. Для примера:
str = 'string variable'; vp = libpointer('voidPtr',[int8(str) 0]);
Синтаксис [int8(str) 0]
создает строку, оконечную null, требуемую функцией 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