Erreurs, bugs, questions - page 2719

 
Vict:

C'est vous qui décidez.

Je ne pensais pas que les champs de contrainte étaient contraires à la pratique générale.

 
Lesinformations sur les bogues dans les priorités d'appel des fonctions template surchargées ontété mises à jour et complétées.
 
fxsaber:

Je ne pensais pas que les champs constants étaient en désaccord avec la pratique générale.

Non !), j'ai juste pensé que ça devrait être juste sur les structures. Pourquoi avons-nous besoin de béquilles alors ? C'est assez élégant, faire un tableau, tourner en boucle et faire set(). S'il y a une erreur dans la logique (appel répété quelque part), vous obtiendrez un plantage.

class A {
    int a;
public:
    A() : a(INT_MAX) {}
    void set(int aval) {if (a != INT_MAX) abort(); a = aval;}
    int get() {return a;}
};
 
Vict:

Je ne pense pas que ça vaille la peine de fourrer son nez dans le marécage d'un autre.

 
Sergey Dzyublik:

Je ne pense pas que ça vaille la peine de fourrer son nez dans le marécage d'un autre.

Junkie ? fxsaber a demandé un conseil, je lui ai dit.

 
fxsaber:

À mon avis, il est logique d'écrire des constantes pour des champs qui ne seront jamais (et ne devraient jamais) être modifiés après leur création.

Non. Ils font des champs constants dans de très rares cas. Et pas pour les types simples.

 
Vict:

Un junkie ? fxsaber a demandé un conseil, j'ai répondu.

Restez simple et vous serez approché...

 
Koldun Zloy:

Non. Les champs constants sont réalisés dans de très rares cas. Et pas pour les types simples.

Un exemple simple. Vous avez besoin d'un tableau de MAUs avec des périodes prédéfinies.

Chacun d'entre eux est un objet d'un type particulier. Il est clair qu'un objet d'un certain type est défini de manière unique par sa période. C'est pourquoi il serait logique de le rendre constant.


D'autres langages créent simplement un tableau de pointeurs. Cette liberté n'existe pas dans MQL.

 
Koldun Zloy:

Non. Les champs constants sont réalisés dans de très rares cas. Et pas pour les types simples.

Savez-vous comment sont configurés l'optimiseur et le compilateur MQL ?
Comment pouvez-vous être sûr que les champs const de types simples ne sont pas utilisés à cette fin ?

 
Une fois de plus, il y a un problème avec des avertissements inutiles lors de la compilation du code MT5 (build 2380).
Veuillez envisager de désactiver les avertissements inutiles du compilateur pour le développeur :
declaration of 'm_range' hides member   
   in template 'NodeArray<NodeArray<TailArray<int>>>' specified with [T=NodeArray<TailArray<int>>]      
   see previous declaration of 'm_range'        
declaration of 'm_range' hides member
   in template 'NodeArray<NodeArray<NodeArray<TailArray<int>>>>' specified with [T=NodeArray<NodeArray<TailArray<int>>>]
   see previous declaration of 'm_range'

Code source, Prototype de tableau multidimensionnel (C++ en ligne: https://onlinegdb.com/Hk7QjyRdL):
#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class TailArray{
protected:
   int m_index;
   T data[];
   
protected:
   TailArray(){}   
public:     
   TailArray(int size){
      ArrayResize(data, size);
      m_index = 0;
   };
   
   T value(){
      int index = m_index;
      m_index = 0;
      return data[index];
   }
   const T operator=(const T value){
      data[m_index] = (T)value;
      m_index = 0;
      return value;
   };
};

template<typename T>
class NodeArray : public T{
protected:
   int m_range;
   
protected:
   NodeArray(){}   
public:     
   NodeArray(const NodeArray &src){ this = src;}
   template<typename T_int> NodeArray(T_int count, T_int r1) : T(count * r1), m_range(r1){}
   template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2) : T(count * r1, r2), m_range(r1){}
   template<typename T_int> NodeArray(T_int count, T_int r1, T_int r2, T_int r3) : T(count * r1, r2, r3), m_range(r1){}
   
   T* operator[](int index){
      this.m_index = this.m_index * this.m_range + index;
      return &this;
   }
};


#define  MultiArray(type, size) MultiArray##size(type)
#define  MultiArray2(type) NodeArray<NodeArray<TailArray<type>>>
#define  MultiArray3(type) NodeArray<NodeArray<NodeArray<TailArray<type>>>>


template<typename T>
class MultiArrayCreate{
public:
   static MultiArray(T, 2) Size(int range_1, int range_2){
      return (MultiArray(T, 2)(range_1, range_2, 1));
   }
   static MultiArray(T, 3) Size(int range_1, int range_2, int range_3){  
      return (MultiArray(T, 3)(range_1, range_2, range_3, 1));
   }
};


void OnStart(){
   MultiArray(int, 2) arr_2 = MultiArrayCreate<int>::Size(4, 4);
   MultiArray(int, 3) arr_3 = MultiArrayCreate<int>::Size(4, 4, 4);
   
   arr_2[0][0] = 2233;
   arr_3[3][3][3] = 4455;
   PRINT(arr_2[0][0].value());
   PRINT(arr_3[3][3][3].value());
}