coder.cstructname

Назовите тип структуры C в сгенерированном коде

Описание

coder.cstructname называет сгенерированный или внешне определенный тип структуры C, используемый для MATLAB® переменные, которые представлены как структуры в сгенерированном коде.

пример

coder.cstructname(var,structName) называет тип структуры C, сгенерированный для переменного MATLAB var. Область входа var может быть структурой или массивом ячеек. Используйте этот синтаксис в функции, из которой вы генерируете код. Место coder.cstructname после определения var и перед первым использованием var. Если var является входным аргументом функции точки входа (верхнего уровня), place coder.cstructname в начале функции, перед любыми операторами потока управления.

пример

coder.cstructname(var,structName,'extern','HeaderFile',headerfile) задает тип структуры C, используемый для var имеет имя structName и определяется во внешнем файле, headerfileName.

Возможно использовать 'extern' опция без указания файла заголовка. Однако лучшая практика задать заголовочный файл, чтобы генератор кода произвел #include оператор в правильном местоположении.

coder.cstructname(var,structName,'extern','HeaderFile',headerfile,'Alignment',alignment) также задает выравнивание памяти во время выполнения для внешнего типа структуры structName. Если у вас есть Embedded Coder® и используйте пользовательские библиотеки замены кода (CRL), задайте выравнивание, чтобы генератор кода мог соответствовать функциям CRL, которые требуют выравнивания для структур. См. «Выравнивание данных для замены кода» (Embedded Coder).

пример

outtype = coder.cstructname(intype,structName) возвращает структуру или объект типа массива ячеек outtype задает имя генерируемого типа структуры C. coder.cstructname создает outtype со свойствами входного типа intype. Затем он устанавливает TypeName свойство к structName. Используйте этот синтаксис для создания объекта type, который вы используете с codegen -args опция. Вы не можете использовать этот синтаксис в функции, из которой вы генерируете код.

Вы не можете использовать этот синтаксис в блоке MATLAB Function.

outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile) возвращает объект type outtype который задает имя и местоположение внешнего типа структуры C. Генератор кода использует внешне определенный тип структуры для переменных с типом outtype.

Вы не можете использовать этот синтаксис в блоке MATLAB Function.

outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile,'Alignment',alignment) создает объект type outtype который также задает тип выравнивания С-структуры.

Вы не можете использовать этот синтаксис в блоке MATLAB Function.

Примеры

свернуть все

В функции MATLAB myfun, присвойте имя MyStruct к сгенерированному типу структуры C для переменной v.

function y = myfun()
%#codegen
v = struct('a',1,'b',2);
coder.cstructname(v, 'myStruct');
y = v;
end

Сгенерируйте автономный код С Например, сгенерируйте статическую библиотеку.

codegen -config:lib myfun -report

Чтобы увидеть сгенерированный тип структуры, откройте codegen/lib/myfun/myfun_types.h или просмотрите myfun_types.h в отчете генерации кода. Сгенерированный тип структуры C:

typedef struct {
  double a;
  double b;
} myStruct;

В функции MATLAB myfun1, присвойте имя MyStruct к сгенерированному типу структуры C для структуры v. Присвойте имя mysubStruct к типу структуры, сгенерированной для подструктуры v.b.

function y = myfun()
%#codegen
v = struct('a',1,'b',struct('f',3));
coder.cstructname(v, 'myStruct');
coder.cstructname(v.b, 'mysubStruct');
y = v;
end

Сгенерированный тип структуры C mysubStruct является:

typedef struct {
  double f;
} mysubStruct;

Сгенерированный тип структуры C myStruct является:

typedef struct {
  double a;
  mysubStruct b;
} myStruct;

В функции MATLAB myfun2, присвойте имя myStruct к сгенерированному типу структуры C для массива ячеек c.

function z = myfun2()
c = {1 2 3};
coder.cstructname(c,'myStruct')
z = c;

Сгенерированный тип структуры C для c является:

typedef struct {
  double f1;
  double f2;
  double f3;
} myStruct;

Укажите, что структура, переданная функции C, имеет тип структуры, заданный в заголовочном файле C.

Создайте файл заголовка C mycadd.h для функции mycadd который принимает параметр типа mycstruct. Определите тип mycstruct в заголовочном файле.

#ifndef MYCADD_H
#define MYCADD_H

typedef struct {
    double f1;
    double f2;
} mycstruct;

double mycadd(mycstruct *s);
#endif

Напишите функцию C mycadd.c.

#include <stdio.h>
#include <stdlib.h>

#include "mycadd.h"

double mycadd(mycstruct *s)
{
  return  s->f1 + s->f2;
}

Написание функции MATLAB mymAdd который передает структуру путем ссылки на mycadd. Использовать coder.cstructname чтобы указать, что в сгенерированном коде структура имеет тип C mycstruct, который определен в mycadd.h.

function y = mymAdd
%#codegen
s = struct('f1', 1, 'f2', 2);
coder.cstructname(s, 'mycstruct', 'extern', 'HeaderFile', 'mycadd.h');
y = 0;
y = coder.ceval('mycadd', coder.ref(s));

Сгенерируйте статическую библиотеку C для mymAdd функций.

codegen -config:lib mymAdd mycadd.c
Сгенерированный заголовочный файл mymadd_types.h не содержит определения структуры mycstruct потому что mycstruct является внешним типом.

