ГЛАВА 2 - ФОРМАТ ИСХОДНОГО ТЕКСТА ПРОГРАММЫ

ФОРМАТ ОПЕРАТОРА

Метки описаний и операторов

Операторы языка в исходном модуле могут быть разделены в две общих категории: описания данных и выполнимые операторы, или просто "данные" и "код".

Во время выполнения программы, описания данных сохраняют за собой области памяти которые управляются в соответствии c выполнимыми операторами. Любой оператор кода или описание данных может быть идентифицировано меткой. Метка описывает определенное местоположение в PRO RAM (памяти процессора?). Ко всем переменным, структурам данных, PROCEDUREМ, FUNCTIONМ, ПОДПРОГРАММАМ можно обращаться по их меткам.

В исходных модулях Кларион, 1ый столбец отведен для меток. Метка может содержать буквы (на верхнем или нижнем регистрах), цифры от 0 до 9, символ подчеркивания символ (_), и двоеточие (:). Первый символ должен быть буквой или символом подчеркивания. Метки не чувствительны к регистру букв, поэтому, CurRent и CURRENT одинаковые метки. Метка не может быть зарезервированным словом. Любое выполнимый оператор может иметь метку которая может использоваться как цель для оператора GOTO.

Метка оператора PROCEDURE или FUNCTION - название(имя) функции или процедуры. Использование метки ПРОЦЕДУРЫ в выполнимом операторе выполняет процедуру. Метка ФУНКЦИИ используется в выражениях, или списках параметров других функций, для присвоения значения, возвращаемого функцией.

Завершение структуры

Составные структуры данных создаются, когда описания данных вложены в другие описания данных. Имеются множество составных структур данных в языке Кларион: SCREEN, REPORT, FILE, RECORD, GROUP, и т.д. Эти составные структуры данных должны завершать с точкой (.) или ключевым словом END. Операторы IF, CASE, EXECUTE, LOOP, и BEGIN, все формы управляющих структур должны также быть завершены точкой или оператором END.

Зарезервированные слова

Следующие ключевые слова зарезервированы и не могут использоваться как метки.

ANDELSELOOPRETURN
BEGINELSIFMEMBERROUTINE
BREAKENDNOTSECTION
BYEXECUTEOFTDEN
CASEEXITOMITTIMES
COMPILEFUNCTIONORTO
CYCLEGOTOOROFUNTIL
DOIFPROCEDUREWHILE
EJECTINCLUDEPROGRAMXOR

Следующие ключевые слова могут использоваться как метки структур данных или выполнимых операторов. Они не могут использоваться как метки операторов PROCEDURE or FUNCTION:

CODEFOOTERMENUQUEUEROW
COLGROUPMODULERECORDSCREEN
DETAILHEADEROPTIONREPEATSUBTITLE
FILEMAPPULLDOWNREPORTTITLE

Специальные символы

Это список специальных символов используемых в языке Кларион:

Инициаторы!Восклицательный Знак начинает комментарий
 ? Вопросительный знак начинает equate-метку поля или меню
 @ Знак "Коммерческое ЭТ" начинает элемент формата или управления(?).
 * Звездочка начинает параметр передаваемый по адресу в прототип MAP.
Терминаторы
(завершители)
; Точка-с-запятой разделяет выполнимые операторы стоящие в одной строке CR/LF ВК/ПС разделитель выполнимых операторов
 . Точка завершает структуру.
 ЃВертикальная черта - символ продолжения строки исходного текста
 #Знак фунта объявляет неявную LONG-переменную.
 $Доллар объявляет неявную REAL-переменную.
 "Двойная кавычка объявляет неявную STRING-переменную.
Разделители( )Круглые Скобки окружают список параметров.
 [ ]Скобки окружают список индексов массива
 ' 'Апострофы окружают строковую константу.
 { }Фигурные скобки окружают индекс повторения в строковой константе.
 < >Угловые скобки окружают ASCII-код в строковой константе, или указывают параметр в прототипе MAP, который может быть опущен
