exponenta event banner

Аргументы указателя

Аргументы указателя в функциях C

Многие функции во внешних библиотеках передают аргументы по ссылке. При передаче по ссылке передается указатель на значение. В сигнатуре функции аргументы указателя имеют имена, оканчивающиеся на Ptr и PtrPtr. Хотя MATLAB ® не поддерживает передачу по ссылке, можно создать аргумент MATLAB, называемый объектом lib.pointer, совместимым с указателем C. Этот объект является экземпляром MATLABlib.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

См. также