Fehler, Irrtümer, Fragen - Seite 1642

 
Wenn ich versuche, ein Objekt einer abstrakten Klasse zu erstellen, zeigt das Protokoll zu wenige Informationen über den Fehler: 'CClass - cannot instantiate abstract class'. Und ich würde gerne wissen, welche Methoden fehlen, weil es so viele abstrakte Methoden gibt und es lange dauert, die fehlende zu finden. Bitte stellen Sie sicher, dass die erste fehlende Methode im Protokoll angezeigt wird.
 
Alexey Valeev:

Nach dem heutigen Update am 18.08.2016 begann die Funktion OrderCalcMargin, 0 zurückzugeben.

Terminal-Version Demo 5.00 build 1383

Test-Code:

Ausgang im Terminal:

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

ps: habe auch an servicedesk geschrieben, aber es gibt hier auch einen passenden Thread, also wird diese Nachricht vielleicht schneller beantwortet.

Es wurde korrigiert. Vielen Dank für diese Nachricht.
 

Keine Überprüfung der Implementierung rein virtueller Methoden

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Debug-Fehler (Build 1383)
Ich dachte, das Problem sei gelöst. Aber nein, es ist 1395.
 

Vielleicht ist es kein ernsthafter Fehler, aber er stört mich immer.

die Essenz des grafischen Objekts wie OBJ_RECTANGLE_LABEL verschwindet ein paar oder ein Pixel, es scheint nichts, aber es ist nicht gut ...

es verschwindet oben links, wenn das Objekt dunkel ist....

 
Kompilierungsfehler
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
Ansonsten ist es in Ordnung.
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

In MQL5\Include\environment.mqh gibt es einen solchen Doppelvergleich

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

In der Hilfe gibt es eine Variante von 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 gibt es einen solchen Doppelvergleich

In der Hilfe gibt es eine Variante von MQL4\Libraries\stdlib.mq4

Doppelter Blick. Und wir lesen sie. Und wir sehen zwei Möglichkeiten des Vergleichs:

  • Die erste Möglichkeit besteht darin, die Differenz zwischen zwei Zahlen mit einem kleinen Wert zu vergleichen, der die Genauigkeit des Vergleichs bestimmt.
    Beispiel:
    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 
      }

  • Bei der zweiten Methode wird die normierte Differenz zwischen zwei reellen Zahlen mit einem Wert von Null verglichen. Ein Vergleich der Differenz der normierten Zahlen mit Null ist nutzlos, da jede mathematische Operation mit normierten Zahlen ein nicht normiertes Ergebnis ergibt.
    Beispiel:

    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:

Bei der zweiten Möglichkeit wird die normierte Differenz zweier reeller Zahlen mit Null verglichen. Es ist sinnlos, die Differenz von normierten Zahlen mit Null zu vergleichen, da jede mathematische Operation mit normierten Zahlen zu einem nicht normierten Ergebnis führt.

Das ist nicht wahr. Die Differenz zweier normierter Doppelwerte ist immer Null, wenn ihre normierten Werte gleich sind. Ich brauche kein Beispiel anzuführen, wenn ich float und double vergleiche. Dies ist nicht der Fall bei zwei Doppelgängern.

Außerdem kann man zwei Zahlen nehmen, deren normierte Werte einander gleich sind. Ihre normierte Differenz ist jedoch nicht gleich Null.

 

Kompilierfehler: ')' - nicht alle Kontrollpfade geben einen Wert zurück

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