Ошибки, баги, вопросы - страница 3430

 
В одном случае есть ошибка при компиляции, а в другом - нет:
void OnStart()
{
    string text1 = (string)NULL;  //(1)//нормально
    string text2 =  string(NULL); //(2)//Error: 'NULL' - expression of 'void' type is illegal
}

А какая принципиальная разница между (1) и (2) ?

 
A100 #:
  
    string text1 = (string)NULL;  //(1)//нормально
    string text2 =  string(NULL); //(2)//Error: 'NULL' - expression of 'void' type is illegal

   // Вот такие варианты компилятор принимает    
   string text1 = (string) NULL;
   string text2 = (string)(NULL);
   string text3 =         (NULL);
   string text4 =          NULL;
 
Konstantin Erin #:

Похвально, лишние скобки умеете расставлять - только какое отношение это имеет к моему сообщению ?

Для сведения - ниже тоже нет ошибок:
void OnStart()
{
    string text3 = (string)1;  //(3)
    string text4 =  string(1); //(4)
}
 
A100 #:
В одном случае есть ошибка при компиляции, а в другом - нет:

А какая принципиальная разница между (1) и (2) ?

Явное приведение к типу 1. 2 не явное. 
 
Valeriy Yastremskiy #:
Явное приведение к типу 1. 2 не явное

А в чем заключается неявность, если string справа явно указана, а главное: почему (4) нормально, а во (2) ошибка?

    string text2 =  string(NULL); //(2)//Error: 'NULL' - expression of 'void' type is illegal
    string text4 =  string(1);    //(4)//нормально
 
A100 #:

А в чем заключается неявность, если string справа явно указана, а главное: почему (4) нормально, а во (2) ошибка?

Не знаю, явно это в доках не указано. Для себя сделал такой вывод из практики. Тип в скобках явное приведение уже объявленной переменной, без скобок это объявление переменной или не явное приведение по правилам очередности. Явное приведение компилируется без ошибки, не явное не всегда.  Вообще в стринг должно все перейти и явно и не явно, видимо просто нулл не имеет текстового штатного аналога в МКЛ или нарушаются правила очерёдности пр мнению компилятора) 
 
Valeriy Yastremskiy #:
Не знаю, явно это в доках не указано. Для себя сделал такой вывод из практики. Тип в скобках явное приведение уже объявленной переменной, без скобок это объявление переменной или не явное приведение по правилам очередности. Явное приведение компилируется без ошибки, не явное не всегда.  Вообще в стринг должно все перейти и явно и не явно, видимо просто нулл не имеет текстового штатного аналога в МКЛ или нарушаются правила очерёдности пр мнению компилятора) 

Второе - тоже явное приведение. В справке указано:

Приведение числовых типов

В выражениях языка MQL5 можно использовать как явное, так и неявное приведение типов. Явное преобразование типов записывается следующим образом:

var_1 = (тип)var_2;

В качестве переменной var_2 может быть выражение или результат выполнения функции. Допускается также функциональная запись явного приведения типов:

var_1 = тип(var_2);

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Приведение типов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Привет,

Нашёл возможную логическую ошибку в ключевом коде стандартной библиотеки, а конкретно в методе Direction класса СExpertSignal
double CExpertSignal::Direction(void)
  {
   long   mask;
   double direction;
   double result=m_weight*(LongCondition()-ShortCondition());
   int    number=(result==0.0)? 0 : 1;      // number of "voted"
//---
   int    total=m_filters.Total();
//--- loop by filters
   for(int i=0;i<total;i++)
     {
      //--- mask for bit maps
      mask=((long)1)<<i;
      //--- check of the flag of ignoring the signal of filter
      if((m_ignore&mask)!=0)
         continue;
      CExpertSignal *filter=m_filters.At(i);
      //--- check pointer
      if(filter==NULL)
         continue;
      direction=filter.Direction();
      //--- the "prohibition" signal
      if(direction==EMPTY_VALUE)
         return(EMPTY_VALUE);
	
	if(direction == 0.0)  //код отсутствует
	continue;

	
      //--- check of flag of inverting the signal of filter
      if((m_invert&mask)!=0)
         result-=direction;
      else
         result+=direction;
      number++;
     }
//--- normalization
   if(number!=0)
      result/=number;
//--- return the result
   return(result);
  }   
Фильтры посылающие в этот модуль значение 0.0 посредством своих собственных методов Direction

direction=filter.Direction();
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до

      number++;
и считаются проголосовавшими, не привнося никаких добавочных значений к результирующей переменной direction.

А так как итоговая переменная result определяющая направление и силу сигнала с учётом всех фильтров высчитывается как

   if(number!=0)
      result/=number;
//--- return the result
   return(result);
что в связке например любого сигнального индикатора и модуля СSignalITF  - intraday time filter - приводит к уменьшению результирующего сигнала в два раза.

Если условная СSignalMA говорит direction = 100, а стандартный СSignalITF в обычный разрешенный день/час/минуту  в соответствии со своим кодом выдаёт всегда direction = 0.0, то сейчас получается result = (100 + 0.0) / 2 проголосовавших = 50 результирующая сила сигнала.
А в реальности все фильтры с 0.0 не должны считаться голосовавшими.
 
 
bred_bred1 #:
в результате отсутствия раннего выхода из текущей итерации лупа при direction 0.0 добираются до

Не добираются.

 
Andrey Barinov #:

Не добираются.

Добираются. Проверьте на отладчике, если в коде этого вам не видно. Сгенерируйте шаблон советника c MA и ITF и убедитесь в ополовиненных результатах на выходе.
Причина обращения: