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, или что-то другое - это, безусловно, Ваше решение.
В результате решили оставить как есть: bool может быть нулем и
не нулем. Это не противоречит стандартам.
Совершенно верно.
Кстати, то что bool хранится как int - это тоже стандарт (имею ввиду
анси стандарт языка СС++). Для данного типа переменных "критичной"
является скорость обработки. Потому и хранится в виде, наиболее
быстро обрабатываемом процессором, хоть и зависимом от разрядности
шины.
Кстати, высказанная выше мысль по поводу сведения булевских
переменных к побитовым операциям не более чем "головная боль"
- отдельно биты не хранятся: так, что затраты на обработку дополнительно
будут, а выигрыш в скорости обработки и уменьшение требуемых
размеров памяти нет.
Успехов.
ЗЫ Так получилось, что невольно "зацепил" и пост chv. Исходя
из "правильности написания программ" совершенно недопустимо
расчитывать на ненулевое значение переменной типа bool и следовательно
такое введение принесет больше вреда, чем пользы.
По поводу размеров памяти: в винде программиста ограничивает
только дисковое пространство - какая разница ? чего там критичного.
Минутки с 2004 года 780 К записей размер файла 33М. У Вас размер винта
какой ? так там тип дабл, что "несколько поболее" инта будет
то. .... А вот скорость обработки у инта самая высокая. Прикиньте
сколько условных операторов содержит программный код (их еще
полно, помимо явно указанных) и поймете насколько будут более
"тормознутыми" программы. По сравнению с этим время, затрачиваемое
на подкачку страницы памяти просто копейки.....
Во многих языках (если не в большинстве) bool хранится как int.
Этот способ наиболее эффективен по скорости.
Обычно bool переменных в программах немного.
Если требуется хранить очень много bool переменных, тогда используют
битовые массивы.
Они по скорости менее эффективны, но занимают в 32 раза меньше
места. chv - можете их реализовать самостоятельно, все для этого в MQL есть.
-------------------------------
Ситуация с bool не критичная, но нехорошая ...
Плохо что bool может хранить много значений,
изредка это может приводить к очень неприятным ошибкам.
ИМХО, чтобы исправить ситуацию достаточно изменений только
в одном месте.
В присвоении переменно типа bool вместо простого присвоения поставить
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. И если Вы всегда будете оперировать именно ими, то
и получите всегда одинаковое представление. Проверьте:
Получите свою единицу. Т.е. если явно присвоили переменной значение True, то при последующих переприсвоениях оно 1 и останется. Другое дело что можно переменной типа bool присвоить другое произвольное значение и результат все равно
будет истина. Ну так сами присвоили - сами и получайте. Логику языка это не нарушает! Главное =0 или !=0.
То, что в MQL4 есть битовые сдвиги для int, я в курсе, мой сделать
и "свой" bool. Вопрос в скорости и объёмах памяти. Винт на
250 Гб мне не жалко использовать, но когда идёт своп памяти на
диск, о производительности расчётов можно забыть.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость
его расчёта для больших переборов тоже измеряется даже не сутками.
Поэтому сделать это самому, конечно, можно, но я и так уже ищу
способы уменьшить время расчётов на оптимизаторе, а своя реализация
типов данных вряд ли будет работать быстрее, чем встроенные
возможности языка.
chv:
То, что в MQL4 есть битовые сдвиги для int, я в курсе, мой сделать
и "свой" bool. Вопрос в скорости и объёмах памяти. Винт на
250 Гб мне не жалко использовать, но когда идёт своп памяти на
диск, о производительности расчётов можно забыть.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость
его расчёта для больших переборов тоже измеряется даже не сутками.
Поэтому сделать это самому, конечно, можно, но я и так уже ищу
способы уменьшить время расчётов на оптимизаторе, а своя реализация
типов данных вряд ли будет работать быстрее, чем встроенные
возможности языка.
Всегда есть способ алгоритмически изменить логику, чтобы на
все хватило.
Если не получается в лоб (выделением большого массива), то надо
идти другими путями.
Например, во всем процессе разработки МТ4 мы постоянно натыкались
на ограничения, но также постоянно их обходили.
Они по скорости менее эффективны, но занимают в 32 раза меньше
места.
В том то и дело, что не занимают. Биты отдельно не хранятся.
Этот механизм был введен еще в С для программирования микроконтроллеров.
Успехов.
ЗЫ сейчас не укажу точно, по-моему, у Страуструпа это было подробно
описано, как и все тонкости работы с этим механизмом.
Я говорил про битовые массивы а не просто биты.
В этом случае массив в 32 бита хранится как одно 4-х байтовое число.
Но обычно все это делается программистом, а не в языке
(хотя в Delphi эта фича кажется встроена в язык, и в некоторых С++
компиляторах)
Мы обсудили и проверили возможность принудительного сведения 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, или что-то другое - это, безусловно, Ваше решение.
В результате решили оставить как есть: bool может быть нулем и не нулем. Это не противоречит стандартам.
Кстати, то что bool хранится как int - это тоже стандарт (имею ввиду анси стандарт языка СС++). Для данного типа переменных "критичной" является скорость обработки. Потому и хранится в виде, наиболее быстро обрабатываемом процессором, хоть и зависимом от разрядности шины.
Кстати, высказанная выше мысль по поводу сведения булевских переменных к побитовым операциям не более чем "головная боль" - отдельно биты не хранятся: так, что затраты на обработку дополнительно будут, а выигрыш в скорости обработки и уменьшение требуемых размеров памяти нет.
Успехов.
ЗЫ Так получилось, что невольно "зацепил" и пост chv. Исходя из "правильности написания программ" совершенно недопустимо расчитывать на ненулевое значение переменной типа bool и следовательно такое введение принесет больше вреда, чем пользы.
По поводу размеров памяти: в винде программиста ограничивает только дисковое пространство - какая разница ? чего там критичного. Минутки с 2004 года 780 К записей размер файла 33М. У Вас размер винта какой ? так там тип дабл, что "несколько поболее" инта будет то. .... А вот скорость обработки у инта самая высокая. Прикиньте сколько условных операторов содержит программный код (их еще полно, помимо явно указанных) и поймете насколько будут более "тормознутыми" программы. По сравнению с этим время, затрачиваемое на подкачку страницы памяти просто копейки.....
Этот способ наиболее эффективен по скорости.
Обычно bool переменных в программах немного.
Если требуется хранить очень много bool переменных, тогда используют битовые массивы.
Они по скорости менее эффективны, но занимают в 32 раза меньше места.
chv - можете их реализовать самостоятельно, все для этого в MQL есть.
-------------------------------
Ситуация с bool не критичная, но нехорошая ...
Плохо что bool может хранить много значений,
изредка это может приводить к очень неприятным ошибкам.
ИМХО, чтобы исправить ситуацию достаточно изменений только в одном месте.
В присвоении переменно типа bool вместо простого присвоения поставить
if (Expr1 == 0) b = false; else b = true;
Все остальное будет работать правильно.
Они по скорости менее эффективны, но занимают в 32 раза меньше места.
Этот механизм был введен еще в С для программирования микроконтроллеров.
Успехов.
ЗЫ сейчас не укажу точно, по-моему, у Страуструпа это было подробно описано, как и все тонкости работы с этим механизмом.
Renat, в сравнении bool с нулем проблемы нет, false практически во всех языках есть 0, остальное - не 0, это нормально.
Мне кажется, проблема в том, что:
1. bool не должен всё-таки занимать в памяти больше, чем 1 байт. Зачем ему больше-то? А память для больших массивов критична.
2. При присваивании I = B (из bool в int) должны получаться какие-то только два значения, которые являются внутренним представлением bool в качестве int в Вашем компиляторе и языке MQL4. Какие Вы выберете - 0 и 1, 0 и 157, или что-то другое - это, безусловно, Ваше решение.
2. Так у внутреннего представления bool-значений в MQL4 есть стандарт: True=1, False=0. И если Вы всегда будете оперировать именно ими, то и получите всегда одинаковое представление. Проверьте:
Получите свою единицу. Т.е. если явно присвоили переменной значение True, то при последующих переприсвоениях оно 1 и останется. Другое дело что можно переменной типа bool присвоить другое произвольное значение и результат все равно будет истина. Ну так сами присвоили - сами и получайте. Логику языка это не нарушает! Главное =0 или !=0.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость его расчёта для больших переборов тоже измеряется даже не сутками. Поэтому сделать это самому, конечно, можно, но я и так уже ищу способы уменьшить время расчётов на оптимизаторе, а своя реализация типов данных вряд ли будет работать быстрее, чем встроенные возможности языка.
То, что в MQL4 есть битовые сдвиги для int, я в курсе, мой сделать и "свой" bool. Вопрос в скорости и объёмах памяти. Винт на 250 Гб мне не жалко использовать, но когда идёт своп памяти на диск, о производительности расчётов можно забыть.
Оптимизатор зачастую съедает весь 1 Гб RAM, что печально, и скорость его расчёта для больших переборов тоже измеряется даже не сутками. Поэтому сделать это самому, конечно, можно, но я и так уже ищу способы уменьшить время расчётов на оптимизаторе, а своя реализация типов данных вряд ли будет работать быстрее, чем встроенные возможности языка.
Если не получается в лоб (выделением большого массива), то надо идти другими путями.
Например, во всем процессе разработки МТ4 мы постоянно натыкались на ограничения, но также постоянно их обходили.
Они по скорости менее эффективны, но занимают в 32 раза меньше места.
Этот механизм был введен еще в С для программирования микроконтроллеров.
Успехов.
ЗЫ сейчас не укажу точно, по-моему, у Страуструпа это было подробно описано, как и все тонкости работы с этим механизмом.
В этом случае массив в 32 бита хранится как одно 4-х байтовое число.
Но обычно все это делается программистом, а не в языке
(хотя в Delphi эта фича кажется встроена в язык, и в некоторых С++ компиляторах)