Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Программа должна рассчитывать значения некоторых функций (в данном случае 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 шт):
ок, объявили динамический, а не статический массив
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.
кто массиву размер то задаст перед тем как в него что-то писать?
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│
└───────┴────────┴────────┘