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