Обработка ошибок TLC

Сообщения об ошибках

Возможно, вам потребуется обнаружить и сообщить об ошибках, условиях в коде TLC. Выявление ошибок и создание отчетов чаще всего используются в функциях библиотеки. Несмотря на редкость, можно также столкнуться с условиями ошибки в коде целевого файла блока, если S-функция mdlCheckParameters функция не обнаруживает непредвиденное условие.

Чтобы сообщить об условии, обнаруженной в коде TLC, используйте LibBlockReportError или LibBlockReportFatalError Служебные функции. Вот пример использования LibBlockReportError в paramlib.tlc функция LibBlockParameter для сообщения о условии неправильного использования этой функции:

%if TYPE(param.Value) == "Matrix"
    %% exit if the parameter is a true matrix,
    %% i.e., has more than one row or columns.
    %if nRows > 1
      %assign errTxt = "Must access parameter %<param.Name> using "...
        "LibBlockMatrixParameter."
      %<LibBlockReportError([], errTxt)>
    %endif
  %endif

Просмотрите файлы в папке matlabroot/ rtw/c/tlc (open) для получения дополнительных примеров использования LibBlockReportError.

Генерация ошибок из файлов TLC

Обзор генерации ошибок TLC

Чтобы сгенерировать ошибки из файлов TLC, можно использовать %exit директива. Кроме того, можно использовать одну из библиотечных функций, описанных ниже, которая вызывает %exit для тебя. Два типа ошибок:

Ошибки при использовании

Это может быть вызвано неправильными моделями.

Фатальные (внутренние) ошибки TLC-кодирования

Они не могут быть вызваны неправильными моделями.

Ошибки при использовании

Ошибки использования являются ошибками, возникающими из-за неправильных моделей или атрибутов, определенных в модели. Например, предположим, что у вас есть блок S-Function и встроенный файл TLC для определенного устройства D/A. Если модель может содержать только одну копию этой S-функции, то для модели, которая содержит две копии этого блока S-Function, должна быть сгенерирована ошибка.

Использование функций библиотеки.  Чтобы сгенерировать ошибки использования, связанные с определенным блоком, используйте функцию библиотеки

LibBlockReportError(block,"error string")

The block аргумент является записью блока, если она не ограничена областью видимости. Если блок в данный момент просмотрен, можно задать block как [].

Чтобы сгенерировать общие ошибки использования, не связанные с определенным блоком, используйте

LibReportError("error string")

Эти функции библиотеки префиксируют строку Simulink Coder Error: к сообщению, которое вы предоставляете при сообщении об ошибке.

