|
Вопрос # 3 799/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
А почему оно зависает?
Приложение: Переключить в обычный режим- procedure TForm1.Timer2Timer(Sender: TObject);
- var v, x:integer;
- z:boolean;
- begin
- if v=0 then
- z:=true else
- z:=false;
- x:=59;
- v:=4;
- if timer2.Enabled then
- repeat
- x:=x-1;
- if (x=0) and (z=false) then
- begin
- v:=v-1;
- x:=59;
- end;
- until (v=0) and (x=0);
- label4.Caption:=(inttostr(v)) + ':' + (inttostr(x));
- end;
 |
Вопрос задал: lonkeli (статус: Посетитель)
Вопрос отправлен: 22 февраля 2010, 18:42
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, lonkeli!
У вас НЕ выполняется условие выхода. Цикл бесконечный. Комментарии см. в тексте ниже:
procedure TForm1.Timer2Timer(Sender: TObject);
var
v, x : integer;
z : boolean;
begin
if v=0 then // по умолчанию переменные инициализируются нулём, поэтому
z:=true // z всегда будет равно true
else z:=false;
x:=59;
v:=4;
if timer2.Enabled then
repeat
x:=x-1; // да, х будет уменьшаться с каждым проходом
if (x=0) and (z=false) then // но вот это условие НИКОГДА не выполнится, т.к.,
// как я уже писал выше, z=true
begin
v:=v-1; // так что эти строчки можно совершенно спокойно
x:=59; // удалить - они не выполнятся ни разу
end;
until (v=0) and (x=0); // это условие не выполнится никогда, т.к., хоть х и будет когда-то равно нулю
// но вот v как было равно 4 перед циклом, так и останется равным 4.
label4.Caption:=(inttostr(v)) + ':' + (inttostr(x));
end;
Возможный вариант - переставить строчки:
...
begin
x:=59;
v:=4; // сначала присвоим значение для v
if v=0 then // а вот теперь v не равно нулю, поэтому
z:=true
else z:=false; // z будет равно false
...
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 22 февраля 2010, 19:24
|
Мини-форум вопроса
Всего сообщений: 13; последнее сообщение — 22 февраля 2010, 19:55; участников в обсуждении: 3.
|
Death_Master (статус: Посетитель), 22 февраля 2010, 18:47 [#1]:
>until (v=0) and (x=0);
а выполняется ли условие?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
lonkeli (статус: Посетитель), 22 февраля 2010, 18:54 [#2]:
как только запускаю- зависает и я run → prog. reset
но по идее должно выполняться
|
|
Death_Master (статус: Посетитель), 22 февраля 2010, 18:58 [#3]:
Покрутите трассировку....
Скорее всего условие НЕ выполняется... и в результате- бесконечный цикл...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
lonkeli (статус: Посетитель), 22 февраля 2010, 19:18 [#4]:
так и есть... беск. цикл. и что мне с ним делать?
|
|
Death_Master (статус: Посетитель), 22 февраля 2010, 19:20 [#5]:
Оба числа уходят в минус?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Death_Master (статус: Посетитель), 22 февраля 2010, 19:22 [#6]:
Если да, то изменить условие...
until (v=0) and (x=0);
на
until ((v<=0) and (x<=0));
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Егор (статус: 10-ый класс), 22 февраля 2010, 19:28 [#7]:
Цитата (Death_Master):
Оба числа уходят в минус?
...
Если да, то изменить условие...
until (v=0) and (x=0);
на
until ((v<=0) and (x<=0));
переменная v не меняется вообще, т.е. она в минус не уходит и предложенное решение не поможет.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
lonkeli (статус: Посетитель), 22 февраля 2010, 19:32 [#8]:
я когда запускаю, там все просто зависает и ничего не меняется
|
|
Death_Master (статус: Посетитель), 22 февраля 2010, 19:35 [#9]:
Что происходит при трассировке?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
|
|
Егор (статус: 10-ый класс), 22 февраля 2010, 19:38 [#10]:
интересно, а в чём смысл этого кода?
можно было написать проще:
procedure TForm1.Timer2Timer(Sender: TObject);
var
v, x : integer;
z : boolean;
begin
x:=59;
v:=4;
if timer2.Enabled then
begin
v=0;
x=0;
end;
label4.Caption:=(inttostr(v)) + ':' + (inttostr(x));
end;
))))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 22 февраля 2010, 19:40 [#11]:
странно...
мой ответ, похоже, никто не видит?...
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
lonkeli (статус: Посетитель), 22 февраля 2010, 19:53 [#12]:
а вот и неправда.
begin
v:=v-1; // так что эти строчки можно совершенно спокойно
x:=59; // удалить - они не выполнятся ни разу
end;
во время трассировки эти строчки выполнялись тогда, когда им и надо было.
|
|
lonkeli (статус: Посетитель), 22 февраля 2010, 19:55 [#13]:
в итоге заработало вот это:
procedure TForm1.Timer2Timer(Sender: TObject);
var v, x:integer;
z:boolean;
begin
x:=59;
v:=4;
if timer2.Enabled then
repeat
if v=0 then
z:=true else
z:=false;
x:=x-1;
if (x=0) and (z=false) then
begin
v:=v-1;
x:=59;
end;
until (v=0) and (x=0);
label4.Caption:=(inttostr(v)) + ':' + (inttostr(x));
end;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|