С одной стороны зря предупреждение (это именно предупреждение,
а не ошибка) выдается,
а с другой дополнительная защита от неправильного использования.
Например, я себе никогда не позволяю писать if(var) ... , если var не
является чистым bool.
Береженого бог бережет.
SK. писал (а):
true и false представлены в машине соотв. как 1 и 0.
С чего бы это? Константы, может быть. Хотя, как заметил chv, -1 тоже
встречается.
А для переменных язык ничего подобного не определяет. То есть,
язык вообще не определяет, как представлен bool в машине. Это делает
компилятор.
Начинается сказка про белого бычка.
Господа, Renat сразу понял, в чём была ошибка - bool не может хранить
более двух значений, каких - неважно. Renat сразу её признал, и думаю, уже в
BugTracker компании MetaQuotes у неё стоит статус "Решён", или близко
к этому.
Поэтому мы обсуждаем уже прошедший факт, и я не буду больше тратить
на него времени. Что мне было нужно, я выяснил.
Всем желаю удачи.
chv:
bool не может хранить более двух значений, каких - неважно.
Bool и не хранит более двух значений. И значения эти очень даже
важны, так как они, собственно, и определяют bool как понятие -
true и false. Где же здесь ошибка?
Bool и не хранит более двух значений. И значения эти очень даже
важны, так как они, собственно, и определяют bool как понятие -
true и false. Где же здесь ошибка?
Честно, поражает иногда, сколько минут у людей стажа программирования,
что они берутся рассуждать на такие темы. Или это такое зрение.
..
ОШИБКА БЫЛА ЗДЕСЬ.
staticboolbFirst = true;
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+intstart(){boolB;
intI;
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);
}//+------------------------------------------------------------------+
Внимание - вопрос? ОТКУДА берутся эти значения I = 15, 17, 19, 21 и т.д и др. и т.п., т.е. ЛЮБЫЕ ЦЕЛЫЕ числа, после преобразования bool в int, и обратно, если bool хранит ТОЛЬКО ДВА различных значения?
Ну хоть книжку про С++ прочитали бы, что ли, "программеры",
для расширения кругозора. Сколько можно тыкать в одно и то же,
первый класс, вторая четверть.
Дался Вам этот тип bool . Увидел про класс и четверть и вспомнил
это - Математика. 1-й класс 2-я четверть. Неуд для MQL4
Не стоит, наверно, копья ломать, большой разницы все равно нет,
а нервы и время отнимает.
Да я бы сказал, в указанной теме всё в порядке. В делении целых
аргументов 70/100 результат 0 - это нормально для "классических"
языков. В C++/C# и т.д. такое решается просто приведением типов:
((double)70)/100, или 70/((double)100), а в MQL4 можно и так:
Мне просто понадобится хранить в памяти большой двумерный массив
bool переменных для истории цен за пару-тройку лет назад, так реально
каждая bool ячейка съест не бит и не байт, а 4 байта в текущей реализации
- много :(
Надеюсь, 2 Gb RAM всё же хватит.
То есть, язык вообще не определяет, как представлен 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. Всего-то. И не надо ничего мудрить.
Да и менять ничего не надо!
Не выдаст.
Renat писал (а):
С одной стороны зря предупреждение (это именно предупреждение, а не ошибка) выдается,
а с другой дополнительная защита от неправильного использования.
Например, я себе никогда не позволяю писать if(var) ... , если var не является чистым bool.
Береженого бог бережет.
true и false представлены в машине соотв. как 1 и 0.
А для переменных язык ничего подобного не определяет. То есть, язык вообще не определяет, как представлен bool в машине. Это делает компилятор.
Начинается сказка про белого бычка.
Поэтому мы обсуждаем уже прошедший факт, и я не буду больше тратить на него времени. Что мне было нужно, я выяснил.
Всем желаю удачи.
bool не может хранить более двух значений, каких - неважно.
Bool и не хранит более двух значений. И значения эти очень даже важны, так как они, собственно, и определяют bool как понятие - true и false. Где же здесь ошибка?
ОШИБКА БЫЛА ЗДЕСЬ.
Этот код выдаёт в журнал:
Внимание - вопрос? ОТКУДА берутся эти значения I = 15, 17, 19, 21 и т.д и др. и т.п., т.е. ЛЮБЫЕ ЦЕЛЫЕ числа, после преобразования bool в int, и обратно, если bool хранит ТОЛЬКО ДВА различных значения?
Ну хоть книжку про С++ прочитали бы, что ли, "программеры", для расширения кругозора. Сколько можно тыкать в одно и то же, первый класс, вторая четверть.
Не стоит, наверно, копья ломать, большой разницы все равно нет, а нервы и время отнимает.
И в Microsoft T-SQL код:
выдаёт на печать 0.
Мне просто понадобится хранить в памяти большой двумерный массив bool переменных для истории цен за пару-тройку лет назад, так реально каждая bool ячейка съест не бит и не байт, а 4 байта в текущей реализации - много :(
Надеюсь, 2 Gb RAM всё же хватит.
То есть, язык вообще не определяет, как представлен bool в машине. Это делает компилятор.
Начинается сказка про белого бычка.
По отношению же к типу bool значение всего два - ноль и не ноль - здесь Вы совершенно правы.
Если жде имелся ввиду МКЛ, то разработчики всегда, в не описанных ими случаях, рекомендовали обращаться к стандартам СС++. Так, что и здесь можно считать, что этот стандарт действует.
Успехов.
В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
Мы обсудили и проверили возможность принудительного сведения bool к 0 и 1, но оказалось, что просто так это не сделать - придется в нескольких местах менять код, разделяя обработку int и bool (bool на самом деле является int и их математические операции объединены).
В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
Если работать с типом bool именно как с логическим, то для этого предусмотрено 2 формально описанных значения True и False - это исключает любую неоднозначность (остальное проблемы компилятора).
Если же есть желание обрабатывать bool как целочисленный тип (по сути он тот же int), то опять же есть достаточно формализованное решение - сравнение ==0 и !=0. Всего-то. И не надо ничего мудрить. Да и менять ничего не надо!