Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта

Программа должна рассчитывать значения некоторых функций (в данном случае F(x)=sin(x)*cos(x) и G(x)=(x-1)^3). Но в 23 строке (указал комментарием) появляется ошибка, указанная в теме. Также в строке 24 и 32 (также указано) выводится ошибка "Параметр цикла for в PascalABC.NET должен описываться в заголовке цикла". Заранее благодарю!

program lr2;
var A : real; //Левая граница отрезка
    B : real; //Правая граница отрезка
    N : integer; //Количество интервалов
    i : integer; //Переменная цикла
    h : real; //Величина шага
    x : array of real; //Массив аргументов функции
    F : array of real; //Массив значений F(x)
    G : array of real; //Массив значений G(x)
    
begin
  write ('Введите значение первой точки: A = ');
  readln (A);
  write ('Введите значение второй точки: B = ');
  readln (B);
  if A>=B then writeln ('Ошибка ввода отрезка, A должно быть строго меньше B!')
  else begin
  write ('Введите количество инетрвалов: N = ');
  readln (N);
  if N<=0 then writeln ('Ошибка ввода колличества интервалов, N должно быть cтрого больше 0!')
  else begin
  h:=(B - A)/N;
  x[1]:=1; // СТРОКА 23
  for i:= 1 to N do //строка 24
      begin
      F[i]:=sin(x[i])*cos(x[i]);
      G[i]:=Power((x[i]-1),3);
      x[i+1]:= A + h;
      end;
writeln ('┌───────┬───────┬───────┐');
writeln ('│  x   │ F(x) │ G(x) │');
for i:=1 to N do // строка 32
  begin
  writeln ('├───────┼───────┼───────┤');
  writeln ('│  ',x[i],'  │  ',F[i],'  │  ',G[i],'  │');  
  end;
  end;
  end;
end.

Ответы (2 шт):

Автор решения: Zhihar

ок, объявили динамический, а не статический массив

x : array of real

но

When declaring a variable of a dynamic array type, the initial length of the array is zero. The actual length of the array must be set with the standard SetLength function, which will allocate the necessary memory to contain the array elements on the heap.

кто массиву размер то задаст перед тем как в него что-то писать?

https://www.freepascal.org/docs-html/ref/refsu14.html

→ Ссылка
Автор решения: RAlex
begin
  var A := ReadReal('Введите значение первой точки: A =');
  var B := ReadReal('Введите значение второй точки: B =');
  if A >= B then
    Print('Ошибка ввода отрезка, A должно быть строго меньше B!')
  else
  begin
    write();
    var N := ReadInteger('Введите количество интервалов: N =');
    if N <= 0 then
      Print('Ошибка ввода количества интервалов, N должно быть cтрого больше 0!')
    else
    begin
      var x := new real[N + 1];
      var F := new real[N + 1];
      var G := new real[N + 1];
      var h := (B - A) / N;
      for var i := 0 to N do
      begin
        x[i] := A + i * h;
        F[i] := Sin(x[i]) * Cos(x[i]);
        G[i] := (x[i] - 1) ** 3
      end;
      Println('┌───────┬────────┬────────┐');
      Println('│   x   │  F(x)  │  G(x)  │');
      for var i := 0 to N do
      begin
        Println('├───────┼────────┼────────┤');
        Writeln('│', x[i]:7:2, '│', F[i]:8:4, '│', G[i]:8:4, '│')
      end;
      Println('└───────┴────────┴────────┘');
    end
  end
end.

Введите значение первой точки: A =  2.8
Введите значение второй точки: B =  4.9
Введите количество интервалов: N =  5
┌───────┬────────┬────────┐ 
│   x   │  F(x)  │  G(x)  │ 
├───────┼────────┼────────┤ 
│   2.80│ -0.3156│  5.8320│
├───────┼────────┼────────┤ 
│   3.22│  0.0781│ 10.9410│
├───────┼────────┼────────┤ 
│   3.64│  0.4199│ 18.3997│
├───────┼────────┼────────┤ 
│   4.06│  0.4824│ 28.6526│
├───────┼────────┼────────┤ 
│   4.48│  0.2241│ 42.1442│
├───────┼────────┼────────┤ 
│   4.90│ -0.1832│ 59.3190│
└───────┴────────┴────────┘ 
→ Ссылка