функция 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.Value
ans = 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'