Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Var
- GVI: Integer;
- GVL: LongInt;
- {Объявили две глобальные переменные. Глобальные переменные видны в любой
- части модуля, как в подпрограмме, так и в главной программе.}
- Procedure VarTest(Var TestV: LongInt); Forward; {Можно узнать, зачем эта хрень,
- если убрать ее и попробовать скомпилировать программу}
- {Процедура SetGV, самая простейшая. Все, что она делает, это просто присваивает
- значения нашим глобальным переменным. Заодно она показывает, что глобальные
- переменные доступны отовсюду}
- Procedure SetGV;
- Begin
- GVI:= 45; GVL:= 12;
- End;
- {Процедура SetAnyGV. От предыдущей отличается тем, что принимает параметры.
- Это те переменные или значения, копии которые делаются внутри процедуры на стеке.
- ТО-есть, теперь, только внутри этой процедуры присутствуют две переменные с
- именем AGVI и AGVL и в них находятся те значения, которые там были при вызове}
- Procedure SetAnyGV(AGVI: Integer; AGVL: LongInt);
- Begin
- GVI:= AGVI; GVL:= AGVL;
- End;
- {Функция, в отличае от процедуры должна возвращать значение какого-либо типа.
- Функцию можно вызвать, в зависимости от типа, даже из математического выражения,
- например, как функцию Sin.}
- Function ReadVal: LongInt;
- Var
- V: LongInt; {Эта переменная является локальной. Она видима только внутри этой функции,
- и когда функция завершится, она перестанет существовать.}
- Begin
- ReadLn(V); {Читаем переменную с клавиатуры}
- ReadVal:= V; {Возвращаем для функции ее значение. Если это не сделать,
- то результатом выполнения будет всякий мусор.}
- End;
- Procedure Test;
- Var
- I: LongInt;
- Begin
- I:= 140;
- VarTest(I);
- WriteLn('I = ', I);
- End;
- {А вот тут параметр необычный. Если перед именем и типом параметра записать
- ключевое слово Var, то параметр становится ссылочным. То-есть, в стек передается
- не его значение, а адрес его переменной. Соответственно, это отличается двумя
- существенными деталями: Параметр должен быть переменной, и вызывать процедуру,
- например, так: VarTest(I + 10); уже не выйдет. Вторая деталь - если внутри
- процедуры значение I изменится, то оно изменится для этой переменной в целом - тоесть
- по всей программе. Иногда этот сервис очень полезен, но нужно быть с ним осторожным.
- Процедура Test показывает такое поведение.
- Чтобы посмотреть на различия в поведении между вариантом с Var И без него,
- достаточно просто Var удалить\добавить назад снизу и в началае программы,
- там где заголовок.}
- Procedure VarTest(Var TestV: LongInt);
- Begin
- TestV:= 40;
- End;
- Begin
- SetGV; {Присвоим глобальным переменным значения.}
- SetAnyGV(40, 50); {Еще раз}
- SetAnyGV(40 * GVI Div 4, 50 - 5); {Можно рассчитывать любой обычный параметр, как выражение}
- WriteLn('Введите два числа:');
- SetAnyGV(ReadVal, ReadVal); {Вот тут и сыграла наша функция. Она читает два числа с клавиатуры,
- и тут же отправляет их в процедуру SetAnyGV как параметры}
- WriteLn('GVI = ', GVI);
- WriteLn('GVL = ', GVL);
- Test;
- WriteLn('Введите 3 числа, чтобы увидеть их сумму: ');
- WriteLn(ReadVal + ReadVal + ReadVal);
- ReadLn;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement