Примеры Передачи структур

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®:

Возвратите типИмяАргументы
doubleaddStructFields(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',
c_structPtr]
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

Предварительно преобразовывание структуры MATLAB перед добавляющими значениями

Этот пример показывает, как предварительно преобразовать структуру 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

Смотрите также

|

Связанные примеры

Больше о