powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
25 сообщений из 67, страница 2 из 3
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950911
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот истинный код:
if ((IPCPort=False) or (IPAdr=False) or (Pusk=False)) then
begin
Preryvanie:=True;
ToolButton5Click(Nil);
StatusBar1.Panels[0].Text:='Прервана связь или отключен контроллер!';
end else
if ({(Preryvanie=True) and} (IPCPort=True) and (IPAdr=True)) then
begin
if (Preryvanie=True) then
begin
ToolButton3Click(Nil);
Preryvanie:=False;
end else
if (Timer1.Enabled=False) then
Timer1.Enabled:=True;
end;

Мне пришлось закомментировать условие с Preryvanie и прописать его ниже, тогда всё пошло.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950913
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю, то что у меня произошло - смахивает на нонсенс. И такого странного результата в своих программах я не получал никогда. Всё, что разумно, работало всегда. А тут странность выскочила.
Прошу прощения за то, что оторвал вас от дел.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950914
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалено
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950920
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чём странность ? В том что вы не понимаете как работает ваш код ? Да, это действительно странно
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950926
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте в начало и наблюдайте, какие значение имеют ваши флаги
Код: pascal
1.
2.
Caption := BoolToStr(IPCPort)+' '+BoolToStr(IPAdr) + ' '+BoolToStr(Pusk);
if ((IPCPort=False) or (IPAdr=False) or (Pusk=False)) then begin
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951049
Ничё вы демагогию развели тут



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

var
  a, b, c: Boolean;
  strCheck: string;

begin
  Randomize;
  a := Boolean(Random(2));
  c := a;
  b := c;

  repeat
    Randomize;

    if a and b and c then
      strCheck := 'истины'
    else
      strCheck := 'не истины';

    Writeln(format('Все условия A=%s, B=%s, C=%s %s', [BoolToStr(a, true), BoolToStr(b, true), BoolToStr(c, true), strCheck]));

    a := Boolean(Random(2));
    b := Boolean(Random(2));
    c := Boolean(Random(2));

   Writeln(format('Все условия A=%s, B=%s, C=%s', [BoolToStr(a, true), BoolToStr(b, true), BoolToStr(c, true)]));

    if a and not b and c then
      strCheck := 'правы все, кроме b'
    else if b then
      strCheck := 'прав только b'
    else
      strCheck := 'Никто не прав';

    Writeln(strCheck);

    Readln;
  until false;

end.




З.ы я никогда не делаю прямых проверок на = false и = true я использую только not в случае проверки на false.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951087
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

тем не менее, в ваш код вкралась ошибка.

Сами найдете, или помочь?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951089
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
if (((a=true) and (b=true)) and (c=true))


Сравнению глобальной булевой переменной с True соответствует следующий код:
Код: pascal
1.
2.
3.
  if b = True then
  cmp byte ptr [$005ef760],$01
  jnz $005db674

Байт в памяти, занимаемый переменной, сравнивается с $01, инструкция условного перехода jnz.
А что, если там ненулевое (мусорное) значение, не равное $01? Условие не выполнится.

А вот какой код соответствует проверке (не сравнения) булевой переменной на True:
Код: pascal
1.
2.
3.
  if b then
  cmp byte ptr [$005ef760],$00
  jz $005db66a

В данном случае сравнение идет с $00, инструкция условного перехода jz.
Если в переменной ненулевое значение, не равное $01, то условие выполнится.

Если условие if (((a=true) and (b=true)) and (c=true)) заменить на if (((a) and (b)) and (c)) что-нибудь изменится?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951093
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с пятничными тремя условиями соснами!
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951106
Polesov,

А продвинутые языки давно на (isTrue) и (isTrue == true) используют единственную инструкцию test с je
И всё что (!isTrue) и (isTrue == false) используется test и jne

А cmp не трогается даже в случае (num == 0)
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951138
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А продвинутые языки давно
Подогрев пятницы? )
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951140
Polesov,

Это я про gcc и clang, в прочем delphi никогда не добиться и 10% от того, что могут те компиляторы. Я уже не говорю про оптимизацию кода.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951223
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Polesov
Сравнению глобальной булевой переменной с True соответствует следующий код:
Код: pascal
1.
2.
3.
  if b = True then
  cmp byte ptr [$005ef760],$01
  jnz $005db674


Байт в памяти, занимаемый переменной, сравнивается с $01, инструкция условного перехода jnz.
А что, если там ненулевое (мусорное) значение, не равное $01? Условие не выполнится.


А сишников с первого класса учат, что сравнивать с true нельзя, и даже объясняют, почему. :)
...
Пожалуй, что булевский тип - зло. Никакой пользы от него, кроме вреда. И тем, кто сравнивает с true/false, и тем, кто на это смотрит...
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951267
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, всё дело оказалось в булевских переменных. Заменил и всё пошло. Очень хорошо пояснили суть проблемы. Не будем впредь надеяться на описание переменных булевского типа.
Спасибо всем за объяснение проблемы. Вопрос решён.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951269
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При чём сбой шёл только в случае условия - true и никогда с условием - false
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951272
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi
Заменил и всё пошло

Можно узнать, что именно ты сделал?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951280
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
Sergi
Заменил и всё пошло

Можно узнать, что именно ты сделал?


Работает и когда убрал сравнения с true и false в условиях, ну и естественно, когда ушел от булевских переменных к integer, проверяю на = (0 или 1).
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951282
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
продолжение следует
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951291
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi
ъъъъъ
пропущено...

Можно узнать, что именно ты сделал?


Работает и когда убрал сравнения с true и false в условиях, ну и естественно, когда ушел от булевских переменных к integer, проверяю на = (0 или 1).

То есть, теперь ждем сравнения неинициализированного целого с единицей.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951304
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi,
а почему не сравнивать с равно/не равно 0?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951318
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему бы не начать искать ошибку у себя, а не у компилятора ))
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951324
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
продолжение следует


Погоди, ТС еще до extended не добрался - вот тогда уже начнется....
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951331
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
почему бы не начать искать ошибку у себя, а не у компилятора ))
Интересно почему ТС не пользуется дебагером, чтобы инспектировать свои переменные прямо в процессе. Глядишь, чего и выяснится. Подскажите ему кто-нибудь, что так можно было.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951382
Сошлите его в деморган, учить ООП. Если используются классы, глобальные переменные нельзя использовать. И ошибок не будет таких.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951417
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Сошлите его в деморган, учить ООП. Если используются классы, глобальные переменные нельзя использовать. И ошибок не будет таких.


Классы + глобали под запретом уже? Это с какого перепугу-то?
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]