Передайте примеры указателей

функция multDoubleRef

Функция multDoubleRef в библиотеке shrlibsample умножает входной параметр на 5.

EXPORTED_FUNCTION double *multDoubleRef(double *x) 
{
     *x *= 5;
     return x;
}

Входной параметр является указателем на double, и функция возвращает указатель на double. Подпись функции MATLAB®:

Возвратите типИмяАргументы
libpointer,
doublePtr]
multDoubleRef(doublePtr)

Передача Указателя, типа double

Этот пример показывает, как создать и передать указатель на функцию 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

Создание Смещения Указателя из Существующего Объекта lib.pointer

Этот пример показывает, как создать указатель на подмножество вектора 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_structPtrPtrallocateStruct(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'

Смотрите также

Была ли эта тема полезной?