Проверка на значение

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Murat Ishakov
3991
Murat Ishakov  
Пишу сложный индикатор, который работает с большим количеством данных, и эти данные хранятся в структуре, а структура ещё к тому же реализована в виде массива. 

И вот когда было написано огромное количество правил по этим данным, вдруг возникла острая необходимость при каждом вызове элемента структуры проверять что он не равняется нулю (и это обязательно). Если переделывать весь код, то это невероятно долго и сложно. А может можно как-то сделать например создать какую то функцию чтобы она при вызове элемента структуры автоматически проверяла его на ноль? Или может структуру переделать в класс? Но я в ООП не силён
Sergey Vradiy
2753
Sergey Vradiy  
Murat Ishakov:
Пишу сложный индикатор, который работает с большим количеством данных, и эти данные хранятся в структуре, а структура ещё к тому же реализована в виде массива. 

И вот когда было написано огромное количество правил по этим данным, вдруг возникла острая необходимость при каждом вызове элемента структуры проверять что он не равняется нулю (и это обязательно). Если переделывать весь код, то это невероятно долго и сложно. А может можно как-то сделать например создать какую то функцию чтобы она при вызове элемента структуры автоматически проверяла его на ноль? Или может структуру переделать в класс? Но я в ООП не силён

А откуда поступают эти данные?

Murat Ishakov
3991
Murat Ishakov  
Sergey Vradiy:

А откуда поступают эти данные?

Это всё данные цен и времени, в различных расчётах. И да забыл сказать, что пишу на Mql4
Ihor Herasko
21126
Ihor Herasko  
Даже если что-то и придумать в плане подобной автоматизации, то встает вопрос: а что нужно делать тогда, когда значение все же равно нулю? Должно же быть выдано какое-то сообщение об ошибке и, по всей видимости, дальнейшее выполнение кода не требуется. А ведь это явно нигде не предусмотрено. Таким образом, во всех местах кода, где используются данные структуры все равно нужно делать ветвление в зависимости от значения. То есть выход один - добавлять нужные проверки. Их можно сделать в виде отдельной функции (возможно, шаблона).
Ihor Herasko
21126
Ihor Herasko  
Murat Ishakov:
Это всё данные цен и времени, в различных расчётах. И да забыл сказать, что пишу на Mql4

А, так это нужно проверять в момент получения, а не в момент использования.

Для этого пишется простая функция:

bool IsClosePriceReceived(ENUM_TIMEFRAMES eTF, int nBarIndex, double &fValue)
{
   fValue = iClose(NULL, eTF, nBarIndex);
   return GetLastError() == ERR_NO_ERROR;
}

Использование:

double fClosePrice = 0.0;
if (!IsClosePriceReceived(PERIOD_D1, 2, fClosePrice))
{
   // Не удалось получить цену закрытия позавчерашнего дня
}
else
{
   // Все ОК
}
Murat Ishakov
3991
Murat Ishakov  
Ihor Herasko:
Даже если что-то и придумать в плане подобной автоматизации, то встает вопрос: а что нужно делать тогда, когда значение все же равно нулю? Должно же быть выдано какое-то сообщение об ошибке и, по всей видимости, дальнейшее выполнение кода не требуется. А ведь это явно нигде не предусмотрено. Таким образом, во всех местах кода, где используются данные структуры все равно нужно делать ветвление в зависимости от значения. То есть выход один - добавлять нужные проверки. Их можно сделать в виде отдельной функции (возможно, шаблона).
Если равно нулю - то это указывалось бы в локальной переменной, и другие функции бы это видели
Murat Ishakov
3991
Murat Ishakov  
Ihor Herasko:

А, так это нужно проверять в момент получения, а не в момент использования.

Нет, там просто есть моменты, когда даже если одни переменные равны нулю, то можно использовать оставшиеся
Ihor Herasko
21126
Ihor Herasko  
Murat Ishakov:
Если равно нулю - то это указывалось бы в локальной переменной, и другие функции бы это видели

В любом случае для этого нужно писать дополнительный функционал. А это потребует переписывания всего кода, чтобы учесть новшества. 

Намного проще сделать так, чтобы программа не производила никакие расчеты до тех пор, пока для них не получены все необходимые данные. Как - показано выше.

Sergey Vradiy
2753
Sergey Vradiy  
Murat Ishakov:
Это всё данные цен и времени, в различных расчётах. И да забыл сказать, что пишу на Mql4

Если я правильно понял, это данные не цен (цены не бывают равны 0), а результаты каких-то вычислений с ценами. Значит, на этапе этих вычислений перед тем, как помещать очередной результат в массив, нужно проверять на неравенство 0 и в случае равенства не помещать в массив, а совершать какое-то другое, но одно и то же действие. Это можно прописать как процедуру и вызываться она будет лишь в одном месте программы.

Konstantin Nikitin
8589
Konstantin Nikitin  
Murat Ishakov:
Пишу сложный индикатор, который работает с большим количеством данных, и эти данные хранятся в структуре, а структура ещё к тому же реализована в виде массива. 

И вот когда было написано огромное количество правил по этим данным, вдруг возникла острая необходимость при каждом вызове элемента структуры проверять что он не равняется нулю (и это обязательно). Если переделывать весь код, то это невероятно долго и сложно. А может можно как-то сделать например создать какую то функцию чтобы она при вызове элемента структуры автоматически проверяла его на ноль? Или может структуру переделать в класс? Но я в ООП не силён

Сразу возникает несколько вопросов.

1. Массив структуры динамический?

2. Может ошибаюсь, но у вас похоже иногда по коду идет обнуление какого-то разряда структуры?

Не совсем понятно в каких ситуациях у вас может возникнуть пустой разряд массива структуры.

Ihor Herasko
21126
Ihor Herasko  
Sergey Vradiy:

Если я правильно понял, это данные не цен (цены не бывают равны 0)

Бывают, когда данные по ТФ не загружены.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий