addStructFields и addStructByRef ФункцииThe shrlibsample библиотека примера содержит две функции с c_struct структурные входные параметры. c_struct определяется в shrlibsample.h заголовочный файл.
struct c_struct {
double p1;
short p2;
long p3;
};
Обе функции суммируют значения полей в структуре. Вход в addStructFields является c_struct. Вход в addStructByRef - указатель на c_struct. Эта функция также изменяет поля после суммирования значений.
addStructFields ФункцияThe 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 ФункцияThe 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