multDoubleRef ФункцияThe 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 не является указателем на язык С. Хотя это указывает на 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
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_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'