exponenta event banner

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

multDoubleRef Функция

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 не является указателем языка 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 plus (+) для создания указателя на последние шесть элементов 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'

См. также