функция multDoubleRefФункция multDoubleRef в библиотеке shrlibsample умножает входной параметр на 5.
EXPORTED_FUNCTION double *multDoubleRef(double *x)
{
*x *= 5;
return x;
}Входной параметр является указателем на double, и функция возвращает указатель на double. Подпись функции MATLAB®:
| Возвратите тип | Имя | Аргументы |
|---|---|---|
libpointer, | multDoubleRef | (doublePtr) |
Этот пример показывает, как создать и передать указатель на функцию C multDoubleRef.
Загрузите библиотеку, содержащую функцию.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Создайте указатель, Xptr, к входному параметру, X.
X = 13.3;
Xptr = libpointer('doublePtr',X);Проверьте содержимое Xptr.
get(Xptr)
Value: 13.3000
DataType: 'doublePtr'
Вызовите функцию и проверьте результаты.
calllib('shrlibsample','multDoubleRef',Xptr); Xptr.Value
ans = 66.5000
Xptr является объектом указателя. Копии этого указателя относятся к тому же основному объекту и любым операциям, вы выполняете на указателе объектное влияние все копии того объекта. Однако Xptr не является указателем языка C. Несмотря на то, что это указывает на X, это не содержит адрес X. Функция изменяет свойство Value Xptr, но не изменяет значение в основном объекте X. Исходное значение X неизменно.
X
X = 13.3000
Этот пример показывает, как создать указатель на подмножество вектора MATLAB X. Новый указатель допустим только, пока исходный указатель существует.
Создайте указатель на вектор.
X = 1:10;
xp = libpointer('doublePtr',X);
xp.Valueans = 1×10
1 2 3 4 5 6 7 8 9 10
Используйте lib.pointer плюс оператор (+), чтобы создать указатель на последние шесть элементов X.
xp2 = xp + 4; xp2.Value
ans = 1×6
5 6 7 8 9 10
Многоуровневые указатели являются аргументами, которые имеют больше чем один уровень ссылки. Многоуровневый тип указателя в MATLAB использует суффиксный PtrPtr. Например, используйте doublePtrPtr для аргумента C double **.
При вызывании функции, которая берет многоуровневый аргумент указателя, используйте объект lib.pointer и позвольте MATLAB преобразовать его в многоуровневый указатель.
allocateStruct и Функции deallocateStructФункция allocateStruct в библиотеке shrlibsample берет аргумент c_structPtrPtr.
EXPORTED_FUNCTION void allocateStruct(struct c_struct **val)
{
*val=(struct c_struct*) malloc(sizeof(struct c_struct));
(*val)->p1 = 12.4;
(*val)->p2 = 222;
(*val)->p3 = 333333;
}Подписи функции MATLAB:
| Возвратите тип | Имя | Аргументы |
|---|---|---|
c_structPtrPtr | allocateStruct | (c_structPtrPtr) |
voidPtr
| deallocateStruct | (voidPtr) |
Этот пример показывает, как передать многоуровневый указатель на функцию C.
Загрузите библиотеку, содержащую allocateStruct и deallocateStruct.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Создайте указатель c_structPtr.
sp = libpointer('c_structPtr');Вызовите allocateStruct, чтобы выделить память для структуры.
res = calllib('shrlibsample','allocateStruct',sp)
res = struct with fields:
p1: 12.4000
p2: 222
p3: 333333
Освободите память, созданную функцией allocateStruct.
calllib('shrlibsample','deallocateStruct',sp)
Предположим, что у вас есть библиотека, myLib, с функцией, acquireString, который читает массив строк. Функциональная подпись:
| Возвратите тип | Имя | Аргументы |
|---|---|---|
'char' | acquireString | (void) |
char** acquireString(void)
Следующий псевдокод показывает, как управлять возвращаемым значением, массивом указателей на строки.
ptr = calllib(myLib,'acquireString')
MATLAB создает объект lib.pointer ptr типа stringPtrPtr. Этот объект указывает на первую строку. Чтобы просмотреть другие строки, постепенно увеличьте указатель. Например, чтобы отобразить первые три строки, введите:
for index = 0:2
tempPtr = ptr + index;
tempPtr.Value
end ans =
'str1'
ans =
'str2'
ans =
'str3'