exponenta event banner

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

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

См. также

|

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

Подробнее