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

 
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;
        }
}
 
A100:

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

У вас не все ветви кода возвращают значение.Надо писать так:

int f()
{
 int res = 0;
        while ( true ) //или for(;;)
        {
//много строк c return, continue, без break
                res = 0;break или continue
//много строк c return, continue, без break
                res = 1;break или continue 
        }
return(res);
}

 Или так:

int f()
{
        while ( true ) //или for(;;)
        {
//много строк c return, continue, без break
                return 0;
//много строк c return, continue, без break
                return 1;
        }
  return(значение возвращаемое по умолчанию если не выполнены предыдущее return);
}
 
Vitalii Ananev:

У вас не все ветви кода возвращают значение.

В приведённом им примере - все. Выход из while(true) возможен только оператором break (которых у него нет) или return.
 
Sergei Vladimirov:
В приведённом им примере - все. Выход из while(true) возможен только оператором break (которых у него нет) или return.
Не буду спорить. Но сообщение об ошибке компилятора ')' - not all control paths return a value,  говорит об обратном.