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

 
При попытке создания объекта абстрактного класса в логе выдаётся слишком скудная информация об ошибке:  'CClass - cannot instantiate abstract class.   А хотелось бы знать, каких именно методов не хватает, ведь абстрактных методов бывает очень много, и приходится долго выискивать пропажу.    Прошу сделать так, чтобы в логе указывался первый отсутствующий метод.
 
Alexey Valeev:

После сегодняшнего обновления 18.08.2016 функция OrderCalcMargin стала возвращать 0.

Версия терминала Demo 5.00 билд 1383

Проверочный код:

Вывод в терминале:

2016.08.18 20:35:36.394    Test (EURUSD,H1)    OneLot=0.0 GetLastError=0

ps: так же написал в сервисдеск, но тут тоже темка подходящая, так что возможно по данному сообщению быстрей отреагируют.

Ошибку исправили. Спасибо за сообщение.
 

Нет проверки на реализацию чистого виртуального метода

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Ошибка при дебаге (build 1383)
Думал, исправят. Ан нет - 1395.
 

Может конечно это и не серьезный баг но меня постоянно от него типает

суть графический обьект типа OBJ_RECTANGLE_LABEL  пропадает пара или один пиксель, вроде бы и ничего но как то это не хорошо...

пропадает слева в верху при темных цветах обьекта.... 

 

 
Ошибка при компиляции
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
а так - нормально
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

В MQL5\Include\environment.mqh есть такое сравнение даблов 

//+------------------------------------------------------------------+
//| Сравнивает два значения типа double.                             |
//| RESULT                                                           |
//|   Возвращает истину, если значения равны и                       |
//|   ложь в противном случе.                                        |
//+------------------------------------------------------------------+
bool CEnvironment::DoubleEquals(const double a,const double b)
  {
//---
   return(fabs(a-b)<=16*DBL_EPSILON*fmax(fabs(a),fabs(b)));
//---
  }

В справке дан вариант из MQL4\Libraries\stdlib.mq4

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
fxsaber:

В MQL5\Include\environment.mqh есть такое сравнение даблов 

В справке дан вариант из MQL4\Libraries\stdlib.mq4

double Смотрим. Читаем. И видим два способа сравнения: 

  • Первый способ заключается в сравнении разницы между двумя числами с какой-то малой величиной, задающей точность сравнения. 
    Пример:
    bool EqualDoubles(double d1,double d2,double epsilon) 
      { 
       if(epsilon<0) epsilon=-epsilon; 
    //--- 
       if(d1-d2>epsilon) return false; 
       if(d1-d2<-epsilon) return false; 
    //--- 
       return true; 
      } 
    void OnStart() 
      { 
       double d_val=0.7; 
       float  f_val=0.7; 
       if(EqualDoubles(d_val,f_val,0.000000000000001)) Print(d_val,"equals",f_val); 
       else Print("Different: d_val = ",DoubleToString(d_val,16), 
                  "  f_val = ",DoubleToString(f_val,16)); 
    // Результат: Different: d_val= 0.7000000000000000   f_val= 0.6999999880790710 
      }

  • Второй способ предполагает сравнивать нормализованную разность двух вещественных чисел с нулевым значением. Сравнивать разность нормализованных чисел с нулём бесполезно, так как в результате любой математической операции с нормализованными числами результат получается ненормализованным.
    Пример:
    bool CompareDoubles(double number1,double number2) 
      { 
       if(NormalizeDouble(number1-number2,8)==0) return(true); 
       else return(false); 
      } 
    void OnStart() 
      { 
       double d_val=0.3; 
       float  f_val=0.3; 
       if(CompareDoubles(d_val,f_val)) Print(d_val,"equals",f_val); 
       else Print("Different: d_val = ",DoubleToString(d_val,16), 
                  "  f_val = ",DoubleToString(f_val,16)); 
    // Результат: Different: d_val= 0.3000000000000000   f_val= 0.3000000119209290 
      }

 
Karputov Vladimir:

Второй способ предполагает сравнивать нормализованную разность двух вещественных чисел с нулевым значением. Сравнивать разность нормализованных чисел с нулём бесполезно, так как в результате любой математической операции с нормализованными числами результат получается ненормализованным.

Это не правда. Разность двух нормализованных double всегда будет равна нулю, если их нормализованные значения совпадают. Пример со сравнением float и double приводить не надо. Это не случай двух double.

Более того, можно взять два числа, нормализованные значения которых будут равны между собой. Но их нормализованная разность не будет равна нулю.

 

Ошибка при компиляции: ')' - not all control paths return a value

int f()
{
        while ( true ) //или for(;;)
        {
//много строк c return, continue, без break
                return 0;
//много строк c return, continue, без break
                return 1;
        }
}
Причина обращения: