Массивы в процедурах и функциях языка Pascal
Создано: 13.03.2026
Массивы также, как и другие типы данных, можно передавать в качестве параметров в подпрограммы и возвращать их из функций. Однако определять формальные параметры, непосредственно описывая массив через базовый тип, нельзя. Как и нельзя так делать, задавая тип возвращаемого функцией значения. Вместо этого следует определять свой тип в разделе type программы и далее использовать его.
const N = 5; type myArray = array[1..N] of Integer; var a: myArray; i: Byte; procedure MyProcedure(var b: myArray); begin for i:=1 to N do b[i] := b[i] + 100; end; begin for i:=1 to N do read(a[i]); MyProcedure(a); for i:=1 to N do write(a[i], ' '); writeln; end.
В примере массив a меняется, так как передается в процедуру по ссылке. На это указывает слово var перед именем формального параметра b. Так если мы введем числа 1 2 3 4 5, то получим 100 200 300 400 500.
Если мы не хотим менять исходный массив, а хотим получить новый, то одним из вариантов сделать это может быть передача массива в функцию по значению и возврат из нее нового массива.
const N = 5; type myArray = array[1..N] of Integer; var a, c: myArray; i: Byte; function MyFunc(b: myArray): myArray; begin for i:=1 to N do b[i] := b[i] + 100; myFunc := b; end; begin for i:=1 to N do read(a[i]); c := MyFunc(a); for i:=1 to N do write(a[i], ' '); writeln; for i:=1 to N do write(c[i], ' '); writeln; end.
В программе показано, что массив a останется прежним, в то время как в массиве c все значения увеличатся на 100.
Несомненно, можно объявлять переменные массивного типа в самих подпрограммах:
const N = 5; type myArray = array[1..N] of Integer; var a: myArray; i: Byte; function MyFunc(): myArray; var b: myArray; // array[1..N] of Integer; begin for i:=1 to N do b[i] := random(100); myFunc := b; end; begin randomize; a := MyFunc(); for i:=1 to N do write(a[i], ' '); writeln; end.
Причем здесь не обязательно делать это через ранее описанный тип. В коде выше в комментарии показано альтернативное определение.
Поскольку переменная a является глобальной, то подпрограмма имеет к ней доступ. Поэтому можно обойтись без локальной переменной b.
const N = 10; var a: array[1..N] of Integer; i: Byte; procedure fillArray(low: integer; high: integer); begin for i:=1 to N do a[i] := random(high - low) + low; end; begin randomize; fillArray(-300, 300); for i:=1 to N do write(a[i], ' '); writeln; end.
Пример выполнения:
205 -198 -279 -225 196 -27 -67 126 -104 -164
Однако подобное делает функцию неуниверсальной. Если в программе будет другая переменная, то вызвать функцию уже будет нельзя.