addStructFields
и addStructByRef
Функцииshrlibsample
библиотека в качестве примера содержит две функции с c_struct
структура ввела параметры. c_struct
задан в shrlibsample.h
заголовочный файл.
struct c_struct { double p1; short p2; long p3; };
Обе функции суммируют значения полей в структуре. Вход к addStructFields
c_struct
. Вход к addStructByRef
указатель на c_struct
. Эта функция также изменяет поля после подведения итогов значений.
addStructFields
ФункцияaddStructFields
функция суммирует значения полей в c_struct
структура.
EXPORTED_FUNCTION double addStructFields(struct c_struct st) { double t = st.p1 + st.p2 + st.p3; return t; }
MATLAB® функциональная подпись:
Возвратите тип | Имя | Аргументы |
---|---|---|
double | addStructFields | (struct c_struct) |
addStructByRef
ФункцияaddStructByRef
функция суммирует значения полей в c_struct
структура, затем изменяет поля. Функция возвращает сумму, вычисленную прежде, чем изменить поля.
EXPORTED_FUNCTION double addStructByRef(struct c_struct *st) { double t = st->p1 + st->p2 + st->p3; st->p1 = 5.5; st->p2 = 1234; st->p3 = 12345678; return t; }
Поскольку функция изменяет входной параметр, MATLAB также возвращает вход как выходной аргумент типа c_structPtr
. Подпись функции MATLAB:
Возвратите тип | Имя | Аргументы |
---|---|---|
'double', | addStructByRef | (c_structPtr) |
Можно передать структуру MATLAB функции и позволить MATLAB автопреобразовать аргумент. Или можно передать указатель на структуру, которая старается не создавать копию структуры.
В этом примере показано, как передать структуру MATLAB функции, addStructFields
.
Создайте и инициализируйте структуру sm
. Каждое поле имеет тип double
.
sm.p1 = 476; sm.p2 = -299; sm.p3 = 1000;
Загрузите библиотеку, содержащую addStructFields
функция.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Вызовите функцию. MATLAB автоматически преобразует поля структуры sm
к определению библиотеки для c_struct
.
calllib('shrlibsample','addStructFields',sm)
ans = 1177
В этом примере показано, как предварительно преобразовать структуру sm
к c_struct
прежде, чем вызвать addStructFields
. Если вы неоднократно передаете sm
к функциям предварительное преобразование устраняет время вычислений, требуемое MATLAB автопреобразовывать структуру для каждого вызова функции.
Создайте и инициализируйте структуру MATLAB.
sm.p1 = 476; sm.p2 = -299; sm.p3 = 1000;
Загрузите библиотеку, содержащую addStructFields
функция.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Преобразуйте поля, которые имеют тип double
, совпадать с c_struct
типы структуры, double
, short
, и long
.
sc = libstruct('c_struct',sm);
Отобразите имена полей и значения.
get(sc)
p1: 476 p2: -299 p3: 1000
Добавьте значения полей.
calllib('shrlibsample','addStructFields',sc)
ans = 1177
В этом примере показано, как передать структуру MATLAB библиотечной функции C, addStructByRef
. Когда вы передаете структуру, MATLAB автоматически преобразует типы поля, но MATLAB также делает копию полей.
Загрузите библиотеку.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Создайте структуру.
S.p1 = 476; S.p2 = -299; S.p3 = 1000;
Вызовите addStructByRef
.
res = calllib('shrlibsample','addStructByRef',S)
res = 1177
MATLAB не изменяет содержимое структуры S
, поскольку это не указатель.
S
S = struct with fields:
p1: 476
p2: -299
p3: 1000
В этом примере показано, как вызов addStructByRef
функция с указателем изменяет поля во входном параметре.
if not(libisloaded('shrlibsample')) addpath(fullfile(matlabroot,'extern','examples','shrlib')) loadlibrary('shrlibsample') end
Создайте структуру типа c_struct
.
S.p1 = 20; S.p2 = 99; S.p3 = 3;
Создайте указатель sp
к структуре.
sp = libpointer('c_struct',S);
sp.Value
ans = struct with fields:
p1: 20
p2: 99
p3: 3
Передайте указатель на функцию.
res = calllib('shrlibsample','addStructByRef',sp)
res = 122
Когда вы передаете указатель, функция изменяет поля в структуре, на которую она указывает.
sp.Value
ans = struct with fields:
p1: 5.5000
p2: 1234
p3: 12345678