Коннекторы
(соединители)
.Точка - десятичная точка используемая в числовых константах.
 ,Запятая соединяет параметры в списке параметров.
 :Двоеточие соединяет префикс с меткой или группирует символы в метках.
 _Подчеркивание соединяет группы символов в метках.
Операторы+Сложение.
 -Вычитание
 *умножение.
 / деление.
 %деление по модулю.
 ^ Возведение в степень.
 <меньше чем.
 >больше чем.
 =присвоение или равенство.
 ~логическое "НЕ".
 &Конкатенация (строк)

Глобальные, локальные, статические, и динамические данные

Термины Глобальные и Локальные относятся к доступности данных. Глобальные данные доступны всюду в программе, Локальные данные имеют ограниченную доступность. Статические и Динамические относятся к распределению памяти для данных. Память для Статических данных выделяется при загрузке программы, для динамических данных выделяется во время исполнения.

Имеются три типа данных которые могут быть определены в программе на Кларион: Глобальные Статические данные, Локальные Статические данные, и Локальные Динамические данные.

Глобальные Статические данные объявлен в секции данных ПРОГРАММЫ, между ключевыми словами PROGRAM и CODE. Они доступны выполнимым операторам и выражениям в каждой ПРОЦЕДУРЕ и ФУНКЦИИ ПРОГРАММЫ. Они всегда в памяти во время исполнения программы.

Локальные Статические данные объявлены в модуле-ЧЛЕНЕ, между ключевыми словами MEMBER и PROCEDURE (или FUNCTION). Доступность этих данных ограничена переделами модуля-ЧЛЕНА в котором они объявлены; к ним могут обращаться только ПРОЦЕДУРЫ и ФУНКЦИИИ в модуле-ЧЛЕНЕ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Локальные Статические данные всегда в памяти во время выполнения программы.

Локальные Динамические данные объявлены в секции данных ПРОЦЕДУРЫ или ФУНКЦИИ, между ключевыми словами PROCEDURE (или FUNCTION) и CODE. Доступны только в ПРОЦЕДУРЕ или ФУНКЦИИИ в которой они объявлены; на них может ссылаться только эта ПРОЦЕДУРА или ФУНКЦИЯ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Память используемая локальными данными динамически размещается в стеке при вызове PROCEDURE или FUNCTION, и освобождается когда PROCEDURE или FUNCTION закончена.

Cтруктурам данных SCREEN, PULLDOWN, FILE, QUEUE, и REPORT назначается Статическая память, объявлены они Глобальными, Локальными в модуле-ЧЛЕНЕ, или локальными в ПРОЦЕДУРЕ или ФУНКЦИИ. Только описания переменных локальные в ПРОЦЕДУРЕ или ФУНКЦИИ размещены на стеке. Это позволяет ФУНКЦИИ или ПРОЦЕДУРЕ быть истинно рекурсивной, получая новую копию Локальных переменных при каждом ее вызове, при использовании только одной копии любой структуры.

См. Также: прототипы процедур и функций

ФОРМАТ ПРОГРАММЫ

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

См. Также: MAP, MODULE, PROCEDURE, FUNCTION, Глобальные, Локальные, Статические и Динамические данные

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

См. Также: MODULE, PROCEDURE, FUNCTION, Глобальные, Локальные, Статические и Динамические данные

MAP (Обьявить прототипы ПРОЦЕДУР и-или ФУНКЦИЙ)


  MAP

  прототипы

  [MODULE()

   прототипы

  .]

  .

MODULE Объявление исходного модуля-члена.

MAP-структура содержит прототипы, которые описывают функции, процедуры и внешние исходные модули используемые в ПРОГРАММЕ или модуле-ЧЛЕНЕ. MAP объявленная в PROGRAM-модуле объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны повсюду в программное. MAP в модуле-ЧЛЕНЕ объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны только в этом модуле-ЧЛЕНЕ.

