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