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

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

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

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

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

 
Sergey Vradiy:

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

Это всё данные цен и времени, в различных расчётах. И да забыл сказать, что пишу на Mql4
 
Даже если что-то и придумать в плане подобной автоматизации, то встает вопрос: а что нужно делать тогда, когда значение все же равно нулю? Должно же быть выдано какое-то сообщение об ошибке и, по всей видимости, дальнейшее выполнение кода не требуется. А ведь это явно нигде не предусмотрено. Таким образом, во всех местах кода, где используются данные структуры все равно нужно делать ветвление в зависимости от значения. То есть выход один - добавлять нужные проверки. Их можно сделать в виде отдельной функции (возможно, шаблона).
 
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
{
   // Все ОК
}
 
Ihor Herasko:
Даже если что-то и придумать в плане подобной автоматизации, то встает вопрос: а что нужно делать тогда, когда значение все же равно нулю? Должно же быть выдано какое-то сообщение об ошибке и, по всей видимости, дальнейшее выполнение кода не требуется. А ведь это явно нигде не предусмотрено. Таким образом, во всех местах кода, где используются данные структуры все равно нужно делать ветвление в зависимости от значения. То есть выход один - добавлять нужные проверки. Их можно сделать в виде отдельной функции (возможно, шаблона).
Если равно нулю - то это указывалось бы в локальной переменной, и другие функции бы это видели
 
Ihor Herasko:

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

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

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

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

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

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

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

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

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

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

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

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

 
Sergey Vradiy:

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

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

Причина обращения: