Fehler, Irrtümer, Fragen - Seite 2760

 
Sergey Dzyublik:

Der Code zeigt eine BAG, in der eine Bedingung nicht eingegeben werden kann, löst aber dennoch einen Haltepunkt an einer völlig anderen Stelle im Code aus.
Noch Fragen?

Der Code-Optimierer hat alles weggeworfen, und die Funktion ist nun leer.

Der Haltepunkt bewegte sich bis zum Ende der Funktion und löste aus.

 
MetaQuotes:

Es war der Code-Optimierer, der alles verworfen und die Funktion leer gelassen hat.
Der Haltepunkt wurde an das gleiche Ende der Funktion verschoben und funktionierte.

Ich habe mich beim ersten Beispiel ein wenig aufgeregt, da stimme ich zu.
Aber was ist mit dem zweiten? Nun, der Haltepunkt bleibt innerhalb der Bedingung und bewegt sich nicht.
Das Auslösen eines Haltepunkts verleitet den Benutzer zu der Annahme, dass die Eingabebedingung erfüllt ist, obwohl dies in Wirklichkeit gar nicht der Fall ist:

class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
MetaQuotes:

Der Haltepunkt wurde an das gleiche Ende der Funktion verschoben und funktionierte.

Glauben Sie, dass es sich nicht um einen Fehler handelt?

 
MT5 (Build 2460) ist bei der Verwendung der Vererbung von Vorlagenklassen etwas kaputt gegangen, in früheren Versionen einschließlich Build 2450 hat alles funktioniert.
 
MT5-Bug (Build 2460) Kompilierungsfehler beim Erben von Template-Klassen aus dem Namespace.
C++ online:https://onlinegdb.com/S1E503pj8
namespace NameSpace{  
   struct A{};
   
   template<typename T>
   struct B : public A{};          // 'A' - declaration without type
};

struct D : public NameSpace::B<int>{
   int data;
};

void OnStart(){
   D d;
}
 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

OOP-Fragen in MQL5

fxsaber, 2020.05.30 10:04

Ich habe ein unerwartetes Ergebnis erhalten.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
  int i;  
  double j[2];
};

// Сложная структура.
struct STRUCT2
{
  int i;  
  string Str;
  
  STRUCT2() : Str("1234567 1234567")
  {
  }
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT2 Array2[]; // Сложная структура.
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array2, Amount), 1));
    
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры происходит в разы дольше,
  Print(_B(Func(Array2), 1)); // чем сложной.
}


        50000000
        Alert: Time[Test6.mq5 280: ArrayResize(Array2,Amount)] = 640 ms.
        50000000
        Alert: Time[Test6.mq5 282: Func(Array1)] = 440 ms.
        1333106752
        Alert: Time[Test6.mq5 283: Func(Array2)] = 156 ms.
        1333106752
 

Warum können wir inOBJ_TRENDBYANGLE den Winkel nicht programmatisch ermitteln?

Wir können die Zeit und die Preise der beiden Punkte programmatisch festlegen, aber der Winkel gibt 0 zurück.

Wenn wir OBJ_TRENDBYANGLE manuell verschieben, gibt es den normalen Winkelwert zurück.


Ich möchte einfach Text auf der Trendlinie in demselben Winkel wie die Trendlinie selbst platzieren.

Aber die Trendlinie gibt den Winkel nicht zurück, während OBJ_TRENDBYANGLE eine feste zweite Koordinate hat, und wenn sich die Skala des Diagramms infolge eines Anstiegs oder Rückgangs des Preises ändert, erhalten wir falsche Informationen...

 

Warum gibt der Compiler eine Warnung aus?

uchar uc[16];
ArrayInitialize(uc, 0xFF); //truncation of constant value

UPD: nein

int ArrayInitialize( uchar array[], uchar value );

ist es nicht angebracht, zu schreiben

uchar uc[16] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
 

401Code - was ist der Fehler?

Was ist los?

401

Es ist nicht möglich, von dieser Klasse zu erben, da sie mit dem Spezifizierer final deklariert ist

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
 
Igor Makanu:

Warum gibt der Compiler eine Warnung aus?

UPD: nein

int ArrayInitialize( uchar array[], uchar value );

ist nicht bequem zu schreiben

0xFF wird wahrscheinlich vom Compiler in 4 Bytes umgewandelt.

Alexsandr San:

401Code ,kann mir jemand sagen, was dieser Fehler ist?

gefunden

401

Eine Vererbung von dieser Klasse ist nicht möglich, da sie mit dem Spezifizierer final deklariert ist

Wie lautet die Frage - es gibt keinen abschließenden Modifikator, aber es liegt ein Fehler vor, oder was?