Предположим, что функция точки входа myFunction принимает аргумент структуры. Чтобы задать тип входного параметра в командной строке:

  1. Задайте структуру примера S.

  2. Создайте тип T от S при помощи coder.typeof.

  3. Использовать coder.cstructname чтобы создать тип T1 что:

    • Обладает свойствами T.

    • Называет сгенерированный тип структуры C myStruct.

  4. Передайте тип в codegen при помощи -args опция.

Для примера:

S = struct('a',double(0),'b',single(0));
T = coder.typeof(S);
T1 = coder.cstructname(T,'myStruct');
codegen -config:lib myFunction -args T1 

Кроме того, можно создать тип структуры непосредственно из структуры примера.

S = struct('a',double(0),'b',single(0));
T1 = coder.cstructname(S,'myStruct');
codegen -config:lib myFunction -args T1 

Входные параметры

свернуть все

Структура MATLAB или переменная массива ячеек, которая представлена как структура в сгенерированном коде.

Имя сгенерированного или внешне определенного типа структуры C, заданное как вектор символов или строковый скаляр.

Заголовочный файл, содержащий определение типа структуры C, заданное в виде вектора символов или строкового скаляра.

Чтобы задать путь к файлу:

  • Используйте codegen -I опция или параметр Additional include directories на вкладке Coder™ параметров приложения Custom Code MATLAB.

  • Для блока MATLAB Function на панелях Simulation Target и Code Generation > Custom Code под Additional build information установите параметр Include directories.

В качестве альтернативы используйте coder.updateBuildInfo с 'addIncludePaths' опция.

Пример: 'mystruct.h'

Выравнивание памяти во время выполнения для сгенерированной или внешне определенной структуры.

Объект типа структуры, объект типа массива ячеек, переменная структуры или переменная массива ячеек, из которой можно создать объект типа.

Ограничения

  • Вы не можете применить coder.cstructname непосредственно к глобальной переменной. Чтобы назвать тип структуры, используемый с глобальной переменной, используйте coder.cstructname для создания объекта-типа с именем типа структуры. Затем, когда вы бегаете codegen, укажите, что глобальная переменная имеет этот тип. См. раздел «Назовите тип структуры C, используемый с глобальной структурной переменной».

  • Для входов массива ячеек имена полей внешне определенных структур должны быть f1, f2и так далее.

  • Вы не можете применить coder.cstructname непосредственно свойству класса.

Совет

  • Для получения информации о том, как генератор кода определяет типы структурных полей C/C + +, смотрите Отображение типов MATLAB с типами в Сгенерированном коде.

  • Используя coder.cstructname в массиве структур задает имя типа структуры базового элемента, а не имя массива. Поэтому вы не можете применить coder.cstructname к элементу массива структур, а затем применить его к массиву с другим именем типа структуры C. Для примера следующий код не разрешен. Второе coder.cstructname пытается задать имя базового типа равным myStructArrayName, который конфликтует с ранее заданным именем, myStructName.

    % Define scalar structure with field a 
    myStruct = struct('a', 0); 
    coder.cstructname(myStruct,'myStructName'); 
    % Define array of structure with field a 
    myStructArray = repmat(myStruct,4,6); 
    coder.cstructname(myStructArray,'myStructArrayName'); 
    

  • Применение coder.cstructname к элементу массива структур приводит к тому же результату, что и к применению coder.cstructname ко всему массиву структур. Если вы подаете заявку coder.cstructname к элементу массива структур необходимо обратиться к элементу с помощью одинарного индекса. Для примера можно использовать var(1), но не var(1,1). Применение coder.cstructname на var(:) приводит к тому же результату что и применение coder.cstructname на var или var(n).

  • Гетерогенные массивы ячеек представлены как структуры в сгенерированном коде. Вот факторы по использованию coder.cstructname с массивами ячеек:

    • В функции, из которой вы генерируете код, использование coder.cstructname с переменной массива ячеек делает массив ячеек неоднородным. Поэтому, если массив ячеек является входным параметром функции точки входа, и его тип постоянно однороден, то вы не можете использовать coder.cstructname с массивом ячеек.

    • Используя coder.cstructname с однородной coder.CellType intype объекта делает возвращенный объект неоднородным. Поэтому вы не можете использовать coder.cstructname с постоянно однородной coder.CellType объект. Для получения информации о том, когда массив ячеек постоянно однороден, смотрите Задать входные параметры массива ячеек в командной строке.

    • При использовании с coder.CellType объект, coder.cstructname создает coder.CellType объект, который постоянно неоднороден.

  • Когда вы используете структуру с именем coder.cstructname в проекте с размещениями массива основной строки и основной матрицы столбцов генератор кода в некоторых случаях переименовывает структуру, добавляя row_ или col_ в начало имени структуры. Это переименование предоставляет уникальные определения типов для типов, которые используются в обоих размещениях массива.

  • Эти советы применяются только к блокам MATLAB Function:

    • MATLAB Function вход и выходная структуры связаны с шинными сигналами. Сгенерированное имя для типа структуры происходит от имени сигнала шины. Не используйте coder.cstructname чтобы назвать тип структуры для входных или выходных сигналов. См. «Создание структур в блоках MATLAB function (Simulink)».

    • Генератор кода создает имена типов структур в соответствии с правилами именования идентификаторов, даже если вы называете тип структуры с coder.cstructname. Если у вас есть Embedded Coder, можно настроить правила именования. Смотрите Конструкцию сгенерированных идентификаторов (Embedded Coder).

Введенный в R2011a