суббота, 23 января 2016 г.

Index 8.1. В версии для MT5 не работали параметры для средних

Новый код часто содержит новые баги, не обошлось и в этот раз. Обновиться можно на странице индикатора Index. Версия для MT4 не пострадала. Для MT5 обновление обязательное, если эти параметры (MA Period и Diff MA period) используются в работе.

Вообще, здесь оплошал мой компоновщик (собирает все 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(), то компилятор этого даже не заметит, хотя логика программы явно испортится. Пример этот совсем простой, и вручную так ошибиться довольно сложно, но когда проект большой, и код разбросан по нескольким файлам, всё становится уже не так просто, и помощь компилятора становится совсем не лишней, так что иногда лучше забить на модные плюшки, и сделать так, чтобы неоднозначностей не возникало.

Постараюсь давать такие описания некоторым своим ошибкам, пусть даже таким глупым, как эта.

Комментариев нет:

Отправить комментарий