По умолчанию MATLAB® строки и векторы строк символов отображаются в символьные массивы C/C + + в сгенерированном коде. Чтобы сгенерировать строки C/C + + из строк MATLAB или векторов символьных строк, строка MATLAB или вектор символьных строк должны быть нулевыми (конец на нуле 0
). Для примера строка "Hello World"+char(0)
и символьные векторы-строки ['Hello World', 0]
имеют нулевое значение.
Если строка MATLAB или символ вектора-строки не оконечна null, для примера 'Hello World'
Строка MATLAB сопоставлена с символьными массивами { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' }
в сгенерированном коде C/C + +.
В MATLAB рассмотрим эту функцию:
function t = CharArrayNullAtEnd() t = ['Hello World',0]; end
Соответствующий код C/C + +, сгенерированный для этой функции, является:
void CharArrayNullAtEnd(char t[12]) { int i; static const char cv[12] = "Hello World"; for (i = 0; i < 12; i++) { t[i] = cv[i]; } }
Генерация строк C/C + + вместо символьных массивов улучшает читаемость сгенерированного кода.
Примечание
Если длина символов меньше LoopUnrollThreshold
Строка C/C + + с двойной кавычкой не генерируется в коде, даже если она завершена null. Вместо этого генератор кода создает символьный массив C, который имеет отдельные назначения символов. По умолчанию присвоенное значение LoopUnrollThreshold
является 5
. Для получения дополнительной информации о размонтировании цикла см. Раздел «Разрегулирование циклов для циклов».
Когда вы генерируете строки C/C + + из нулевых строк MATLAB или вектора символьных строк, используйте newline
функция в строке MATLAB или символе вектора-строки. Генератор кода отображает newline
преобразование функции в символьную '\n'
в сгенерированном коде. Если вы используете символ '\n'
в коде MATLAB он избегается и сопоставляется с '\\n'
в сгенерированном коде.
В MATLAB рассмотрим эту функцию:
function StringNewline() string1 = ['Hello World' 0]; string2 = ['My MATLAB' 0]; formatSpecifier = ['%s' newline 0]; coder.cinclude('<stdio.h>'); coder.ceval('printf',coder.rref(formatSpecifier),coder.rref(string1)); coder.ceval('printf',coder.rref(formatSpecifier),coder.rref(string2)); end
Соответствующий код C/C + +, сгенерированный для этой функции, является:
void StringNewline(const emlrtStack *sp) { static const char_T formatSpecifier[4] = "%s\n"; static const char_T string1[12] = "Hello World"; static const char_T string2[14] = "My MATLAB"; (void)sp; printf(formatSpecifier, string1); printf(formatSpecifier, string2); }
StringNewline
, если formatSpecifier
является '%s\n'
вместо ['%s' newline 0]
, затем символ '\n'
сбежал, и у вас есть {'\\','n'}
в сгенерированном коде C/C + +.Символьный вектор-строка MATLAB, который имеет несколько нулей, для примера ['Hello', 0, 0]
, не поддерживается для генерации строк на C/C + +.
codegen
| coder
| coder.ceval
| coder.config
| coder.rref
| newline