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