Преобразование bool к int - значения - страница 3

 
SK. писал (а):
Не выдаст.
Ну если мне или своим глазам не верите,

Renat писал (а):

С одной стороны зря предупреждение (это именно предупреждение, а не ошибка) выдается,
а с другой дополнительная защита от неправильного использования.

Например, я себе никогда не позволяю писать if(var) ... , если var не является чистым bool.
Береженого бог бережет.


SK. писал (а):
true и false представлены в машине соотв. как 1 и 0.
С чего бы это? Константы, может быть. Хотя, как заметил chv, -1 тоже встречается.
А для переменных язык ничего подобного не определяет. То есть, язык вообще не определяет, как представлен bool в машине. Это делает компилятор.
Начинается сказка про белого бычка.
 
Господа, Renat сразу понял, в чём была ошибка - bool не может хранить более двух значений, каких - неважно. Renat сразу её признал, и думаю, уже в BugTracker компании MetaQuotes у неё стоит статус "Решён", или близко к этому.
Поэтому мы обсуждаем уже прошедший факт, и я не буду больше тратить на него времени. Что мне было нужно, я выяснил.
Всем желаю удачи.
 
chv:
bool не может хранить более двух значений, каких - неважно.
Bool и не хранит более двух значений. И значения эти очень даже важны, так как они, собственно, и определяют bool как понятие - true и false. Где же здесь ошибка?
 
Нынешняя реализация компилятора (и виртуальной машины) такова, что значению FALSE соответствует 0, все остальные (ненулевые) значения - это TRUE
 
Irtron:

Bool и не хранит более двух значений. И значения эти очень даже важны, так как они, собственно, и определяют bool как понятие - true и false. Где же здесь ошибка?
Честно, поражает иногда, сколько минут у людей стажа программирования, что они берутся рассуждать на такие темы. Или это такое зрение. ..

ОШИБКА БЫЛА ЗДЕСЬ.

static bool bFirst = true;
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   bool B;
   int I;
 
   if (bFirst)
   {
      // проверять эту возню ТОЛЬКО один раз
      bFirst = false;
      
      // 1-й раз не ....   
      I = 15;
      B = I;
      I = B; // bool выдает ТОЛЬКО два различных значения, мы помним это?
      Print("I(1) = ", I);
 
      // ну 2-й раз тоже не ....   
      I = 17;
      B = I;
      I = B; // bool выдает ТОЛЬКО два различных значения, мы помним это?
      Print("I(2) = ", I);
 
      // ну а 3-й то раз уже кто?
      I = 19;
      B = I;
      I = B; // bool выдает ТОЛЬКО два различных значения, мы помним это?
      Print("I(3) = ", I);
 
      // ну а 4-й раз - тоже не ..................
      I = 21;
      B = I;
      I = B; // bool выдает ТОЛЬКО два различных значения, мы помним это?
      Print("I(4) = ", I);
   }
 
   return(0);
  }
//+------------------------------------------------------------------+
Этот код выдаёт в журнал:
2006.11.13 17:25:01    2006.11.01 00:00  test001 GBPUSD,H1: I(4) = 21
2006.11.13 17:25:01    2006.11.01 00:00  test001 GBPUSD,H1: I(3) = 19
2006.11.13 17:25:01    2006.11.01 00:00  test001 GBPUSD,H1: I(2) = 17
2006.11.13 17:25:01    2006.11.01 00:00  test001 GBPUSD,H1: I(1) = 15
2006.11.13 17:25:01    test001 started for testing
2006.11.13 17:24:36    test001 GBPUSD,H1: loaded successfully
Внимание - вопрос? ОТКУДА берутся эти значения I = 15, 17, 19, 21 и т.д и др. и т.п., т.е. ЛЮБЫЕ ЦЕЛЫЕ числа, после преобразования bool в int, и обратно, если bool хранит ТОЛЬКО ДВА различных значения?

Ну хоть книжку про С++ прочитали бы, что ли, "программеры", для расширения кругозора. Сколько можно тыкать в одно и то же, первый класс, вторая четверть.
 
Дался Вам этот тип bool . Увидел про класс и четверть и вспомнил это - Математика. 1-й класс 2-я четверть. Неуд для MQL4
Не стоит, наверно, копья ломать, большой разницы все равно нет, а нервы и время отнимает.
 
Да я бы сказал, в указанной теме всё в порядке. В делении целых аргументов 70/100 результат 0 - это нормально для "классических" языков. В C++/C# и т.д. такое решается просто приведением типов: ((double)70)/100, или 70/((double)100), а в MQL4 можно и так:
double arg = 70;
double ret = arg/100;
И в Microsoft T-SQL код:
declare @a int , @b int, @c int
 
set @a = 70
set @b = 100
set @c = @a / @b
 
print @c
выдаёт на печать 0.

Мне просто понадобится хранить в памяти большой двумерный массив bool переменных для истории цен за пару-тройку лет назад, так реально каждая bool ячейка съест не бит и не байт, а 4 байта в текущей реализации - много :(
Надеюсь, 2 Gb RAM всё же хватит.
 
Irtron:

То есть, язык вообще не определяет, как представлен bool в машине. Это делает компилятор.
Начинается сказка про белого бычка.

Если имелся ввиду не конкретно МКЛ, а язык вообще, то, например, достаточно прочесть АНСИ стандарт языка СС++, чтобы увидеть, что это не так. В СС++ именно в стандарте языка написано, что используются значения НОЛЬ и НЕ НОЛЬ. Что там хранится кроме нуля - это действительно зависит от реализации и стандартом не регламентируется. С точки зрения корректности достаточно сравнивать на равенство нулю (или неравенство нулю) и не будет использования недокументированных возможностей. А вот если программист будет считать, что там ноль и единица (или любое фиксированное значение)- могут быть сюрпризы потому как ни одно фиксированное значение, отличное от нуля, не гарантируется.
По отношению же к типу bool значение всего два - ноль и не ноль - здесь Вы совершенно правы.

Если жде имелся ввиду МКЛ, то разработчики всегда, в не описанных ими случаях, рекомендовали обращаться к стандартам СС++. Так, что и здесь можно считать, что этот стандарт действует.

Успехов.
 
Мы обсудили и проверили возможность принудительного сведения bool к 0 и 1, но оказалось, что просто так это не сделать - придется в нескольких местах менять код, разделяя обработку int и bool (bool на самом деле является int и их математические операции объединены).

В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
 
Renat:
Мы обсудили и проверили возможность принудительного сведения bool к 0 и 1, но оказалось, что просто так это не сделать - придется в нескольких местах менять код, разделяя обработку int и bool (bool на самом деле является int и их математические операции объединены).

В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
Вообще-то даже странно что это обсуждение так разрослось?! :) По моему проблемы-то и нет никакой.
Если работать с типом bool именно как с логическим, то для этого предусмотрено 2 формально описанных значения True и False - это исключает любую неоднозначность (остальное проблемы компилятора).
Если же есть желание обрабатывать bool как целочисленный тип (по сути он тот же int), то опять же есть достаточно формализованное решение - сравнение ==0 и !=0. Всего-то. И не надо ничего мудрить. Да и менять ничего не надо!
Причина обращения: