Ошибка "Несколько подпрограмм могут быть вызваны" - Pascal ABC

Формулировка задачи:

Делал лабораторную, всё как обычно, но вдруг встретился с ранее не известной мне ошибкой в PascalABC
//  (ba)!x^2+2*dc)!x+(mk)!=0
//  z 6-6  w 11-11  v 12-12
 
program lab6zachas;
 
uses
  crt;
 
const
  ZA = 6;
  WA = 11;
  VA = 12;
  Y = 1;
 
var
  z: array [1..ZA, 1..ZA] of integer;
  w: array [1..WA, 1..WA] of integer;
  v: array [1..VA, 1..VA] of integer;
  
  a, b, c, d, k, m, x1, x2: integer;
  factba, factdc, factmk: BigInteger;
  i, j: byte;
 
//
function fact(n:integer):BigInteger;
var r: BigInteger;
    i: integer;
begin
r:=1;
if n=1 then fact:=1
         else 
          for i:= 2 to n do
           begin
            r:=r*i;
           end;
         fact:=r;  
end;
 
//
procedure xnadva(g, h, j: BigInteger; D: BigInteger; var res: BigInteger);
  begin
  if (g=0) then
  begin
      writeln('Не квадратное уравнение.');
      halt;
   end;
   D := h*h-4*g*j;
   if (D=0) then
   begin
      writeln('x = ',-h/2.0/g);
      halt;
   end;
   if (D>0) then
   begin
      writeln('x1 = ',(-h+Sqrt(D))/2.0/g);
      writeln('x2 = ',(-h-Sqrt(D))/2.0/g);
   end
   else
   begin
      writeln('x1 = (',-h/2.0/g,',',Sqrt(-D)/2.0/g,')');
      writeln('x2 = (',-h/2.0/g,',',-Sqrt(-D)/2.0/g,')');
   end;
end;
 
 
begin
  randomize;
  a := 0;
  b := 0;
  
  //Z
  for i := 1 to ZA do 
  begin
    for j := 1 to ZA do
    begin
      z[i, j] := random(Y) - random(Y);
      write(z[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //W
  for i := 1 to WA do 
  begin
    for j := 1 to WA do
    begin
      w[i, j] := random(Y) - random(Y);
      write(w[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //V
  for i := 1 to VA do 
  begin
    for j := 1 to VA do
    begin
      v[i, j] := random(Y) - random(Y);
      write(v[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //Zmod
  for i := 1 to ZA do 
  begin
    write(' ':5 * (ZA - i + 1));
    for j := ZA - i + 2 to ZA do 
    begin
      write(z[i, j]:5);
      a := a + 1;
      b := b + abs(z[i, j]);
    end;
    writeln();
  end;
  
  writeln(a); // Вывод кол-ва
  writeln(b); // Вывод суммы модулей 
  
    //Wmod
  for i := 1 to WA do 
  begin
    write(' ':5 * (WA - i + 1));
    for j := WA - i + 2 to WA do 
    begin
      write(w[i, j]:5);
      c := c + 1;
      d := d + abs(w[i, j]);
    end;
    writeln();
  end;
  
  writeln(c); // Вывод кол-ва
  writeln(d); // Вывод суммы модулей 
  
    //Vmod
  for i := 1 to VA do 
  begin
    write(' ':5 * (VA - i + 1));
    for j := VA - i + 2 to VA do 
    begin
      write(v[i, j]:5);
      m := m + 1;
      k := k + abs(v[i, j]);
    end;
    writeln();
  end;
  
  writeln(m); // Вывод кол-ва
  writeln(k); // Вывод суммы модулей 
  
    // (ba)! x^2 + 2(dc)! x + (mk)! = 0
    // (ba)! = factba
    // (dc)! = factdc
    // (mk)! = factmk
 
  factba := fact(a*b);
  factdc := fact(d*c);
  factmk := fact(m*k);
  
  writeln(factba);
  writeln;
  writeln(factdc);
  writeln;
  writeln(factmk);
  
  xnadva(factba, factdc, factmk, res);
 
  readln;
end.
Эту ошибку он выдаёт в 42 строке. После удаления ( для проверки) данного условия, ошибка находится и в последующих. Всю ночь на неё убил Как это исправить? Помогите пожалуйста P.S. ещё нужно с типами данных в desc разобраться

Код к задаче: «Ошибка "Несколько подпрограмм могут быть вызваны" - Pascal ABC»

textual
//  (ba)!x^2+2*dc)!x+(mk)!=0
//  z 6-6  w 11-11  v 12-12
 
program lab6zachas;
 
uses
  crt;
 
const
  ZA = 6;
  WA = 11;
  VA = 12;
  Y = 1;
 
var
  z: array [1..ZA, 1..ZA] of integer;
  w: array [1..WA, 1..WA] of integer;
  v: array [1..VA, 1..VA] of integer;
  
  a, b, c, d, k, m, x1, x2: integer;
  rez, factba, factdc, factmk: LongInt;
  i, j: byte;
 
//
function fact(n: integer): LongInt;
var
  r: LongInt;
  i: integer;
begin
  r := 1;
  if n = 1 then fact := 1
  else
    for i := 2 to n do
    begin
      r := r * i;
    end;
  fact := r;
end;
 
//
procedure xnadva(g, h, j: LongInt; var res: LongInt);
var
  D: LongInt;
begin
  if (g = 0) then
  begin
    writeln('Не квадратное уравнение.');
    halt;
  end;
  D := h * h - 4 * g * j;
  if (D = 0) then
  begin
    writeln('x = ', -h / 2.0 / g);
    halt;
  end;
  if (D > 0) then
  begin
    writeln('x1 = ', (-h + Sqrt(D)) / 2.0 / g);
    writeln('x2 = ', (-h - Sqrt(D)) / 2.0 / g);
  end
   else
  begin
    writeln('x1 = (', -h / 2.0 / g, ',', Sqrt(-D) / 2.0 / g, ')');
    writeln('x2 = (', -h / 2.0 / g, ',', -Sqrt(-D) / 2.0 / g, ')');
  end;
end;
 
 
begin
  randomize;
  a := 0;
  b := 0;
  
  //Z
  for i := 1 to ZA do
  begin
    for j := 1 to ZA do
    begin
      z[i, j] := random(Y) - random(Y);
      write(z[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //W
  for i := 1 to WA do
  begin
    for j := 1 to WA do
    begin
      w[i, j] := random(Y) - random(Y);
      write(w[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //V
  for i := 1 to VA do
  begin
    for j := 1 to VA do
    begin
      v[i, j] := random(Y) - random(Y);
      write(v[i, j]:5);
    end;
    writeln;
  end;
  
  writeln;
  writeln;
  
  //Zmod
  for i := 1 to ZA do
  begin
    write(' ':5 * (ZA - i + 1));
    for j := ZA - i + 2 to ZA do
    begin
      write(z[i, j]:5);
      a := a + 1;
      b := b + abs(z[i, j]);
    end;
    writeln();
  end;
  
  writeln(a); // Вывод кол-ва
  writeln(b); // Вывод суммы модулей
  
    //Wmod
  for i := 1 to WA do
  begin
    write(' ':5 * (WA - i + 1));
    for j := WA - i + 2 to WA do
    begin
      write(w[i, j]:5);
      c := c + 1;
      d := d + abs(w[i, j]);
    end;
    writeln();
  end;
  
  writeln(c); // Вывод кол-ва
  writeln(d); // Вывод суммы модулей
  
    //Vmod
  for i := 1 to VA do
  begin
    write(' ':5 * (VA - i + 1));
    for j := VA - i + 2 to VA do
    begin
      write(v[i, j]:5);
      m := m + 1;
      k := k + abs(v[i, j]);
    end;
    writeln();
  end;
  
  writeln(m); // Вывод кол-ва
  writeln(k); // Вывод суммы модулей
  
    // (ba)! x^2 + 2(dc)! x + (mk)! = 0
    // (ba)! = factba
    // (dc)! = factdc
    // (mk)! = factmk
  
  factba := fact(a * b);
  factdc := fact(d * c);
  factmk := fact(m * k);
  
  writeln(factba);
  writeln;
  writeln(factdc);
  writeln;
  writeln(factmk);
  
  xnadva(factba, factdc, factmk, rez);
  
  readln;
end.

11   голосов, оценка 3.909 из 5


СОХРАНИТЬ ССЫЛКУ