Массивы в процедурах и функциях языка 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

Однако подобное делает функцию неуниверсальной. Если в программе будет другая переменная, то вызвать функцию уже будет нельзя.