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

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

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

|

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

Больше о

Для просмотра документации необходимо авторизоваться на сайте