Считайте файлы записи с TLC

Учебный обзор

Objective: Изучает структуру файлов записи и изучает, как проанализировать их с директивами TLC.

Folder: matlabroot/toolbox/rtw/rtwdemos/tlctutorial/guide открытый

В этом примере вы интерпретируете простой файл структурированных записей с рядом скриптов TLC. Вы изучите, как записи структурированы, и как %assign TLC и %<> Директивы token expansion используются, чтобы обработать их. Кроме того, пример иллюстрирует циклы с помощью %foreach, и определение объема использования %with.

Пример включает эти шаги, которые необходимо выполнить последовательно:

  1. Structure of Record Files — Некоторый фон и простой пример

  2. Interpret Records — Представление содержимого файла записи

  3. Anatomy of a TLC Script — Разрушение в представлении

  4. Modify read-guide.tlc — Экспериментируйте с TLC

  5. Pass and Use a Parameter — Передайте параметры от командной строки до файлов TLC

  6. Review

Структура файлов записи

Модели компиляций генератора кода в структурированную форму вызвали файл записи, называемый model.rtw. Такие скомпилированные файлы модели подобны в синтаксисе и организации к файлам исходной модели, в этом они содержат серию иерархически вложенных записей формы

recordName {itemName itemValue}

Названия товара являются алфавитными. Значения элемента могут быть строками или числами. Числовые значения могут быть скалярами, векторами или матрицами. Фигурные скобки выделяют содержимое каждой записи, которая может содержать один или несколько элементов, разграниченных пробелом, перейти или возвратить символы.

В model.rtw файл, именем (первой) записи верхнего уровня является CompiledModel. Каждый блок представлен подзаписью в нем, идентифицирован именем блока. 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. Сделайте это сами теперь путем выполнения этих шагов:

  1. В MATLAB, папка изменения (cd) к вашей копии tlctutorial/guide в вашей рабочей папке.

  2. Произвести выход, только перечисленный, процесс guide.rtw со скриптом TLC read-guide.tlc путем ввода следующей команды:

    tlc -v -r guide.rtw read-guide.tlc

Использование команды примечания:

  • -r переключатель (для чтения) идентифицирует файл входных данных в этом случае guide.rtw.

  • Скрипт TLC, обрабатывающий файл данных, задан последней введенной лексемой.

  • -v переключатель (для многословного) направляет выход к командному окну, если дескрипторы файлов TLC это само.

Анатомия скрипта TLC

Вы теперь разделяете скрипт, который вы только запустили. Каждый “абзац” выхода от guide.tlc обсужден в последовательности в следующих кратких разделах:

Кодирование соглашений

Это некоторый основной синтаксис 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
    Дополнительный двойной префикс двоеточия указывает, что переменная, присваиваемая, является глобальной переменной. В его отсутствие TLC создает или изменяет локальную переменную в текущем осциллографе.

  • Линия 4 — отображения

    %<Top.Date> -- evaluates to:
    Предыдущая линия позволяет TLC распечатать %<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>"
    Альтернативный метод использует evals полей и одинаково эффективен.

+ оператор, который ассоциативен, также работает на числовые типы, векторы, матрицы и записи:

  • Числовые Типы — Добавляют два выражения вместе; оба операнда должны быть числовыми. Например:

    Вывод :
    * 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.rtw файлы, такие параметры объявляются как NumIdent, где 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. Поэтому необходимо быть осторожными при интерпретации NumIdent идентификаторы записи. Встроенные TLC функционируют 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_FILEisNull. Другим встроенным потоком является STDOUT. Когда активировано с помощью %selectfile, STDOUT направляет выход к Окну Команды MATLAB.

Примечание

Потоки NULL_FILE и STDOUT всегда открыты. Определение их с %openfile генерирует ошибки. Используйте %selectfile активировать их.

Направляющий %closefile закрывает файл текущей производительности или буфер. До %openfile или %selectfile с директивой сталкиваются, выводят, переходит к ранее открытому потоку (или, если ни один не существует к пустому указателю). Используйте %selectfile определять открытый поток для чтения или записи. На практике много скриптов TLC пишут части выходных данных, чтобы разделить буферы, которые затем выбраны в последовательности и их содержимом, буферизованном к одному или нескольким файлам.

Реализуйте управление выходным файлом

В вашем tlctutorial/guide папка, найдите файл read-guide-file-src.tlc. Предоставленная версия этого файла содержит комментарии и три линии добавленного текста. Отредактируйте этот файл, чтобы реализовать управление выходным файлом, можно следующим образом:

  1. Открытый read-guide-file-src.tlc в вашем текстовом редакторе.

  2. Сохраните файл как read-guide-file.tlc.

  3. Отметьте пять строк с комментариями, которые начинаются с %% ->.

    В соответствии с каждым из этих комментариев, вставьте директиву TLC, как обозначено.

  4. Сохраните отредактированный файл как read-guide-file.tlc.

  5. Выполните 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 директивы.

  1. Откройте скрипт TLC read-guide-scope-src.tlc в текстовом редакторе.

  2. Сохраните файл как read-guide-scope.tlc.

  3. Отметьте строки с комментариями, которые начинаются с %% ->.

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

  4. Сохраните отредактированный файл как read-guide-scope.tlc.

  5. Выполните 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:

  1. Откройте скрипт TLC read-guide-param-src.tlc в вашем текстовом редакторе.

  2. Сохраните файл как read-guide-param.tlc.

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

    1. Ниже линии %selectfile STDOUT, добавьте линию:

      %assign inputfile = GET_COMMAND_SWITCH ("r")

      %assign директива объявляет и устанавливает переменные. В этом экземпляре это содержит идентификатор имени файла строки. GET_COMMAND_SWITCH() возвращается любой аргумент строки следует за заданным переключателем команды TLC. Необходимо использовать ВЕРХНИЙ РЕГИСТР в именах встроенной функции.

    2. Измените линию “*** WORKING WITH RECORDFILE” чтобы читать можно следующим образом:

      *** WORKING WITH RECORDFILE %<inputfile>
  4. Чтобы управлять, выполняется ли раздел кода TLC, сделайте следующее:

    1. Ниже линии “%assign inputfile = GET_COMMAND_SWITCH ("r")добавление:

      %if (!EXISTS(list))
      	%assign list = 1
      %endif
      Программа проверяет, был ли параметр списка объявлен через внутренний (встроенный) функциональный EXISTS(). Если никакая переменная списка не существует, программа присваивает тот. Это задает list и по умолчанию его значением является TRUE.

    2. Заключите строки кода в %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.

    3. Сохраните read-guide-param.tlc.

  5. Выполните 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
  6. 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Добавьте осциллограф, чтобы упростить блоки ссылки.

Похожие темы