| 
| 
 | Вопрос # 3 799/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!А почему оно зависает?
 Приложение:Переключить в обычный режим procedure TForm1.Timer2Timer(Sender: TObject);var v, x:integer;z:boolean;beginif v=0 thenz:=true elsez:=false;x:=59;v:=4;if timer2.Enabled thenrepeatx:=x-1;if (x=0) and (z=false) thenbeginv:=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;
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |