Предположим, что ваш внешний код условно выделяет память для и инициализирует интерполяционную таблицу и данные о наборе точки останова на основе длины размерности, которую вы задаете как #define макрос. В этом примере показано, как сгенерировать код, который импортирует эти внешние глобальные данные.
Сохраните определение данных о наборе точки останова T1Break и данные об интерполяционной таблице T1Data в вашей текущей папке в файле под названием ex_vec_symdim_src.c. Эти глобальные переменные имеют или 9 или 11 элементов в зависимости от значения макро-bpLen.
#include "ex_vec_symdim_decs.h"
#if bpLen == 11
double T1Break[bpLen] = {
-5.0,
-4.0,
-3.0,
-2.0,
-1.0,
0.0,
1.0,
2.0,
3.0,
4.0,
5.0
} ;
double T1Data[bpLen] = {
-1.0,
-0.99,
-0.98,
-0.96,
-0.76,
0.0,
0.76,
0.96,
0.98,
0.99,
1.0
} ;
#endif
#if bpLen == 9
double T1Break[bpLen] = {
-4.0,
-3.0,
-2.0,
-1.0,
0.0,
1.0,
2.0,
3.0,
4.0
} ;
double T1Data[bpLen] = {
-0.99,
-0.98,
-0.96,
-0.76,
0.0,
0.76,
0.96,
0.98,
0.99
} ;
#endif
Сохраните объявления переменных и определение макроса в вашей текущей папке в файле ex_vec_symdim_decs.h.
#define bpLen 11 extern double T1Break[bpLen]; extern double T1Data[bpLen];
Откройте модель rtwdemo_configinterface в качестве примера.
open_system('rtwdemo_configinterface') set_param('rtwdemo_configinterface/Table1','DataSpecification','Table and breakpoints');

Откройте диалоговое окно блока Table1. Блок относится к переменным, T1Data и T1Break, в рабочем пространстве модели. Эти переменные хранят интерполяционную таблицу и устанавливают точки останова данные о наборе с 11 элементами.
В командной строке преобразуйте переменные в Simulink.Parameter объекты.
mws = get_param('rtwdemo_configinterface','modelworkspace'); T1Data = mws.getVariable('T1Data'); T1Break = mws.getVariable('T1Break'); T1Data = Simulink.Parameter(T1Data); T1Break = Simulink.Parameter(T1Break);
В командной строке создайте Simulink.Parameter объект представлять пользовательский макро-bpLen.
bpLen = Simulink.Parameter(11); bpLen.Min = 9; bpLen.Max = 11; bpLen.DataType = 'int32'; bpLen.CoderInfo.StorageClass = 'Custom'; bpLen.CoderInfo.CustomStorageClass = 'ImportedDefine'; bpLen.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';
Используйте bpLen установить размерности интерполяционной таблицы и данных о наборе точки останова. Сконфигурируйте модель, чтобы включить символьные размерности путем выбора параметра конфигурации, Позволяют символьную спецификацию размерности.
T1Data.Dimensions = '[1 bpLen]'; T1Break.Dimensions = '[1 bpLen]'; set_param('rtwdemo_configinterface','AllowSymbolicDim','on');
Установите Параметры конфигурации> Генерация кода> Пользовательский код> Дополнительная информация о сборке> Исходные файлы к ex_vec_symdim_src.c.
set_param('rtwdemo_configinterface','CustomSource','ex_vec_symdim_src.c')
Сконфигурируйте объекты импортировать определения данных из вашего внешнего кода.
mws.assignin('T1Data',T1Data); mws.assignin('T1Break',T1Break); cm = coder.mapping.utils.create('rtwdemo_configinterface'); setDataDefault(cm,'ModelParameters','StorageClass','Default'); setModelParameter(cm,'Table1','StorageClass','Model default'); setModelParameter(cm,'Table2','StorageClass','Model default'); setModelParameter(cm,'T1Data','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h'); setModelParameter(cm,'T1Break','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h');
Сгенерируйте код из модели.
Алгоритм сгенерированного кода находится в модели step функция в сгенерированном файле rtwdemo_configinterface.c. Алгоритм передает T1Break, T1Data, и bpLen как значения аргументов к функции, которая выполняет поиск по таблице. В этом случае, bpLen управляет верхней границей двоичного поиска, который использует функция.
Для получения дополнительной информации о символьных размерностях, смотрите Варианты Размерности Реализации для Размеров Массивов в Сгенерированном коде.