Почему выполняется ложное условие?

Тема в разделе "Delphi - FAQ", создана пользователем AND, 12 ноя 2007.

Статус темы:
Закрыта.
  1. AND

    AND Гость

    Доброго время суток.
    В программе есть условие, которое вначале ложно. При нажатии на кнопку старт задаются переменные, где
    tpostzad := 5 + random(5);
    Vremy- это переменная характерезующая внутреннее время, при вызове
    TTimer через 1 сек. увеличивается на 1 ед.
    tnachrab - время начала работы программы, равняется 1.
    Почему идет приращение EH1, если условие ложно?
    Код (Text):
    if (tpostzad <= Vremy - tnachrab) then
    begin
    if K1sost = false then
    begin
    EH1 := EH1+1;
    end
    else
    begin
    tnachobrK1: = Vremy;
    K1sost :=false;
    end
    end
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: AND
    По твоему коду не видно, что вначале K1sost ложно. Поставь точку останова и проверь, действительно ли условие ложное. Даже если оно и ложно, то выполнится ветка else и в следующей итерации таймера произойдет увеличение. Хотя кода маловато чтобы чем-нибудь помочь. По крайней мере нужно знать где объявлены и как инициализируются переменные
     
  3. zubr

    zubr Гость

    Если K1sost ложно, то условие if K1sost = false then выполняется, ведь K1sost = false, а это True
    Другое дело будет, при условии: if K1sost then
     
  4. AND

    AND Гость

    Что значит "точка останова"?
    Вот собственно код:

    Код (Text):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls;

    type
    TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    tobrabzadK1, tobrabzadK2, tobrabzadK3: Integer;
    TimeNow, NachProg, KonProg, WorkTime: TDateTime;
    Vremy,tpostzad, tnachrab : Integer;
    tnachobrK1, tnachobrK2, tnachobrK3 : Integer;
    tkonobrK1, tkonobrK2, tkonobrK3 : Integer;
    ksostfonK2, ksostfonK3, K1sost, K2sost,K3sost: Boolean;
    tnachfonzadK2 , tnachfonzadK3, tpreryvfonzadK2, tpreryvfonzadK3 : Integer;
    tobshobrzadK1, tobshobrzadK2, tobshobrzadK13 : Integer;
    EH1, EH2, EH3, EmaxH1, EmaxH2, EmaxH3 : Integer;
    shetfonzadK2, schetfonzadK3, schetzadK1, schetzadK2, schetzadK3 : Integer;
    implementation

    {$R *.dfm}




    procedure TForm1.Button1Click(Sender: TObject);
    begin
    NachProg := Time;
    Label3.Caption := TimeToStr(NachProg);
    tpostzad :=4+random(5);
    tobrabzadK1 := 4+random(5);
    tobrabzadK2 := 3+random(5);
    tobrabzadK3 := 5+random(8);
    Label8.Caption := IntToStr(tpostzad);
    tnachrab := Vremy;
    ksostfonK2:=true;
    ksostfonK3 :=true;
    K1sost :=true;
    K2sost :=true;
    K3sost := true;
    EH1 :=0;
    EH2 :=0;
    EH3 :=0;

    tpostzad :=0;
    tnachobrK1 :=0;
    tnachobrK2 :=0;
    tnachobrK3 :=0;
    tkonobrK1 :=0;
    tkonobrK2 :=0;
    tkonobrK3 :=0;
    Label10.Caption := IntToStr(tnachrab);


    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    KonProg := Time;
    Label7.Caption := TimeToStr(KonProg);
    WorkTime := KonProg-NachProg;
    Label6.Caption := TimeToStr(WorkTime);


    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    TimeNow := Time;
    Label1.Caption := TimeToStr(TimeNow);
    Vremy := Vremy+1;
    Label9.Caption := IntToStr(Vremy);
    Label28.Caption := IntToStr(Vremy-tnachrab);
    if (tpostzad <= Vremy - tnachrab) then
    begin
    if K1sost = false then

    begin

    EH1 := EH1+1;
    Label20.Caption := IntToStr(EH1);
    end
    else
    begin
    tnachobrK1 := Vremy;
    K1sost := false;
    end
    end

    end;
    end.
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-AND+16:11:2007, 15:37 -->
    <span class="vbquote">(AND @ 16:11:2007, 15:37 )</span><!--QuoteEBegin-->Что значит "точка останова"?
    [snapback]86113" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    http://ru.wikipedia.org/wiki/Точка_останова
     
  6. AND

    AND Гость

    Спасибо, посмотрел. А как делать это в Delphi, точку останова, где она? И как привинтить её к условию if, что бы видить как оно выполняется?
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ставишь курсор на строку с if и нажимаешь F5. Потом нажимаешь F9.
    Вот ТУТ можно почитать подробности
     
  8. root

    root Гость

    Для: AND
    в умных книгах пишут " Если переменная не инициализируется при объявлении, то по умолчанию она заполняется нулем" я думаю что у тебя таймер срабатывает раньше чем ты успеваешь присвоить значение своей переменной.
    лучше сделать так
    var
    K1sost: boolean = false или true; //при объявлении
     
  9. AND

    AND Гость

    для: root
    инициализировал переменную при объявлении всё равно условие проходит, а не должно проходить, т.к. условие if ложно.
     
  10. root

    root Гость

    Неполенился запустил borland :ph34r:
    Код (Text):
    var
    Form1: TForm1;
    false1: boolean= true;
    implementation
    {$R *.dfm}
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if false1=false then
    ShowMessage('false')
    else
    ShowMessage('true');
    end;

    end.
     
  11. AND

    AND Гость

    У меня "true" выдаёт... Значит не в Delphi косяк... а где-то в программе.
     
  12. root

    root Гость

    Для: AND
    запакуй проект и выложи посмотрим
     
  13. AND

    AND Гость

    Мне кажется, что я нашел недоработку.
    P.S. root спасибо за подсказку, вывел на экран с помощью ShowMessage переменную tpostzad, оказалась она равна нулю, тоесть по каким-то причинам её в другой процедуре обнуляю, оказывается сам... где-то там закралась ошибка...
     
  14. root

    root Гость

    Для: AND
    Всегда пожалуйста.
    З.Ы "Если переменная не инициализируется при объявлении, то по умолчанию она заполняется нулем"
     
  15. zubr

    zubr Гость

    Блин, ну как дети малые. Выражение False=False истинно. Причем здесь косяк дельфи или косяк в программе. Нафига чтобы это определить, точки останова. Нафига вообще здесь это выражение:
    Код (Text):
     if K1sost = false then
    правильнее будет
    Код (Text):
    if K1sost then
    Учите матчасть.
     
  16. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Туплю, туплю... Сорри... :)
     
  17. root

    root Гость

    Для: zubr
    так проблему подняли не из за Логики 1=1 и из за того что
    при объявлении переменной и инициализации AND говорил что
    переменной K1sost = true не присваивается значение, и истина было в другом в том что при инициализации tpostzad присваивался 0 при вызове таймера выполнялось не if K1sost = false then а if (tpostzad <= Vremy - tnachrab) then потомучто Vremy= Vremy+1 и tnachrab =0 так как он оперировал впервыеб поэтому и присваивался K1sost :=false .
    А то что
    if K1sost then
    правельней это да
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей