coder.cstructname

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

Описание

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

пример

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. Используйте этот синтаксис, чтобы создать текстовый объект, который вы используете с codegen -args опция. Вы не можете использовать этот синтаксис в функции, от которой вы генерируете код.

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

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

  • Используйте codegen -I опция или параметр 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,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