Функция: туда и обратно
Итак, в функцию при ее вызове должны попасть какие-то значения. Например, в основной программе написано:
a:=StrToFloat(Edit2.Text);
b := Tan(a);
Чтобы значение переменой a оказалось в функции, ее заголовок должен выглядеть следующим образом:
FUNCTION Tan(x: REAL):REAL;
Такое описание говорит, что передаваемое в функцию значение должно быть типа REAL и оно заносится в переменную x внутри функции. Второе слово REAL относится к типу результата, возвращаемого функцией Tan. При вызове значение переменной a будет скопировано в переменную х.
Все переменные, описанные внутри функции или процедуры, являются ЛОКАЛЬНЫМИ. Это значит, что они никак не связаны с одноименными переменными, описанными в других частях программы. Например:
IMPLEMENTATION
VAR a: REAL; { глобальная переменная а }
FUNCTION abc(a:REAL):REAL; { локальная переменная а }
BEGIN
…
END;
В примере в начале всей программы выделяется память под ГЛОБАЛЬНУЮ переменную с именем a. Глобальные переменные можно использовать в любом месте в тексте программы. Они постоянно занимают память. Большое количество глобальных переменных – признак низкой квалификации программиста.
Переменная a, описанная в заголовке функции abc, существует только внутри этой функции. Она никак не связана с глобальной переменной a, это две разные ячейки памяти. Внутри функции глобальная переменная a будет не видна, возможен доступ только к локальной переменной a.
В момент вызова функции Tan значение, записанное в скобках после ее имени, будет занесено в локальную переменную a. Например:
x := Tan(2*b+pi);
Сначала вычисляется выражение 2*b+pi, а затем начинает выполняться функция и полученное при вычислении значение заносится в ее локальную переменную а.
В процедурах и функциях могут быть и обычные локальные переменные, типы данных и константы:
FUNCTION abc(a:REAL):REAL;
TYPE TA=ARRAY[1..10] OF REAL;
VAR x:REAL;
BEGIN
…
END;
В приведенном примере в переменную a заносится значение при вызове функции, а переменная x является просто ячейкой памяти. Она никак не связана с другими переменными с именем x, описанными в других местах программы. Аналогично тип данных TA в примере действует (обычно говорят "виден") только до конца текста функции, т.е. до слова END.
После того, как в функции вычислено возвращаемое значение, самое главное – не забыть на самом деле вернуть его. Для возврата значения внутри функции всегда существует переменная с именем Result, а также с именем, совпадающем с именем самой функции. Например, внутри функции Tan живет переменная с именем Tan и типом REAL и переменная Result тоже типа Real (напомним, что тип возвращаемого значения указывается после заголовка функции). Этой-то переменной и нужно присвоить результат вычислений:
FUNCTION Tan(a:REAL):REAL;
BEGIN
Result:=SIN(a)/COS(a)
END;
Очень часто встречается следующая ошибка:
Такая функция возвращает неопределенное значение. И в самом деле, результат вычисления тангенса записан в переменную t. Но это локальная переменная, при выходе из функции она удаляется из памяти вместе с вычисленным значением. Соответственно и вся функция становится бесполезной. Нужно помнить простое правило: внутри функции обязательно должно присваиваться значение переменной result.
Дата добавления: 2015-03-19; просмотров: 822;