MATLAB® Coder™ переводит и оптимизирует код MATLAB с динамическим контролем типов на C/C++ со статическим контролем типов. Статически типизированные языки требуют, чтобы типы переменных были явным образом объявлены, и эти типы определяются во время компиляции. Определенные изменения и оптимизация, выполняемая генератором кода, включают использование типов данных MATLAB и функций в сгенерированном коде. Для получения дополнительной информации о типах данных и функциях, поддерживавших для генерации кода, смотрите Функции Определения данных и языка MATLAB, Поддерживавшие для Генерации кода C/C++.
Эти изменения и оптимизация заставляют сгенерированный код появляться по-другому, чем код MATLAB. Сгенерированный код не может сопоставить непосредственным способом с вашим кодом MATLAB ни из-за одного следующего:
Примечание
В зависимости от вашего исходного кода эти случаи могут произойти немного по-другому, чем, как их показывают здесь.
MATLAB Coder генерирует автономный код C/C++ и код MEX из кода MATLAB. Одна функция в вашем коде MATLAB может быть переведена в несколько функций в сгенерированном коде. Две или больше функции в вашем коде MATLAB могут также стать одним телом функции в сгенерированном коде. Этот процесс называется функциональным встраиванием. По умолчанию генератор кода использует внутреннюю эвристику, чтобы определить, встроить ли ваши функции или нет. Для получения дополнительной информации смотрите coder.inline и управляйте встраиванием, чтобы подстроить эффективность и удобочитаемость сгенерированного кода.
Выходные параметры функции MATLAB могут стать возвращаемыми значениями в C или могут стать входными параметрами передачи ссылкой.. Один скалярный выход в вашем коде MATLAB обработан как возвращаемое значение в сгенерированном коде.
Функциональный addOne имеет входную переменную x и выходная переменная y. В данном примере x имеет тип double.
function y = addOne(x) y = x + 1; end
Код, сгенерированный для отрывка, показывают здесь:
double addOne(double x)
{
return x + 1.0;
}Вход к функциональному addOneX, обработан как переменная передачи значением в сгенерированном коде. Выходной параметр функции MATLAB возвращен значением в сгенерированном коде.
Для массивов могут быть переданы ссылкой выходные параметры. Фрагмент кода, показанный здесь, использует double вход x и массив выход y.
function y = addMat(x) z = [1:100]; y = z + x; end
Выходная переменная y переводится в переменную типа массив передачи ссылкой в сгенерированном коде, показанном здесь:
void addMat(double x, double y[100])
{
int i;
for (i = 0; i < 100; i++) {
y[i] = ((double)i + 1.0) + x;
}
}Для функций точки входа, которые имеют несколько выходных переменных, выходные параметры могут быть переданы ссылкой в сгенерированном коде. Этот фрагмент кода имеет два double скалярные выходные параметры, y и z, с double скалярный вход x.
function [z,y] = splitOne(x) y = x + 1; z = x + 2; end
Выходные переменные y и z переводятся в передачу ссылкой переменные в сгенерированном коде:
void splitOne(double x, double *z, double *y)
{
*y = x + 1.0;
*z = x + 2.0;
}Для получения дополнительной информации о поведении передачи параметров функций точки входа в сгенерированном коде смотрите, Развертывают Сгенерированный код.
Постоянные значения в вашем коде не могут быть сохранены в сгенерированном коде. Эти значения могут быть удалены, чтобы оптимизировать сгенерированный код. Сворачивание констант удаляет расчеты, которые могут присутствовать в вашем коде MATLAB и заменяют расчеты на результат вместо этого. Для получения дополнительной информации смотрите Сворачивание констант.
Рассмотрите этот фрагмент кода:
function y = removeConst x = ones(10); y = x + 1; end
Генератор кода удаляет постоянный матричный x сохранять память и присвоения постоянное значение как результат. Сгенерированный код выглядит так код:
void removeConst(double y[100])
{
int i;
for (i = 0; i < 100; i++) {
y[i] = 2.0;
}
}Неиспользованные входные параметры или постоянные входные параметры к функциям точки незаписи в вашем коде MATLAB удалены из тел функции в сгенерированном коде.
Функциональные специализации генератором кода могут изменить функцию в версию, где входной тип, размер, сложность или значение могут быть настроены для конкретного вызова функции. Это сделано, чтобы произвести эффективный код С за счет дублирования кода. Для получения дополнительной информации смотрите Специализированные Функции или Классы.
В предыдущем экземпляре, получая доступ к матрице требует дополнительных строк кода на C/C++. 10- 10 матрица представлена как массив 100 double элементы в сгенерированном коде. for цикл используется, чтобы получить доступ ко всем элементам массива в этом случае. C/C++ не поддерживает много операций над матрицей, таким образом, генератор кода преобразует матрицы и операции на матрицах к массивам и методах как for циклы, чтобы получить доступ к тем массивам.
Сгенерированный код может использовать стандартные библиотеки для C, чтобы выполнить математические операции или другие функции в вашем коде MATLAB. Для списка поддерживаемых функций языка смотрите Функции языка MATLAB, Поддерживавшие для Генерации кода C/C++.
Для генерации кода массив может быть фиксированным размером или переменным размером. Массивы переменного размера могут появиться в различных форматах в сгенерированном коде. Код может быть сгенерирован для массива фиксированного размера, если генератор кода может определить размер массива. Генерация кода также допустима для массива фиксированного размера с верхней границей. Динамически выделенные массивы также сгенерированы в определенных случаях. Смотрите Генерацию кода для Массивов Переменного Размера.
Генерация кода для фиксированного размера и массивов переменного размера может дать к следующим объявлениям переменной в сгенерированном коде:
double x[10]; // Fixed-size array double y_data[20]; int y_size[2]; // y_data and y_size denote an upper-bounded array emxArrayReal_T *z; // Dynamically allocated array
Если ваш код MATLAB содержит локальные переменные, которые занимают большую память, то в сгенерированном коде они могут быть объявлены как локальные переменные, статические локальные переменные, или как переменные в struct это передается в вашу функцию точки входа в вашем сгенерированном коде. Можно управлять этим преобразованием путем управления памятью, которая выделяется для сгенерированного кода. Смотрите Использование Стекового пространства Управления.
Чтобы реализовать массивы ячеек в сгенерированном коде, генератор кода может перевести их как struct, статический массив или динамический массив. Для получения дополнительной информации смотрите Генерацию кода для Массивов ячеек.
Генератор кода может произвести две функции обслуживания, инициализировать и завершить работу, если они необходимы. Можно искать эти функции во вкладке Generated Code в отчете генерации кода. Инициализировать функция инициализирует состояние, с которым работают сгенерированные функции точки входа C/C++. Оконечная функция освобождает выделенную память и выполняет другие операции очистки. Для получения дополнительной информации смотрите, что Сгенерированное Использование Инициализирует и Отключает Функции