Errores, fallos, preguntas - página 1642

 
Al intentar crear un objeto de una clase abstracta, el log muestra una información demasiado escasa sobre el error: 'CClass - cannot instantiate abstract class'. Y me gustaría saber qué métodos faltan, porque hay muchos métodos abstractos y se tarda mucho en encontrar el que falta. Por favor, asegúrate de que el primer método que falta se indica en el log.
 
Alexey Valeev:

Después de la actualización de hoy, 18.08.2016, la función OrderCalcMargin comenzó a devolver 0.

Terminal versión Demo 5.00 build 1383

Código de prueba:

Salida en terminal:

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

ps: también escribí a servicedesk, pero hay un hilo adecuado aquí también, así que quizás este mensaje sea respondido más rápido.

Lo he arreglado. Gracias por el mensaje.
 

No se comprueba la implementación de métodos virtuales puros

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Error de depuración (build 1383)
Pensé que estaba arreglado. Pero no, es 1395.
 

Quizá no sea un fallo grave, pero siempre me molesta.

la esencia del objeto gráfico como OBJ_RECTANGLE_LABEL desaparece un par o un píxel, no parece nada, pero no es bueno ...

desaparece en la parte superior izquierda cuando el objeto es oscuro en color....

 
Error de compilación
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
Por lo demás, está bien.
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

En MQL5\Include\environment.mqh existe esta doble comparación

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

En la Ayuda, hay una variante de 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:

En MQL5\Include\environment.mqh hay una comparación doble de este tipo

En la Ayuda, hay una variante de MQL4\Libraries\stdlib.mq4

doble mirada. Y lo leemos. Y vemos dos formas de comparación:

  • La primera forma consiste en comparar la diferencia entre dos números con algún valor pequeño, que establece la precisión de la comparación.
    Ejemplo:
    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 
      }

  • El segundo método consiste en comparar la diferencia normalizada entre dos números reales con un valor de cero. Comparar la diferencia de los números normalizados con el cero es inútil porque cualquier operación matemática con números normalizados da un resultado no normalizado.
    Ejemplo:

    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:

La segunda forma consiste en comparar la diferencia normalizada de dos números reales con cero. Es inútil comparar la diferencia de los números normalizados con el cero, porque cualquier operación matemática con números normalizados da un resultado no normalizado.

Esto no es cierto. La diferencia de dos dobles normalizados siempre será cero si sus valores normalizados son iguales. No es necesario citar un ejemplo al comparar float y double. Este no es el caso de dos dobles.

Además se pueden tomar dos números cuyos valores normalizados sean iguales entre sí. Pero su diferencia normalizada no será igual a cero.

 

Error de compilación: ')' - no todas las vías de control devuelven un valor

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