Передача по ссылке (call by reference)
Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Передача по ссылке (call by reference)





«Возврат значений» результатов из вызываемой программы можно осуществить через общую память переменных раздела, при этом сохраняется упомянутый ранее риск дублирования имен переменных. Более элегантной и надежной является форма передачи по ссылке.

Эта форма предполагает установление отношения между переменной в вызывающей и вызываемой программе. Любое присваивание и даже удаление командой Kill в вызываемой программе воздействует на соответствующую переменную вызывающей программы.

Синтаксический символ передачи переменной по ссылке — это точка перед именем переменной в списке параметров. Переменная var может, однако, в отличие от метода передачи по значению, не существовать!

Kill var // var более не существует

Do P1(.var) // вызов с передачей по ссылке

(...)

Р1(х) // формальный параметр х

Set x=0,x(l)=l,x(2),x(3)=3

(...)

Quit

Дополнительно, с помощью передачи по ссылке можно осуществлять связь целых массивов, иными словами, локальных индексированных переменных, с вызываемой программой и наоборот. После того как мы покинули Р1, в нашей программе существуют переменные var, var (1), var (2), var (3). Переменная var, таким образом, точное отображение х. Точно таким же способом осуществляется передача массива в вызываемую программу.

Разумеется, при вызове программы обе формы передачи параметров могут смешиваться.

Do ^Summe (a,b, с, . sum)

 

Процедуры

Структура процедуры

Выше обсуждалась концепция области видимости локальных переменных в Cache. Команда New в подпрограмме сохраняет локальные переменные, используемые в ней, и таким образом изолирует их от внешнего мира. Таким образом, разработчик должен создать список всех локальных переменных, которые необходимо сохранить. При этом легко пропустить необходимую переменную. С другой стороны, New без аргументов сохраняет все переменные, что приводит к дополнительным накладным расходам и поэтому должна использоваться осторожно.



Для упрощения управления локальными переменными, а также из общих соображений, Cache поддерживает процедуры. Процедура задается в следующей форме:

<procedurename> (<formal list>) [<public list>] <access> {

code ...

}

Например:

MyProc(X,Y) [A,B] Public

{

Write "X + Y = ", X+Y,!

Write "A + В = ", A+B,!

}

Эта процедура, названная МуРгос, объявлена как public, имеет два формальных параметра (х и y), и две public переменные (A и B). Основные синтаксические компоненты:

§ <procedurename> — идентификатор процедуры. Это обычная метка, начинающаяся с первой позиции строки и удовлетворяющая требованиям к именам программ.

§ <formal list> — список формальных параметров процедуры. Он организован точно так же, как в подпрограммах и пользовательских функциях. Поскольку список формальных параметров не может быть опущен, если их нет, то используются пустые скобки.

§ <public list> — необязательный список общедоступных переменных, используемых процедурой.

§ <access> — необязательное ключевое слово public (общедоступная) или private (внутренняя), которое определяет, можно ли вызывать процедуру из других программ, или нет.

§ {} — фигурные скобки обрамляют тело процедуры. После открывающей фигурной скобки и началом программного кода должен быть как минимум один пробел или конец строки. После закрывающей фигурной скобки не может быть никакого кода, кроме комментария.

Ключевое слово <access> всегда либо public, либо private. Процедура, объявленная как private, может быть вызвана только из той программы, которая ее содержит. Процедура, объявленная как public, может быть вызвана из других программ. По умолчанию, если явно не указано, процедура объявляется как private.

Код процедуры

Следующий список обобщает правила и принципы, применяемые при создании кода процедуры.

§ Процедура должна начинаться непосредственно с метки процедуры и никогда с последующих строк, например, с использованием ссылок типа метка+смещение, которые, вообще говоря, допустимы в командах Do и Goto, хотя это и очень плохой стиль программирования. Надо заметить, что метка, помещенная перед открывающей скобкой, считается находящейся внутри скобок, то есть два следующих фрагмента кода эквивалентны:

МуРгос() МуРгос () {

Label { label

 

§ Все метки внутри процедура имеют тип private и могут быть использованы только изнутри процедуры. Эти метки снаружи не видны. Ключевое слово private может быть использовано при задании меток вложенных процедур, но в этом нет необходимости. Ключевое слово public для таких меток не может быть использовано, оно вызовет сообщение об ошибке. Функция $Text также не может ссылаться на метки внутри процедуры; для этого можно использовать только метку самой процедуры в форме метка+смещение.

§ Несмотря на то, что одинаковые имена меток внутри процедуры недопустимы, они могут встречаться в разных процедурах, содержащихся в одной программе. Это же относится и к метке внутри процедуры и метке в «обычном» теле программы, которые тоже могут совпадать.

§ Если используется команда DO или вызов пользовательской функции без указания имени программы, то есть только с указанием имени метки, ее поиск осуществляется сначала внутри процедуры. Если в процедуре такая метка не будет обнаружена, поиск продолжается в теле текущей программы.

§ Вышеупомянутые правила слегка видоизменяются, если вызов программы или функции внутри процедуры происходит с указанием имени программы, например, label1^rou1. Очевидно, что происходит поиск метки LABEL1 в программе ROU1. Однако если программа ROU1 уже загружена, то есть вызов производится из процедуры, расположенной в данной программе, этот синтаксис всегда ссылается на метку за пределами текущей процедуры.

§ Если процедуры содержит команды Goto, эта команда может ссылаться только на внутренние метки процедуры. Команда Goto, ссылающаяся на внешние метки, недопустима.

§ Синтаксис метка+смещение внутри процедуры не поддерживается за следующими исключениями:

§ Как было указано выше, функция $Text () в форме метка+смещение допустима.

§ В режиме программиста команда Goto метка+смещение может быть использована после команды Break (или ошибки) для передачи управления внутри процедуры.

§ Конструкция метка+смещение может быть использована вместе с командой Zbreak, которая допускает такой синтаксис для перехода внутри процедуры.

§ Изменение системной переменной $Test, выполненное внутри процедуры, невидимо снаружи, иными словами, значение переменной $Test после выхода из процедуры всегда такое же, как было перед входом в нее.

§ Закрывающая скобка «}» может находиться в любой позиции строки, даже в первой. После нее в этой строке не должно быть программного кода.

§ Перед закрывающей скобкой выполняется неявная команда Quit, которая завершает процедуру.

§ Косвенность и команда Xecute внутри процедуры ведут себя так, как будто они выполняются вне процедуры. Другими словами, команда Xecute обрабатывается как внешняя подпрограмма.

Если косвенность или команда Xecute ссылаются на переменную внутри процедуры, всегда предполагается, что эта переменная типа public. Это прямое следствие тех фактов, что эти две языковые конструкции выполняются вне процедуры, а внутренние переменные недоступны снаружи. Это правило распространяется и на использование меток в этих конструкциях. Следовательно, поскольку команда Goto может ссылаться только на метки внутри процедуры, команда Goto @A внутри процедуры не поддерживается.

И, наконец, не стоит забывать о функции $CASE, которая похожа на функцию $Select. В отличие от $Select, эта функция может быть использована для программирования выбора без использования косвенности. Таким образом, $CASE внутри процедуры играет роль $Select.









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.