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

multDoubleRef Функция

The multDoubleRef функция в shrlibsample библиотека умножает вход на 5.

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

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

Тип возвратаИмяАргументы
[lib.pointer,
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 не является указателем на язык С. Хотя это указывает на 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 plus (+), чтобы создать указатель на последние шесть элементов X.

xp2 = xp + 4;
xp2.Value
ans = 1×6

     5     6     7     8     9    10

Многоуровневые указатели

Multilevel pointers являются аргументами, которые имеют несколько уровней ссылок. Многоуровневый тип указателя в MATLAB использует суффикс PtrPtr. Для примера используйте doublePtrPtr для аргумента C double **.

При вызове функции, которая принимает многоуровневый аргумент указателя, используйте lib.pointer Объект и дайте MATLAB преобразовать его в многоуровневый указатель.

allocateStruct и deallocateStruct Функции

The 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'

См. также