SetLength, Компилятор выдаёт ошибку, что ожидалось 2 параметра

type
  matrix = array of array of integer;
  arr = array of integer;

procedure matr2(c: char; var x: matrix; var m, n: integer);
var
  i, j: integer;
begin
  writeln('Введите количество строк в матрице ' + c + ': ');
  readln(m);
  writeln('Введите количество столбцов в матрице ' + c + ': ');
  readln(n);
  setlength(x,m,n);// вот эта строчка!
  writeln('Матрица ', c, ':'); 
  for i := 0 to m-1 do 
  begin
    for j := 0 to n-1 do 
    begin
      x[i, j] := -99 + random(199); 
      write(x[i, j]:4)
    end;
    writeln
  end
end;

procedure el(const x: matrix; const m, n: integer; var y: arr);
var
  i, j: integer;
begin
  for j := 1 to n do y[j] := 0; 
  for i := 1 to m do 
    for j := 1 to n do 
      if x[i, j] < 0 then inc(y[j])
end;


procedure poell(var y: arr; const n: integer);
var
  j: integer;
begin
  writeln('Количество отрицательных элементов по столбцам:'); 
  for j := 1 to n do write(y[j]:4); 
  writeln; 
  writeln
end;


var
  a, b: matrix;
  c, d: arr;
  i, j, k, e: integer;

begin
  randomize; 
  matr2('A', a, i, j); 
  el(a, i, j, c); 
  poell(c, j); 
  matr2('B', b, k, e); 
  el(b, k, e, d); 
  poell(d, e); 
  readln;
  end.

Я предполагаю, что ошибка в неверной передаче параметров в Setlength, как можно изменить первую процедуру, чтобы эта ошибка исчезла?

Двумерный массив это массив, в котором каждый элемент это массив.

Так что надо сначала SetLength(x, m), а потом в цикле SetLength(x[i], n).

Example: Multidimensional dynamic array - Free Pascal wiki


При вставке кода на форумы надо нажимать кнопку Код.

А во второй процедуре,нужно так же выделять место под массив?

procedure el(const x: matrix; const m, n: integer; var y: arr);
var
  i, j: integer;
begin
  for j := 1 to n do y[j] := 0; 
  for i := 1 to m do 
    for j := 1 to n do 
      if x[i, j] < 0 then inc(y[j])
end;

Смотря что делать нужно :man_shrugging:

Туда ж видимо передается уже созданный в первой.

Программа ищет количество отрицательных элементов по столбцам.
Просто мне выдает ошибку, что параметр цикла for в PascalABC.NET должен описываться в заголовке цикла.

Выдает как именно?
Это наверно не ошибка, а просто рекомендация объявлять переменные цикла сразу в цикле (for var i := ...) без объявления в процедуре. Описание параметра цикла for в заголовке цикла — Вики проекта PascalABC.NET

Вот так вот выдаёт:

Ошибка в конце, остальное просто предупреждения.

Похоже для y нигде не вызван SetLength.

Хорошо, если я впишу setlength(y,n) до выделенной строчки, то индекс находиться вне границы массива.

на какой строке?

Которая выделена на фото.

Так а в коде что сейчас, как х создается?

Понял, наверное, за сегодня уже подустал. Спасибо Вам большое!