Пример использования этих функций см. в gensfun.tlc для блока ошибок и commonsetup.tlc для общих ошибок. Существуют другие файлы, которые используют эти функции в исходных папках TLC matlabroot/ rtw/c/tlc (открыто.

Неустранимые (внутренние) ошибки кодирования TLC

Предположим, у вас есть S-функция, которая имеет локальную функцию, которая может принимать только числовые числа. Можно хотеть добавить assert, требующее, чтобы входы были только числовыми числами. Эти утверждения могут указывать на фатальные ошибки кодирования, для которых у пользователя нет способа создания модели или определения атрибутов, которые могут привести к возникновению ошибки.

Использование функций библиотеки.  Двумя доступными функциями библиотеки являются

LibBlockReportFatalError(block,"fatal coding error message")

где block является оскорбляющей блочной записью (или [] если блок уже обрисован), и

LibReportFatalError("fatal coding error message")

для сообщений об ошибке, которые не являются конкретными блоками. Для примера, чтобы добавить код assert, вы могли бы использовать

%if TYPE(argument) != "Number" 
  %<LibBlockReportFatalError(block,"unexpected argument type")>
%endif

Эти функции библиотеки префиксируют строку Simulink Coder Fatal: к сообщению, которое вы предоставляете и отображаете стек вызовов при сообщении об ошибке.

Пример использования этих функций см. в gensfun.tlc для блока ошибок и commonsetup.tlc для общих ошибок. Есть другие файлы, которые используют эти функции в папке matlabroot/ rtw/c/tlc (откройте).

Использование% exit.  Можно вызвать %exit чтобы сгенерировать фатальные сообщения об ошибке. Однако MathWorks предполагает, что вы используете одну из библиотечных функций, описанных выше.

При генерации фатальных сообщений об ошибке непосредственно с %exit, рекомендуется дать трассировку стека с сообщением об ошибке. Это позволяет увидеть цепь вызовов функций, вызвавших ошибку. Чтобы сгенерировать трассировку стека, сгенерируйте сообщение с помощью формата:

%setcommandswitch "-v1"
%exit Simulink Coder Fatal: error string

Форматирование сообщений об ошибке

Если необходимо отобразить форматированное многострочное сообщение об ошибке, создайте локальную переменную, содержащую текст сообщения. Для примера:

%openfile message
My message text
with newlines
%closefile message

После форматирования сообщения об ошибке используйте одну из функций библиотеки отчетов об ошибках, описанных выше, таких как LibReportError, чтобы сообщить о вашей ошибке, когда она происходит. Для примера:

%<LibReportError(message)>

Функции библиотеки отчетов об ошибках обеспечивают префикс сообщения об ошибке, такой как Simulink Coder Error:.

Проверка сообщений об ошибке

Настоятельно рекомендуется протестировать сообщения об ошибке перед выпуском нового кода TLC. Чтобы протестировать свои сообщения об ошибке, скопируйте соответствующий код в test.tlc файл и запуск

tlc test.tlc

в MATLAB® приглашение.

Использование сообщений об ошибке TLC для устранения неполадок

В этом разделе перечислены и описаны сообщения об ошибке, сгенерированные компилятором целевого языка. Используйте эту ссылку на

  • Подтвердите, что сообщение об ошибке

  • Определите возможные причины ошибки

  • Определите возможные способы исправить ошибку

% closefile или% selectfile или% flushfile аргумент должен быть допустимым открытым файлом

В %closefile или %selectfile или %flushfileаргумент должен быть допустимой переменной файла, открытой с %openfile.

% define больше не поддерживается, вместо этого используйте функцию%

Макросы не поддерживаются. Вы должны переписать макросы как функции или вписать их в свой код.

% error directive: text

Код, содержащий %error директива генерирует это сообщение. Обычно это указывает на некоторое условие, что код не смог обработать, и отображает текст, следующий за %error директива.

Директива о выходе% exit: text

Код, содержащий %exit директива вызывает это сообщение. Обычно это указывает на некоторое условие, что код не смог обработать, и отображает текст, следующий за %exit директива. Обратите внимание, что эта директива заставляет компилятор целевого языка завершать работу независимо от -mnumber опция командной строки.

% filescope уже использовался в этом файле

Пользователь попытался использовать %filescope директива более одного раза в файле.

Директива% trace: text

The %trace директива выдает это сообщение об ошибке и отображает текст, следующий за %trace директива. Директивы трассировки сообщаются только тогда, когда -v опция (подробный режим) появится в командной строке. Обратите внимание, что %trace директивы не рассматриваются как ошибки и не заставляют компилятор целевого языка останавливать обработку.

% warning directive: text

The %warning директива выдает это сообщение об ошибке и отображает текст, следующий за %warning директива. Обратите внимание, что %warning директивы не рассматриваются как ошибки и не заставляют компилятор целевого языка останавливать обработку.

Директива% реализует должна находиться в файле шаблона блока и должна совпадать с заданными% language и type

Найден файл шаблона блока, но он не содержит %implements директива. Система координат %implements директива необходима для реализации ожидаемого языка и типа в этом файле шаблона блока. Для получения дополнительной информации смотрите Объектно-ориентированную программу для генерации целевого кода.

Оператор% switch может иметь только один% по умолчанию

Пользователь написал %switch оператор с несколькими %default случаи, как в следующем примере:

%switch expr
  %case 1
    code...
    %break
  %default
    
more code...
    %break
  %default		  %% error
    even more code...
    %break
%endswitch

Выбор языка должен быть сделан с помощью директивы% language перед использованием GENERATE или GENERATE_TYPE

Как использовать GENERATE или GENERATE_TYPE встроенные функции, целевой компилятор языка требует, чтобы вы сначала задали создаваемый язык. Это заставляет целевой файл уровня блоков реализовывать тот же язык и тип, что и указано в %language директива.

Неоднородный вектор передали в GENERATE_FORMATTED_VALUE

Встроенный GENERATE_FORMATTED_VALUE может обрабатывать только векторы, которые имеют однородные элементы (то есть векторы, в которых все элементы имеют одинаковый тип).

Неоднозначная ссылка на identifier - необходимо использовать индекс массива для обращения к одному из нескольких возможностей

В повторном идентификаторе возможностей из файла базы данных необходимо задать индекс, чтобы изменить неоднозначность ссылки. Для примера

Database file:
block
{
	Name				"Abc2"
	Parameter {
		Name			"foo"
		Value			2
	}
}
block
{
	Name				"Abc3"
	Parameter {
		Name			"foo"
		Value			3
	}
}
TLC file:
%<GETFIELD(block, "Name")>

В предыдущем примере ссылка на block неоднозначно, потому что несколько повторные возможности с именем block появится в файле базы данных. Используйте индекс, чтобы изменить неоднозначность ссылок, как в:

%<GETFIELD(block[0], "Name")>

Оператор% if может иметь только один% else

Пользователь написал %if оператор с несколькими %else блоки, как в следующем примере:

%if expr
  code...
%else
  more code...
%else          %% error
  even mode code...
%endif

Аргумент в identifier должна быть строкой

Следующие встроенные функции ожидают строку и сообщают об этой ошибке, если переданный аргумент не является строкой.

CASTGENERATE_FILENAME
EXISTSGENERATE_FUNCTION_EXISTS
FEVALGENERATE_TYPE
FILE_EXISTSGET_COMMAND _SWITCH
FORMATIDNUM
GENERATESYSNAME

Аргументы в directive должны быть записями

Аргументы в %mergerecord и %copyrecord должны быть записями. Кроме того, первым аргументом следующих встроенных функций должна быть запись:

  • ISALIAS

  • REMOVEFIELD

  • FIELDNAMES

  • ISFIELD

  • GETFIELD

  • SETFIELD

Аргументы в TLC из командной строки MATLAB должны быть строками

Была предпринята попытка обратиться к компилятору целевого языка из MATLAB, но некоторые переданные аргументы не были строками.

Не удалось выполнить проверку типа «Assertion»

Выражение в %assert оператор, рассчитанный как ложный.

Присвоение identifier области видимости разрешено только при использовании оператора + для добавления представителей

Назначение возможностей должно быть scope = scope + variable.

Попытка задать идентификатор функции поверх существующей переменной или функции

Функция не может быть определена дважды. Убедитесь, что у вас нет той же функции, определенной в отдельных файлах TLC.

Попытка разделить на нули

Компилятор целевого языка не допускает деления на нули.

Неправильное приведение - невозможно привести это выражение к type

Компилятор целевого языка не может привести это выражение от текущего типа к указанному типу. Для примера Target Language Компилятора не может привести строку к числу, как в

%assign x = "1234"
%assign y = CAST("Number", x );

Плохая директория (dirname) в O: filename

The -O опция не задал допустимую папку.

builtin ожидал выражения типа type, получил тип type

Встроенный передан выражение неправильного типа.

Невозможно% undef какие-либо функции или переменные builtin

Пользователь не имеет права не определять встроенную или переменную TLC. Для примера

%undef FORMAT  %% error

Невозможно преобразовать строку your_string в число

Невозможно преобразовать строку в число.

Изменение значения identifier из файла RTW

Вы перезаписали значение, появившееся в .rtw файл.

Ошибка при открытии filename

Компилятору целевого языка не удалось открыть файл, указанный в командной строке.

Ошибка записи в файл error

Произошла ошибка при записи в текущий выходной поток; error содержит системное сообщение об ошибке.

Произошли ошибки - прерывание

Это сообщение об ошибке является последней сообщаемой ошибкой. Это происходит, когда или

  • Количество сообщений об ошибках превышает порог сообщения об ошибке (5 по умолчанию).

  • Обработка завершена, и возникли ошибки.

Директивы расширения% < > не могут быть вложены

Незаконно гнездить директивы расширения. Для примера,

%<foo(%<expr>)>

Вместо этого выполните следующее:

%assign tmp = %<expr>
%<foo(tmp)>

Директивы расширения% < > не могут охватывать несколько линии; использование\в конце линии

Директива расширения не может охватывать несколько линии. Чтобы обойти это ограничение, используйте символ продолжения\line. Следующее неверно:

%<CompiledModel.System[Sysidx].Block[BlkIdx].Name + 
"Hello">

Вместо этого используйте:

%<CompiledModel.System[Sysidx].Block[BlkIdx].Name + \
"Hello">

Дополнительные аргументы в function-name встроенная функция была проигнорирована (Предупреждение)

Следующие встроенные функции сообщают об этом предупреждении, когда им передается слишком много аргументов:

CASTNUMTLCFILES
EXISTSOUTPUT_LINES
FILE_EXISTSSIZE
FORMATSTRING
GENERATE_FILENAMESTRINGOF
GENERATE_FUNCTION_EXISTSSYSNAME
IDNUMTLCFILES
ISFINITETYPE
ISINFWHITE_SPACE
ISNANWILL_ROLL

Слишком длинное имя файла (директория = dirname, имя = filename)

Заданное filename была слишком длинной. Предельные пределы по умолчанию - 256 символов для filename и 1024 символа для dirname, но пределы могут быть больше, в зависимости от платформы.

format не является допустимым значением формата

Указанный формат не является допустимым для %realformat директива. Допустимые строки формата "EXPONENTIAL" и "CONCISE".

Несоответствие аргументов функции; функциональные function_name ожидает number аргументы

При вызове функции ей передавалось слишком много или слишком мало аргументов.

Функция достигла конца и не вернула значение

Функции, которые не объявлены как void или Output необходимо вернуть значение. Если возврат значение не требуется, объявите функцию следующим void, в противном случае сделать его возвращающим значение.

Значения функций не разрешены

Попытка использовать функцию TLC в качестве переменной.

Идентификатор identifier умножить заданный. Второе и последующие определения проигнорированы.

Пользователь пытается добавить к записи то же поле более одного раза, как в следующем коде.

%createrecord err { foo 1; rec { val 2 } }
%addtorecord err foo 2             %% error

Идентификатор identifier использованный в операторе% foreach, уже находился в возможностях видимости (Предупреждение)

Аргумент в %foreach оператор не может быть определен до ввода %foreach.

Незаконное использование eval (т.е.% <... >

)

Использование evals в .rtw незаконно файлы. Есть также некоторые места, где evals не допускаются в директивах. Для примера:

%function %<foo>(a, b, c) void  %% error
%endfunction

Индексы могут быть не отрицательными

Индекс, используемый в выражении [], должен быть неотрицательным целым числом.

Индексы должны быть постоянными интегральными числами

Индекс, используемый в выражении [], должен быть целым числом.

Недопустимый указатель

Недопустимый указатель передан в режим сервера компилятора целевого языка.

Недопустимая область значений идентификаторов, начальные строки string1 и string2 должен соответствовать

В область значений сигналов, для примера, u1:u10идентификатор в первом аргументе не совпадал с идентификатором во втором аргументе.

Недопустимая область значений идентификаторов, нижняя граница (bound) должно быть меньше верхней границы (bound)

В область значений сигналов, для примера, u1:u10нижняя граница была выше верхней границы.

Недопустимый тип для унарных operator

Унарные операторы и + требуются числовые типы. Унарный оператор требует интегрального типа. Унарный оператор ! требует числового типа.

Недопустимый тип type

Встроенной функции передан недопустимый тип.

Возвращать функцию из функции незаконно

Значение функции не может быть возвращено из вызова функции.

Именованное значение identifier уже существует в этой scope-identifier; используйте% присвоение, чтобы изменить значение

Вы не можете использовать оператор сложения блоков +, чтобы добавить значение, которое уже является представителем указанного блока. Использование %assign для изменения значения существующего значения. Этот пример приводит к этой ошибке:

%assign x = BLK { a 1; b 2 }
%assign a = 3
%assign x = x + a

Вместо этого используйте следующее:

%assign x.a = 3

Оператор% case еще не замечен, оператор проигнорирован

Операторы, которые появляются в %switch оператор, но предшествующий %case операторы игнорируются, как в следующем коде:

%switch expr
%assign x = 2  %% this statement will be ignored
  %case 1
    code
    %break
%endswitch

Только двойной и символьные массивы могут быть преобразованы из MATLAB в TLC. Это может произойти, если функция MATLAB не вернет значение (см.% matlab)

Только двойной и символьные массивы могут быть преобразованы из MATLAB в целевой языковой компилятор. Эта ошибка может возникнуть, если функция MATLAB не вернет значение (см %matlab). Для примера,

%assign a = FEVAL("int8",3)
%matlab disp(a)

Из TLC допускается только один выход

Была предпринята попытка получить несколько выходы от версии MATLAB компилятора целевого языка.

Только строки длины 1 могут быть назначены с помощью обозначения []

Правая сторона назначения строки с помощью оператора [] должна быть строкой длины 1. Вы можете заменить только один символ с помощью этого обозначения.

В качестве аргумента в Query и ExecString могут использоваться только строки или камеры из строк

Камера, содержащая нестроку данные, была передана в качестве третьего аргумента Query или ExecString в серверном режиме.

Только векторы той же длины, что и существующее векторное значение, могут быть назначены с помощью обозначения []

В обозначении [] для замены строки матрицы строка должна быть вектором той же длины, что и существующие строки.

Выходные файлы identifier открытый с% openfile не был закрыт

Выходные файлы, открытые с помощью %openfile должна быть закрыта %closefile. The identifier - имя переменной, заданное в %openfile директива.

Примечание

Это также может произойти синтаксическая ошибка в секции кода между openfile и closefile, или если вы пытаетесь назначить выход функции типа void или Output в переменную.

Области значений, области значений идентификаторов и повторные значения не могут быть повторены

Вы не можете повторить область значений, область значений идентификаторов или повторить значение. Это препятствует таким вещам, как [1@2@3].

Строка не может изменить настройку для переключателя командной строки '- switch'

%setcommandswitch не распознает указанный коммутатор или не может его изменить (например -r не может быть изменен).

string не является распознанным пользовательским свойством этого указателя

Запрос, выполненный на указателе режима сервера TLC, ищет неопределенное свойство.

Синтаксическая ошибка

Указанная линия содержит синтаксическую ошибку, для получения дополнительной информации о синтаксисе смотрите Директивы компилятора целевого языка.

Директива% пропуск может находиться только в операторе% foreach,% for,% крен или% switch

The %break директива может использоваться только в %foreach, %for, %roll, или %switch оператор.

Директивы% case и% по умолчанию могут использоваться только в операторе% switch

A %case или %default директива может появиться только в %switch оператор.

Директива% continue может появиться только в операторе% foreach,% for или% крен

The %continue директива может использоваться только в %foreach, %for, или %roll оператор.

Оператор% foreach ожидает постоянного числового аргумента

Аргумент %foreach должен быть числовым типом. Для примера:

%foreach Index = [1 2 3 4]
...
%endforeach

%foreach не может принять вектор как вход.

Оператор if ожидает постоянного числового аргумента

Аргумент %if оператор должен быть числовым типом. Для примера,

%if [ 1 2 3 ]
...
%endif

%if не может принять вектор как вход.

Директива% реализует в качестве списка языков ожидает строку или строковый вектор

Можно использовать %implements директива, чтобы задать строку для реализуемого языка или указать, что она реализует несколько языков с помощью вектора строк. Вы не можете задать другой тип аргумента для %implements директива.

Директива% реализует тип как type где type было ожидаемо

Тип, заданный в %implements директива должна точно совпадать с типом, заданным в блоке или на GENERATE_TYPE директива. Если вы хотите указать, что блок принимает несколько входных типов, используйте %implements * директива, как в

%implements * "C"   %% I accept any type and generate C code

Язык% реализует не совпадает с языком, генерируемым в данный момент (language)

Язык или языки, указанные в %implements директива должна точно совпадать с %language директива.

Оператор% возврат может появиться только в теле функции

A %return оператор может находиться только в теле функции.

Операторы = = и! = могут использоваться только для сравнения значений того же типа

Аргументы оператора = = и! = должны совпадать. Вы можете использовать CAST() встроенная функция для их преобразования в один и тот же тип.

Аргумент для% openfile должен быть допустимой строкой

Когда вы открываете файл выхода, имя, заданное для файла, должно быть допустимой строкой.

Аргумент для% with должен быть допустимыми возможностями

Аргумент в %with должен быть допустимым идентификатором возможностей. Для примера,

%assign x = 1
%with x
...
%endwith

В этом коде %with аргумент оператора является числом и генерирует это сообщение об ошибке.

Аргументом для операции [] должен быть повторный символ возможностей, вектор или матрица

Когда вы используете оператор [] для индекса, выражение слева от скобок должно быть вектором, матрицей, строкой, числовой константой или повторным идентификатором возможностей. Когда вы используете индексацию массива на скаляре, константа автоматически расширяется скаляром и возвращается значение скаляра. Для примера,

%openfile x
%assign y = x[0]

Этот пример вызывает эту ошибку из-за x является файлом и недопустим для индексации.

Аргумент% addincludepath должен быть допустимой строкой

Аргумент в %addincludepath должна быть строкой.

Аргумент для% include должен быть допустимой строкой

Аргумент директивы управления входным файлом должен быть допустимой строкой с именем файла, заданным в двойных кавычках.

Директива begin должна находиться в том же файле, что и соответствующая конечная директива.

Эти begin компилятора целевого языка директивы должны находиться в том же файле, что и соответствующие им end директивы: %function, %switch, %foreach, %roll, и %for. Поместите конструкцию полностью в один исходный файл компилятора целевого языка.

The begin директива в этой линии не имеет совпадающих end директива

Для директивов с разбиением на блоки эта ошибка возникает, если совпадающий end директива отсутствует. Эта ошибка может возникнуть для следующих директивов Target Language Compiler с блочным диапазоном.

Начальная директиваКонечная директиваОписание
%if%endif

Условное включение

%for%endfor

Перекручивание

%foreach%endforeach

Перекручивание

%roll%endroll

Контурная прокатка

%with%endwith

Директива Scoping

%switch%endswitch

Директива Switch

%function%endfunction

Директива объявления функции

{}

Создание записей

Об ошибке сообщается в линии, которая открывает возможности и не имеет совпадающих end возможности.

Примечание

Вложенные возможности должны быть закрыты перед их родительскими возможностями. Отказ включить end для вложенных возможностей часто вызывает эту ошибку, как в

%if Block.Name == "Sin 3" 
    %foreach idx = Block.Width %endif  
%% Error reported here that the %foreach was not terminated

Конструкция% matlab function_name(...) конструкция недопустима в автономном tlc

Вы не можете вызвать MATLAB из отдельного TLC.

Функция FEVAL () может принимать только 2-мерные массивы из MATLAB, а не числовые размерности

Возвращаемые значения из MATLAB могут иметь самое большее две размерности.

Функция FEVAL () может принимать векторы чисел или строк только при вызове MATLAB

Векторы, переданные в MATLAB, могут быть числами или строками. См. FEVAL Function.

Для вызова функции FEVAL () требуется имя функции

FEVAL требуется функция для вызова. Эта ошибка появляется только в MATLAB.

Конечным аргументом% крен должна быть допустимые возможности

Когда вы используете %rollконечный аргумент (перед дополнительными аргументами) должен быть допустимыми возможностями блока. Описание этой команды смотрите в% roll.

Первый аргумент оператора?: должен быть логическим выражением

The ? : оператор должен иметь логическое выражение в качестве первого операнда.

Первый аргумент GENERATE или GENERATE_TYPE должен быть допустимыми возможностями

Когда вы звоните GENERATE или GENERATE_TYPEпервый аргумент должен быть допустимыми возможностями. Смотрите функции GENERATE и GENERATE_TYPE для получения дополнительной информации и примеров.

Функция name требует по крайней мере number аргументы

Пользователь передает слишком мало аргументов в функцию, как в следующем коде:

%function foo(a, b, c)
  %return a + b + c
%endfunction

%<foo(1, 2)>  %% error

Функция GENERATE требует как минимум 2 аргумента

Когда вы вызываете GENERATE встроенная функция, первые два аргумента должны быть блоком и именем функции, которая будет вызываться.

Функция GENERATE_TYPE требует не менее 3 аргументов

Когда вы вызываете GENERATE_TYPE встроенная функция, первые три аргумента должны быть блоком, именем функции и типом.

Функции ISINF (), ISNAN (), ISFINITE (), REAL () и IMAG () ожидают реального или комплексного аргумента

Эти функции ожидают Real или комплексное число как входной параметр.

Реализуемый язык не может быть изменен в файле шаблона блока

Вы не можете изменить язык, используя %language директива в файле шаблона блока.

Внедряемый язык изменился с old-language на new-language (Предупреждение)

Внедряемый язык не должен быть изменен в среднем потоке, потому что GENERATE вызовы функций, которые появляются перед %language директива может вызвать generate функций для загрузки для предыдущего языка. В заданном файле должна появиться только одна языковая директива.

Левая сторона оператора. должна быть допустимым идентификатором возможностей

Когда вы используете . оператор, левая сторона . оператор должен быть допустимым идентификатором в области видимости. Для примера:

%assign x = 1
%assign y = x.y

В этом коде ссылка на x.y выдает это сообщение об ошибке из-за x не определяется как возможности.

Левая сторона назначения должна быть простым выражением, состоящим из., [] и идентификаторов

Недопустимая левая сторона назначения.

Количество заданных столбцов (specified-columns) не совпадало с фактическим количеством столбцов в строках (actual-columns)

Когда вы задаете матрицу компилятора целевого языка, количество заданных столбцов должно совпадать с фактическим количеством столбцов в матрице. Для примера,

%assign mat = Matrix(2,1) [[1,2];[2,3]]

В этом случае количество столбцов в объявлении матрицы (1) не совпадало с количеством столбцов в матрице (2). Либо измените количество столбцов в матрице, либо измените объявление матрицы.

Количество заданных строк (specified-rows) не совпадало с фактическим количеством строк в матрице (actual-rows)

Когда вы задаете матрицу компилятора целевого языка, количество строк должно совпадать с фактическим количеством строк в матрице. Для примера,

%assign mat = Matrix(1,2) [[1,2];[2,3]]

В этом случае количество строк в объявлении матрицы (1) не совпадало с количеством строк в матрице (2). Либо измените количество строк в матрице, либо измените объявление матрицы.

The operator_name оператор работает только с логическими аргументами

The && и || операторы работают только с логическими значениями.

The operator_name оператор работает только с интегральными аргументами

The &, ^, |, <<, >> и % операторы работают только с номерами.

The operator_name оператор работает только с числовыми аргументами

Аргументы для следующих операторов должны быть либо числовыми, либо реальными: <, <=, >, >=, -, *, /. Эта ошибка может также возникнуть, когда вы используете + как унарный оператор. В сложение, FORMAT встроенная функция ожидает либо числового, либо действительного аргумента.

Значение возврата из функции RollHeader должно быть строкой

Когда вы используете %roll, RollHeader() функция, заданная в Roller.tlc должно возвращать строку значение. Смотрите% roll для полного обсуждения %roll конструировать.

Аргумент roll в% крен должен быть непустым вектором чисел или областей значений

Когда вы используете %roll, а roll вектор не может быть пустым и должен содержать числа или области значений чисел. Смотрите% roll для полного обсуждения %roll конструировать.

Второе значение в Области значений должно быть больше первого значения

В области значений, например 1:10нижняя граница была выше верхней границы.

Заданный индекс (index) находился вне области значений 0 - number-of-elements - 1

Эта ошибка возникает, когда вы индексируете в нескаляр за концом переменной. Для примера:

%assign x = [1 2 3]
%assign y = x[3]

Этот пример приведет к этой ошибке. Помните, что в Target Language Compiler индексы массивов начинаются с 0 и переходят к количеству элементов минус 1.

Встроенная функция STRINGOF ожидает вектор чисел в качестве своего аргумента

STRINGOF функция ожидает вектор чисел. Функция рассматривает каждое число как значение ASCII допустимого символа.

Встроенная функция SYSNAME ожидает входа строку формы xxx/ yyy

SYSNAME функция принимает одну строку вида xxx/ yyy как это появляется в .rtw Файл и возвраты вектор из двух строк, xxx и yyy. Если входной параметр не соответствует этому формату, SYSNAME возвращает эту ошибку.

Порог в операторе% крен должно быть одним числом

Когда вы используете %rollзаданный порог крена должен быть одним числом. Смотрите% roll для полного обсуждения %roll конструировать.

Использование feature устаревает и не будет поддерживаться в будущих версиях TLC. Альтернативы см. в руководстве TLC.

The %define и %generate директивы не рекомендуются, поскольку они заменяются.

Встроенная в WILL_ROLL функция ожидает вектор области значений и целочисленный порог

WILL_ROLL функция требует обоих аргументов, приведенных в сообщении.

Больше нет свободных контекстов. Используйте tlc ('close', УКАЗАТЕЛЬ), чтобы освободить контекст

Глобальная контекстная таблица заполнилась во время использования режима сервера TLC.

Отсутствует тип, сопоставленный с данным блоком для GENERATE

Возможности, заданная для GENERATE должен включать Type параметр, который указывает, какой файл шаблона должен использоваться для генерации кода для указанных возможностей. Для примера:

%assign scope = block { Name "foo" }
%<GENERATE( scope, "Output" )>

Этот пример генерирует сообщение об ошибке, поскольку возможности не включает параметр Type. Смотрите функции GENERATE и GENERATE_TYPE для получения дополнительной информации и примеров.

Это назначение перезаписывает пару идентификатор-значение из файла RTW. Чтобы избежать этой ошибки, укажите левую сторону или выберите другой идентификатор.

Пользователь пытается изменить поле записи в %with блок без проверки левой стороны, как в этом примере:

  %createrecord foo { field 1 }
  %with foo
    %assign field = 2  %% error
  %endwith

Вместо этого используйте

%createrecord foo { field 1 }
  %with foo
    %assign foo.field = 2
  %endwith

ТЛК утекла number символы. Возможно, вы создали циклическую запись. Если это не так, пожалуйста, сообщите об этой утечке в The MathWorks.

Произошла утечка памяти при запуске TLC. Наиболее распространенной причиной этого является наличие циклических записей.

Не удается найти identifier в рамках scope-identifier возможности

Указанный идентификатор не найден в указанных возможностях. Для примера,

%assign scope = ascope { x 5 }
%assign y = scope.y

В этом коде ссылка на scope.y выдает это сообщение об ошибке.

Не удается открыть файл% include filename

Файл, включенный в %include директива не найдена в пути. Либо переместите файл в место по текущему пути, либо используйте -I опция командной строки или %addincludepath директива указать папку, содержащую файл.

Не удается открыть файл шаблона блока filename из GENERATE или GENERATE_TYPE

Вы указали GENERATE но указанное имя файла не найдено в пути компилятора целевого языка. Вы можете

  • Добавьте файл в папку в пути.

  • Используйте %generatefile директива для задания альтернативного имени файла для этого типа блока, находящегося в пути.

  • Добавьте папку, в которой этот файл отображается, в путь поиска файлов с помощью -I опция командной строки или %addincludepath директива.

Не удается открыть выходной файл filename

Не удалось открыть указанный выходной файл. Указано недопустимое имя файла или файл доступен только для чтения.

Неопределенный идентификатор identifier_name

Идентификатор, указанный в этом выражении, не определен.

Неизвестный тип type в выражении CAST

Когда вы вызываете CAST встроенная функция, тип должен быть допустимым типом из таблицы Типы значений на целевом языке.

Неопознанный переключатель командной строки перешел к строке: switch

Вы запросили текущее состояние коммутатора, но указанный коммутатор не был распознан.

Непризнанные директивные directive-name замеченный

Нелегальное % обнаружена директива. Действующие директивы показаны ниже.

%addincludepath%addtorecord
%assert%assign
%break=%case
%closefile%continue
%copyrecord%createrecord
%default%define
%else%elseif
%endbody%endfor
%endforeach%endfunction
%endif%endroll
%endswitch%endwith
%error%exit
%filescope%for
%foreach%function
%generate%generatefile
%if%implements
%include%language
%matlab%mergerecord
%openfile%realformat
%return%roll
%selectfile%setcommandswitch
%switch%trace
%undef%warning
%with 

Неопознанный тип output-type для функции

Модификатор типа функции не Output или void. Для функций, которые не выдают выход, значение по умолчанию без модификатора типов указывает, что функция не должна выдавать выход.

Неотключенный многострочный комментарий.

Многострочный комментарий (т.е./% %/) не имеет терминатора строки, как в следующем коде:

/% my comment

%assign x = 2
%assign y = x * 7

Неотключенная строка

Строка должна быть закрыта до окончания директивы расширения или окончания линии.

Использование: tlc [options] файл

Произошла проблема командной строки. Сообщение об ошибке содержит список доступных опций.

Использование feature является хитом эффективности, пожалуйста, смотрите руководство TLC для возможных обходных путей.

The %undef и расширение (т.е. %<expr>) функции могут снизить эффективность.

Значение type тип нельзя сравнить

Значения заданного type невозможно сравнить.

Значения specified_type тип не может быть развернут

Указанный тип не может использоваться в директиве расширения. Невозможно развернуть файлы и возможности. Эта ошибка может также возникнуть, когда вы расширяете функцию без каких-либо аргументов. Если вы используете

%<Function>

вызовите его с необходимыми аргументами.

Значения типа Special, Macro Expansion, Function, File, Full Identifier и Index не могут быть преобразованы в переменный MATLAB

Значения типов, перечисленных в сообщении, не могут быть преобразованы в переменный MATLAB.

При добавлении к буферному потоку переменная должна быть строкой

Можно задать append опция для буферного потока, только если переменная в данный момент существует как строка. Не используйте append опция, если переменная не существует или не является строкой. Этот пример приводит к этой ошибке.

%assign x = 1
%openfile x , "a"
%closefile x

Функциональная библиотека TLC Сообщений об ошибке

Функции в библиотеке функций TLC могут генерировать много сообщений об ошибке, которые не задокументированы. Эти сообщения являются достаточно самоописательными, так что они не нуждаются в дополнительном объяснении. Однако, если вы столкнулись с сообщением об ошибке, которое не содержит достаточного количества описания для решения вашей проблемы, обратитесь в службу технической поддержки.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте