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

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

В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.

Renat, в сравнении bool с нулем проблемы нет, false практически во всех языках есть 0, остальное - не 0, это нормально.

Мне кажется, проблема в том, что:
1. bool не должен всё-таки занимать в памяти больше, чем 1 байт. Зачем ему больше-то? А память для больших массивов критична.
2. При присваивании I = B (из bool в int) должны получаться какие-то только два значения, которые являются внутренним представлением bool в качестве int в Вашем компиляторе и языке MQL4. Какие Вы выберете - 0 и 1, 0 и 157, или что-то другое - это, безусловно, Ваше решение.
 
Renat:

В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
Совершенно верно.
Кстати, то что bool хранится как int - это тоже стандарт (имею ввиду анси стандарт языка СС++). Для данного типа переменных "критичной" является скорость обработки. Потому и хранится в виде, наиболее быстро обрабатываемом процессором, хоть и зависимом от разрядности шины.
Кстати, высказанная выше мысль по поводу сведения булевских переменных к побитовым операциям не более чем "головная боль" - отдельно биты не хранятся: так, что затраты на обработку дополнительно будут, а выигрыш в скорости обработки и уменьшение требуемых размеров памяти нет.

Успехов.

ЗЫ Так получилось, что невольно "зацепил" и пост chv. Исходя из "правильности написания программ" совершенно недопустимо расчитывать на ненулевое значение переменной типа bool и следовательно такое введение принесет больше вреда, чем пользы.
По поводу размеров памяти: в винде программиста ограничивает только дисковое пространство - какая разница ? чего там критичного. Минутки с 2004 года 780 К записей размер файла 33М. У Вас размер винта какой ? так там тип дабл, что "несколько поболее" инта будет то. .... А вот скорость обработки у инта самая высокая. Прикиньте сколько условных операторов содержит программный код (их еще полно, помимо явно указанных) и поймете насколько будут более "тормознутыми" программы. По сравнению с этим время, затрачиваемое на подкачку страницы памяти просто копейки.....
 
Во многих языках (если не в большинстве) bool хранится как int.
Этот способ наиболее эффективен по скорости.
Обычно bool переменных в программах немного.

Если требуется хранить очень много bool переменных, тогда используют битовые массивы.
Они по скорости менее эффективны, но занимают в 32 раза меньше места.
chv - можете их реализовать самостоятельно, все для этого в MQL есть.
-------------------------------

Ситуация с bool не критичная, но нехорошая ...
Плохо что bool может хранить много значений,
изредка это может приводить к очень неприятным ошибкам.

ИМХО, чтобы исправить ситуацию достаточно изменений только в одном месте.
В присвоении переменно типа bool вместо простого присвоения поставить

if (Expr1 == 0) b = false; else b = true;

Все остальное будет работать правильно.
 
Mak:

Они по скорости менее эффективны, но занимают в 32 раза меньше места.

В том то и дело, что не занимают. Биты отдельно не хранятся.
Этот механизм был введен еще в С для программирования микроконтроллеров.

Успехов.

ЗЫ сейчас не укажу точно, по-моему, у Страуструпа это было подробно описано, как и все тонкости работы с этим механизмом.
 
chv:
Renat, в сравнении bool с нулем проблемы нет, false практически во всех языках есть 0, остальное - не 0, это нормально.

Мне кажется, проблема в том, что:
1. bool не должен всё-таки занимать в памяти больше, чем 1 байт. Зачем ему больше-то? А память для больших массивов критична.
2. При присваивании I = B (из bool в int) должны получаться какие-то только два значения, которые являются внутренним представлением bool в качестве int в Вашем компиляторе и языке MQL4. Какие Вы выберете - 0 и 1, 0 и 157, или что-то другое - это, безусловно, Ваше решение.
1. bool занимает столько же сколько минимально предусмотренный целочисленный тип. Был бы в MQL4 целочисленный байтовый тип, bool бы и занимал байт, но так как int (минимально) занимает 4 байта, то и bool соответственно занимает столько же. Ну а уж битового представления (это вроде не ваше предложение было) логического типа так по моему вообще нигде не используется (ИМХО).

2. Так у внутреннего представления bool-значений в MQL4 есть стандарт: True=1, False=0. И если Вы всегда будете оперировать именно ими, то и получите всегда одинаковое представление. Проверьте:
void start()
  {
   bool B=True;
   int  I=B;
   Comment("B=",B,"  I=",I);
  }
Получите свою единицу. Т.е. если явно присвоили переменной значение True, то при последующих переприсвоениях оно 1 и останется. Другое дело что можно переменной типа bool присвоить другое произвольное значение и результат все равно будет истина. Ну так сами присвоили - сами и получайте. Логику языка это не нарушает! Главное =0 или !=0.
 
То, что в MQL4 есть битовые сдвиги для int, я в курсе, мой сделать и "свой" bool. Вопрос в скорости и объёмах памяти. Винт на 250 Гб мне не жалко использовать, но когда идёт своп памяти на диск, о производительности расчётов можно забыть.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость его расчёта для больших переборов тоже измеряется даже не сутками. Поэтому сделать это самому, конечно, можно, но я и так уже ищу способы уменьшить время расчётов на оптимизаторе, а своя реализация типов данных вряд ли будет работать быстрее, чем встроенные возможности языка.
 
chv:
То, что в MQL4 есть битовые сдвиги для int, я в курсе, мой сделать и "свой" bool. Вопрос в скорости и объёмах памяти. Винт на 250 Гб мне не жалко использовать, но когда идёт своп памяти на диск, о производительности расчётов можно забыть.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость его расчёта для больших переборов тоже измеряется даже не сутками. Поэтому сделать это самому, конечно, можно, но я и так уже ищу способы уменьшить время расчётов на оптимизаторе, а своя реализация типов данных вряд ли будет работать быстрее, чем встроенные возможности языка.
Всегда есть способ алгоритмически изменить логику, чтобы на все хватило.
Если не получается в лоб (выделением большого массива), то надо идти другими путями.

Например, во всем процессе разработки МТ4 мы постоянно натыкались на ограничения, но также постоянно их обходили.
 
VladislavVG:
Mak:

Они по скорости менее эффективны, но занимают в 32 раза меньше места.

В том то и дело, что не занимают. Биты отдельно не хранятся.
Этот механизм был введен еще в С для программирования микроконтроллеров.

Успехов.

ЗЫ сейчас не укажу точно, по-моему, у Страуструпа это было подробно описано, как и все тонкости работы с этим механизмом.
Я говорил про битовые массивы а не просто биты.
В этом случае массив в 32 бита хранится как одно 4-х байтовое число.
Но обычно все это делается программистом, а не в языке
(хотя в Delphi эта фича кажется встроена в язык, и в некоторых С++ компиляторах)