Advertisement
Abaduaber

FProcG

Dec 11th, 2012
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.77 KB | None | 0 0
  1. Var
  2.     GVI: Integer;
  3.     GVL: LongInt;
  4.     {Объявили две глобальные переменные. Глобальные переменные видны в любой
  5.     части модуля, как в подпрограмме, так и в главной программе.}
  6.  
  7.     Procedure VarTest(Var TestV: LongInt); Forward;  {Можно узнать, зачем эта хрень,
  8.     если убрать ее и попробовать скомпилировать программу}
  9.  
  10. {Процедура SetGV, самая простейшая. Все, что она делает, это просто присваивает
  11. значения нашим глобальным переменным. Заодно она показывает, что глобальные
  12. переменные доступны отовсюду}
  13. Procedure SetGV;
  14. Begin
  15.     GVI:= 45; GVL:= 12;
  16. End;
  17.  
  18. {Процедура SetAnyGV. От предыдущей отличается тем, что принимает параметры.
  19. Это те переменные или значения, копии которые делаются внутри процедуры на стеке.
  20. ТО-есть, теперь, только внутри этой процедуры присутствуют две переменные с
  21. именем AGVI и AGVL и в них находятся те значения, которые там были при вызове}
  22. Procedure SetAnyGV(AGVI: Integer; AGVL: LongInt);
  23. Begin
  24.     GVI:= AGVI; GVL:= AGVL;
  25. End;
  26.  
  27. {Функция, в отличае от процедуры должна возвращать значение какого-либо типа.
  28. Функцию можно вызвать, в зависимости от типа, даже из математического выражения,
  29. например, как функцию Sin.}
  30. Function ReadVal: LongInt;
  31. Var
  32.     V: LongInt; {Эта переменная является локальной. Она видима только внутри этой функции,
  33.     и когда функция завершится, она перестанет существовать.}
  34. Begin
  35.     ReadLn(V); {Читаем переменную с клавиатуры}
  36.     ReadVal:= V; {Возвращаем для функции ее значение. Если это не сделать,
  37.     то результатом выполнения будет всякий мусор.}
  38. End;
  39.  
  40. Procedure Test;
  41. Var
  42.     I: LongInt;
  43. Begin
  44.     I:= 140;
  45.     VarTest(I);
  46.     WriteLn('I = ', I);
  47. End;
  48.  
  49. {А вот тут параметр необычный. Если перед именем и типом параметра записать
  50. ключевое слово Var, то параметр становится ссылочным. То-есть, в стек передается
  51. не его значение, а адрес его переменной. Соответственно, это отличается двумя
  52. существенными деталями: Параметр должен быть переменной, и вызывать процедуру,
  53. например, так: VarTest(I + 10); уже не выйдет. Вторая деталь - если внутри
  54. процедуры значение I изменится, то оно изменится для этой переменной в целом - тоесть
  55. по всей программе. Иногда этот сервис очень полезен, но нужно быть с ним осторожным.
  56. Процедура Test показывает такое поведение.
  57. Чтобы посмотреть на различия в поведении между вариантом с Var И без него,
  58. достаточно просто Var удалить\добавить назад снизу и в началае программы,
  59. там где заголовок.}
  60. Procedure VarTest(Var TestV: LongInt);
  61. Begin
  62.     TestV:= 40;
  63. End;
  64.  
  65. Begin
  66.     SetGV; {Присвоим глобальным переменным значения.}
  67.     SetAnyGV(40, 50); {Еще раз}
  68.     SetAnyGV(40 * GVI Div 4, 50 - 5); {Можно рассчитывать любой обычный параметр, как выражение}
  69.     WriteLn('Введите два числа:');
  70.     SetAnyGV(ReadVal, ReadVal);  {Вот тут и сыграла наша функция. Она читает два числа с клавиатуры,
  71.     и тут же отправляет их в процедуру SetAnyGV как параметры}
  72.     WriteLn('GVI = ', GVI);
  73.     WriteLn('GVL = ', GVL);
  74.     Test;
  75.     WriteLn('Введите 3 числа, чтобы увидеть их сумму: ');
  76.     WriteLn(ReadVal + ReadVal + ReadVal);
  77.     ReadLn;
  78. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement