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

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® сигнатура функции:

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

См. также

|

Похожие примеры

Подробнее о