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.Valueans = 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