exponenta event banner

Обработка ошибок 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 (открыто) для более примеров использования LibBlockReportError.

Создание ошибок из файлов TLC

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

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

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

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

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

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

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

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

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

LibBlockReportError(block,"error string")

block аргумент - это запись блока, если она не имеет области действия. Если объем блока в настоящее время определен, можно указать block как [].

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

LibReportError("error string")

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

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

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

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

Использование библиотечных функций.  Две доступные библиотечные функции:

LibBlockReportFatalError(block,"fatal coding error message")

где block является записью блока-нарушителя (или [] если объем блока уже определен), и

LibReportFatalError("fatal coding error message")

для сообщений об ошибках, не зависящих от блока. Например, для добавления кода утверждения можно использовать

%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 больше не поддерживается, используйте% function

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

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

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

% exit директива :text

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

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

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

% директивы трассировки :text

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

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

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

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

Файл шаблона блока найден, но не содержит %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 может иметь только один%

Пользователь написал %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, но некоторые из переданных аргументов не были строками.

Утверждение не выполнено

Выражение в %assert оператор оценивается как false.

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

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

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

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

Попытка деления на ноль

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

Bad cast - не удается привести это выражение к type

Компилятор целевого языка не может преобразовать это выражение из текущего типа в указанный тип. Например, компилятор целевого языка не может привести строку к числу, как в

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

Неверный каталог (dirname) в O: filename

-O в параметре не указана допустимая папка.

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

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

Не удается% undef какие-либо функции сборки или переменные

Пользователь не может отменить определение встроенной или переменной 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 файлы. Есть также места, где оценки не допускаются в директивах. Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Возврат функции из функции недопустим

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

Именованное значение identifier уже существует в этом scope-identifier; используйте% assign для изменения значения

Оператор сложения блоков + нельзя использовать для добавления значения, которое уже является членом указанного блока. Использовать %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. С помощью этой нотации можно заменить только один символ.

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

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

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

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

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

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

Примечание

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

Диапазоны, диапазоны идентификаторов и повторяющиеся значения не могут быть повторены

Нельзя повторить диапазон, диапазон идентификаторов или повторяющееся значение. Это предотвращает такие вещи, как [1@2@3].

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

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

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

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

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

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

Директива% break может отображаться только в операторе% foreach,% for,% roll или% switch

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Директива% implements указывает тип как type где type ожидалось

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

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

Язык% implements не соответствует языку, создаваемому в данный момент (language)

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

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

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

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

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

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

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

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

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

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

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

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

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

%openfile x
%assign y = x[0]

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

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

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

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

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

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

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

begin директива в этой строке не имеет соответствия end директива

Для директив в области блоков эта ошибка возникает при совпадении end отсутствует директива. Эта ошибка может возникнуть для следующих директив компилятора целевого языка в области блоков.

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

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

%for%endfor

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

%foreach%endforeach

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

%roll%endroll

Катание петли

%with%endwith

Директива по определению объема работ

%switch%endswitch

Директива о переключении

%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 () может принимать только двухмерные массивы из MATLAB, а не числовые измерения

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

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

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

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

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

Последний аргумент% roll должен быть допустимой областью блока

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

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

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

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

При звонке GENERATE или GENERATE_TYPE, первый аргумент должен быть допустимой областью. Дополнительные сведения и примеры см. в разделах СОЗДАНИЕ и 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). Измените количество строк в матрице или объявление матрицы.

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

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

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

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

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

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

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

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

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

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

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

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

Указанный индекс (index) вышел за пределы диапазона 0 - number-of-elements - 1

Эта ошибка возникает при индексировании в нескалярное значение после конца переменной. Например:

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

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

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

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

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

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

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

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

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

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

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

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

Больше нет свободных контекстов. Используйте tlc ('close', HANDLE), чтобы освободить контекст

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

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

Область, указанная для GENERATE должен включать Type параметр, указывающий, какой файл шаблона должен использоваться для создания кода для указанной области. Например:

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

В этом примере выводится сообщение об ошибке, поскольку область не включает параметр Type. Дополнительные сведения и примеры см. в разделах СОЗДАНИЕ и 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

Произошла утечка TLC number символы. Возможно, создана циклическая запись. Если это не так, сообщите об этой утечке в 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 для возможных обходных путей.

%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 могут генерировать множество сообщений об ошибках, которые не задокументированы. Эти сообщения являются достаточно самоописательными, чтобы они не нуждались в дополнительном объяснении. Однако в случае появления сообщения об ошибке, в котором содержится недостаточно описания для устранения проблемы, обратитесь в службу технической поддержки.

Связанные темы