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.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_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'