multDoubleRef Функция multDoubleRef функции в shrlibsample библиотека умножает входные данные на 5.
EXPORTED_FUNCTION double *multDoubleRef(double *x)
{
*x *= 5;
return x;
}Вход является указателем на doubleи функция возвращает указатель на double. Сигнатура функции MATLAB ®:
| Тип возврата | Имя | Аргументы |
|---|---|---|
[lib.pointer, | 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.Valueans = 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_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'