coder.cstructname

Структура имени C вводит в сгенерированном коде

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

Синтаксис

coder.cstructname(var,structName)
coder.cstructname(var,structName,'extern','HeaderFile',headerfile)
coder.cstructname(var,structName,'extern','HeaderFile',headerfile,'Alignment',alignment)
outtype = coder.cstructname(intype,structName)
outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile)
outtype = coder.cstructname(intype,structName,'extern','HeaderFile',headerfile,'Alignment',alignment)

Описание

пример

coder.cstructname(var,structName) называет тип структуры C сгенерированным для переменной MATLAB var. Вход var может быть структурой или массивом ячеек. Используйте этот синтаксис в функции, от которой вы генерируете код. Поместите coder.cstructname после определения var и перед первым использованием var. Если var является точкой входа (верхний уровень) входной аргумент функции, место 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® и пользуетесь Заменяющими Библиотеками пользовательского кода (CRLs), задаете выравнивание так, чтобы генератор кода мог совпадать с функциями CRL, которые требуют выравнивания для структур. Смотрите Выравнивание Данных для Замены Кода (Embedded Coder).

пример

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

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

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

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

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

Вы не можете использовать этот синтаксис в блоке 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 для ячейки arrayc.

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, заданное как скаляр строки или вектор символов.

Задавать путь к файлу:

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

  • Для блока 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, и так далее.

Советы

  • Для получения информации о том, как генератор кода определяет типы 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,k,n); 
    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