Другие языки программирования и технологии

Delphi. Зависает при выполнении цикла

Можете объяснить в чём ошибка, прога зависает при выполнении конструкции ифов. Массив - шахматное поле, единицы - чёрные шашки, двойки - белые, нули - пустые клетки. procedure TForm1.Button1Click(Sender: TObject); var Mas:array [1..8,1..8] of byte;str,stol:byte; begin str:=0;stol:=0; Repeat begin str:=str+1; Repeat begin stol:=stol+1; if odd(str+stol) and (str<4) then Mas[str,stol]:=1 else Mas[str,stol]:=0; if odd(str+stol) and (str>5) then Mas[str,stol]:=2; end until stol=8; end; until str=8; end;
Зависает она у Вас, потому что Вы не обнуляете переменную stol перед перед началом внутреннего цикла.

Первый проход внешнего цикла идет нормально, т. к. stol была инициализирована нулем в начале, а на втором проходе перед началом внутреннего ее значение равно восьми.

После этого она увеличивается и никогда восьми равна уже не станет.
Товарищ Ishido Uruyu предложил типично индусское решение. Зависать программа перестанет, но работать все равно не будет.

И два совета на будущее.

1. В данной ситуации логичнее использовать цикл FOR:
for str := low(mas) to high(mas) do
for stol := low(mas[str]) to high(mas[str]) do
begin
// пишете здесь Ваши "ифы"
end;

2. ФОРМАТИРУЙТЕ КОД!! !
Читать невозможно.
Nail Heyderov
Nail Heyderov
2 882
Лучший ответ
stol:=0 должно быть там же, где str:=str+1.
Два цикла один вложен в другой! Почему для внутреннего цикла переменная stol не инициализируется заново нулём?
Она после 1-й итерации внешнего цикла переходя ко 2-й продолжает увеличиваться 9, 10 и т. д. Ох и долго придётся ждать когда она опять станет равной 8 :)
Тёма Пашистый
Тёма Пашистый
76 473
дебагером пользоваться не пробывали?
Сергей Гридин
Сергей Гридин
35 594
попробуйте так:

procedure TForm1.Button1Click(Sender: TObject);

var
Mas:array [1..8,1..8] of byte;str,stol:byte;

begin

str:=0;stol:=0;
Repeat
begin str:=str+1;
Repeat begin stol:=stol+1; if odd(str+stol) and (str<4) then Mas[str,stol]:=1
else Mas[str,stol]:=0;
if odd(str+stol) and (str>5) then Mas[str,stol]:=2;
end until stol>=8;
end;
until str>=8;
end;

если зависнет, пишите на почту
Nail Heyderov То, что Вы предлагаете, называется "Лечить гангрену обзеболиванием"!
внешний цикл: увеличивать переменную пока она =8????может все таки НЕ РАВНА?
Dima Fyodorov
Dima Fyodorov
969
Nail Heyderov Ну и закончится тогда цикл на первом же шаге.

Вы repeat..until с while..do путаете.
нескончаемый цикл
Игорь Брик
Игорь Брик
397