Top.Mail.Ru
Ответы
Аватар пользователя
Изменено
Аватар пользователя
Аватар пользователя
Программирование
+1

Ошибка в паскале : Ошибка времени выполнения: Индекс находился вне границ массива.

не понимаю что не так, ошибка написана в вопросе, код ниже, помогите пожалуйста

uses graphABC;
function F(x:real):real;
begin
F:=-2+3*x-(x*x*x);
end;
var
xn,xk,x,h,ymx,m:real;
x1,y1:array[1..30] of real;
n,i,x0,y0:integer;
st:string;

begin
xn:=-3;
xk:=3.00;
h:=0.05; //ошибка вылезает когда пишу 0.05 если писать 0.5 то все нормально, ну нужен шаг 0.05
x:=xn;
ymx:=F(x);
n:=0;
while x<=xk do
begin

n:=n+1;
x1[n]:=x;
y1[n]:=F(x);
if y1[n]>ymx then ymx:=y1[n];
x:=x+h;
end;
setwindowsize(960,640);
x0:=2*windowwidth div 3-50;
y0:=windowheight-170;
if abs(ymx)>xk then m:=(windowwidth-x0-10)/abs(ymx)
else m:=(windowwidth-x0-10)/xk;
line(x0-round(xk*m),y0,x0+round(xk*m),y0);
textout(x0+round(xk*m)-5,y0-20,'X');
line(x0,y0,x0,y0-round(ymx*m));
textout(x0+10,y0-round(ymx*m)-5,'Y');
textout(x0,y0+10,'0');
for i:=1 to 2*trunc(xk) do
begin
line(x0+round(m*i/2),y0+3,x0+round(m*i/2),y0-3);
line(x0-round(m*i/2),y0+3,x0-round(m*i/2),y0-3);
textout(x0+round(m*i/2),y0+10,floattostr(i/2));
textout(x0-round(m*i/2),y0+10,floattostr(-i/2));
line(x0+3,y0-round(m*i),x0-3,y0-round(m*i));
textout(x0-30,y0-round(m*i),inttostr(i));
end;
moveto(x0+round(x1[1]*m),y0-round(y1[1]*m));
setpencolor(clGreen);
circle(x0+round(x1[1]*m),y0-round(y1[1]*m),2);
for i:=1 to n do
begin
setpencolor(clRed);
lineto(x0+round(x1[i]*m),y0-round(y1[i]*m));
setpencolor(clGreen);
circle(x0+round(x1[i]*m),y0-round(y1[i]*m),2);
x:=x+h;
end;
setpencolor(clRed);
textout(x0-60,0,'График функции y=(1/(x+2))+2');
textout(x0-50,20,'интервал [-3;3] h=0.05');
setpencolor(clBlack);
textout(10,0,'Значения аргумента');
textout(30,20,'и функции');
line(10,50,10,50+(n+1)*18);
line(60,50,60,50+(n+1)*18);
line(110,50,110,50+(n+1)*18);
for i:=0 to n+1 do
line(10,50+i*18,110,50+i*18);
textout(35,55,'X');
textout(85,55,'Y');
for i:=1 to n do
begin
str(x1[i]:0:2,st);
textout(15,55+18*i,st);
str(y1[i]:0:2,st);
textout(65,55+18*i,st);
end;
end.

По дате
По рейтингу
Аватар пользователя
Новичок

Ты считать умеешь?

1
 (3 - (-3)) / 0.05 + 1 = 121 

Точек (x, y) у тебя 121, а размеры массивов x1 и y1, в которых ты хранишь точки - всего 30. Разумеется, вылезает за границы массива.

Аватар пользователя
Высший разум

x1,y1:array[1..3000] of real;

Аватар пользователя
Знаток

Ошибка "Ошибка времени выполнения: Индекс находился вне границ массива." означает, что программа пытается обратиться к элементу массива, которого не существует. В вашем случае это может происходить в строке 69 при обращении к элементу массива x1[i] и y1[i], так как переменная i принимает значения от 1 до n, а размер массива равен 30.

Возможно, значение переменной n превышает размер массивов x1 и y1. Попробуйте добавить проверку перед строкой 69, чтобы убедиться, что i находится в допустимых пределах:

1234567891011121314
 for i:=1 to n do 
begin 
  if (i < 1) or (i > 30) then 
  begin 
    writeln('Ошибка: i находится вне допустимых пределов.'); 
    break; 
  end; 
  setpencolor(clRed); 
  lineto(x0+round(x1[i]*m),y0-round(y1[i]*m)); 
  setpencolor(clGreen); 
  circle(x0+round(x1[i]*m),y0-round(y1[i]*m),2); 
  x:=x+h; 
end; 
 

Также стоит убедиться, что значение переменной n не превышает 30, чтобы избежать переполнения массивов:

123456789101112131415
 n:=0; 
while x<=xk do 
begin 
  n:=n+1; 
  if (n < 1) or (n > 30) then 
  begin 
    writeln('Ошибка: n находится вне допустимых пределов.'); 
    break; 
  end; 
  x1[n]:=x; 
  y1[n]:=F(x); 
  if y1[n]>ymx then ymx:=y1[n]; 
  x:=x+h; 
end; 
 

Если эти изменения не помогут, пожалуйста, уточните, в какой строке происходит ошибка и какое сообщение об ошибке выводится.