Errori, bug, domande - pagina 2760

 
Sergey Dzyublik:

Il codice mostra un BAG in cui una condizione non può essere inserita, ma innesca comunque un breakpoint in un punto completamente diverso del codice.
Altre domande?

L'ottimizzatore di codice ha buttato via tutto e la funzione è rimasta vuota.

Il punto di interruzione si è spostato alla fine della funzione e si è attivato.

 
MetaQuotes:

È stato l'ottimizzatore di codice che ha buttato via tutto e ha lasciato la funzione vuota.
Il punto di interruzione si è spostato alla stessa fine della funzione e ha funzionato.

Mi sono un po' eccitato con il primo esempio, sono d'accordo.
Ma che dire del secondo? Bene, il punto di interruzione rimane all'interno della condizione e non si sposta da nessuna parte.
L'attivazione di un punto di interruzione induce l'utente a pensare che la condizione di ingresso sia stata soddisfatta, quando in realtà potrebbe non esserlo affatto:

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:

Il punto di interruzione si è spostato alla stessa fine della funzione e ha funzionato.

Non pensate che questo sia un bug?

 
MT5 (build 2460) qualcosa si è rotto quando si usa l'ereditarietà dalle classi template, nelle versioni precedenti inclusa la build 2450 tutto funzionava.
 
Bug di MT5 (build 2460) errore di compilazione quando si eredita da una classe template dallo spazio dei nomi.
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 sul trading, sistemi di trading automatico e test di strategia

Domande OOP in MQL5

fxsaber, 2020.05.30 10:04

Ho ottenuto un risultato inaspettato.
#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
 

Perché inOBJ_TRENDBYANGLE non possiamo conoscere l'angolo programmaticamente?

Possiamo impostare programmaticamente il tempo e i prezzi dei due punti, ma l'angolo restituisce 0.

Se spostiamo manualmente OBJ_TRENDBYANGLE, viene restituito il valore dell'angolo normale.


Voglio semplicemente mettere del testo sulla linea di tendenza con lo stesso angolo della linea di tendenza stessa.

Ma la linea di tendenza non restituisce l'angolo, mentre OBJ_TRENDBYANGLE ha una seconda coordinata fissa e quando la scala del grafico cambia a causa dell'aumento o della diminuzione del prezzo, otteniamo informazioni false...

 

Perché il compilatore dà un avvertimento ?

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

UPD: no

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

non è conveniente scrivere

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

Codice 401 - qual è l'errore?

cosa c'è?

401

L'ereditarietà da questa classe è impossibile perché è dichiarata con lo specificatore final

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

Perché il compilatore dà un avvertimento ?

UPD: no

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

non è conveniente scrivere

0xFF è probabilmente trasformato in 4 byte dal compilatore.

Alexsandr San:

Codice 401, qualcuno può dirmi cos'è questo errore?

trovato

401

L'ereditarietà da questa classe è impossibile perché è dichiarata con lo specificatore final

Qual è la domanda - non c'è un modificatore finale, ma c'è un errore, o cosa?