@dmitri_001

Как передать массив в процедуру?

Добрый день. Пишу программу на PascalABC которая должна сравнивать массивы, само действие нужно производить через процедуры. Пытаюсь передать массивы в процедуру, но получаю ошибку.
Program1.pas(33) : Нельзя преобразовать тип array [0..3] of integer к array of integer

Код выглядит следующим образом:
procedure test(a,b: array of integer);
собственно сами массивы, которые я передаю вызываю как
a: array [0..3] of integer;
Как действовать?
  • Вопрос задан
  • 13514 просмотров
Решения вопроса 1
AnnTHony
@AnnTHony
Интроверт
Установил Pascal ABC.net (версия 3.1, сборка 1179 от 29.02.2016)

Как пишет справка:


Передача статического массива в подпрограмму

При передаче статического массива в подпрограмму по значению также производится копирование содержимого массива - фактического параметра в массив - формальный параметр:

procedure p(a: Arr); // передавать статический массив по значению - плохо!
...
p(a1);


Это крайне расточительно, поэтому статические массивы рекомендуется передавать по ссылке. Если массив не меняется внутри подпрограммы, то его следует передавать как ссылку на константу (const), если меняется - как ссылку на переменную:

type Arr = array [2..10] of integer;

procedure Squares(var a: Arr);
begin
  for var i:= Low(a) to High(a) do
    a[i] := Sqr(a[i]);
end;

procedure PrintArray(const a: Arr);
begin
  for var i:= Low(a) to High(a) do
    Print(a[i])
end;

var a: Arr := (1,3,5,7,9,2,4,6,8); 

begin
  Squares(a);
  PrintArray(a);
end.


Для доступа к нижней и верхней границам размерности одномерного массива используются функции Low и High.


Вот рабочий код:

Program arrays;
type
  tArray = array [0..3] of integer;

var
  a, b: tArray;
  i: integer;

procedure FirstProcedure(a, b: tArray); 
begin
  writeLn(a);
end;

begin
  for i := Low(a) to High(a) do
    begin
      writeLn('WHAT IS A' + i + '?');
      readLn(a[i]);
    end;
    
  for i := Low(b) to High(b) do
    begin
      writeLn('WHAT IS B' + i + '?');
      readLn(b[i]);
    end;

  FirstProcedure(a,b);
end.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы