Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 799

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
А почему оно зависает?

Приложение:
  1. procedure TForm1.Timer2Timer(Sender: TObject);
  2. var v, x:integer;
  3. z:boolean;
  4. begin
  5. if v=0 then
  6. z:=true else
  7. z:=false;
  8. x:=59;
  9. v:=4;
  10. if timer2.Enabled then
  11. repeat
  12. x:=x-1;
  13. if (x=0) and (z=false) then
  14. begin
  15. v:=v-1;
  16. x:=59;
  17. end;
  18. until (v=0) and (x=0);
  19. label4.Caption:=(inttostr(v)) + ':' + (inttostr(x));
  20. end;


lonkeli Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Death_Master (статус: Посетитель), 22 февраля 2010, 18:47 [#1]:

>until (v=0) and (x=0);
а выполняется ли условие?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
lonkeli

lonkeli (статус: Посетитель), 22 февраля 2010, 18:54 [#2]:

как только запускаю- зависает и я run → prog. reset
но по идее должно выполняться
Death_Master

Death_Master (статус: Посетитель), 22 февраля 2010, 18:58 [#3]:

Покрутите трассировку....
Скорее всего условие НЕ выполняется... и в результате- бесконечный цикл...
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
lonkeli

lonkeli (статус: Посетитель), 22 февраля 2010, 19:18 [#4]:

так и есть... беск. цикл. и что мне с ним делать?
Death_Master

Death_Master (статус: Посетитель), 22 февраля 2010, 19:20 [#5]:

Оба числа уходят в минус?
Обычно захожу по ночам... (60-70%)
Если нужно что-то написать, то беру оборудованием, деньгими и пивом(при личной встрече)...
P.S. Помогаю и рассказываю бесплатно ^_^.....Nyaaa!
Death_Master

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

lonkeli (статус: Посетитель), 22 февраля 2010, 19:32 [#8]:

я когда запускаю, там все просто зависает и ничего не меняется
Death_Master

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

lonkeli (статус: Посетитель), 22 февраля 2010, 19:53 [#12]:

а вот и неправда.
begin
v:=v-1; // так что эти строчки можно совершенно спокойно
x:=59; // удалить - они не выполнятся ни разу
end;

во время трассировки эти строчки выполнялись тогда, когда им и надо было.
lonkeli

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;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.03 сек.