Erreurs, bugs, questions - page 1642

 
Alexey Valeev:

Après la mise à jour d'aujourd'hui, le 18.08.2016, la fonction OrderCalcMargin a commencé à renvoyer 0.

Version du terminal Demo 5.00 build 1383

Code de test :

Sortie dans le terminal :

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

ps : j'ai également écrit à servicedesk, mais il y a un fil de discussion approprié ici aussi, donc peut-être que ce message recevra une réponse plus rapidement.

Je l'ai corrigé. Merci pour le message.
 

Aucun contrôle sur l'implémentation de méthodes virtuelles pures

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Erreur de débogage (build 1383)
Je pensais que c'était réparé. Mais non, c'est 1395.
 

Ce n'est peut-être pas un bogue grave, mais il me dérange toujours.

l'essence de l'objet graphique tel que OBJ_RECTANGLE_LABEL disparaît de quelques pixels ou d'un pixel, cela n'a l'air de rien, mais ce n'est pas bon ...

il disparaît en haut à gauche lorsque l'objet est de couleur sombre....

 
Erreur de compilation
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
Sinon, c'est bien.
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

Dans MQL5\Include\environment.mqh il y a une telle double comparaison

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

Dans l'aide, il existe une 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:

Dans MQL5\Include\environment.mqh il y a une telle double comparaison

Dans l'aide, il y a une variante de MQL4\Libraries\stdlib.mq4

double regard. Et nous l'avons lu. Et nous voyons deux façons de comparer :

  • La première méthode consiste à comparer la différence entre deux nombres avec une petite valeur, qui définit la précision de la comparaison.
    Exemple:
    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 
      }

  • La deuxième méthode consiste à comparer la différence normalisée entre deux nombres réels avec une valeur de zéro. Comparer la différence des nombres normalisés à zéro est inutile car toute opération mathématique avec des nombres normalisés donne un résultat non normalisé.
    Exemple :

    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 deuxième façon consiste à comparer la différence normalisée de deux nombres réels à zéro. Il est inutile de comparer la différence des nombres normalisés à zéro, car toute opération mathématique avec des nombres normalisés donne un résultat non normalisé.

Ce n'est pas vrai. La différence de deux doubles normalisés sera toujours égale à zéro si leurs valeurs normalisées sont les mêmes. Je n'ai pas besoin de citer d'exemple pour comparer un flottant et un double. Ce n'est pas le cas de deux doubles.

De plus, vous pouvez prendre deux nombres dont les valeurs normalisées sont égales l'une à l'autre. Mais leur différence normalisée ne sera pas égale à zéro.

 

Erreur de compilation : ')'. - tous les chemins de contrôle ne renvoient pas une valeur

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

Erreur de compilation : ')'. - tous les chemins de contrôle ne renvoient pas une valeur

Vous n'avez pas toutes les branches du code qui retournent une valeur :

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);
}

Ou comme ça :

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