Пример:


 Один файл содержит

 Sample PROGRAM  !Программа Sample в prele.cla

   MAP   !Hачало глобальной MAP

   LoadIt  !процедура "загрузи ЭТО"

   .   !Конец map



 Отдельный файл содержит:

   MEMBER('Sample') !Обьявить модуль-ЧЛЕН

   MAP   !Начать местную MAP

   ComputeIt  !процедура "Вычисли ЭТО"

   .   !Конец MAP

См. Также: PROGRAM, MEMBER, MODULE, прототипы ПРОЦЕДУР и ФУHКЦИЙ

МОДУЛЬ (указывает файл с модулем-ЧЛЕНОМ)


  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

См. Также: MEMBER, MAP, прототипы ПРОЦЕДУР и ФУHКЦИЙ

Прототипы ПРОЦЕДУР и ФУ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(<*LONG>) !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

См. Также: MAP, MEMBER, MODULE, NAME, RETURN

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  !Вернуться обратно

См. Также: прототипы ПРОЦЕДУР и ФУHКЦИЙ, Глобальные, Локальные, Статические и Динамические Данные

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

См. Также: прототипы ПРОЦЕДУР и ФУHКЦИЙ

CODE (Начать выполнимые операторы)


    CODE 

Оператор CODE отделяет секцию декларации данных от секции выполнимых операторов в пределах ПРОГРАММЫ, ПРОЦЕДУРЫ, или ФУНКЦИИ. Первый оператор, который выполнится в ПРОГРАММЕ, ПРОЦЕДУРЕ или ФУНКЦИИ - оператор после слова CODE.

Пример:


 OrdList PROCEDURE !Объявляем процедуру

    !Здесь идет описание данных

   CODE !Это начало секции "Кода"

    !Здесь идут выполнимые операторы

 

См. Также: PROGRAM, PROCEDURE, FUNCTION

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

См. Также: EXIT, DO

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

ДИРЕКТИВЫ КОМПИЛЯТОРА

Директивы Компилятора операторы которые говорят компилятору выполнить некоторое действие во время компиляции. Эти операторы не включены в выполнимый объектный код программы который производит компилятор.

BEGIN (Определить структуру кода)


  BEGIN

  Операторы

  .

 

операторы  Выполнимые инструкции программы.

Директива компилятора BEGIN заставляет компилятор рассматривать группу операторов как единую структуру. BEGIN структура должна завершаться точкой или оператором END.

BEGIN используется в структуре управления EXECUTE чтобы позволить обрабатывать несколько строк кода как одну.

Пример:


  EXECUTE Value

  Procl  !Выполняется если Value = 1

  BEGIN  !Выполняется если Value = 2

   Value+=1

   Proc2

  .

  Proc3  !Выполняется если Value = 3

  .

См. Также: EXECUTE

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

См. Также: OMIT, EQUATE

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

 

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

   !Включить описания файлов и поместить их в листинг

 

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

См. Также: COMPILE, EQUATE

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

SUBTITLE (Печатать подзаголовок МОДУЛЯ)


    SUBTITLE(подзаголовок модуля) 

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

SUBTITLE печатает в первой колонке третьей строки листинга Кларион. Директива SUBTITLE не печатается в листинге. Директива SUBTITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Подзаголовок остается одним и тем же на каждой странице листинга, если его не измененит директива EJECT.

Пример:


   SUBTITLE ('Описания Глобальных Данных')

 

TITLE (Печатает заголовок МОДУЛЯ)


    TITLE(заголовок модуля) 

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

TITLE печатает в первой колонке первой строки листинга Кларион. Директива TITLE не печатается в листинге. Директива TITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Заголовок остается одним и тем же на каждой странице листинга.

Пример:


   TITLE ('ORDERSYS - Листинг Системы Ввода Заказов')

 

Назад | Содержание | Вперед