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

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

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

Multilevel pointers является аргументами, которые имеют больше чем один уровень ссылки. Многоуровневый тип указателя в 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'

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