
Лекция 13 (2 часа)
-
Операторы работы с процедурами и функциями.
Операторы вызова процедур и процедур-функций
Оператор объявления BASIC-процедур - DECLARE (BASIC)
Оператор объявления процедур на языках семейства Microsoft - DECLARE Оператор задания процедуры - SUB
Оператор задания процедуры-функции - FUNCTION
Оператор вызова BASIC-процедур - CALL
Оператор вызова программ на машинном языке -CALL ABSOLUTE
13.1. Операторы вызова процедур и процедур-функций
Группа операторов вызова процедур и процедур-функций объединяет операторы следующего назначения:
• объявления BASIC-процедур;
_™0• объявления процедур на языках С, Pascal, FORTRAN, Assembler;
• задания процедур и процедур-функций;
• вызова BASIC-процедур;
• вызова разноязыковых модулей на языках семейства Microsoft (С, PaScai, FORTRAN, Assembler);
• вызова программ на машинном языке;
• выполнения команд MS DOS.
13.2. Оператор объявления BASIC-процедур - DECLARE (BASIC)
Назначение: Объявляет ссылки к BASIC-процедурам и вызывает проверку типов аргументов.
Синтаксис:
DECLARE (FUNCTION | SUB] <имя> [([ <список параметров> ])]
Аргумент Описание
<имя> Имя процедуры; оно ограничено 40 символами. Имя процедуры-функции FUNCTION может сопровождаться маркером типа (%, &, !, #, $) для возвращаемой величины
<список параметров> Список параметров используется при вызове процедуры, определяет только количество и тип аргументов
13.3. Оператор объявления процедур на языках семейства
Microsoft - DECLARE
Назначение: Объявляет вызываемые последовательности внешних процедур, написанных на других языках программирования семейства Microsoft.
Синтаксис 1:
DECLARE FUNCTION <имя> [CDECL] [ALIAS < альтернативное имя>"]
[([ <список параметров> ])]
Синтаксис 2
DECLARE SUB <имя> [CDECL] [ALIAS "<альтернативное имя>"]
[([ <список параметров> ])]
Элемент Описание
FUNCTION Указывает, что внешняя процедура возвращает значение; может использоваться в составе арифметических выражений
SUB Указывает, что внешняя процедура вызывается аналогично BASIC-процедуре
<имя> Имя, используемое в BASIC-программе для вызова процедуры; длина до 40 символов; имя процедуры-функции может включать маркер типа (%, &, !, #, $) для .возвращаемой величины.
CDECL Указывает, что процедура использует порядок размещения аргументов, свойственный языку С; ключевое слово CDECL указывает на передачу аргументов справа налево, а не слева направо, как принято в среде языка BASIC
ALIAS Указывает, что процедура имеет другое имя в .OBJ-файле или библиотеке; если отсутствует ключ ALIAS, то имя процедуры отображается строчными буквами, маркер типа удаляется, а в начале имени добавляется символ подчеркивания, и именно это имя используется при поиске библиотек и внешних файлов; если за ключом CDECL следует ключ ALIAS, то используется указанное альтернативное имя.
Синтаксис аргумента <список параметров>
[[BYVAL SEG]] <переменная> [AS <тип>] (, [[BYVAL SEGl] <переменная> [AS <тип>] ] ...
Элемент Описание
BYVAL Указывает, что параметр передается значением, а не ссылкой; передача ссылкой принята по умолчанию; ключ можно применять только для числовых параметров типа INTEGER, LONG, SINGLE, DOUBLE; при использовании BYVAL текущий аргумент преобразуется к типу, указанному в операторе DECLARE, непосредственно перед передачей параметра
SEG Указывает, что параметр передается адресом сегмента
<переменная> Имя, допустимое для переменных языка BASIC;
существенным является тип переменной; если переменная - массив, то в скобках можно указать его размерность (в частности, чтобы обеспечить совместимость с прежними версиями языка)
AS <тип> Указывает тип переменной: INTEGER, LONG, SINGLE, DOUBLE, STRING, ANY - или имя структуры; можно указывать также и маркер типа (%, &, !, #, $) или принимать его по умолчанию;
при объявлении внешних процедур, написанных на других языках, можно указать тип ANY, и это приведет к тому, что проверка типа не выполняется; нельзя использовать тип ANY для аргумента, передаваемого значением
Если не используются ключи BYVAL и SEG, то аргументы передаются смещением.
13.4. Оператор задания процедуры - SUB
Назначение: Указывает начало и конец процедуры.
Синтаксис:
SUB <глобальное имя> [( <список параметров> )] [STATIC]
[EXIT SUB] END SUB
Аргумент Описание
<глобальное имя> Имя переменной не более чем из 40 символов. Это имя не может использоваться в других операторах SUB или FUNCTION в данной программе, а также в библиотеке пользователя
<список параметров> Содержит имена простых переменных и массивов, передаваемых при вызове процедуры SUB. Каждое имя отделяется от предыдущего запятой. В связи с тем, что переменные и массивы передаются в процедуру ссылкой, то любое изменение величины аргумента в подпрограмме приводит к изменению величины этой переменной в вызываемой программе
Аргумент <список параметров> оператора SUB имеет следующий синтаксис:
<переменная> [()] [ AS <тип> ]
[, <переменная> [()] [ AS <тип> ]...,
где: <переменная> - имя переменной языка BASIC;
<тип> - тип переменной, принимающий значения INTEGER,
LONG, SINGLE, DOUBLE, STRING, ANY или определяемый пользователем.
В качестве параметра <тип> нельзя использовать строки фиксированной длины. Атрибут STATIC указывает, что все переменные, локальные для процедуры SUB, являются статическими и их величины сохраняются между вызовами.
13.5. Оператор задания процедуры-функции - FUNCTION
Назначение: Объявляет имя, параметры и способ формирования тела процедуры-функции.
Синтаксис:
FUNCTION < имя > [( список параметров )] [STATIC]
<имя> = <выражение> END FUNCTION
Аргумент Описание
<имя> Имя процедуры-функции эквивалентно имени переменной; содержит не более чем 40 символов и может включать символы определения типа (%. $i 'ч ^ члч $)• Тип возвращаемого значения может быть определен также и в операторе DEF
<список параметров> Список переменных, передаваемых в процедуру-функцию и разделенных запятыми. Поскольку параметры передаются ссылкой, то любое изменение величины параметра в процедуре-функции вызовет изменение величины этой переменной в вызывающей программе
STATIC Атрибут, указывающий, что все локальные для данной функции переменные сохраняются между вызовами. При отсутствии атрибута STATIC память под локальные переменные выделяется во время вызова процедуры-функции, а после возврата управления в вызывающую программу память освобождается. Атрибут STATIC не распространяет своего действия на используемые в процедуре-функции переменные, которые были объявлены вне этой процедуры в операторах DIM или COMMON с атрибутом SHARED
<выражение> Величина, возвращаемая процедурой-функцией. Она присваивается имени функции; если величина не присвоена, то возвращаемое значение равно: для числовых функций - 0, для строковых -" " (пустой строке).
Аргумент < список параметров > имеет следующий синтаксис:
<переменная> [()] [AS тип ]
[, <переменная> [()] [ AS тип ]...,
где: <переменная> - имя переменной языка BASIC;
<тип> - тип переменной, принимающий значения INTEGER,
LONG, SINGLE, DOUBLE, STRING, ANY или определяемый пользователем.
Оператор EXIT FUNCTION обеспечивает альтернативный выход из тела процедуры-функции.
13.6. Оператор вызова BASIC-процедур - CALL
Назначение: Передает управление подпрограмме SUB на языке BASIC. Синтаксис 1: CALL <имя> [( <список аргументов> )]
Синтаксис 2: <имя> [( <список аргументов> )]
Аргумент Описание
<имя> Имя ограничено длиной в 40 символов. Имя должно быть объявлено в операторе SUB, если процедура размешается в этом же модуле
<список аргументов> Переменные или константы, передаваемые в процедуру. Аргументы в списке отделяются за--пятыми. Аргументы, передаваемые ссылкой, могут быть изменены при выполнении процедуры
Если <список аргументов> включает переменную массива, то массив указывается именем, за которым следуют пустые скобки.
13.7. Оператор вызова программ на машинном языке -CALL ABSOLUTE
Назначение: Передает управление модулю, написанному на машинном языке. Синтаксис: CALL ABSOLUTE ([<список аргументов>,]<целая переменная>]) Аргумент Описание
<список аргументов> Необязательные аргументы, передаваемые процедуре на машинном языке
<целая переменная> Определяет смещение от начала текущего сегмента, установленного оператором DEF SEG. Аргумент <целая переменная> не передается процедуре. Оператор DEF SEG должен быть выполнен перед оператором CALL ABSOLUTE, чтобы указать начальный адрес сегмента для вызываемого модуля на машинном языке. Использование в качестве аргумента <целая переменная> нецелочисленного значения может вызвать непредвиденные последствия
Параметры из <списка аргументов> передаются процедуре на машинном языке ссылкой по смещению относительно начала текущего сегмента данных; в то же время обращение к самому модулю осуществляется по полному адресу.