Считайте файлы записи с 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 — Отраженный, чтобы вывести.

  • Оператор Line 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_FILE, является null. Другим встроенным потоком является 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Добавьте осциллограф, чтобы упростить блоки ссылки.

Похожие темы