Errori, bug, domande - pagina 1642

 
Quando si cerca di creare un oggetto di una classe astratta, il log mostra informazioni troppo scarne sull'errore: 'CClass - cannot instantiate abstract class. E vorrei sapere quali metodi mancano, perché ci sono così tanti metodi astratti, e ci vuole molto tempo per trovare quello mancante.
 
Alexey Valeev:

Dopo l'aggiornamento di oggi 18.08.2016 la funzione OrderCalcMargin ha iniziato a restituire 0.

Versione terminale Demo 5.00 build 1383

Codice di prova:

Uscita nel terminale:

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

ps: ho scritto anche a servicedesk, ma c'è un thread adatto anche qui, quindi forse questo messaggio riceverà una risposta più rapida.

Riparato. Grazie per il messaggio.
 

Nessun controllo sull'implementazione di metodi virtuali puri

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Errore di debug (build 1383)
Credevo fosse stato fissato. Ma no, è il 1395.
 

Forse non è un bug grave, ma mi dà sempre fastidio.

l'essenza dell'oggetto grafico come OBJ_RECTANGLE_LABEL scompare un paio o un pixel, sembra niente, ma non è buono...

scompare in alto a sinistra quando l'oggetto è scuro nel colore....

 
Errore di compilazione
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
Altrimenti, va bene.
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

In MQL5\Include\environment.mqh c'è un tale doppio confronto

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

In Aiuto, c'è una variante da 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:

In MQL5\Include\environment.mqh c'è un tale doppio confronto

In Aiuto, c'è una variante di MQL4\Libraries\stdlib.mq4

doppio sguardo. E noi lo leggiamo. E vediamo due modi di confronto:

  • Il primo modo consiste nel confrontare la differenza tra due numeri con qualche piccolo valore, che definisce la precisione del confronto.
    Esempio:
    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 
      }

  • Il secondo metodo consiste nel confrontare la differenza normalizzata tra due numeri reali con un valore di zero. Confrontare la differenza dei numeri normalizzati con lo zero è inutile perché qualsiasi operazione matematica con numeri normalizzati dà come risultato un risultato non normalizzato.
    Esempio:

    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:

Il secondo modo consiste nel confrontare la differenza normalizzata di due numeri reali con zero. È inutile confrontare la differenza dei numeri normalizzati con lo zero, perché qualsiasi operazione matematica con i numeri normalizzati produce un risultato non normalizzato.

Questo non è vero. La differenza di due doppi normalizzati sarà sempre zero se i loro valori normalizzati sono gli stessi. Non ho bisogno di citare un esempio quando paragono float e double. Questo non è il caso di due doppi.

Inoltre si possono prendere due numeri i cui valori normalizzati sono uguali tra loro. Ma la loro differenza normalizzata non sarà uguale a zero.

 

Errore di compilazione: ')'. - non tutti i percorsi di controllo restituiscono un valore

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