Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2018, 05:03   #1
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию Индекс находится вне границ массива.

Код:
uses crt, graphabc;

var
n,dx,dy,nmax,i: integer;
xo, yo: array[1..10] of integer;

procedure vrag_init;
begin
n:=1;
repeat

dx:=random(1,10);
dy:=random(1,10);
for var i:=1 to n do
xo[i]:=50*dx;
yo[i]:=50*dy; // тут ошибка
rectangle(xo[i],yo[i],xo[i]+50,yo[i]+50);

n:=n+1;
nmax:=random(3,6);
until n>nmax;
end;


begin
vrag_init;
end.
Программа выполняется, но в помеченной комментарием строке происходит ошибка. "Индекс находится вне границ массива".

Почему? Диапазон массива 1..10. Ведь индекс в цикле равен одному.
Kukla19 вне форума Ответить с цитированием
Старый 27.09.2018, 06:16   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Тут забавное сочетание ошибок
1) Вы забыли взять в операторные скобки тело цикла for. В результате тело цикла состоит из одного оператора, а строчка 16, на которой происходит ошибка, в цикл не попадает
2) Вы объявили переменную цикла прямо в заголовке, используя var i. Но ещё одна переменная i объявлена на уровне программы.

В результате в строчках 15 и 16 используются разные переменные, хоть обе и называются i. Та, что в цикле, изменяется от 1 до N, а вот другая не инициализирована и остаётся равной 0, что и вызывает ошибку
Black Fregat вне форума Ответить с цитированием
Старый 27.09.2018, 06:25   #3
CMY_3
Пользователь
 
Регистрация: 24.02.2016
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Kukla19 Посмотреть сообщение
Почему?
Потому, что переменная i в этой строке глобальная, не инициализированная, поэтому равна 0
CMY_3 вне форума Ответить с цитированием
Старый 27.09.2018, 06:48   #4
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

Всем спасибо большое!
Kukla19 вне форума Ответить с цитированием
Старый 27.09.2018, 09:21   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

и не понимаю, зачем в цикле repeat until значение переменной nmax переопределять в каждой итерации. Не разумнее это сделать один раз ДО цикла?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2018, 12:39   #6
Kukla19
Пользователь
 
Регистрация: 23.09.2018
Сообщений: 38
По умолчанию

Да точно, так и сделал. Это по неопытности делаю такие ошибки. Мне сейчас хоть как сделать - лишь бы работало.
Kukla19 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C#] Не компилирует программу. пишет,что Индекс находится вне границ массива Baldr Помощь студентам 2 02.10.2017 17:41
Индекс находится вне границ массива. stopping Помощь студентам 3 04.11.2016 21:34
индекс находится вне границ массива (паскаль) max75025 Помощь студентам 5 20.12.2014 08:06
Индекс находился вне границ массива. Maks3 C# (си шарп) 3 23.11.2014 21:54
Индекс находился вне границ массива. banan4ik Помощь студентам 1 30.05.2013 02:25