Персональная страничка
| ||
Предыдущий раздел:
Следующий раздел:
Как вы знаете с отдельными элементами массивов можно работать также как с обычными (скалярными) переменными. Соответственно можно использовать их в качестве фактических параметров. Однако, может потребоваться передать процедуре не отдельные элементы, а весь массив целиком. При этом недопустим такой, например, способ описания параметра:
procedure P(a: array [1..10] of integer); {Так нельзя}
Тип параметра должен быть или скалярным или заранее определенным в разделе type. То есть правильным будет следующее описание:
type TArray = array [1..10] of integer; var x: TArray; procedure P(a: TArray);
Такую процедуру P можно вызывать, указав в качестве фактического параметра, например, глобальную переменную x.
Пример: Программа, вычисляющая сумму элементов массива.
const n = 10; type TArray = array [0..n-1] of integer; var x: TArray; i, sum: integer; procedure Summa(a: TArray; var s:integer); var i: integer; begin s:=0; {Операции с параметром-переменной s отразятся на фактическом параметре – глобальной переменной sum} for i:=0 to n-1 do s:=s+a[i]; end; begin for i:=0 to n-1 do readln(x[i]); Summa(x, sum); {К моменту вызова процедуры, переменной sum ничего еще не присвоили. Это не страшно, так как начальное значение параметра s для работы процедуры несущественно} writeln(sum); end.
При вызове процедуры содержимое массива x будет скопировано в массив a. Глобальная переменная sum на время работы процедуры приобретет синоним s. То есть, присваивая что-то переменной s, мы тем самым изменяем и переменную sum. В итоге программа выведет сумму элементов введенного пользователем массива.
При передаче массива через параметр-значение происходит копирование его содержимого в новые ячейки памяти. При работе с массивами большого размера или при необходимости вызывать процедуру очень много раз это может привести к большим затратам времени. Чтобы этого избежать, можно передавать массивы через параметры-переменные. При этом фактического переноса содержимого массивов из одной области памяти в другую не происходит, и вызов процедуры занимает меньше времени. То есть при большом размере массива правильнее будет заголовок:
procedure Summa(var a: TMassive; var s: integer);
Следующий раздел:
Предыдущий раздел: