BEGIN (Определить структуру кода)
BEGIN
Операторы
.
операторы | Выполнимые инструкции программы. |
Директива компилятора BEGIN заставляет компилятор рассматривать группу операторов как единую структуру. BEGIN структура должна завершаться точкой или оператором END.
BEGIN используется в структуре управления EXECUTE чтобы позволить обрабатывать несколько строк кода как одну.
Пример:
EXECUTE Value
Procl !Выполняется если Value = 1
BEGIN !Выполняется если Value = 2
Value+=1
Proc2
.
Proc3 !Выполняется если Value = 3
.
См. Также:
CODE (Начать выполнимые операторы)
CODE
Оператор CODE отделяет секцию декларации данных от секции выполнимых операторов в пределах ПРОГРАММЫ, ПРОЦЕДУРЫ, или ФУНКЦИИ. Первый оператор, который выполнится в ПРОГРАММЕ, ПРОЦЕДУРЕ или ФУНКЦИИ - оператор после слова CODE.
Пример:
OrdList PROCEDURE !Объявляем процедуру
!Здесь идет описание данных
CODE !Это начало секции "Кода"
!Здесь идут выполнимые операторы
См. Также: , ,
COMPILE (Определить источник который нужно компилировать)
COMPILE(завершитель[,выражение])
завершитель | Строковая постоянная, который отмечает последнюю строку блока исходного кода. |
Выражение | Выражение, позволяющее условное выполнение COMPILE. Выражение имеет вид: EQUATE = целое. |
Директива COMPILE определяет блок строк исходного кода, которые нужно включить в компиляцию. Включенный блок начинается с директивы COMPILE и оканчивается строкой, которая содержит строковую константу-завершитель.
Сама строка-завершитель включается в COMPILE-блок.
Необязательный параметр "выражение" разрешает условный COMPILE. Форма выражения однозначна. Это - метка оператора EQUATE, либо установленный переключатель CONDITIONAL в Проектной Системе, сопровождаемый знаком равенства (=), за которым идет целая константа. Код между COMPILE и завершителем компилируется только если выражение истинно. Хотя выражение не требуется, COMPILE без параметра "выражение" не нужен, потому что весь исходный код компилируется, если явно не опущен с помощью OMIT. COMPILE и OMIT это, как говорят в Одессе, две большие разницы, и не могут быть вложены друг в друга.
Пример:
Demo EQUATE(1) !Задать EQUATE-значение Demo
CODE
COMPILE('EndDemoChk',Demo = 1)
!Компилировать только если Demo=1
DO DemoCheck !Проверка ограничителей
EndDemoChk !Конец кода условного COMPILE
См. Также: ,
ДИРЕКТИВЫ КОМПИЛЯТОРА
Директивы Компилятора операторы которые говорят компилятору выполнить некоторое действие во время компиляции. Эти операторы не включены в выполнимый объектный код программы который производит компилятор.
EJECT (Начать новую страницу листинга)
EJECT([подзаголовок модуля])
подзаголовок модуля | строковая постоянная, содержащая подзаголовок, который нужно напечатать. На следующей странице листинга, подзаголовок модуля печатается в первой колонке третьей строки. |
Директива EJECT начинает новую страницу и, необязательно, новый подзаголовок модуля в листинге Кларион. Если подзаголовок модуль опущен, то для следующей страницы будет задействован подзаголовок установленный предыдущими директивами SUBTITLE или EJECT.
Пример:
EJECT('Описания файлов') !Hачать новую страницу с новым
!подзаголовком
EMBED (Вложенная секция исходного кода)
EMBED(строка)
операторы вложенного исходного кода
.
Строка | строковая постоянная которая объявляет секцию вложенного исходного кода. Обычно используется для сообщений об ошибках, для легкой идентификации местоположения ошибки. |
операторы вложенного исходного кода | Любые допустимые операторы языка Кларион. |
Директива EMBED идентифицирует блок вложенного исходного кода. Блок начинается директивой EMBED и завершается оператором END или точкой.
Директива EMBED заставляет компилятор нумеровать строки исходного кода относительно начала вложенного кода. Строка используется в сообщениях об ошибках, чтобы определить какой именно вложенный код содержит ошибку. После завершающей точки или оператора END, нумерация строк компилятором продолжается с того места, где она была прервана директивой EMBED (включая число строк содержащихся во вложенном коде).
Директива EMBED обычно используется, чтобы идентифицировать блоки вложенного исходного кода включенного Генератором Приложений в произведенный им исходный код.
Пример:
CODE
SETCOLOR(7) !Строка 1
BLANK !Строка 2
SETCOLOR() !Строка 3
EMBED('EndEmbed','Source One') !Строка 4
SETCOLOR(23) !Вложенная Строка 1
SHOW(25,35,'Message') !Вложенная Строка 2
SETCOLOR() !Вложенная Строка 3
. !Строка 8, конец вложенного кода
OPEN(Screen) !Строка 9
END (Завершить структуру)
END
END завершает описание данных или составной выполнимый оператор. Функционально эквивалентен точке (.)
Пример:
Customer FILE,DRIVER('Clarion') !Описание файла
RECORD ! начать описание записи
Name STRING(20)
Number LONG
END ! конец описания записи
END !конец описания файла
CODE
IF Number <> SavNumber !начало структуры if
DO GetNumber
END !конец структуры if
CASE Action !начало структуры case
OF 1
DO AddRec
OF 2
DO ChgRec
OF 3
DO DelRec
END !конец структуры case
FUNCTION (Объявить функцию)
метка FUNCTION(список параметров)
[метка] локальные данные
CODE
операторы
RETURN(значение)
Список параметров | Необязательный список переменных которые передают значения ФУНКЦИИ. Этот список определяет имя каждого параметра используемого в пределах исходного кода ФУHКЦИИ. Каждый параметр отделяется запятой. Тип данных каждого параметра задается в прототипе функции в MAP-структуре. |
Локальные данные | Объявляет Локальные Динамические данные которые могут использоваться только этой функцией. |
CODE | Начало выполнимых операторов. |
операторы | Выполнимые инструкции программы. |
RETURN | Завершает выполнение функции и возвращает значение в выражение в котором функция использовалась. |
Значение | Числовая или строковая постоянная или переменная которая определяет результат вызова функции. |
Декларация ФУНКЦИИ начинает секцию исходного кода который может быть выполнен обращением к метке ФУНКЦИИ (со списком параметров, если есть). Функция может использоваться как компонент выражения, или параметр ПРОЦЕДУРЫ или другой ФУНКЦИИ в секции кода ПРОГРАММЫ. Выполнение ФУНКЦИИ завершается (требуемым) оператором RETURN в ее секции CODE.
Данные объявленные в пределах ФУНКЦИИ, между ключевыми словами FUNCTION и CODE, являются "Локальными Динамическими данными" к которым может обращаться только данная ФУНКЦИЯ (если они не переданы как параметр другой ПРОЦЕДУРЕ или ФУНКЦИИ). Эти данные кладутся на стек, память под них выделяется при входе в функцию, и освобождается при выходе из нее.
ФУНКЦИЯ должна быть объявлена в MAP модуля-ЧЛЕHА или ПРОГРАММЫ. Если она объявлена в MAP ПРОГРАММЫ, то она доступна любой другой процедуре или функции в программе. Если же объявлена в MAP модуля-ЧЛЕHА, то функция доступна только другим процедурам или функциям из этого модуля-ЧЛЕHА.
Пример:
PROGRAM
MAP
FulIName(STRING.STRING,STRING),STRING
!Прототип функции с параметрами
DayString,STRING
!Прототип функции без параметров
.
CODE
: !Глобальные операторы
:
FulIName FUNCTION(Last,First,lnit) !Функция полного имени
CODE !Hачало секции кода
IF Init !Если нет среднего инициала
RETURN(CLIP(First) & ' ' & Last)
! вернуть полное им
ELSE !в противном случае
RETURN(CLIP(First) & ' ' & Init & '. ' & Last)
! вернуть полное им
. !конец условия if
DayString FUNCTION !функция названия дн
CODE !Hачало секции кода
Day# = (TODAY()%7)+1 !Получить день недели из
!системной даты
EXECUTE Day# !Execute, возвращает название
!дн
RETURN('Воскресенье')
RETURN('Понедельник')
RETURN('Вторник')
RETURN('Среда')
RETURN('Четверг')
RETURN('Пятница')
RETURN('Суббота')
. !Конец структуры execute
См. Также:
Глобальные, локальные, статические, и динамические данные
Термины Глобальные и Локальные относятся к доступности данных. Глобальные данные доступны всюду в программе, Локальные данные имеют ограниченную доступность. Статические и Динамические относятся к распределению памяти для данных. Память для Статических данных выделяется при загрузке программы, для динамических данных выделяется во время исполнения.
Имеются три типа данных которые могут быть определены в программе на Кларион: Глобальные Статические данные, Локальные Статические данные, и Локальные Динамические данные.
Глобальные Статические данные объявлен в секции данных ПРОГРАММЫ, между ключевыми словами PROGRAM и CODE. Они доступны выполнимым операторам и выражениям в каждой ПРОЦЕДУРЕ и ФУНКЦИИ ПРОГРАММЫ. Они всегда в памяти во время исполнения программы.
Локальные Статические данные объявлены в модуле-ЧЛЕНЕ, между ключевыми словами MEMBER и PROCEDURE (или FUNCTION). Доступность этих данных ограничена переделами модуля-ЧЛЕНА в котором они объявлены; к ним могут обращаться только ПРОЦЕДУРЫ и ФУНКЦИИИ в модуле-ЧЛЕНЕ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Локальные Статические данные всегда в памяти во время выполнения программы.
Локальные Динамические данные объявлены в секции данных ПРОЦЕДУРЫ или ФУНКЦИИ, между ключевыми словами PROCEDURE (или FUNCTION) и CODE. Доступны только в ПРОЦЕДУРЕ или ФУНКЦИИИ в которой они объявлены; на них может ссылаться только эта ПРОЦЕДУРА или ФУНКЦИЯ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Память используемая локальными данными динамически размещается в стеке при вызове PROCEDURE или FUNCTION, и освобождается когда PROCEDURE или FUNCTION закончена.
Cтруктурам данных SCREEN, PULLDOWN, FILE, QUEUE, и REPORT назначается Статическая память, объявлены они Глобальными, Локальными в модуле-ЧЛЕНЕ, или локальными в ПРОЦЕДУРЕ или ФУНКЦИИ. Только описания переменных локальные в ПРОЦЕДУРЕ или ФУНКЦИИ размещены на стеке. Это позволяет ФУНКЦИИ или ПРОЦЕДУРЕ быть истинно рекурсивной, получая новую копию Локальных переменных при каждом ее вызове, при использовании только одной копии любой структуры.
См. Также:
INCLUDE (Компилировать код из другого файла)
INCLUDE(имя_файла[,секция])[,LIST]
имя_файла | строковая постоянная, которая содержит спецификацию DOS-файла с исходным текстом. Если не указано расширение, то по умолчанию принимается .CLA. |
Секци | строковая постоянная, которая является строковым параметром директивы SECTION, отмечающей начало исходного кода, который нужно включить. |
LIST | Поместить включенный код в листинг. |
Директива INCLUDE указывает исходный код, который нужно компилировать, но который находится в отдельном файле. При появлении директивы INCLUDE, указанный файл, или его же указанная секция компилируется так, как будто находится в самом компилируемом модуле.
Компилятор использует файл Переназначений (TS.RED) чтобы найти требуемый файл. Файл ищется по маршруту, заданному для данного типа имени_файла (обычно по расширению). Это делает ненужным задание полного пути к имени_файла, который нужно включить. Обсуждение файла Переназначений находится в Руководстве программиста.
Пример:
GenLedger PROCEDURE !Описываем процедуру
INCLUDE('filedefs.cla')
!Здесь включим описания файлов
CODE !Hачало секции кода
INCLUDE('Setups','ChkErr')
!Включаем секцию проверки ошибок из
!setups.cla
LIST (Помещает включенный исходный код в листинг компилятора)
LIST
Признак LIST директивы INCLUDE заставляет компилятор поместить включенный исходный код в листинг. Если признак LIST опущен, то только сам оператор INCLUDE появится в листинге.
Пример:
INCLUDE('filedefs.cla'),LIST
!Включить описания файлов и поместить их в листинг
MAP (Обьявить прототипы ПРОЦЕДУР и-или ФУНКЦИЙ)
MAP
прототипы
[MODULE()
прототипы
.]
.
MEMBER (Идентифицирует принадлежность модуля-члена)
MEMBER (программа)
[MAP
прототипы
.]
[метка] локальные данные
;процедуры или функции
Программа | Строковая константа, содержащая имя файла (без расширения) модуль PROGRAM. Этот параметр требуется. |
MAP | Описание локальных процедур и функций. Любые процедуры или функции объявленные здесь могут быть использованы только теми процедурами или функциями, чей код находится в этом модуле-ЧЛЕНЕ. |
прототипы | Объявления PROCEDURE или FUNCTION. |
локальные данные | Объявление локальных Статических данных, которые могут использоваться только теми процедура- ми и функциями чей исходный код находится в этом модуле-ЧЛЕНЕ. |
CODE | Начало блока выполнимых операторов. |
операторы | Выполнимые инструкции программы. |
RETURN | Завершает выполнение программы. Возвращает уп равление операционной системе. |
Процедуры или Функции | Исходный текст для процедур и функций в модуля-ЧЛЕНА. |
MEMBER - первый оператор в исходном модуле, который не является PROGRAM-модулем. Ему могут предшествовать только комментарии к исходному тексту и-или директивы компилятора или TITLE и SUBTITLE. Это слово требуется в начале любого исходного файла который содержит процедуры и-или ФУНКЦИИ которые используются в ПРОГРАММЕ. Оператор MEMBER идентифицирует программу к которой принадлежит данный исходный МОДУЛЬ.
Модуль-ЧЛЕНА может иметь собственную MAP-структуру. Процедуры и функции, объявленные в этой MAP, доступны только другим процедурам и функциям в этом модуле-ЧЛЕНЕ. Исходный код для процедур и функций, объявленных в MAP этого модуля-ЧЛЕНА, может содержаться в файле самого модуля-ЧЛЕНА, или другом файле. Если исходный код для ПРОЦЕДУРЫ или ФУНКЦИИ объявленной в MAP модуля-ЧЛЕНА содержится в отдельном файле, прототип такой процедуры и-или функции должен быть объявлен в структуре MODULE в пределах MAP данного модуля-ЧЛЕНА. Этот отдельный исходный файл модуля-ЧЛЕНА должен также содержать собственную MAP, которая объявляет тот же самый прототип для этой ПРОЦЕДУРЫ или ФУНКЦИИ. Любая PROCEDURE или FUNCTION не объявленная в Глобальной MAP (ПРОГРАММЫ) должна быть объявлена в локальной MAP в МОДУЛЕ-ЧЛЕНЕ который содержит исходный код.
Данные объявленные в модуле-ЧЛЕНЕ, между ключевыми словами MEMBER и PROCEDURE или FUNCTION, является "Локальными Статическими данными" и к ним могут обращаться только PROCEDURE или FUNCTION в пределах модуля.
Пример:
MEMBER('OrderSys')
!Модуль относится к программе OrderSys
MAP !Описываем локальные процедуры
Func1(STRING),STRING
!Func1 известна только в этом модуле
.
LocalData STRING(10) !Описываем данные, локальные для данно-
!го модуля-ЧЛЕHА
HistOrd PROCEDURE !Описание процедуры HistOrd
HistData STRING(10) !Данные, локальные для PROCEDURE
CODE
LocalData = Func1(HistData)
HistOrd2 PROCEDURE !Еще одна процедура
CODE
LocalData = Func1(LocalData)
Funcl FUNCTION(RecField)
CODE
См. Также: , , ,
Метки описаний и операторов
Операторы языка в исходном модуле могут быть разделены в две общих категории: описания данных и выполнимые операторы, или просто "данные" и "код".
Во время выполнения программы, описания данных сохраняют за собой области памяти которые управляются в соответствии c выполнимыми операторами. Любой оператор кода или описание данных может быть идентифицировано меткой. Метка описывает определенное местоположение в PRO RAM (памяти процессора?). Ко всем переменным, структурам данных, PROCEDUREМ, FUNCTIONМ, ПОДПРОГРАММАМ можно обращаться по их меткам.
В исходных модулях Кларион, 1ый столбец отведен для меток. Метка может содержать буквы (на верхнем или нижнем регистрах), цифры от 0 до 9, символ подчеркивания символ (_), и двоеточие (:). Первый символ должен быть буквой или символом подчеркивания. Метки не чувствительны к регистру букв, поэтому, CurRent и CURRENT одинаковые метки. Метка не может быть зарезервированным словом. Любое выполнимый оператор может иметь метку которая может использоваться как цель для оператора GOTO.
Метка оператора PROCEDURE или FUNCTION - название(имя) функции или процедуры. Использование метки ПРОЦЕДУРЫ в выполнимом операторе выполняет процедуру. Метка ФУНКЦИИ используется в выражениях, или списках параметров других функций, для присвоения значения, возвращаемого функцией.
МОДУЛЬ (указывает файл с модулем-ЧЛЕНОМ)
MODULE(sourcefile)
прототип процедурыe
прототип функции
.
sourcefile | Строковая константа. Если sourcefile содержит исходный код на Кларион, то задается имя файла (без расширения) который содержит ПРОЦЕДУРЫ и-или ФУНКЦИИ. Если sourcefile внешняя библиотека, то строка может содержать любой уникальный идентификатор. |
прототип Процедуры | прототип ПРОЦЕДУРЫ содержащейся в sourcefile. |
прототип Функции | прототип ФУНКЦИИ содержащейся в sourcefile. |
Структура MODULE именует модуль-ЧЛЕН. Он содержит прототипы дл ПРОЦЕДУР и ФУНКЦИЙ содержащихся в sourcefile. Структура MODULE может только быть объявлена в пределах MAP-структуры.
Пример:
Файл "prele.cla" содержит:
PROGRAM !программа Sample в prele.cla
MAP !Hачало MAP
MODULE('Loadit') ! исходный модуль loadit.cla
LoadIt ! процедура load it
. ! конец MODULE
MODULE('Compute') ! исходный модуль compute.cla
ComputeIt ! процедура compute it
. ! конец MODULE
. !конец MAP
Файл "loadit.cla" содержит:
MEMBER('Sample') !Описываем модуль-ЧЛЕH
MAP !Hачало локальной MAP
MODULE('Process') ! исходный модуль process.cla
ProcessIt ! процедура process it
. ! конец MODULE
. !конец MAP
См. Также: , ,
MODULE Объявление исходного модуля-члена.
MAP-структура содержит прототипы, которые описывают функции, процедуры и внешние исходные модули используемые в ПРОГРАММЕ или модуле-ЧЛЕНЕ. MAP объявленная в PROGRAM-модуле объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны повсюду в программное. MAP в модуле-ЧЛЕНЕ объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны только в этом модуле-ЧЛЕНЕ.
Пример:
Один файл содержит
Sample PROGRAM !Программа Sample в prele.cla
MAP !Hачало глобальной MAP
LoadIt !процедура "загрузи ЭТО"
. !Конец map
Отдельный файл содержит:
MEMBER('Sample') !Обьявить модуль-ЧЛЕН
MAP !Начать местную MAP
ComputeIt !процедура "Вычисли ЭТО"
. !Конец MAP
См. Также: , , ,
OMIT (Указывает не подлежащий компиляции текст)
OMIT(завершитель[,выражение])
завершитель | строковая постоянная, которая отмечает последнюю строку блока исходного кода. |
Выражение | Выражение, позволяющее условное выполнение OMIT, выражение должно иметь вид: EQUATE = целое. |
OMIT директива определяет блок исходных линий кода которые не надо компилировать. Эти строки могут содержать комментарии к исходному коду или секцию кода который был "отключен" для отладочных целей. Опущенный блок начинается с директивы OMIT и завершается строкой, которая содержит ту же самую строковую константу, что и завершитель. Сама строка-завершитель тоже входит в OMIT-блок.
Необязательный параметр "выражение" разрешает условный OMIT. Форма выражения однозначна. Это метка оператора EQUATE, либо установленный переключатель CONDITIONAL в Проектной Системе, сопровождаемый знаком равенства (=), за которым идет целая константа. Директива OMIT выполняется только, если выражение истинно.
COMPILE и OMIT - противоположны друг другу и не могут быть взаимно вложены.
Пример:
OMIT('**END**') !Безусловный OMIT
*************************************************
*
* Главный цикл программы
*
*************************************************
**END**
Demo EQUATE(0) !Задает EQUATE-значение Demo
CODE !Опустить только, если Demo
!равно нулю
OMIT('EndDemoChk',Demo = 0)
!Проверка ограничителей
DO DemoCheck !конец опущенного кода
EndDemoChk
См. Также: ,
PROCEDURE (Объявить процедуру)
Метка PROCEDURE (список параметров) [Метка] Локальные данные CODE операторы [RETURN]
Список параметров | Необязательный список переменных, которые передают значения ПРОЦЕДУРЕ. Этот список определяет имя каждого параметра используемого в пределах ИСХОДНОГО кода процедуры. Каждый параметр отделяется запятой. Тип данных каждого параметра указан в прототипе процедуры в MAP- структуре. |
Локальные данные | Объявите Локальные Динамические данные, которые могут использоваться только в этой процедуре. |
CODE | Начало выполнимых операторов. |
операторы | Выполнимые инструкции программы. |
RETURN | Завершить выполнение процедуры. Вернуться в точку, из которой процедура была вызвана. |
Декларация ПРОЦЕДУРЫ начинает секцию исходного кода который может быть выполнен в ПРОГРАММЕ. Процедура вызывается обращением к ее метке (и указанием параметров, если есть в наличии) как к исполняемому оператору в секции кода ПРОГРАММЫ, ПРОЦЕДУРЫ, или ФУHКЦИИ. ПРОЦЕДУРА завершается и возвращается в точку вызова когда выполнен оператор RETURN. Неявное RETURN происходит в конце выполнимого кода. Конец выполнимого кода для ПРОЦЕДУРЫ определен как конец исходного файла или начала новой ФУНКЦИИ, ROUTINE, или другой ПРОЦЕДУРЫ.
Данные объявленные в пределах ПРОЦЕДУРЫ, между ключевыми словами PROCEDURE и CODE, являются "Локальными Динамическими данными" к которым может обращаться только данная ПРОЦЕДУРА (если они не переданы как параметр другой ПРОЦЕДУРЕ или ФУНКЦИИ). Эти данные кладутся на стек, память под них выделяется при входе в процедуру, и освобождается при ее завершении.
ПРОЦЕДУРА должна быть объявлена в MAP модуля-ЧЛЕHА или ПРОГРАММЫ. Если она объявлена в MAP ПРОГРАММЫ, то она доступна любой другой процедуре или функции в программе. Если же объявлена в MAP модуля-ЧЛЕHА, то процедура доступна только другим процедурам или функциям из этого модуля-ЧЛЕHА.
Пример:
PROGRAM !Пример кода программы
MAP
OpenFile(FILE) !Прототип процедуры с параметром
ShoTime !Прототип процедуры без параметра
.
CODE
OpenFile(FileOne) !Вызов процедуры для открытия файла
IDLE(ShoTime) !Вызывать ShoTime пока ACCEPT ждет ввода
: !Еще какие-то операторы
OpenFile PROCEDURE(AnyFile) !Открывает любой файл
CODE !Hачало секции кода
OPEN(AnyFile) !Открыть файл
IF ERRORCODE() = 2 !Если файл не найден
CREATE(AnyFile) ! создать его
. !конец условия IF
RETURN !Вернуться обратно
ShoTime PROCEDURE !Показывает врем
Time LONG !Локальная переменна
CODE !Hачало секции кода
Time = CLOCK() !получить системное врем
SHOW(1,1,Time,@T3) !Показать врем
RETURN !Вернуться обратно
См. Также: ,
PROGRAM (Объявить программу)
PROGRAM
[MAP
прототипы
.]
глобальные данные
CODE
операторы
[RETURN]
процедуры или функции
MAP | Описание глобальных процедур и функций. |
прототипы | Объявления PROCEDURE или FUNCTION. |
глобальные данные | Объявление Глобальных Статических данных, которые могут использоваться всеми процедурами и функциями. |
CODE | Начало блока выполнимых операторов. |
операторы | Выполнимые инструкции программы. |
RETURN | Завершает выполнение программы. Возвращает управление операционной системе. |
Процедуры или Функции | Исходный текст для процедур и функций в Модуле PROGRAM. |
Оператор PROGRAM - первое описание в исходном модуле Кларион- программы.
Ему могут предшествовать либо комментарии к исходному тексту, либо директивы компилятора TITLE & SUBTITLE. Имя файла исходного текста ПРОГРАММЫ используется как имя файла для объектного (.OBJ) и исполняемого (.EXE) модулей при компиляции. Оператор PROGRAM может иметь метку, но метка игнорируется компилятором.
ПРОГРАММА с PROCEDURE и-или FUNCTION должна иметь MAP-структуру. MAP объявляет прототипы функций и-или процедур. Любая PROCEDURE или FUNCTION содержащаяся в отдельном файле исходного текста должна быть объявлена в структуре MODULE в пределах MAP.
Данные объявленные в модуле PROGRAM, между PROGRAM и CODE, является "Глобальными Статическими данными" и доступны из любой ПРОЦЕДУРЫ или ФУНКЦИИ в ПРОГРАММЕ.
Пример:
PROGRAM !Пробное описание программы
Fahrenheit REAL !Описание глобальных данных
Centigrade REAL
CODE !Hачало выполняемого кода
SETCOLOR(7)
BLANK
SHOW(4,20,'Введи температуру по Фаренгейту: ')
Fahrenheit = ENTRY(4,50.@N-04)
Centigrade = (Fahrenheit - 32) / 1.8
SHOW(6,20,'Температура по Цельсию: ')
SHOW(6,50,Centigrade,@N-04)
SHOW(8,20,'Press any key to exit')
ASK
См. Также: , , , ,
Прототипы ПРОЦЕДУР и ФУHКЦИЙ
имя[(список параметров)][,возвращаемый тип][,соглашение вызова][,RAW][,NAME()]
Имя | Метка оператора PROCEDURE или FUNCTION. |
Список параметров | типы данных переданных ПРОЦЕДУРЕ или ФУНКЦИИ в качестве параметров |
возвращаемый тип | Тип данных, который возвращает FUNCTION. |
Соглашения Вызова | Задает паскалевский или С-подобный вид передачи параметров через стек. |
RAW | Указывет, что параметры STRING или GROUP передают только адрес в памяти. |
NAME | Определяет замену, "внешнее" имя для ПРОЦЕДУРЫ или ФУНКЦИИ. |
Все ПРОЦЕДУРЫ и ФУНКЦИИ в ПРОГРАММЕ должны быть объявлены как прототипы в MAP. Прототип состоит из: имени ПРОЦЕДУРЫ или ФУНКЦИИ, необязательного списка параметров, и возвращаемого типа данных (если описывается FUNCTION). Если PROCEDURE или FUNCTION библиотека, написанная на другом языке, C или ПАСКАЛЕ, может быть указано соглашение о вызове (передаче параметров через стек. Также может быть определено внешнее (external) ИМЯ.
Необязательный список параметров - список типов данных которые передаются ПРОЦЕДУРЕ или ФУНКЦИИ, разделяются запятыми и заключается в круглые скобками. Любой параметр который может быть опущен при вызове PROCEDURE или FUNCTION, должен быть в список параметров прототипа и заключаться в угловые скобки ( <> ). Есть три типа параметров которые могут быть пропущены: параметры-значения, параметры-переменные, и параметры-указатели (?).
Параметры-значенияи "передаются по значению." В "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ используется копия переменной переданной в списке параметров "вызывающей" ПРОЦЕДУРЫ или ФУНКЦИИ. "Вызванная" PROCEDURE или FUNCTION не может изменить значение переменной переданной ей "вызывающей". Параметры-значения представлены в списке типом данных в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Допустимые типы параметров-значений:
BYTE | SHORT | USHORT | LONG | ULONG | SREAL | REAL | DATE | TIME | STRING |
Параметры-переменные "передаются по адресу". Переменная переданная по адресу имеет только один адрес в памяти.
Изменение значения переменной в "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ изменяет значение самой переменной, а не ее копии. Параметры-переменные представлены в списке типами данных со звездочкой (*) в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Допустимые типы параметров-переменных:
*BYTE | *SHORT | *USHORT | *LONG | *ULONG | *SREAL | *REAL |
*DATE | *TIME | *STRING | *PSTRING | *CSTRING | *GROUP |
Параметры-указатели передают имя структуры данных "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ. Передача указателя позволяет "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ использовать те команды Кларион, которые требуют метку структуры как параметр. Параметры-указатели представлены в списке типом указатель в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Параметры-указатели всегда "передаются по адресу." Допустимые типы параметров-указателей:
FILE | KEY | INDEX | QUEUE | SCREEN | REPORT | PULLDOWN |
FUNCTION должна ВОЗВРАЩАТЬ (RETURN) значение. Тип данных который нужно возвратить внесен в список, отделяется запятой, после необязательного списка параметров. Допустимые типы результатов, возвращаемых функцией:
BYTE | SHORT | USHORT | LONG | ULONG | SREAL |
REAL | DATE | TIME | STRING |
Вы можете, но не обязаны, указать способ передачи параметров - C или ПАСКАЛЬ для вашей ПРОЦЕДУРЫ или ФУНКЦИИ. Это обеспечивает совместимость библиотеками написанными на других языках. Если вы не указываете тип соглашения о вызове, по умолчанию используется внутреннее, основанное на регистрах соглашение.
Признак RAW позволяет вам передавать только адрес памяти СТРОКИ или ГРУППЫ, либо как параметр-значение, либо как параметр-переменную. Обычно, параметры STRING или GROUP передают адресату(?) еще и длину строки. Признак RAW подавляет передачу длины. Это наиболее полезно для функций внешних библиотек, которые ожидают получить только адрес строки.
Признак NAME обеспечивает внешнее имя для ПРОЦЕДУРЫ или ФУНКЦИИ. Это также сделано для совместимости с библиотеками написанными на других языках. Например: В некоторых компиляторах языка C, при C-шном соглашении о вызове заданном для функции, компилятор добавляет подчеркивание к имени функции.
Признак NAME позволяет линкеру разрешить нормальное имя функции не заставляя программу на Кларион обращаться к функции с именем, начинающимся с подчеркивания.
Пример:
MAP
MODULE('Test')
!'test.cla' содержит эту процедуру и функции
MyProcl(LONG) !LONG параметр-значение
MyProc2() !Hеобязательный LONG параметр-пере-
!менна
MyFuncl(*SREAL),REAL,C
!SREAL параметр-переменная, возвращаем REAL,
!C-шное соглашение вызова
MyFunc2(FILE),STRING
!FILE параметр-указатель, возвращаем STRING
. !конец MODULE и MAP
MODULE('Party3.Obj') !third-party библиотека
Func46(*CSTRING),REAL,C,RAW
!Передаем только адрес CSTRING в C-функцию
Func48(REAL),REAL,PASCAL !PASCALевский вызов
Func49(SREAL),REAL,C,NAME('_func49')
!C-шный вызов и внешнее имя функции
. . !конец MODULE и MAP
См. Также: , , , ,
ROUTINE (Обьявить локальную подпрограмму)
метка ROUTINE
метка | Имя подпрограммы. |
ROUTINE объявляет начало местной подпрограммы. Она локальна по отношению к ПРОЦЕДУРЕ или ФУНКЦИИ в которой она описана и должна быть в конце секции CODE ПРОЦЕДУРЫ или ФУНКЦИИ к которой она принадлежит.
ROUTINE вызывается оператором DO, за которым идет метка подпрограммы. Управление Программе после выполнения ROUTINE возвращается оператору после слова DO. ROUTINE заканчивается концом исходного модуля, или началом другой ROUTINE, ПРОЦЕДУРЫ, или ФУНКЦИЙ. Оператор RETURN может также использоваться для завершения кода ROUTINE (подобно RETURN в ПРОЦЕДУРЕ).
Пример:
SomeProc PROCEDURE
CODE
!операторы
DO CheckPage !вызов подрограммы
!еще операторы
CheckPage ROUTINE !начало подпрограммы, и одновремен-
!но - окончание процедуры
IF LineCount > 55 !Если больше 55 строк
PRINT(@FF) ! делаем перевод формата
LineCount = 0 ! сбросить счетчик строк
EXIT ! выход из подпрограммы
. !Конец условия if
См. Также: ,
SECTION (Определить секцию исходного кода)
SECTION(строка)
Строка | строковая постоянная который именует СЕКЦИЮ. |
Директива компилятора SECTION описывает начало блока выполнимого Директива компилятора SECTION описывает начало блока выполнимого исходного кода или описаний данных. SECTION используется как необязательный параметр директивы INCLUDE чтобы включить конкретный блок исходного кода. SECTION завершается следующей СЕКЦИЕЙ или концом файла.
Пример:
SECTION('FirstSection') !Hачало секции
FieldOne STRING(20)
FieldTwo LONG
SECTION('SecondSection')
!Заканчиваем предыдущую, начинаем новую
!секцию
IF Number <> SavNumber
DO GetNumber
.
SECTION('ThirdSection')
!Заканчиваем предыдущую, начинаем новую
!секцию
CASE Action
OF 1
DO AddRec
OF 2
DO ChgRec
OF 3
DO DelRec !Третья секция завершается с кон-
. !цом файла
См. Также: INCLUDE
Специальные символы
Это список специальных символов используемых в языке Кларион:
Инициаторы | ! | Восклицательный Знак начинает комментарий |
? | Вопросительный знак начинает equate-метку поля или меню | |
@ | Знак "Коммерческое ЭТ" начинает элемент формата или управления(?). | |
* | Звездочка начинает параметр передаваемый по адресу в прототип MAP. | |
Терминаторы (завершители) | ; | Точка-с-запятой разделяет выполнимые операторы стоящие в одной строке CR/LF ВК/ПС разделитель выполнимых операторов |
. | Точка завершает структуру. | |
Ѓ | Вертикальная черта - символ продолжения строки исходного текста | |
# | Знак фунта объявляет неявную LONG-переменную. | |
$ | Доллар объявляет неявную REAL-переменную. | |
" | Двойная кавычка объявляет неявную STRING-переменную. | |
Разделители | ( ) | Круглые Скобки окружают список параметров. |
[ ] | Скобки окружают список индексов массива | |
' ' | Апострофы окружают строковую константу. | |
{ } | Фигурные скобки окружают индекс повторения в строковой константе. | |
< > | Угловые скобки окружают ASCII-код в строковой константе, или указывают параметр в прототипе MAP, который может быть опущен | |
Коннекторы (соединители) | . | Точка - десятичная точка используемая в числовых константах. |
, | Запятая соединяет параметры в списке параметров. | |
: | Двоеточие соединяет префикс с меткой или группирует символы в метках. | |
_ | Подчеркивание соединяет группы символов в метках. | |
Операторы | + | Сложение. |
- | Вычитание | |
* | умножение. | |
/ | деление. | |
% | деление по модулю. | |
^ | Возведение в степень. | |
< | меньше чем. | |
> | больше чем. | |
= | присвоение или равенство. | |
~ | логическое "НЕ". | |
& | Конкатенация (строк) |
SUBTITLE (Печатать подзаголовок МОДУЛЯ)
SUBTITLE(подзаголовок модуля)
подзаголовок модул | строковая постоянная содержащая подлежащий печати подзаголовок. |
SUBTITLE печатает в первой колонке третьей строки листинга Кларион. Директива SUBTITLE не печатается в листинге. Директива SUBTITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Подзаголовок остается одним и тем же на каждой странице листинга, если его не измененит директива EJECT.
Пример:
SUBTITLE ('Описания Глобальных Данных')
TITLE (Печатает заголовок МОДУЛЯ)
TITLE(заголовок модуля)
заголовок модул | строковая постоянная, содержащая заголовок, который нужно напечатать. |
TITLE печатает в первой колонке первой строки листинга Кларион. Директива TITLE не печатается в листинге. Директива TITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Заголовок остается одним и тем же на каждой странице листинга.
Пример:
TITLE ('ORDERSYS - Листинг Системы Ввода Заказов')
Зарезервированные слова
Следующие ключевые слова зарезервированы и не могут использоваться как метки.
AND | ELSE | LOOP | RETURN |
BEGIN | ELSIF | MEMBER | ROUTINE |
BREAK | END | NOT | SECTION |
BY | EXECUTE | OF | TDEN |
CASE | EXIT | OMIT | TIMES |
COMPILE | FUNCTION | OR | TO |
CYCLE | GOTO | OROF | UNTIL |
DO | IF | PROCEDURE | WHILE |
EJECT | INCLUDE | PROGRAM | XOR |
Следующие ключевые слова могут использоваться как метки структур данных или выполнимых операторов. Они не могут использоваться как метки операторов PROCEDURE or FUNCTION:
CODE | FOOTER | MENU | QUEUE | ROW |
COL | GROUP | MODULE | RECORD | SCREEN |
DETAIL | HEADER | OPTION | REPEAT | SUBTITLE |
FILE | MAP | PULLDOWN | REPORT | TITLE |
Завершение структуры
Составные структуры данных создаются, когда описания данных вложены в другие описания данных. Имеются множество составных структур данных в языке Кларион: SCREEN, REPORT, FILE, RECORD, GROUP, и т.д. Эти составные структуры данных должны завершать с точкой (.) или ключевым словом END. Операторы IF, CASE, EXECUTE, LOOP, и BEGIN, все формы управляющих структур должны также быть завершены точкой или оператором END.
BYTE (однобайтное целое без знака)
метка BYTE(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | однобайтная переменная |
Биты: | 7___________________0 |
Диапазон: | 0..255 |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает альтернативное, "внешнее" имя для поля. |
EXTERNAL | Указывает, что переменная описывается и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
BYTE описывает однобайтное беззнаковое целое. Присвоение значения выходящего за пределы диапазона приводит к непредсказуемым результатам.
Пример:
Countl | BYTE | !Declare one byte integer |
Count2 | BYTE,OVER(Countl) | !Declare OVER the one byte integer |
Count3 | BYTE,DIM(4) | !Declare it an array of 4 bytes |
Count4 | BYTE(5) | !Declare with initial value |
Count5 | BYTE,EXTERNAL | !Declare as external |
Count6 | BYTE,NAME('SixCount') | !Declare with external name |
ExampleFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
CountS BYTE,NAME('Counter')!Declare with external name
. .
CSTRING (строка фиксированной длины, завершающаяся нулем)
метка СSTRING( | length string constant picture |
)[,DIM()][,OVER()][,NAME()] [,EXTERNAL] |
Формат: | Фиксированное число байт. |
Диапазон: | От 1 до 65,535 байт |
length | Числовая константа, которая задает размер строки в байтах. При использовании этого параметра,строка инициализируется пробелами. |
string constant | Начальное значение строки. Длина СSTRING-a устанавливается (в байтах) по длине этой строковой константы плюс завершающий нулевой символ. |
picture | Используется для форматирования значений, присвоенных строке. Длина такой строки, это количество байт, достаточное для хранения форматированной строки и завершающего нулевого символа. Строка инициализируется пробелами. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
CSTRING описывает символьную строку, завершающуюся нулевым символом (ASCII NULL). Она соответствует строкам, используемым в языке C и типу данных "ZSTRING" в Btrieve Record Manager. Под CSTRING в памяти выделяется участок постоянной длины, при этом, завершающий нулевой символ помещается в конец введенных данных. CSTRING во время исполнения преобразовывается в промежуточный тип STRING. Тип CSTRING имеет смысл употреблять для совместимости с внешними файлами и/или процедурами.
Пример:
Name CSTRING(21) !Declare 21 byte field - 20 bytes data
OtherName CSTRING(21),OVER(Name) !Declare field over name field
Contact CSTRING(21),DIM(4) !Array 21 byte fields - 80
! bytes data Company
Company CSTRING('Clarion Software, Inc.') !23 byte string 22
! bytes data
Phone CSTRING(@P(###)###-####p) !Declare 14 bytes 13 bytes
! data
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
NameField CSTRING(21),NAME('ZstringField')
!Declare with external name
. .
DATE (четырехбайтная дата)
метка DATE[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | год мм дд |
Диапазон: | год: 1..9999 месяц: 1..12 день: 1..31 |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
DATE описывает четырех байтную переменную типа даты. Этот формат соответствует типу поля "DATE" в Btrieve Record Manager. DATE, используемые в числовых выражениях, преобразовываются в число дней, прошедших с 28 декабря 1800 года (стандартная кларионовская дата, обычно хранится как LONG). Допустимый диапазон стандартной кларионовской даты - от 1 января 1801 года по 31 декабря 2099 года. Использование значений, выходящих за пределы данного диапазона, приводит к непредсказуемым результатам. Тип DATE имеет смысл употреблять для совместимости с внешними файлами и/или процедурами.
Пример:
DueDate DATE !Declare a date field
OtherDate DATE,OVER(DueDate) !Declare field over date field
ContactDate DATE,DIM(4) !Array of 4 date fields
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
DateRecd DATE,NAME('DateField')
. . !Declare with external name
См. также: Standard Date
DECIMAL (упакованное десятичное число фиксированной длины со знаком)
метка DECIMAL(length[,places][,initial value])[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | s d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 |
Биты: | 60____________________________________________0 |
Диапазон: | -999,999,999,999,999..999,999,999,999,999 |
length | ТРЕБУЕМАЯ числовая константа, содержащая общее число десятичных цифр (в целой и дробной частях вместе взятых) в переменной. Максимальная длина 15. |
places | Числовая константа, уточняющая количество цифр в дробной части (справа от десятичной точки) в переменной. Она должна быть меньше или равна параметру length. Если опущена, то описываема переменная считается целочисленной. |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
DECIMAL описывает переменную переменной длины со знаком, в формате BCD (binary-coded-decimal) Intel 8087. Каждый байт в DECIMAL хранит две десятиные цифры (по 4 бита на цифру). Самый левый байт хранит знак числа в своем старшем ниббле (0 = плюс, что-нибудь другое - минус) и одну десятичную цифру. Таким образом, переменные типа DECIMAL всегда содержат нечетное число цифр (скажем, DECIMAL(10) и DECIMAL(11) оба занимают по 6 байт. Присвоение DECIMAL-переменным значений, выходящих за пределы DECIMAL приводит к непредсказуемым результатам.
Пример:
Countl DECIMAL(5,O) !Declare three-byte signed packed decimal
Count2 DECIMAL(5),OVER(Countl) !Declare OVER the three-byte
signed packed decimal
Count3 DECIMAL(5.0),DIM(4) !Declare it an array of 4 decimals
Count4 DECIMAL(5,0,5) !Declare with initial value
Count5 DECIMAL(5,O),EXTERNAL !Declare as external
Count6 DECIMAL(5,O),NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
Count7 DECIMAL(5,O),NAME('Counter 1) !Declare with
. . !external name
DIM (размерность массива)
DIM(измерение,....,измерение)
измерение | Числовая константа, которая задает количество элементов в данном измерении массива. |
Атрибут DIM объявляет
перемнную-массив. Такая
переменная повторяется
столько раз, сколько указано в
параметрах ИЗМЕРЕНИЕ.
Многомерные массивы можно
рассматривать как вложенные
одномерные. Каждое измерение
массива имеет соответствующий
индекс. Таким образом,
обращаясь к переменной -
элементу трехмерного массива,
надо указать три индекса. Хотя
на число измерений не
накладывается ограничений, но
размер массива не должен
превышать 65,520б.С атрибутом DIM
можно использовать следующие
типы данных:
SHORT | REAL | STRING | CSTRING | PSTRING |
ULONG | USHORT | SREAL | DATE | TIME |
Индексы однозначно
определяют конкретный элемент
массива. Список индексов
содержит индексы для каждого
ИЗМЕРЕНИЯ массива. В списке,
индексы отделяются друг от
друга запятыми, а весь список
заключается в квадратные
скобки ([ ]). Индекс может быть
числовой константой,
выражением или функцией. Если
надо обратиться ко всему
массиву целиком, то надо
использовать метку этого
массива без списка индексов.
Структура GROUP - особый случай.
Каждый уровень вложенности
добавляет индексы и GROUP и ее
переменным. Данные, описанные в
GROUP можно использовать точно
так же, как и собственно GROUP.
Пример:
Screen GROUP !Текст на экране
Row GROUP,DIM(25) !25 строк
Pos GROUP,DIM(80) !Две тысячи знакомест
Attr BYTE !Байт атрибута
Char BYTE !Собственно символ
. . . !Завершаем все три группы
В предыдущей группе:
Screen это 4,000байтная GROUP
Row[1] это 160байтная GROUP
Pos[1,1] это 2хбайтная GROUP
Attr[1,1] это BYTE
Char[1,1] это BYTE
Month STRING(10),DIM(12) !Размерность для месяца - 12
CODE
CLEAR(Month) !Весь массив заполнить пробелами
Month[1] = 'January' !Заполнить массив названиями
Month[2] = 'February'
MonthE3] = 'March'
См. также: MAXIMUM
Массивы как
параметры процедур и функций
Массив можно передать в PROCEDURE
или FUNCTION.
Прототип, описанный в
MAP-структуре должен описывать
тип данных "массив" как
параметр-переменную
("передается по адресу") с
пустым списком индексов.
Вызывающий оператор может
передать массив в ROCEDURE или
FUNCTION.
Пример:
PROGRAM
MAP
MainProc
AddCount(*LONG[,],*LONG[,]) !Передаем 2 двумерных
. !масива типа LONG
CODE
MainProc
MainProc PROCEDURE
TotalCount LONG,DIM(10,10)
CurrentCnt LONG,DIM(10,10)
CODE
AddCount(TotalCount,CurrentCnt) !Вызывая процедуру, переда-
!ем ей массивы
AddCount PROCEDURE(Tot,Cur) ! Процедуре нужны два массива
CODE
LOOP I# = 1 TO MAXIMUM(Tot,1) !Цикл по первому индексу
LOOP J# = 1 TO MAXIMUM(Tot,2) !Цикл по второму индексу
Tot[I#,J#l += Cur[I#,J#] ! увеличить TotalCount на
. . ! CurrentCnt
CLEAR(Cur) !Очистить массив CurrentCnt
RETURN
См. также: , , MAXIMUM
EQUATE (назначить метку)
метка | EQUATE( | label constant picture |
) |
метка | Метка исполняемого оператора. Используется для присвоения оператору еще одной метки. |
constant | Числовая или символьная константа. Используется для описания сокращенного названия содержимого константы, и позволяет легко изменять и находить эту константу. |
picture | Элемент шаблона. Дает сокращенное имя шаблону. Тем не менее, форматтеры экранов и отчетов в кларионовском редакторе не распознают назначенные метки как разрешенные шаблоны. |
Директива EQUATE не занимает
память во время исполнения. Она
используется для присвоения
метки другой метке или
константе. Метка директивы EQUATE
не может быть такой же, как ее
параметр.
Пример:
Init EQUATE(SetUpProg) !Обзовем процедуру по другому
Off EQUATE(0) !Off означает нуль
On EQUATE(1) !On означает один
Pi EQUATE(3.1415927) !Значение числа ПИ
EnterMsg EQUATE('Press Ctrl-Enter to SAVE')
SocSecPic EQUATE(@P###-##-##IfltP)!Формат номера карточки
!социального страхован.
См. также: Зарезервированные
слова
EXTERNAL (переменная описана извне)
EXTERNAL
Атрибут EXTERNAL указывает на то, что переменная, которой он присвоен, описана во внешней библиотеке. Таким образом, переменная с атрибутом EXTERNAL определена и может использоваться кларионовским кодом, но под нее не будет выделена память. Память для такой переменной выделяется самой внешней библиотекой. Этот атрибут позволяет Clarion-программам иметь доступ к полям, описанным как PUBLIC во внешних библиотеках.
EXTERNAL допустим только для
переменных, описанных ВНЕ
структур FILE, QUEUE или GROUP.
Пример:
PROGRAM
MAP
MODULE('External.Obj')
AddCount,PASCAL !External library with PASCAL
. . ! calling convention
TotalCount LONG,EXTERNAL !Variable declared in external library
См. также: NAME
Документация по Clarion
метка | GROUP[,PRE()][,DIM()][,OVER()][,NAME()][,EXTERNAL] declarations . |
declarations | Одно или более последовательных описаний переменных. |
PRE | Метка-префикс для переменных этой структуры. |
DIM | Размерность переменных как массива. |
OVER | Разделяет одно и то же место в памяти с другойпеременной или структурой. |
NAME | Задает "внешнее" имя поля. |
EXTERNAL | Указывает на то, что переменная описана и память под нее выделена во внешней библиотеке. НЕ разрешено с описаниями FILE, QUEUE или GROUP. |
(SPA - Мне кажется, что они
противоречат сами себе - пишут,
что атрибут external не разрешен
для group, а сами указывают его в
списке возможных параметров...)
Структура GROUP позволяет
обращаться к нескольким
переменным по одной метке. Это
может использоваться для
измерения (?) набора переменных,
или для присвоения или
сравнения наборов переменных
одним оператором. В больших
сложных программах, структуры
GROUP удобны для подержки наборов
связанных разнотипных данных.
GROUP должна завершаться точкой
или оператором END.
При обращении оператора или
выражения к переменной типа
GROUP, GROUP рассамтривается как
STRING, составленная из всех
переменных этой структуры.
Структура GROUP может быть
вложена в другую структуру
данных, как например, RECORD или
другая GROUP.
Из-за внутреннего
представления, числовые
переменные (кроме DECIMAL)
описанные в группе не совсем
корректно обрабатываются, при
использовании их как строк. По
этой причине, построение ключа,
в котором используются поля
типа GROUP, содержащие числовые
переменные, может привест к
неожиданной
последовательности сравнения
(collating sequence).
Пример:
NameGroup GROUP,PRE(Nme) !Name group
First STRING(20) ! first name
Middle STRING(L) ! middle initial
Last STRING(20) ! last name
. !End group declaration
DateTimeGrp GROUP,PRE(Dtg),DIM(10) !Date/time array
Date LONG
Time LONG
. !End group declaration
ЭЛЕМЕНТЫ ШАБЛОНОВ
Элементы шаблонов предлагают формат масок для просмотра и/или редактирования переменных. Элементы шаблонов можно использовать как параметры для описания переменных типа STRING, ENTRY, или STRING OPTION в SCREEN-структурах; как параметры операторов STRING в REPORT-структурах; как параметры некоторых процедур и функций Клариона; или, как параметры описаний STRING, CSTRING и PSTRING. Есть семь типов элементов шаблонов: числовые и валюта, научная нотация, дата, время, образец, key-in template и строки.
Шаблоны
чисел и валюты
@N[валюта][знак][заполнение]размер[группирование][места][валюта][знак][B]
@N | Все шаблоны чисел и валюты начинаются с @N. |
валюта | Либо знак доллара ($) либо строковая константа, заключенная в тильды (~). Если есть признак знака и нет признака заполнения, то символ валюты будет "плавать" возле старшей левой цифры. Если же есть признак заполнения, то символ валюты остается в крайней левой позиции. Если символ валюты стоит после размера и группирования, то он будет располагаться в конце показываемого числа. |
знак | Задает формат вывода отрицательных чисел. Если тире стоит перед ЗАПОЛНЕНИЕМ и РАЗМЕРом, то отрицательные числа будут выводиться с ведущим знаком "минус". Если же тире идет после РАЗМЕРа, ГРУППИРОВАНИя, places, и ВАЛЮТы, то числа будут выводиться с хвостовым минусом. Если в обоих позициях, предназначенных для ЗНАКа стоят скобки, то отрицательные числа будут выводиться без минуса, но заключенными в скобки. |
заполнение | Указывает вид ведущих нулей нули, пробелы или звездочки (*). Если ЗАПОЛНЕНИЕ опущено, то ведущие пробелы подавляются. 0 Ведущие нули выводятся, ГРУППИРОВАНИЕ подавлено Вместо нулей пробелы, ГРУППИРОВАНИЕ подавлено * Вместо ведущих нулей выводятся звездочки |
размер | РАЗМЕР требуется, чтобы указать общее число значащих цифр для вывода, включая количество цифр в признаке МЕСТА и всех символов форматирования. |
группирование | Признак ГРУППИРОВАНИЯ (кроме запятой, которая принимается по умолчанию) может быть помещен справа от РАЗМЕРА, для указания разделитель групп из трех цифр. |
. | Порождает точки |
- | Порождает тире |
_ | Порождает пробелы (НЕ подчеркивания!) |
места |
Задает символ десятичного разделителя и число цифр в дробной части. Число цифр в дробной части должно быть меньше, чем РАЗМЕР. Десятичным разделителем может быть точка (.), слабое ударение ('), или буква "v" (только для описания формата хранения STRING-полей, а не для вывода). . Точка порождает точку как десятичный разделитель ` Слабое ударение порождает запятую как десятичный разделитель. v НЕ порождает десятичный разделитель (только для хранения STRING-полей) |
B | Если значение нулевое, то число выводится в виде пробелов. |
Элементы шаблонов чисел и валюты форматируют числа для вывода на экран или в отчет. Если значение больше, чем можно вывести в текущем шаблоне, такое значение выводится в виде строки из звездочек.
Пример:
Число | Результат | Формат |
@N9 | 4,550,000 | Девять цифр, группирование запятыми (по умолчанию) |
@N_9B | 4550000 | Девять цифр, без группирования, ведущие нули выводятся как пробелы |
@N09 | 004550000 | Девять цифр, ведущие нули выводятся |
@N*9 | ***45,000 | Девять цифр, заполнение звездочками, группирование запятыми |
@N9_ | 4 550 000 | Девять цифр, группирование пробелами |
@N9. | 4.550.000 | Девять цифр, группирование точками |
Десятич. дробь |
Результат | Формат |
@N9.2 | 4,550.75 | Две цифры в дробной части, десятичный разделитель - точка |
@N_9.2B | 4550.75 | То же, без группирования, если ноль, то выводится строка пробелов. |
@N_9'2 | 4550,75 | Две цифры в дробной части, десятичный разделитель запятая |
@N9.'2 | 4.550,75 | Десятичный разделитель запятая, группирование точками |
@N9_'2 | 4 550,75 | Десятичный разделитель запятая, группирование пробелами |
Со знаком | Результат | Формат |
@N-9.2B | 2,347.25 | Ведущий минус, если ноль, то вывести пустую строку |
@N9.2- | 2,347.25- | Хвостовой минус |
@N(10.2) | (2,347.25) | Вывести в скобках, если отрицательное |
Знак доллара |
Результат | Формат |
@N$9.2B | $2,347.25 | Ведущий знак доллара, вывести пустую строку, если ноль |
@N$10.2- | $2,347.25- | Ведущий знак доллара, хвостовой минус, если отрицательное |
@N$(11.2) | $(2,347.25) | Ведущий знак доллара, вывести в скобках, если отрицательное |
Национальные валюты |
Результат | Формат |
@N12_'2~ F~ | 1 5430,50 F | Франция |
@N~L. ~12' | L.1.430.050 | Италия |
@N~L~12.2 | L1,240.50 | Великобритания |
@N~kr~12'2 | kr1.430,50 | Норвегия |
@N~DM~12'2 | DM1.430,50 | Германия |
@N12_'2~ mk~ | 1 430,50 mk | Финляндия |
@N12'2~ kr~ | 1,430.50 kr | Швеция |
Только хранение
Шаблоны:
Variablel STRING(@N_6v2) !Шесть байт хранятся БЕЗ десятич-
!ного разделителя
CODE
Variablel="1234.56" !Храним в виде '123456'
SHOW(1,1,Variablel,@N_7.2)
!Выводим с десятичн. точкой: '1234.56'
LIKE (определяемые пользователем типы данных)
новое_описание LIKE(выглядит_как)[,DIM()][,OVER()][,PRE()][,NAME()]
новое_описание - Метка
описания нового типа данных.
выгдядит_как - Метка описания
элемента данных, чье
определение будет
использовано.
LIKE говорит компилятору
определить новое_описание
используя то же описание, что и
для выглядит_как, включая все
атрибуты.
Новое_описание может
использовать атрибуты DIM и OVER.
Если выглядит_как имело
атрибут DIM, то новое_описание
сразу будет массивом. Если в
будущем атрибут DIM добавится к
новому_описанию, то
размерности массива
определятся в будущем (???).
Атрибуты PRE и NAME могут быть
использованы, если надо. Если
выглядит_как уже имеет эти
атрибуты, новое_описание
унаследует их и может привести
к ошибке компилятора. Чтобы
исправить это положение, задай
принудительно PRE или NAME для
нового_описания, чтобы
перекрыть унаследованный(е)
атрибут(ы).
Пример:
Amount REAL !Описываем поле
QTDAmount LIKE(Amount) !Используем то же описание
YTDAmount LIKE(OTDAmount) !И еще раз
MonthlyAmts LIKE(Amount),DIM(12) !То же описание, но для массива
!из 12 элементов
AmtPrPerson LIKE(MonthlyAmts),DIM(10)
!То же описание, но уже для 120 элементов (12,10)
Construct GROUP,PRE(Con) !Описываем группу
Fieldl LIKE(Amount) ! con:field1 - real
Field2 STRING(10) ! con:field2 - string(10)
.
NewGroup LIKE(Construct),PRE(New)!Описываем новую группу с
! new:field1 - real
! new:field2 - string(10)
AmountFile FILE,DRIVER('Clarion'),PRE(Amt)
Record RECORD
Amount REAL !Define a field
OTDAmount LIKE(Amount) !Use same definition
. .
См. также: , , ,
LONG (четырехбайтное целое со знаком)
метка LONG(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | знак_____значение_______ |
Биты: | 31_____________________0 |
Диапазон: | -2,147,483,648..2,147,483,647 |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
LONG описывает четырехбайтное целое со знаком в формате длинного целого Intel 8086. Старший бит - знаковый, (0 положительное, 1 отрицательное). Отрицательные значения представляются в стандартном дполнении до двух. Присвоение значения, выходящего за пределы диапазона LONG, приводит к непредсказуемым результатам
Пример:
Countl LONG !Declare four-byte signed integer
Count2 LONG,OVER(Countl) !Declare OVER the four-byte signed
! integer
Count3 LONG,DIM(4) !Declare it an array of 4 longs
Count4 LONG(5) !Declare with initial value
Count5 LONG,EXTERNAL !Declare as external
Counts LONG,NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
Count7 LONG,NAME('Counter')!Declare with external name
. .
NAME (указать внешнее имя)
NAME([ | constant variable |
] |
constant | Строковая константа. |
variable | Метка STRING-переменной, описанной в области описания глобальных данных или в области описания данных модуля-члена. |
Атрибут NAME задает
"внешнее" имя. Он
полностью независим от
атрибута EXTERNAL - между ними не
требуется никакой связи, хотя
оба этих атрибута могут быть у
одной и той же переменной.
Атрибут NAME можно
использовать в прототипах
процедур и функций, применять к
FILE, KEY, INDEX, MEMO, любому полю,
описанному в FILE или QUEUE
структурах, или к любому полю
вне структуры. Атрибут NAME имеет
различные свойства, в
зависимости от того, где он
использован.
NAME(константа) можно задать в
прототипах процедур или
функций. Константа - это
внешнее имя, используемое
компоновщиком для
идентификации процедуры или
функции из внешней библиотеки.
Атрибуты NAME(константа) или
NAME(переменная) в описании FILE
задает ДОСовскую спецификацию
полного имени файла. Если
константа или переменная не
содержит диск и путь, то
подразумеваются текущие диск и
каталог. Если опущено
расширение файла, то
подразумевается расширение,
стандартное для данного
файлового драйвера. Некоторые
файловые драйверы требуют,
чтобы KEYи, INDEXы, или MEMO-поля были
в отдельных файлах. Таким
образом, NAME можно применить к
описаниям KEY, INDEX или MEMO. Атрибут
NAME без константы или
переменной, ссылается на метку
того описательного оператора,
к которому он был применен
(включая префикс, если таковой
указан).
NAME(константа) может
применятся к любому полю,
описанному в структуре RECORD. Это
позволяет использовать имена
полей, не нарушающих
ограничений на имена,
накладываемые отдельными
файловыми драйверами.
NAME(константа) можно применять
к любому полю в структуре QUEUE.
Так достигается возможность
динамических сортировок во
время исполнения.
NAME(константа) можно также
применять к любой переменной,
описанной вне какой-либо
структуры. Это дает
возможность компоновщику по
внешнему имени
идентифицировать переменную,
описанную во внешней
библиотеке. Если переменная
имеет еще атрибут EXTERNAL, то она
описана, и память под нее
выделяется самой внешней
библиотекой. Без атрибута EXTERNAL,
такая переменная описывается,
и память под нее выделяется в
кларионовской программе, и она
является внешней по отношению
ко внешней библиотеке.
Пример:
PROGRAM
MAP
MODULE('External.Obj')
AddCount(LONG),LONG,C,NAME('_AddCount')
!C function named ' AddCount,
. .
Cust FILE,PRE(Cus),NAME(CustName) !Filename in CustName variable
CustKey KEY('Name'),NAME('c:\data\cust.idx')
!Declare key,cust.idx
Record RECORD
Name STRING(20),NAME !Default NAME to 'Cus:Name'
. !End file declaration
SortOue QUEUE,PRE(Que)
Fieldl STRING(10),NAME('FirstField') !QUEUE SORT NAME
Field2 LONG,NAME('SecondField') !QUEUE SORT NAME
.
CurrentCnt LONG,EXTERNAL,NAME('Cur') !Field declared public in
! external library as 'Cur'
TotalCnt LONG,NAME('Tot') !Field declared external
!in external library as 'Tot'
См. также: , FILE, , INDEX, QUEUE, EXTERNAL
НЕЯВНЫЕ ПЕРЕМЕННЫЕ
Неявные переменные НЕ
описываются в описаниях
данных. Они создаются
компилятором, когда он
встречает их впервые. Любая
неявная переменная,
использованная области
описания глобальных данных
(между ключевыми словами PROGRAM и
CODE) это "Глобальные
Статические Данные". Любая
неявная переменная между
ключевыми словами MEMBER и PROCEDURE
(или FUNCTION) это "Локальные
Статические Данные". Все
остальные неявные переменные -
это "Локальные Динамические
данные".
Неявные переменные обычно
используются для: индексов
массивов, флагов true/false,
промежуточных переменных в
сложных вычислениях; как
управляющие переменные циклов,
итд. Язык Clarion предлагает три
типа неявных переменных:
# | Неявная LONG-переменная, ее метка (имя) завершается символом # (решетка, номер). |
$ | Знак доллара указывает на неявную REAL-переменную, метка котороя завершается символом $ (доллар). |
" | Двойная кавычка (не путать с двумя апострофами!) означает неявную 32хбайтную строку. Имя такой переменной заканчивается символом " (кавычка или двойная кавычка). |
Пример:
LOOP Counter# - 1 TO 10 !Implicit LONG
ArrayField[Counter#] = Counter# * 2 !Initialize an array
.
Address"=CLIP(City) & ','&State &' '&ZIP!Implicit STRING(32)
SHOW(12,16,Address") !Used to display a temporary value
Percent$ = ROUND((Quota/Sales),.1) * 100 !Implicit REAL
SHOW(15,22,Percent$,@P%<<<.##P)
!Used to display a temporary value
См. также: .
OVER (разделяет место в памяти)
OVER(переменная)
переменная Метка переменной,
которая уже занимает память,
подлежащую разделу.
Атрибут OVER позволяет
ссылаться на один и тот же
участок памяти двумя разными
путями. Поле, описанное с
атрибутом OVER, должно быть НЕ
больше, чем переменная, поверх
которой она накладывается (хотя,
конечно, она может быть меньше).
(SPA. Для тех кому это трудно
понять сразу, как мне было в
свое время, скажу что этот
механизм аналогичен
паскалевским записям с
вариантами)
Поле в структуре GROUP НЕ может
быть описано поверх
переменной, которая находится
ВНЕ этой структуры GROUP. Также,
нельзя описать поле поверх
переменной, которая является
частью списка параметров
процедуры или функции.
Пример:
CustNote FILE,PRE(Csn) !Declare CustNote file
Notes MEMO(2000) !The memo field
Record RECORD
CustID LONG
. .
CsnMemoRow STRING(IO),DIM(200),OVER(Csn:Notes) !Csn:Notes
!можно рассматривать как одно
!целое или блоками по 10 байт
См. также:
PDECIMAL (то же, что и DECIMAL)
метка PDECIMAL(length[,places][,iinitial value])[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | dl5 dl4 d13 dl2 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 s |
Биты: | 63________________________________________ 5_0 |
Диапазон: | -999,999,999,999,999..999,999,999,999,999 |
length | ТРЕБУЕМАЯ числовая константа, содержащая общее число десятичных цифр (в целой и дробной частях вместе взятых) в переменной. Максимальная длина 15. |
places | Числовая константа, уточняющая количество цифр в дробной части (справа от десятичной точки) в переменной. Она должна быть меньше или равна параметру length. Если опущена, то описываема переменная считается целочисленной. |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
PDECIMAL описывает переменной длины десятичную переменную со знаком в формате Btrieve и IBM/EBCDIC. Каждый байт PDECIMAL содержит две десятичные цифры, по 4 бита на цифру. Самый правый байт содержит знак в своем младшем ниббле (OFh или OCh позитивный, ODh негативный и одну десятичную цифру. Таким образом, PDECIMAL-переменные всегда содержат строго "нечетное" число цифр (скажем, PDECIMAL(10) и PDECIMAL(ll) используют по 6 байт).
Присвоение числа, выходящего за диапазон PDECIMAL приводит к непредсказуемым результатам.
Пример:
Countl PDECIMAL(5,O) !Declare three-byte signed packed decimal
Count2 PDECIMAL(5),OVER(Countl) !Declare OVER the three-byte
signed packed decimal
Count3 PDECIMAL(5,O),DIM(4) !Declare it an array of 4 decimals
Count4 PDECIMAL(5,0,5) !Declare with initial value
Count5 PDECIMAL(5,O),EXTERNAL !Declare as external
Count6 PDECIMAL(5,O),NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
Count7 PDECIMAL(5,O),NAME('Counter') !Declare with
. . ! external name
PRE (префикс метки)
PRE(prefix)
prefix | Допустимые символы буквы, цифры от 0 до 9 и символ подчеркивания. Префикс должен ничинаться с буквы и не должен быть зарезервированм словом. |
Атрибут PRE
предусматривает префикс метки
для сложных структур данных. Он
используется для того, чтобы
различать переменные с
одинаковыми именами в разных
структурах. При обращении к
переменной исполняемымы
операторами, при присвоениях и
передаче в списках параметров,
префикс присоединяется к метке
двоеточием (Pre:Метка). PRE можно
использовать со следующими
структурами данных:
DETAIL | FILE | FOOTER |
GROUP | HEADER | OPTION |
QUEUE | RECORD | REPEAT |
REPORT | SCREEN |
Пример:
MasterFile FILE,DRIVER('Clarion'),PRE(Mst) !Declare master
Record RECORD ! file layout
AcctNumber LONG
. .
Detail FILE,DRIVER('Clarion'),PRE(Dtl) !Declare detail
! file layout
Record RECORD
AcctNumber LONG
. .
GROUP,PRE(Mem) !Declare some memory variables
Message STRING(30)
Page LONG
Line LONG
Device STRING(30)
.
CODE
IF Dtl:AcctNumber <> Mst:AcctNumber !Is it a new account
Mem:Message - 'New Account' ! display message
DO MatchMaster ! get new record
.
См. также: Зарезервированные
слова
PSTRING (строка со встроенным байтом-счетчиком длины)
метка PSTRING( | length string constant picture |
)[,DIM()][,OVER()][,NAME()] [,EXTERNAL] |
Формат: | Фиксированное число байт. |
Диапазон: | От 1 до 255 байт |
length | Числовая константа, которая задает размер строки в байтах, включая место для первого по порядку байта, в котором хранится длина такой строки. |
string constant | Начальное значение строки.Длина PSTRING-a устанавливается (в байтах) по длине этой строковой константы плюс начальный байт-счетчик. |
picture | Используется для форматирования значений, присвоенных строке. Длина такой строки, это количество байт, достаточное для хранения форматированной строки и начального байта длины. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
PSTRING описывает символьную строку с ведущим байтом длины и длиной, заданной для этой строки.. Она соответствует типу, используемому в Паскале и типу данных "LSTRING" из Btrieve Record Manager. Место в памяти под нее выделяется постоянной длины, но байт длины содержит число символов, реально хранящихся в такой переменной. Во время исполнения, PSTRING преобразуется в STRING. Тип PSTRING имеет смысл употреблять для совместимости с внешними файлами и/или процедурами.
Пример:
Name PSTRING(21) !Declare 21 byte field - 20 bytes data
OtherName PSTRING(21),OVER(Name) !Declare field over name field
Contact PSTRING(21),DIM(4) !Array 21 byte fields - 80 bytes data
Company PSTRING('Clarion Software,Inc.')!23 byte string - 22
! bytes data
Phone PSTRING(@P(###)###-####P) !Declare 14 bytes - 13 bytes
! data
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
NameField PSTRING(21),NAME('LstringField')
. . !Declare with external name
REAL (восьмибайтное вещественное со знаком)
метка REAL(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | знак____порядок____мантисса |
Биты: | 63____________52__________0 |
Диапазон: | 0,+/-2.22507385850720le-308..+/1.79769313496231e+308 (15 значащих цифр) |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
REAL описывает восмибайтное вещественное число со знаком в формате длинного вещественного Intel 8087 (двойной точности. Присвоение числа, выходящего за пределы диапазона REAL приводит к непредсказуемым результатам.
Пример:
Countl REAL !Declare eight-byte signed floating point
Count2 REAL,OVER(Countl) !Declare OVER the eight-byte signed floating point
Count3 REAL,DIM(4) !Declare it an array of 4 rlelals
Count4 REAL(5) !Declare with initial value
Count5 REAL,EXTERNAL !Declare as external
Count6 REAL,NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
Count5 REAL,NAME('Counter')!Declare with external name
. .
Шаблоны научной нотации
@Em.n[B]
@E | Все шаблоны научной нотации начинаются с @E. |
m | Общее число символов в формате, предлагаемом данным шаблоном. |
n | Число цифр после десятичной точки. |
B | Если число равно нулю, то вывести пустую строку |
Шаблоны научной нотации форматируют очень большие или же очень маленькие числа. Вывод в виде десятичного числа в степени десяти.
Пример:
Шаблон | Значение | Результат |
@E9.0 | 1,967,865 | .20e+007 |
@E12.1 | 1,967,865 | 1.9679e+006 |
@E12.1B | 0 | |
@E12.1 | 1,967,865 | 1.9679 e+006 |
@E12.1 | .000000032 | 3.2000e-008 |
Шаблоны даты
@Dn[s][B]
@D | Все шаблоны даты начинаются с @D. |
n | Номер шаблоны даты. Допустимые номера от 1 до 16. |
s | Разделитель. Слэш (/) ставится между днем, месяцем и годом в большинстве шаблонов даты. Можно использовать альтернативные разделители, как то: . Порождает точки ` (слабое ударение)порождает запятые - Порождает тире _ (подчеркивание) порождает пробелы |
B | Вывести пустую строку, если число равно нулю. |
Даты можно хранить в числовых переменных (обычно LONG), DATE-полях (для совместимости с Btrieve), или в STRINGах описанных в виде дат. Дата, хранящаяся в числовой переменной называется Стандартной Кларионовской датой. Ее значение представляет собой количество дней, прошедших с 28 декабря 1800 года. Шаблон даты преобразует это число в один из форматов даты.
Для ввода данных нельзя использовать шаблоны @D3, @D4, @D7 и @D8 поскольку в них требуется вводить не только цифры, но и буквы.
Пример:
Шаблон | Формат | Результат |
@Dl | mm/dd/yy | 10/31/59 |
@D2 | mm/dd/yyyy | 10/31/1959 |
@D3 | mmm dd, yyyy | OCT 31,1959 |
@D4 | mmmmmmmmm dd, yyyy | October 31, 1959 |
@D5 | dd/mm/yy | 31/10/59 |
@D6 | dd/mm/yyyy | 31/10/1959 |
@D7 | dd mmm yy | 31 OCT 59 |
@D8 | dd mmm yyyy | 31 OCT 1959 |
@D9 | yy/mm/dd | 59/10/31 |
@D10 | yyyy/mm/dd | 1959/10/31 |
@D11 | yymmdd | 591031 |
@D12 | yyyymmdd | 19591031 |
@D13 | mm/yy | 10/59 |
@D14 | mm/yyyy | 10/1959 |
@D15 | yy/mm | 59/10 |
@D16 | yyyy/mm | 1959/10 |
@Dl. | mm.dd.yy | Разделитель точка |
@D2- | mm-dd-yyyy | Разделитель тире |
@D5_ | dd mm yy | Подчеркивание порождает разделитель пробел |
@D6` | dd,mm,yyyy | Слабое ударение порождает разделитель запятую |
Шаблоны времени
@Tn[s][B]
@T | Все шаблоны времени начинаются с @T. |
n | Номер формата времени. Допустимые номера форматов от 1 до 6. |
s | Разделитель. Двоеточие (:) ставится по умолчанию между часами, минутами и секундами в большинстве форматов времени. Можно использовать альтернативные разделители, как то: . Порождает точки ' (слабое ударение) порождает запятые - Порождает тире _ (подчеркивание) порождает пробелы |
B | Если значение равно нулю, то вывести пустую строку. |
Время можно хранить в числовой переменной (обычно LONG), в TIME- полях (для совместимости сBtrieve), или в STRINGах, описанных в формате времени. Время, хранящееся в числовой переменной называется стандартным кларионовским временем. Оно представляет из себя количество сотых долей секунды, прошедших с полуночи. Шаблон времени переводит это число в один из 6 форматов времени.
Нельзя
использовать для ввода шаблоны
(@T3 и @T6), в которых требуется
вводить не только цифры, но и
буквы.
Пример:
Шаблон | Формат | Результат |
@T1 | hh:mm | 17:30 |
@T2 | hhmm | 1730 |
@T3 | hh:mmXM | 5:30PM |
@T4 | hh:mm:ss | 17:30:00 |
@T5 | hhmmss | 173000 |
@T6 | hh:mm:ssXM | 5:30:00PM |
@T1. | hh.mm | Разделитель точка |
@T1- | hh-mm | Разделитель тире |
@T3_ | hh mmXM | Подчеркивание порождает пробелы |
@T4' | hh,mm,ss | Слабое ударение порождает запятые |
Шаблоны
"по образцу"
@p[<][#][x]P[B]
@P | Все шаблоны "по образцу" начинаются с разделителя @P и заканчиваются разделителем P. Регистр обоих разделетелей должен быть один и тот же. |
< | Целочисленная позиция. Если в этой позиции ноль, то вывести пробел. |
# | Целочисленная позиция. В этой позиции вывести цифру, независимо от ее значения. |
x | Необязательный символ для вывода. Эти символы будут присутствовать в выводной строке. |
p | Все шаблоны "по образцу" должны заканчиваться на P. Если разделитель @p введен на нижнем регистре, то и конечный разделитель P тоже должен быть в нижнем регистре. |
B | Если ВСЕ число равно нулю, то вывести пустую строку. |
Шаблоны "по
образцу" содержат
необязательные целочисленные
пози- ции и необязательные
символы редактирования. Любой
символ кроме < или # считается
символом редактирования,
который появится в
форматированной
строке-результате. Разделители
@P и P чувствительны к регистру,
на котором они введены. Это
сделано для того, чтобы, если
скажем, надо ввести символ
"Р", то можно использовать
разделители "р" и
наоборот.
Пример:
Шаблон | Значение | Результат |
@P###-##-####P | 215846377 | 215-84-6377 |
@P<#/##/##P | 103159 | 10/31/59 |
@P(###)###-####P | 3057854555 | (305)785-4555 |
@P###/###-####P | 7854555 | 000/785-4555 |
@p<#:##PMp | 530 | 5:30PM |
@P<#'<#"P | 506 | 5' 6" |
@P<#Ib. <#oz.P | 902 | 91b. 2oz. |
@P4##A-#P | 112 | 411A-2 |
Key-in
Template Pictures
@K[@][#][<][x][\][?][^][_][Ѓ]K[B]
@K | Все key-in template шаблоны начинаются разделителем @K и завершаюися разделителем K. Регистр обоих "К" должен быть одним и тем же. |
@ | Разрешены только буквы на верхнем и нижнем регистрах. |
# | Разрешены целые числа от 0 до 9. |
< | У целых чисел выводить лидирующие нули пробелами. |
x | Представляет необязательные постоянные символы для показа (любые символы, пригодные для вывода на экран). Эти символы попадают без изменений в результирующую строку. |
\ | Следующий за \ символ выводить на экран как печатаемый. Так можно включить в результирующую строку любые символы форматирования (@,#,<,\,?,^,_,Ѓ) как обычные печатаемые символы. |
? | В этой позиции может быть любой символ. |
^ | В этой позиции разрешены только буквы на верхнем регистре. В этой позиции разрешены только буквы на нижнем регистре |
| | Ограничитель. Только данные введенные до | и печатаемые символы, введенные до | будут помещены в результирующую строку. |
K | Все key-in template шаблоны завершаются символом "K". Если разделитель @k был введен на нижнем регистре, то и завершающий k должен быть введен на нижнем регистре. |
B | Если ВСЕ число рано нулю, то вывести пустую строку. |
Key-in шаблоны
могут содержать целочисленные
позиции ( # < ), символьные
позиции ( @ ^ _ ), места для любых
символов ( ? ), и печатаемые
символы. Любой символ, кроме
символов форматирования,
рассматривается как
печатаемый, который попадает в
форматированную
строку-результат. Разделители
@K иd K чувствительны к регистру
по той же причине, что и @P и P в
шаблонах "по образцу".
Key-in Шаблоны
специфичны для полей типа STRING,
PSTRING, и CSTRING для возможности
произвольного редактирования
и проверки допустимости поля.
Использование key-in шаблонов,
содержащих любые алфавитные
индикаторы ( @ ^ _ ) с полями для
ввода чисел дает
непредсказуемые результаты.
Поскольку
использование режима вставки
для key-in шаблонов, может также
привести к непредсказуемым
результатам, то key-in шаблоны
всегда принимают данные в
режиме надпечатки, даже если
есть атрибут INS.
Пример:
Шаблон | Введено значение |
Строка-результат |
@K###-##-###K | 215846377 | 215-84-6377 |
@K####Ѓ-####K | 33064 | 33064 |
@K####Ѓ-####K | 330643597 | 33064-3597 |
@K<# ^^^ ##K | 10AUG59 | 10 AUG 59 |
@K(###)@@@-##\@##K | 305abc4555 | (305)abc-45@55 |
@K###/?##-####K | 7854555 | 000/785-4555 |
@k<#:##^Mk | 530P | 5:30PM |
@K<#' <#"K |
506 | 5' 6" |
@K4#_#A-#K | 1g12 | 41glA-2 |
Строковые
шаблоны
@Slength
@S | Все строковые шаблоны начинаются с @S. |
length | Определяет количество символов в шаблоне формата. |
Строковый
шаблон описывает
НЕформатированную строку
заданной длины.
Пример:
Name STRING(@S20) !20-символьное поле-строка
SHORT (двухбайтное целое со знаком)
метка SHORT(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | знак значение |
Биты: | 15_________0 |
Диапазон: | -32,768..32,767 |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет место в памяти с другой переменной. |
NAME | Задает внешнее имя поля. |
EXTERNAL | Указывает на то, что переменная описана и память под нее выделена во внешней библиотеке. НЕ разрешено с описаниями FILE, QUEUE или GROUP. |
SHORT описывает двухбайтное целое со знаком в формате целого слова Intel 8086. Старший бит в этой конфигурации - знаковый бит (0 = плюс, 1 = минус. Отрицательные значения представляются в стандартном дополнении до двух. Присвоение значения, выходящего за пределы диапазона SHORT дает к непредсказуемые результатам.
Пример:
Count2 SHORT,OVER(Countl) !Declare OVER the two-byte signed
! integer
Count3 SHORT,DIM(4) !Declare it an array of 4 shorts
Count4 SHORT(5) !Declare with initial value
Count5 SHORT,EXTERNAL !Declare as external
Count6 SHORT,NAME('SixCount') !Declare with external name
Examp]eFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
Count7 SHORT,NAME('Counter') !Declare with external
. . ! name
SIZE (размер памяти в байтах)
SIZE( | label constant picture |
) |
метка | Метка ранее описанной переменной. |
constant | Числовая или символьная константа. |
picture | Элемент шаблона. |
SIZE заставляет компилятор
сообщить количество памяти (в
байтах) выделенной для
хранения параметра.
Пример:
SavRec STRING(1),DIM(SIZE(Cus:Record)
!Строк столько же, каков размер записи
StringVar STRING(SIZE('Clarion Software, Inc.'))
!Строка должна быть достаточной для этой
!константы длины
LOOP I# = 1 TO SIZE(ParseString)
!Цикл по все символам строки
PicLen = SIZE(@P(###)###-####P) !Сохраняем размер шаблона
SREAL (четырехбайтное вещественное со знаком)
метка SREAL(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | знак____порядок____мантисса |
Биты: | 31____________23__________0 |
Диапазон: | 0, +/- 1.17549435e-38 .. 3.40282347e+38 (6 значащих цифр) |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
SREAL описывает четырехбайтную числовую переменную со знаком с плавающей запятой в формате короткого целого Intel 8087 (одинарной точности). Присвоение значения, выходящего за пределы диапазона SREAL приводит к непредсказуемым результатам.
Пример:
Countl SREAL !Declare four-byte signed floating point
Count2 SREAL,OVER(Countl) !Declare OVER the four-byte signed floating point
Count3 SREAL,DIM(4) !Declare it an array of 4 floats
Count4 SREAL(5) !Declare with initial value
Count5 SREAL,EXTERNAL !Declare as external
Count6 SREAL,NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
Count7 SREAL,NAME('Counter') !Declare with external name
. .
STRING (строка фиксированной длины)
метка STRING( | length string constant picture |
)[,DIM()][,OVER()][,NAME()] [,EXTERNAL] |
Формат: | Фиксированное число байт. |
Диапазон: | От 1 до 65,535 байт |
length | Числовая константа, которая задает размер строки в байтах. При использовании этого параметра, строка инициализируется пробелами. |
string constant | Начальное значение строки. Длина STRING-a устанавливается (в байтах) по длине этой строковой константы. |
picture | Используется для форматирования значений, присвоенных строке. Длина такой строки, это количество байт, достаточное для хранения форматированной строки. Строка инициализируется пробелами. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
STRING описывает символьную строку фиксированной длины.
Пример:
Name STRING(20) !Declare 20 byte name field
NameArray STRING(l),DIM(20),OVER(Name) !Declare array over name
!field
Company STRING('Clarion Software, Inc.,)!The software
! company - 22 bytes
Phone STRING(@P(###)###-####P) !Phone number field - 13
! bytes
ExampleFile FILE,DRIVER('Clarion') !Declare a file
Record RECORD
NameField STRING(20),NAME('Name') !Declare with external
. . ! name
TIME (четырехбайтное время)
метка TIME[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | чч мм сс ст |
Диапазон: | часы: 0..23 минуты: 0..59 секунда: 0..59 секунды/100: 0..99 |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
TIME описывает четырехбайтную переменную типа времени. Этот формат соответствует типу поля "TIME" в Btrieve Record Manager. TIME используемые в числовых выражениях, преобразовываются в число сотых долей секунды, прошедших с полуночи (стандартное кларионовское время, обычно хранится как LONG). Тип DATE имеет смысл употреблять для совместимости с внешними файлами и/или процедурами.
Пример:
ChkoutTime TIME !Declare checkout time field
OtherTime TIME,OVER(CheckoutTime) !Declare field over time field
ContactTime TIME,DIM(4) !Array of 4 time fields
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
TimeRecd TIME,NAME('TimeField') !Declare with external name
. .
См. также: Standard Time
ULONG (четырехбайтное целое без знака)
метка ULONG(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | _________значение_______ |
Биты: | 31_____________________0 |
Диапазон: | 0..4,294,967,295 |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
ULONG описывает четырехбайтное целое без знака в формате длинного целого Intel 8086. В этой конфигурации НЕТ знакового бита. Присвоение значения, выходящего за пределы диапазона ULONG дает непредсказуемые результаты.
Пример:
Countl ULONG !Declare four-byte unsigned integer
Count2 ULONG,OVER(Countl) !Declare OVER four-byte unsigned integer
Count3 ULONG,DIM(4) !Declare it an array of 4 unsigned longs
Count4 ULONG(5) !Declare with initial value
Count5 ULONG,EXTERNAL !Declare as external
Counts ULONG,NAME('SixCount') !Declare with external name
Examp]eFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
Count7 ULONG,NAME('Counter') !Declare with external
. . ! name
USHORT (two-byte unsigned integer)
метка USHORT(initial value)[,DIM()][,OVER()][,NAME()][,EXTERNAL]
Формат: | _____значение_______ |
Биты: | 15__________________0 |
Диапазон: | 0..65,535 |
initial value | Числовая константа. Если опущена, то подразумевается ноль. |
DIM | Размерность(и) переменной как массива. |
OVER | Разделяет один и тот же участок памяти с другой переменной |
NAME | Задает внешнее имя для переменной. |
EXTERNAL | Указывает, что переменная описана и память под нее выделяется во внешней библиотеке. НЕ разрешено для описаний FILE, QUEUE и GROUP. |
USHORT описывает двухбайтное целое без знака в формате слова Intel 8086. В этой конфигурации НЕТ знакового бита. Присвоение значения, выходящего за пределы диапазона USHORT приводит к не предсказуемым результатам.
Пример:
Countl USHORT !Declare two-byte unsigned integer
Count2 USHORT,OVER(Countl) !Declare OVER the two-byte unsi gned
! integer
Counts USHORT.DIM(4) !Declare it an array of 4 unsigned
! shorts
Count4 USHORT(5) !Declare with initial value
Count5 USHORT,EXTERNAL !Declare as external
Count6 USHORT,NAME('SixCount') !Declare with external name
ExampleFile FILE,DRIVER('Btrieve') !Declare a file
Record RECORD
Count7 USHORT,NAME('Counter') !Declare with external
. . ! name