Objective: Изучает структуру файлов записи и изучает, как проанализировать их с директивами TLC.
Folder:
открытыйmatlabroot
/toolbox/rtw/rtwdemos/tlctutorial/guide
В этом примере вы интерпретируете простой файл структурированных записей с рядом скриптов TLC. Вы изучите, как записи структурированы, и как %assign
TLC и
%<>
Директивы token expansion используются, чтобы обработать их. Кроме того, пример иллюстрирует циклы с помощью %foreach
, и определение объема использования %with
.
Пример включает эти шаги, которые необходимо выполнить последовательно:
Structure of Record Files — Некоторый фон и простой пример
Interpret Records — Представление содержимого файла записи
Anatomy of a TLC Script — Разрушение в представлении
Modify
read-guide.tlc
— Экспериментируйте с TLC
Pass and Use a Parameter — Передайте параметры от командной строки до файлов TLC
Review
Модели компиляций генератора кода в структурированную форму вызвали файл записи, называемый
. Такие скомпилированные файлы модели подобны в синтаксисе и организации к файлам исходной модели, в этом они содержат серию иерархически вложенных записей формыmodel
.rtw
recordName {itemName itemValue}
Названия товара являются алфавитными. Значения элемента могут быть строками или числами. Числовые значения могут быть скалярами, векторами или матрицами. Фигурные скобки выделяют содержимое каждой записи, которая может содержать один или несколько элементов, разграниченных пробелом, перейти или возвратить символы.
В
файл, именем (первой) записи верхнего уровня является model
.rtwCompiledModel
. Каждый блок представлен подзаписью в нем, идентифицирован именем блока. TLC может проанализировать правильно построенные файлы записи, когда это осуществление иллюстрирует.
Следующий листинг является допустимым файлом записи, который может проанализировать TLC, несмотря на то, что не один, для которого это может сгенерировать код. Комментарии обозначаются знаком фунта (#):
# # File: guide.rtw Illustrative record file, which can't be used by Simulink # Note: string values MUST be in quotes Top { # Outermost Record, called Top Date "21-Aug-2008" # Name/Value pair named Top.Date Employee { # Nested record within the Top record FirstName "Arthur" # Alpha field Top.Employee.FirstName LastName "Dent" # Alpha field Top.Employee.LastName Overhead 1.78 # Numeric field Top.Employee.Overhead PayRate 11.50 # Numeric field Top.Employee.PayRate GrossRate 0.0 # Numeric Field Top.Employee.GrossRate } # End of Employee record NumProject 3 # Indicates length of following list Project { # First list item, called Top.Project[0] Name "Tea" # Alpha field Name, Top.Project[0].Name Difficulty 3 # Numeric field Top.Project[0].Difficulty } # End of first list item Project { # Second list item, called Top.Project[1] Name "Gillian" # Alpha field Name, Top.Project[1].Name Difficulty 8 # Numeric field Top.Project[1].Difficulty } # End of second list item Project { # Third list item, called Top.Project[2] Name "Zaphod" # Alpha field Name, Top.Project[2].Name Difficulty 10 # Numeric field Top.Project[2].Difficulty } # End of third list item } # End of Top record and of file
Пока программисты знают имена записей и полей и их ожидаемого содержимого, они могут составить операторы TLC, чтобы считать, проанализировать, и управлять данными о файле записи.
Вот выход от TLC, пишут скрипт, который читает guide.rtw
, интерпретирует его записи, управляет полевыми данными и описаниями форматов, которые направлены к Командному окну MATLAB®:
Using TLC you can: * Directly access a field's value, e.g. %<Top.Date> -- evaluates to: "21-Aug-2008" * Assign contents of a field to a variable, e.g. "%assign worker = Top.Employee.FirstName" worker expands to Top.Employee.FirstName = "Arthur" * Concatenate string values, e.g. "%assign worker = worker + " " + Top.Employee.LastName" worker expands to worker + " " + Top.Employee.LastName = "Arthur Dent" * Perform arithmetic operations, e.g. "%assign wageCost = Top.Employee.PayRate * Top.Employee.Overhead" wageCost expands to Top.Employee.PayRate * Top.Employee.Overhead <- 11.5 * 1.78 = 20.47 * Put variables into a field, e.g. Top.Employee.GrossRate starts at 0.0 "%assign Top.Employee.GrossRate = wageCost" Top.Employee.GrossRate expands to wageCost = 20.47 * Index lists of values, e.g. "%assign projects = Top.Project[0].Name + ", " + Top.Project[1].Name..." "+ ", " + Top.Project[2].Name" projects expands to Top.Project[0].Name + ", " + Top.Project[1].Name + ", " + Top.Project[2].Name = Tea, Gillian, Zaphod * Traverse and manipulate list data via loops, e.g. - At top of Loop, Project = Tea; Difficulty = 3 - Bottom of Loop, i = 0; diffSum = 3.0 - At top of Loop, Project = Gillian; Difficulty = 8 - Bottom of Loop, i = 1; diffSum = 11.0 - At top of Loop, Project = Zaphod; Difficulty = 10 - Bottom of Loop, i = 2; diffSum = 21.0 Average Project Difficulty expands to diffSum / Top.NumProject = 21.0 / 3 = 7.0
Этот выход от guide.rtw
был произведен путем вызова TLC из Окна Команды MATLAB, выполнения скрипта под названием read-guide.tlc
. Сделайте это сами теперь путем выполнения этих шагов:
В MATLAB, папка изменения (cd
) к вашей копии tlctutorial/guide
в вашей рабочей папке.
Произвести выход, только перечисленный, процесс guide.rtw
со скриптом TLC read-guide.tlc
путем ввода следующей команды:
tlc -v -r guide.rtw read-guide.tlc
Использование команды примечания:
-r
переключатель (для чтения) идентифицирует файл входных данных в этом случае guide.rtw
.
Скрипт TLC, обрабатывающий файл данных, задан последней введенной лексемой.
-v
переключатель (для многословного) направляет выход к командному окну, если дескрипторы файлов TLC это само.
Вы теперь разделяете скрипт, который вы только запустили. Каждый “абзац” выхода от guide.tlc
обсужден в последовательности в следующих кратких разделах:
Кодирование Соглашений — Прежде чем вы начнете
Заголовок файла — информация о Заголовке и директива форматирования
Маркерное поле Expansion — Evaluating и идентификаторы переменных
Общее присвоение — Используя %assign
директива
Представьте Обработку в виде строки Плюс — Методы сборки строк
Арифметические операции — Расчеты на полях и переменных
Измените Записи — Изменение, копирование, добавив к записям
Индексируйте Списки — Ссылающийся на элементы списка с индексами
Цикл По Спискам — Детали о конструкции цикла и поведении
Это некоторый основной синтаксис TLC и соглашения кодирования:
%% Comment
| TLC комментируют, который не выводится |
/* comment */
| Прокомментируйте, чтобы быть выведенными |
%keyword
| Директива TLC (ключевое слово), запустите с “% ” |
%<expr> | Оператор лексемы TLC |
. (период) | Определяя объем оператора, например, Top.Lev2.Lev3 |
... (в конце) | Продолжение оператора (разрыв строки не выводится), |
\ (в конце) | Продолжение оператора (разрыв строки выводится), |
localvarIdentifier
| Локальные переменные запускаются в нижнем регистре |
GlobalvarIdentifier
| Глобальные переменные запускаются в верхнем регистре |
RecordIdentifier
| Идентификаторы записи запускаются в верхнем регистре |
EXISTS()
| Встроенные функции TLC называют в верхнем регистре Note: идентификаторы TLC является чувствительным к регистру. |
Для получения дополнительной информации см., что TLC Кодирует Соглашения.
Файл read-guide.tlc
начинается:
%% File: read-guide.tlc (This line is a TLC Comment, and will not print) %% %% To execute this file, type: tlc -v -r guide.rtw read-guide.tlc %% Set format for displaying real values (default is "EXPONENTIAL") %realformat "CONCISE"
Линии 1 - 4 — текст на линии после символов %%
обработан как комментарий (проигнорированный, не интерпретированный или выход).
Линия 5 — Как объяснено в тексте четвертой линии, директива TLC (ключевое слово) %realformat
, который управляет, как последующие числа с плавающей запятой отформатированы, когда отображено в выходе. Здесь мы хотим минимизировать отображенные цифры.
Первый раздел выхода производится линиями скрипта:
Using TLC you can: * Directly access a field's value, e.g. %assign td = "%" + "<Top.Date>" %<td> -- evaluates to: "%<Top.Date>"
Линии 1 и 2 — (и линии, которые не содержат директив TLC или лексем) просто отражены к потоку вывода, включая продвижение и конечные пробелы.
Линия 3 — Создает переменную под названием td
и присваивает значение строки %<Top.Date>
к нему. %assign
директива создает новый и изменяет существующие переменные. Его общий синтаксис:
%assign ::variable = expression
Линия 4 — отображения
%<Top.Date> -- evaluates to:
%<Top.Date>
не расширяя его. Это создает строку путем вставки вместе двух литералов.%assign td = "%" + "<Top.Date>"
Линия 5 — Оценивает (расширяет) Top.Date
записи. Более точно это оценивает поле
Date
который существует в осциллографе Top
. Синтаксис %<expr>
выражение причин expr
(который может быть записью, переменной или функцией) быть оцененным. Эта операция иногда упоминается как eval.
Вы не можете вложить %<expr>
оператор (то есть, %<foo%<bar>>
не позволен).
Когда вы используете %<expr>
оператор в кавычках, например, "%<Top.Date>"
, TLC расширяет выражение и затем заключает результат в кавычки. Однако размещение %assign
в кавычках, например, "%assign foo = 3"
, просто повторяет оператор, заключенный в кавычки к потоку вывода. Никакие результаты присвоения (значение foo
остается неизменным или неопределенным).
Второй раздел выхода производится линиями скрипта:
* Assign contents of a field to a variable, e.g. %assign worker = Top.Employee.FirstName "%assign worker = Top.Employee.FirstName" worker expands to Top.Employee.FirstName = %<worker>
Линия 1 — Отраженный, чтобы вывести.
Линия 2 — присвоение поля FirstName
в Top.Employee
запишите осциллограф к новой локальной переменной под названием worker
.
Линия 3 — Повторения предыдущий оператор, производя выведенный путем включения его в кавычки.
Линия 4 — Объясняет следующее присвоение и иллюстрирует маркерное расширение. Маркерный %<worker>
расширяется до Arthur
.
Следующий раздел скрипта иллюстрирует конкатенацию строк, одно из использования “+
оператор:
* Concatenate string values, e.g. %assign worker = worker + " " + Top.Employee.LastName "%assign worker = worker + " " + Top.Employee.LastName" worker expands to worker + " " + Top.Employee.LastName = "%<worker>"
Линия 1 — Отраженный, чтобы вывести.
Линия 2 — Выполняет конкатенацию.
Линия 3 — линия Эха 2 к выходу.
Линия 4 — Описывает операцию, в которой переменная конкатенирована к полю, разделенному пробелом. Альтернативный способ сделать это, не используя +
оператор,
%assign worker = "%<Top.Employee.FirstName> %<Top.Employee.LastName>"
+
оператор, который ассоциативен, также работает на числовые типы, векторы, матрицы и записи:
Числовые Типы — Добавляют два выражения вместе; оба операнда должны быть числовыми. Например:
* Numeric Type example, e.g. Top.Employee.PayRate = 11.5 Top.Employee.Overhead = 1.78 td = Top.Employee.PayRate + Top.Employee.Overhead td evaluates to 13.28
Векторы — Если первый аргумент является вектором и вторым, являются скалярным значением, TLC добавляет скалярное значение к вектору. Например:
* Vector example, e.g. v1 is [0, 1, 2, 3] Top.Project[1].Difficulty is 8 v2 = v1 + Top.Project[1].Difficulty v2 evaluates to: [0, 1, 2, 3, 8]
Матрицы — Если первый аргумент является матрицей и вторым, являются вектором той же ширины столбца как матрица, TLC добавляет вектор как другую строку к матрице. Например:
* Matrices example, e.g. mx1 is [ [4, 5, 6, 7]; [8, 9, 10, 11] ] v1 is [0, 1, 2, 3] mx = mx1 + v1 mx evaluates to [ [4, 5, 6, 7]; [8, 9, 10, 11]; [0, 1, 2, 3] ]
Записи — Если первый аргумент является записью, TLC, добавляют второй аргумент как идентификатор параметра (с его текущим значением). Например:
* Record example, e.g. StartDate is August 28, 2008 Top + StartDate Top.StartDate evaluates to August 28, 2008
TLC обеспечивает полное дополнение арифметических операторов для числовых данных. В следующем фрагменте нашего скрипта TLC умножаются два числовых поля:
* Perform arithmetic operations, e.g. %assign wageCost = Top.Employee.PayRate * Top.Employee.Overhead "%assign wageCost = Top.Employee.PayRate * Top.Employee.Overhead" wageCost expands to Top.Employee.PayRate * Top.Employee.Overhead ... <- %<Top.Employee.PayRate> * %<Top.Employee.Overhead> = %<wageCost>
Линия 1 — Отраженный, чтобы вывести.
Линия 2 — %assign
оператор, который вычисляет значение, какой TLC хранит в локальной переменной wageCost
.
Линия 3 — Эхо операция в линии 2.
Линии 4 и 5 — Составляют отдельного оператора. Замещающий знак (введенный как три последовательных периода, например, ...
) сигналы, что оператор продолжен на следующей линии, но если оператор вывел, TLC, не вставляют разрыв строки. Чтобы продолжить оператор и вставить разрыв строки, замените замещающий знак на обратную косую черту (\
).
После того, как читайте в память, можно изменить и управлять записями точно так же, как переменные, которые вы создаете присвоением. Следующий сегмент read-guide.tlc
заменяет значение поля Top.Employee.GrossRate
записи:
* Put variables into a field, e.g. %assign Top.Employee.GrossRate = wageCost "%assign Top.Employee.GrossRate = wageCost" Top.Employee.GrossRate expands to wageCost = %<Top.Employee.GrossRate>
Такие изменения в записях являются нестойкими (потому что файлы записи являются входными параметрами к TLC; другими типами файлов, такими как исходный код C, являются выходные параметры), но может быть полезным.
Можно использовать несколько директив TLC помимо %assign
изменить записи:
%createrecord | Создает новые записи верхнего уровня и может также задать подзаписи в них, включая пары имя/значение. |
%addtorecord | Добавляют поля к существующей записи. Новые поля могут быть парами имя/значение или псевдонимами к существующим записям. |
%mergerecord | Объединения одна или несколько записей. Первая запись содержит себя плюс копии содержимого других записей, заданного командой в последовательности. |
%copyrecord | Создает новую запись как %createrecord делает, кроме компонентов записи, прибывшей от существующей записи, которую вы задаете. |
%undef var | Удаляет (удаляет) var (переменная или запись) от осциллографа. Если var поле в записи, TLC удаляет поле из записи. Если var массив записи (список), TLC удаляет первый элемент массива; остающиеся элементы остаются доступными. Можно удалить только записи, которые вы создаете с %createrecord или %copyrecord . |
См. Директивы компилятора Выходного языка для получения дополнительной информации об этих директивах.
Файлы записи могут содержать списки или последовательности записей, имеющих тот же идентификатор. Наш пример содержит список трех записей, идентифицированных как Project
в Top
осциллограф. Перечислите ссылки, индексируются, нумеруются от 0, в порядке, в котором они появляются в файле записи. Вот код TLC, который компилирует данные из Name
поле Project
список:
* Index lists of values, e.g. %assign projects = Top.Project[0].Name + ", " + Top.Project[1].Name... + ", " + Top.Project[2].Name "%assign projects = Top.Project[0].Name + ", " + Top.Project[1].Name..." "+ ", " + Top.Project[2].Name" projects expands to Top.Project[0].Name + ", " + Top.Project[1].Name + ", " + Top.Project[2].Name = %<projects>
Scope.Record[n].Field
синтаксис похож на используемый в C к опорным элементам в массиве структур.
В то время как явная индексация, такая как вышеупомянутое, совершенно приемлема, часто предпочтительно использовать построение цикла при пересечении целых списков, как показано в Цикле По Спискам.
Условно, разделу файла записи, который занимает список, предшествует запись, которая указывает, сколько элементов списка присутствует. В
файлы, такие параметры объявляются как model
.rtwNum
, где Ident
идентификатор, используемый в записях в списке, который следует. В Ident
guide.rtw
, Project
список выглядит так:
NumProject 3 # Indicates length of following list Project { # First list item, called Top.Project[0] Name "Tea" # Alpha field Name, Top.Project[0].Name Difficulty 3 # Numeric field Top.Project[0].Difficulty } # End of first list item Project { # Second list item, called Top.Project[1] Name "Gillian" # Alpha field Name, Top.Project[1].Name Difficulty 8 # Numeric field Top.Project[1].Difficulty } # End of second list item Project { # Third list item, called Top.Project[2] Name "Zaphod" # Alpha field Name, Top.Project[2].Name Difficulty 10 # Numeric field Top.Project[2].Difficulty } # End of third list item
Таким образом, значение NumProject
описывает сколько Project
записи происходят.
model.rtw
файлы могут также содержать записи, которые запускаются с Num
но не параметры размера списка. TLC не требует, чтобы параметры размера списка запустились с Num
. Поэтому необходимо быть осторожными при интерпретации Num
идентификаторы записи. Встроенные TLC функционируют Ident
SIZE()
может определить количество записей в заданном осциллографе, следовательно длина списка.
Последний сегмент read-guide.tlc
использует %foreach
цикл, которым управляет NumProject
параметр, чтобы выполнить итерации Project
перечислите и управляйте его значениями.
* Traverse and manipulate list data via loops, e.g. %assign diffSum = 0.0 %foreach i = Top.NumProject - At top of Loop, Project = %<Top.Project[i].Name>; Difficulty =... %<Top.Project[i].Difficulty> %assign diffSum = diffSum + Top.Project[i].Difficulty - Bottom of Loop, i = %<i>; diffSum = %<diffSum> %endforeach %assign avgDiff = diffSum / Top.NumProject Average Project Difficulty expands to diffSum / Top.NumProject = %<diffSum> ... / %<Top.NumProject> = %<avgDiff>
Как можно вспомнить, TLC, выход выглядит так:
* Traverse and manipulate list data via loops, e.g. - At top of Loop, Project = Tea; Difficulty = 3 - Bottom of Loop, i = 0; diffSum = 3.0 - At top of Loop, Project = Gillian; Difficulty = 8 - Bottom of Loop, i = 1; diffSum = 11.0 - At top of Loop, Project = Zaphod; Difficulty = 10 - Bottom of Loop, i = 2; diffSum = 21.0 Average Project Difficulty expands to diffSum / Top.NumProjects = 21.0 / 3 = 7.0
diffSum
суммирования
, %foreach
цикл вводится с переменной i
объявленный как счетчик цикла, выполняющий итерации до NumProject
. Осциллограф цикла является всеми операторами, с которыми сталкиваются до соответствующего %endforeach
достигнут (%foreach
циклы могут быть вложены).Итерации цикла неявно запускаются в нуле и области значений в меньше, чем индекс, который задает верхнюю границу. Индекс цикла локален для тела цикла.
read-guide.tlc
Теперь, когда вы изучили read-guide.tlc
, пора изменить его. Это осуществление вводит два важных средства TLC, управление файлом и определяющий объем управления. Вы реализуете обоих в read-guide.tlc
скрипт.
Скрипты TLC почти неизменно производят выход в форме потоков символов. Выход обычно направляется к одному или нескольким буферам и файлам, коллективно названным потокам. До сих пор вы направили выход от read-guide.tlc
к Окну Команды MATLAB, потому что вы включали -v
включите командную строку. Докажите это путем исключения -v
когда вы запускаете read-guide.tlc
Ввод
tlc -r guide.rtw read-guide.tlc
Ничего, кажется, не происходит. На самом деле скрипт выполнялся, но выводился, был направлен к пустому устройству (иногда названный “битоприемником”).
Существует один активный выходной файл, даже если это является пустым. Чтобы задать, откройте, и близкие файлы, используйте следующие директивы TLC:
%openfile streamid ="filename" , "mode" %closefile streamid %selectfile streamid
Если вы не даете имя файла, последующий выход течет к буферу памяти, названному streamid
. Если вы не задаете режим, TLC открывает файл для записи и удаляет любое существующее содержимое (удовлетворяющий механизмам защиты файла уровня системы). Допустимыми идентификаторами режима является a
(добавьте) и w
(запишите, значение по умолчанию). Заключите эти символы в кавычки.
%openfile
директива создает файл/буфер (в w
режим), или открывает существующий (в a
режим. Обратите внимание, что необходимое равняется, расписываются за спецификацию файла. Несколько потоков могут быть открыты для записи, но только один может быть активным когда-то. Чтобы переключить потоки вывода, используйте %selectfile
директива. Вы не должны закрывать файлы, пока вы не сделаны с ними.
Поток вывода по умолчанию, который можно повторно задать с потоковым ID NULL_FILE
isNull
. Другим встроенным потоком является STDOUT
. Когда активировано с помощью %selectfile
, STDOUT
направляет выход к Окну Команды MATLAB.
Потоки NULL_FILE
и STDOUT
всегда открыты. Определение их с %openfile
генерирует ошибки. Используйте %selectfile
активировать их.
Направляющий %closefile
закрывает файл текущей производительности или буфер. До %openfile
или %selectfile
с директивой сталкиваются, выводят, переходит к ранее открытому потоку (или, если ни один не существует к пустому указателю). Используйте %selectfile
определять открытый поток для чтения или записи. На практике много скриптов TLC пишут части выходных данных, чтобы разделить буферы, которые затем выбраны в последовательности и их содержимом, буферизованном к одному или нескольким файлам.
В вашем tlctutorial/guide
папка, найдите файл read-guide-file-src.tlc
. Предоставленная версия этого файла содержит комментарии и три линии добавленного текста. Отредактируйте этот файл, чтобы реализовать управление выходным файлом, можно следующим образом:
Открытый read-guide-file-src.tlc
в вашем текстовом редакторе.
Сохраните файл как read-guide-file.tlc
.
Отметьте пять строк с комментариями, которые начинаются с %% ->
.
В соответствии с каждым из этих комментариев, вставьте директиву TLC, как обозначено.
Сохраните отредактированный файл как read-guide-file.tlc
.
Выполните read-guide-file.tlc
со следующей командой:
tlc -r guide.rtw read-guide-file.tlc
Если вы успешно выполнились, TLC создает файл guidetext.txt
который содержит ожидаемый выход и отображения Окна Команды MATLAB
*** Output being directed to file: guidetext.txt *** We're almost done . . . *** Processing completed.
Если вы не видели эти сообщения, или если текстовый файл не был произведен, рассмотрите материал и попробуйте еще раз. Если проблемы сохраняют, смотрят read-guide-file.tlc
в guide/solutions
подпапка, чтобы видеть, как необходимо задать управление файлом.
Структура Файлов Записи объясняет иерархическую организацию записей. Каждая запись существует в осциллографе, заданном записями, в которых она вкладывается. Файл в качестве примера, guide.rtw
, содержит следующие осциллографы:
Top Top.Employee Top.Project[0] Top.Project[1] Top.Project[2]
Чтобы относиться к полю или записи, задайте ее определение объема, даже если никакой другой контекст, который содержит идентификатор, не существует. Например, в guide.rtw
, поле FirstName
существует только в осциллографе Top.Employee
. Необходимо назвать его Top.Employee.FirstName
получая доступ к нему.
Когда модели представляют осциллографы, которые глубоко вкладываются, это может привести к чрезвычайно долгим идентификаторам, которые утомительны и подвержены ошибкам, чтобы ввести. Например:
CompiledModel.BlockOutputs.BlockOutput.ReusedBlockOutput
Этот идентификатор имеет осциллограф, который длинен и имеет подобные названия товара, которые вы могли легко ввести неправильно.
%with/%endwith
директива упрощает нагрузку кодирования скриптов TLC и разъясняет их поток управления. Синтаксис
%with RecordName [TLC statements] %endwith
Каждый %with
в конечном счете сопровождается %endwith
, и эти пары могут быть вложены (но не накладывающийся). Если RecordName
ниже верхнего уровня, вы не должны включать осциллограф верхнего уровня в его описание. Например, чтобы сделать текущий осциллограф guide.rtw
Top.Employee
, можно задать
%with Employee [TLC statements] %endwith
Естественно, %with Top.Employee
также допустимый синтаксис. После того, как заключенный в скобки %with/%endwith
, идентификаторы записи в операторах TLC не требуют, чтобы вы задали их внешний осциллограф. Однако отметьте следующие условия:
Можно получить доступ к записям за пределами текущего %with
определите объем, но необходимо квалифицировать их полностью (например, с помощью имени записи и полей).
Каждый раз, когда вы делаете присвоения на записи в %with
директива, необходимо квалифицировать их полностью.
%with
В последнем сегменте этого осуществления вы изменяете скрипт TLC путем добавления %with/%endwith
директива. Также необходимо отредактировать имена идентификатора записи (но не те из локальных переменных), чтобы составлять изменения осциллографа, следующего из %with
директивы.
Откройте скрипт TLC read-guide-scope-src.tlc
в текстовом редакторе.
Сохраните файл как read-guide-scope.tlc
.
Отметьте строки с комментариями, которые начинаются с %% ->
.
В соответствии с каждым из этих комментариев, вставьте директиву TLC или измените операторы, уже представляют, как обозначено.
Сохраните отредактированный файл как read-guide-scope.tlc
.
Выполните read-guide-scope.tlc
со следующей командой:
tlc -v -r guide.rtw read-guide-scope.tlc
Выход должен быть точно тем же самым как от read-guide.tlc
, кроме возможно для пробела, который вы можете ввести путем расположения с отступом разделов кода в %with/%endwith
или путем устранения пустых строк.
Полностью задавая осциллограф в %with
контекст не является ошибкой, это является просто ненужным. Однако не удаваясь полностью задать его осциллограф при присвоении его записи (например, %assign GrossRate = wageCost
) недопустимо.
Если ошибочный результат выполнения скрипта, рассмотрите обсуждение определения объема выше и отредактируйте read-guide-scope.tlc
устранить их. Как последнее прибежище смотрите read-guide-scope.tlc
в /solutions
подпапка, чтобы видеть, как необходимо было обработать определение объема в этом осуществлении.
Для получения дополнительной информации смотрите Осциллографы в model.rtw Файле и Переменном Определении объема.
Можно использовать команды TLC и встроенные функции, чтобы передать параметры от командной строки до выполняемого файла TLC. Самым общекомандным переключателем является -a
, который присваивает произвольные переменные. Например:
tlc -r input.rtw -avar=1 -afoo="abc" vars.tlc
Результат передачи этой пары строк через -a
совпадает с объявлением и инициализацией локальных переменных в выполняемом файле (здесь, vars.tlc
). Например:
%assign var = 1 %assign foo = "abc"
Вы не должны объявлять такие переменные в файле TLC, и они доступны для использования, когда установлено с -a
. Однако ошибки заканчиваются, если код присваивает необъявленные переменные, которые вы не задаете с -a
переключитесь при вызове файла. Также обратите внимание что (в отличие от -r
переключитесь), пробел не должен разделять -a
от параметра вы объявляете.
В итоговом разделе этого примера вы используете встроенную функцию GET_COMMAND_SWITCH()
распечатать имя файла записи, используемого в скрипте TLC и обеспечить параметр, чтобы управлять, подавлен ли код. По умолчанию код выполнен, но подавлен, если командная строка содержит -alist=0
:
Откройте скрипт TLC read-guide-param-src.tlc
в вашем текстовом редакторе.
Сохраните файл как read-guide-param.tlc
.
Чтобы позволить вашей программе получить доступ к входному имени файла из командной строки, сделайте следующее:
Ниже линии %selectfile STDOUT
, добавьте линию:
%assign inputfile = GET_COMMAND_SWITCH ("r")
%assign
директива объявляет и устанавливает переменные. В этом экземпляре это содержит идентификатор имени файла строки. GET_COMMAND_SWITCH()
возвращается любой аргумент строки следует за заданным переключателем команды TLC. Необходимо использовать ВЕРХНИЙ РЕГИСТР в именах встроенной функции.
Измените линию “*** WORKING WITH RECORDFILE
” чтобы читать можно следующим образом:
*** WORKING WITH RECORDFILE %<inputfile>
Чтобы управлять, выполняется ли раздел кода TLC, сделайте следующее:
Ниже линии “%assign inputfile = GET_COMMAND_SWITCH ("r")
добавление:
%if (!EXISTS(list)) %assign list = 1 %endif
EXISTS()
. Если никакая переменная списка не существует, программа присваивает тот. Это задает list
и по умолчанию его значением является TRUE
.Заключите строки кода в %if
блок.
%if (list) * Assign contents of a field to a variable, e.g. %assign worker = FirstName "%assign worker = FirstName" worker expands to FirstName = %<worker> %endif
Теперь код, чтобы присвоить worker
отправляется в выход только когда list
TRUE
.
Сохраните read-guide-param.tlc
.
Выполните read-guide-param.tlc
и исследуйте выход, с помощью команды
tlc -r guide.rtw read-guide-param.tlc
Это уступает
*** WORKING WITH RECORDFILE [guide.rtw] * Assign contents of a field to a variable, e.g. "%assign worker = FirstName" worker expands to FirstName = Arthur ***END
Executeread-guide-param.tlc
с командой:
tlc -r guide.rtw -alist=0 read-guide-param.tlc
С -alist=0
переключитесь, выход отображает только информацию за пределами if
оператор.
*** WORKING WITH RECORDFILE [guide.rtw] ***END
Предыдущие упражнения исследовали структуру файлов записи и подробно остановились, как использовать директивы TLC. Следующие директивы TLC обычно используются в скриптах TLC (см. Директивы компилятора Выходного языка для подробных описаний):
%addincludepath | Позвольте TLC найти включенные файлы. |
%addtorecord | Добавьте поля в существующую запись. Новые поля могут быть парами имя/значение или псевдонимами к существующим записям. |
%assign | Создайте или измените переменные. |
%copyrecord | Создайте новую запись и, если применимо, задайте подзаписи в них, включая пары имя/значение. Компоненты записи прибывают из существующей заданной записи. |
%createrecord | Создайте новые записи верхнего уровня и, если применимо, задайте подзаписи в них, включая пары имя/значение. |
%foreach/%endforeach | Выполните итерации переменной цикла от 0 до верхнего предела. |
%if/%endif | Управляйте, выполнен ли код, как в C. |
%include | Вставьте один файл в другого, как в C. |
%mergerecord | Объедините одну или несколько записей. Первая запись содержит себя плюс копии другого содержимого записей, заданного командой в последовательности. |
%selectfile | Прямые выходные параметры к потоку или файлу. |
%undef var | Удалите (удаляют) var (переменная или запись) от осциллографа. Если var поле в записи, TLC удаляет поле из записи. Если var массив записи (список), TLC удаляет первый элемент массива; остающиеся элементы остаются доступными. Только записи создаются через %createrecord или %copyrecord может быть удален. |
%with/%endwith | Добавьте осциллограф, чтобы упростить блоки ссылки. |