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