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

  • Автор темы AND
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A
#1
Доброго время суток.
В программе есть условие, которое вначале ложно. При нажатии на кнопку старт задаются переменные, где
tpostzad := 5 + random(5);
Vremy- это переменная характерезующая внутреннее время, при вызове
TTimer через 1 сек. увеличивается на 1 ед.
tnachrab - время начала работы программы, равняется 1.
Почему идет приращение EH1, если условие ложно?
Код:
if (tpostzad <= Vremy - tnachrab) then
begin
if K1sost = false then
begin
EH1 := EH1+1;
end
else
begin
tnachobrK1: = Vremy;
K1sost :=false;
end
end
 
04.09.2006
2 566
3
#2
Для: AND
По твоему коду не видно, что вначале K1sost ложно. Поставь точку останова и проверь, действительно ли условие ложное. Даже если оно и ложно, то выполнится ветка else и в следующей итерации таймера произойдет увеличение. Хотя кода маловато чтобы чем-нибудь помочь. По крайней мере нужно знать где объявлены и как инициализируются переменные
 
Z

zubr

#3
Если K1sost ложно, то условие if K1sost = false then выполняется, ведь K1sost = false, а это True
Другое дело будет, при условии: if K1sost then
 
A
#4
Что значит "точка останова"?
Вот собственно код:

Код:
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.
 
A
#6
Спасибо, посмотрел. А как делать это в Delphi, точку останова, где она? И как привинтить её к условию if, что бы видить как оно выполняется?
 
04.09.2006
2 566
3
#7
Ставишь курсор на строку с if и нажимаешь F5. Потом нажимаешь F9.
Вот ТУТ можно почитать подробности
 
R

root

#8
Для: AND
в умных книгах пишут " Если переменная не инициализируется при объявлении, то по умолчанию она заполняется нулем" я думаю что у тебя таймер срабатывает раньше чем ты успеваешь присвоить значение своей переменной.
лучше сделать так
var
K1sost: boolean = false или true; //при объявлении
 
A
#9
для: root
инициализировал переменную при объявлении всё равно условие проходит, а не должно проходить, т.к. условие if ложно.
 
R
#10
Неполенился запустил borland :ph34r:
Код:
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.
 
A
#11
У меня "true" выдаёт... Значит не в Delphi косяк... а где-то в программе.
 
A
#13
Мне кажется, что я нашел недоработку.
P.S. root спасибо за подсказку, вывел на экран с помощью ShowMessage переменную tpostzad, оказалась она равна нулю, тоесть по каким-то причинам её в другой процедуре обнуляю, оказывается сам... где-то там закралась ошибка...
 
R
#14
Для: AND
Всегда пожалуйста.
З.Ы "Если переменная не инициализируется при объявлении, то по умолчанию она заполняется нулем"
 
Z
#15
Блин, ну как дети малые. Выражение False=False истинно. Причем здесь косяк дельфи или косяк в программе. Нафига чтобы это определить, точки останова. Нафига вообще здесь это выражение:
Код:
 if K1sost = false then
правильнее будет
Код:
if K1sost then
Учите матчасть.
 
R
#17
Для: 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
правельней это да
 
Статус
Закрыто для дальнейших ответов.