Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мы обсудили и проверили возможность принудительного сведения 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 эта фича кажется встроена в язык, и в некоторых С++ компиляторах)