Erreurs, bugs, questions - page 2760

 
MetaQuotes:

C'est l'optimiseur de code qui a tout jeté et laissé la fonction vide.
Le point d'arrêt s'est déplacé à la même extrémité de la fonction et a fonctionné.

Je me suis un peu emballé avec le premier exemple, je suis d'accord.
Mais qu'en est-il du second ? Eh bien, le point d'arrêt reste à l'intérieur de la condition et ne se déplace pas.
Le déclenchement d'un point d'arrêt induit l'utilisateur en erreur en lui faisant croire que la condition d'entrée a été remplie, alors que ce n'est peut-être pas le cas du tout :

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:

Le point d'arrêt a été déplacé à la même extrémité de la fonction et a fonctionné.

Vous ne pensez pas que c'est un bug ?

 
MT5 (build 2460) quelque chose s'est cassé lors de l'utilisation de l'héritage des classes de modèles, dans les versions précédentes, y compris la build 2450, tout fonctionnait.
 
Bug MT5 (build 2460) erreur de compilation lors de l'héritage d'une classe modèle depuis un espace de nom.
C++ en ligne: 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 sur le trading, les systèmes de trading automatisés et les tests de stratégie

Questions sur la POO dans MQL5

fxsaber, 2020.05.30 10:04

J'ai obtenu un résultat inattendu.
#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
 

Pourquoi dansOBJ_TRENDBYANGLE on ne peut pas connaître l'angle de manière programmatique ?

Nous pouvons définir l'heure et les prix des deux points de façon programmatique, mais l'angle renvoie 0.

Si nous déplaçons OBJ_TRENDBYANGLE manuellement, la valeur de l'angle normal est retournée.


Je veux simplement placer du texte sur la ligne de tendance au même angle que la ligne de tendance elle-même.

Mais la ligne de tendance ne renvoie pas l'angle, alors que OBJ_TRENDBYANGLE a une seconde coordonnée fixe et lorsque l'échelle du graphique change en raison de la hausse ou de la baisse du prix, nous obtenons de fausses informations...

 

Pourquoi le compilateur donne-t-il un avertissement ?

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

UPD : non

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

il n'est pas pratique d'écrire

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

Code 401 - quelle est l'erreur ?

Quoi de neuf ?

401

L'héritage de cette classe est impossible car elle est déclarée avec le spécificateur final.

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

Pourquoi le compilateur donne-t-il un avertissement ?

UPD : non

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

Il n'est pas pratique d'écrire

0xFF est probablement transformé en 4 octets par le compilateur.

Alexsandr San:

Code 401, quelqu'un peut-il me dire ce qu'est cette erreur ?

trouvé

401

L'héritage de cette classe est impossible car elle est déclarée avec le spécificateur final.

La question est la suivante : il n'y a pas de modificateur final, mais il y a une erreur, ou quoi ?

 
Aleksey Mavrin:

0xFF est probablement transformé en 4 octets par le compilateur.

non, mais il s'initialise correctement

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