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