Вообще, здесь оплошал мой компоновщик (собирает все include в один файл, а также убирает мусор и ненужные функции), убрав из сборки одну из перегрузок одной функции, посчитав её ненужной. Эта перегрузка подменилась другой перегрузкой, которая вызывала в итоге саму себя с неправильным набором параметров, что приводило к нулевому результату.
Проблема в том, что компилятор без всяких предупреждений даёт возможность передать параметр int как datetime. Учитывая природу типа datetime в MQL, это, может быть, и правильно, затрудняюсь ответить. Поэтому, если есть две перегрузки функции с такими схожими типами параметров, т.е. если хотя бы один из них неявно может быть приведён к другому без сообщений со стороны компилятора, есть смысл дать им уникальные имена.
Например:
void OnStart() { datetime time = 0; func(time); int bar = 0; func(bar); } void func(const datetime time) { } void func(const int bar) { }
Если убрать вторую перегрузку func(), то компилятор этого даже не заметит, хотя логика программы явно испортится. Пример этот совсем простой, и вручную так ошибиться довольно сложно, но когда проект большой, и код разбросан по нескольким файлам, всё становится уже не так просто, и помощь компилятора становится совсем не лишней, так что иногда лучше забить на модные плюшки, и сделать так, чтобы неоднозначностей не возникало.
Постараюсь давать такие описания некоторым своим ошибкам, пусть даже таким глупым, как эта.
Постараюсь давать такие описания некоторым своим ошибкам, пусть даже таким глупым, как эта.
Комментариев нет:
Отправить комментарий