Hatalar, hatalar, sorular - sayfa 1642

 
Soyut bir sınıfın nesnesini yaratmaya çalışırken, günlük çok az hata bilgisi veriyor: 'CClass - soyut sınıfı başlatamıyor. Ancak hangi yöntemlerin eksik olduğunu bilmek istiyorum çünkü çok fazla soyut yöntem var ve kaybı aramak uzun zaman alıyor. İlk eksik yöntemin günlükte belirtildiğinden emin olmanızı rica ediyorum.
 
Alexey Valeev :

18/08/2016 tarihindeki bugünkü güncellemeden sonra, OrderCalcMargin işlevi 0 döndürmeye başladı.

Terminal sürümü Demo 5.00 yapı 1383

Doğrulama kodu:

Terminalde çıktı:

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

ps: Servis masasına da yazdım ama burada konu da uygun yani bu mesaja daha hızlı cevap vermeleri mümkün.

Hata düzeltildi. Mesaj için teşekkürler.
 

Saf sanal yöntem uygulaması için kontrol yok

 class A {
         virtual void f() = 0 ;
};
void A::f() {} //нормально
 
fxsaber :
Hata ayıklama hatası (1383 oluştur)
Düzelteceklerini düşündüler. Ama hayır - 1395.
 

Belki bu ciddi bir bug değildir tabi ama sürekli yazıyorum

OBJ_RECTANGLE_LABEL türünde bir grafik nesnesinin özü, birkaç veya bir piksel kaybolur, hiçbir şey yok gibi görünüyor, ama bir şekilde bu iyi değil ...

nesnenin renkleri koyu olduğunda sol üstte kaybolur....

 
Derlerken hata
 template < typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
ayrıca tamam
 template < typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

MQL5\Include\environment.mqh, çiftlerin aşağıdaki karşılaştırmasını içerir

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

Yardım , MQL4\Libraries\stdlib.mq4'ten bir türev içerir

 //+------------------------------------------------------------------+
//| 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, çiftlerin aşağıdaki karşılaştırmasını içerir

Yardım , MQL4\Libraries\stdlib.mq4'ten bir türev içerir

çift bak. Okuma. Ve karşılaştırmanın iki yolunu görüyoruz:

  • İlk yol, iki sayı arasındaki farkı, karşılaştırmanın doğruluğunu belirten küçük bir değerle karşılaştırmaktır.
    Misal:
     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 
      }

  • İkinci yöntem, iki gerçek sayının normalleştirilmiş farkının sıfır ile karşılaştırılmasını içerir. Normalleştirilmiş sayıların farkını sıfırla karşılaştırmak işe yaramaz, çünkü normalleştirilmiş sayılarla herhangi bir matematiksel işlem sonucunda sonuç normalleştirilmez.
    Misal:
     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 :

İkinci yöntem, iki gerçek sayının normalleştirilmiş farkının sıfır ile karşılaştırılmasını içerir. Normalleştirilmiş sayıların farkını sıfırla karşılaştırmak işe yaramaz , çünkü normalleştirilmiş sayılarla herhangi bir matematiksel işlem sonucunda sonuç normalleştirilmez.

Bu doğru değil. Normalleştirilmiş değerleri aynıysa, iki normalleştirilmiş çiftin farkı her zaman sıfır olacaktır. Float ve double karşılaştırmalı bir örnek gerekli değildir. Bu iki duble için geçerli değil.

Ayrıca, normalleştirilmiş değerleri birbirine eşit olacak iki sayı alabilirsiniz. Ancak normalleştirilmiş farkları sıfır olmayacaktır.

 

Derleme hatası: ')' - tüm kontrol yolları bir değer döndürmez

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