Discussion de l'article "Les bases de la programmation MQL5 : Tableaux" - page 2

 
Un article très utile et bien expliqué, merci Dmitry Fedoseev.
 
J'ai trouvé une solution de contournement, mais il doit bien y avoir un moyen de le faire "frontalement" )).
 
thejobber:
Comment retourner un tableau à partir d'une fonction ? J'ai trouvé une solution de contournement jusqu'à présent, mais il doit évidemment y avoir un moyen de le faire "de front" )).

Il n'y a aucun moyen de le faire frontalement... sauf pour un pointeur sur le tableau. Par exemple :

CArrayDouble *Function(void);

Pas de manière frontale, mais une approche assez standard, comme ceci, dans cette section :

void Function(double &_arr_out[]);
En général, le tableau retourné est une référence de paramètre...
 

Oui, merci. J'ai essayé de faire immédiatement

return *x ; par habitude, comme en C++ ))

au lieu de

return GetPointer(x)

J'ai compris ))

 
MetaQuotes Software Corp.:

Nouvel article : MQL5 Programming Basics : Arrays est publié :

Auteur : Dmitry Fedoseev

1 Question :

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

Le compilateur interdit cette construction. Pourquoi ?

 
Merci beaucoup pour cet examen approfondi
 
#import "dll.dll"
  double qwerty(double &q[]) ;
#import

Je crée une dll et je veux lui passer un pointeur de tableau.

Mais je n'arrive pas à comprendre comment faire.

Il y a quelque chose qui ne va pas.


J'ai besoin d'un analogue de C++


double qwerty(double *q) ;

double *q ;

q = nouveau double [100] ;

qwerty(q) ;


Comment le faire en MQL5...

 
En mql, quel que soit le tableau, c'est ce qu'il est, vous ne pouvez rien en faire. Il ne devrait y avoir aucun problème. L'erreur se trouve quelque part dans votre dll. Peut-être devriez-vous passer la taille du tableau dans la dll.
 

Merci pour votre code qui m'a fait gagner du temps. J'ai essayé d'utiliser l'objet MQL5 Array (double, int etc.) et j'ai été frustré. Je suis arrivé sur votre post et j'ai trouvé votre code pour redimensionner les tableaux, c'était génial, merci. J'ai modifié votre code pour qu'il s'applique à n'importe quel type de données. Il suffit de ne pas essayer d'utiliser la méthode Contains (Search method) pour les objets car cela pourrait ne pas fonctionner car les objets pourraient être des références, je n'en suis pas sûr, je n'ai pas testé cela. J'essaie de recréer C# dans MQL5, c'est pourquoi les abréviations sont similaires :)


Que Dieu vous bénisse ! !!



// + ----------------------------------------------- ------------------- + 


// | 
CDynamicArray.mqh | 


// | 
Integer | 


// | 
https://login.mql5.com/ru/users/Integer | 


// + ----------------------------------------------- ------------------- + 


#property 

copyright  

"Integer" 


#property 

link  

"https://login.mql5.com/en/users/Integer" 


// + - -------------------------------------------------- --------------- + 


// | 
| 


// + ----------------------------------------------- ------------------- + 


template 

< 

typename 

 T> 


class 

 CDynamicArray 


  { 


private 

 : 
   

int 

                m_ChunkSize;     

// Taille des morceaux 
   

int 

                m_ReservedSize; 

// Taille réelle du tableau 
   

int 

                m_Size;         

// Nombre d'éléments actifs dans le tableau 


public 

 : 


   T Element [];       

// Le tableau proprement dit. 
Il se trouve dans la section publique, 
                                     

// afin que nous puissions l'utiliser directement, si nécessaire 
   

// + --------------------------- --------------------------------------- + 
   

| 
Constructeur | 
   

// + ----------------------------------------------- ------------------- + 
   

void 

 CDynamicArray ( 

int 

 ChunkSize = 

1024 

 ) 


     { 


      m_Size = 

0 

 ;                             

// Nombre d'éléments actifs 


       m_ChunkSize = ChunkSize;               

// Taille des morceaux 


       m_ReservedSize = ChunkSize;             

// Taille réelle du tableau 
      

ArrayResize 

 (Element, m_ReservedSize); 

// Préparer le tableau 


      } 
   

// + ----------------------------------------- ------------------------- + 
   

// 
Fonction permettant d'ajouter un élément à la fin d'un tableau | 
   

// + ----------------------------------------------- ------------------- + 
   

void 

 Add (T Value) 


     { 


      m_Size ++; 

// Augmenter le nombre d'éléments actifs 
      

if 

 (m_Size> m_ReservedSize) 


        { 

// Le nombre requis est supérieur à la taille réelle du tableau 


          m_ReservedSize + = m_ChunkSize; 

// Calculer la nouvelle taille du tableau 
         

ArrayResize 

 (Element, m_ReservedSize); 

// Augmenter la taille réelle du tableau 


         } 


      Element [m_Size- 

1 

 ] = Value; 

// Ajouter la valeur 


      } 
     
     

void 

 Set ( 

int 

 index, T Value) 


     { 


      m_Size ++; 

// Augmenter le nombre d'éléments actifs 
      

if 

 (m_Size <index) 


        { 
         

return 

 ; 


        } 


      Element [index] = Value; 

// Ajouter la valeur 


      } 
   

// + ----------------------------------------- ------------------------- + 
   

// 
Fonction permettant d'obtenir le nombre d'éléments actifs dans le tableau. 
   

// + ----------------------------------------------- ------------------- + 
   

int 

 Count () 


     { 
      

return 

 (m_Size); 


     } 
   


   T 

operator 

 [] ( 

const  

int 

 index) 

const 

 { 

return 

 Element [index]; 
} 
   
   

bool 

Contains (T itemToFind) 


   { 
      

for 

 ( 

int 

 i = 

0 

 ; i <Count (); i ++) 


        { 
            

if 

 (Element [i] == itemToFind) 


            { 
               

return  

true 

 ; 


            } 


        } 
        
      

return  

false 

 ; 


   } 
   
   

int 

 IndexOf (T itemToFind) 


   { 
      

for 

 ( 

int 

 i = 

0 

 ; i <Count (); i ++) 


        { 
            

if 

 (Element [i] == itemToFind) 


            { 
               

return 

 i; 


            } 


        } 
        
      

return 

 - 

1 

 ; 


   } 


  }; 


// + ----------------------------------------------- ------------------- + 

Vous pouvez alors les déclarer comme suit

CDynamicArray 

< 

int 

> 

  *Tickets; 


CDynamicArray 

< 

bool 

> 

 *FixedSLUsed; 


CDynamicArray 

< 

bool 

> 

 *PrevBarSLUsed; 

et les créer comme :

                        Tickets = 

new 

 CDynamicArray< 

int 

>(); 


                        FixedSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 


                        PrevBarSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 

et dans le code vous les utilisez comme une classe normale :



int 

 ticket = 

PositionGetInteger 

 ( 

POSITION_TICKET 

 ); 


int 

 index; 


if 

 (!Tickets.Contains(ticket)) // If Ticket Object does NOT contains ticket then we go into the if 


{ 


        Tickets.Add(ticket); 


        FixedSLUsed.Add( 

false 

); 


        PrevBarSLUsed.Add( 

false 

); 


} 
      


index = Tickets.IndexOf(ticket);   
 

ok essayons la version anglaise de MQL.


Merci pour votre code. Cela m'a fait gagner du temps. J'ai essayé d'utiliser les tableaux de MQL et ils étaient confus. J'étais alors très déprimé de devoir à nouveau écrire des structures de base qui étaient censées être là MAIS j'ai trouvé votre code qui m'a fait gagner du temps dans mes recherches sur les tableaux et sur la façon de les faire croître dynamiquement. AWESOME merci.

J'espère pouvoir vous rendre la pareille ! Le code ci-dessous fonctionne pour tous les types de données. Il fonctionnera également avec les objets, mais la méthode Contains (recherche) risque de ne pas fonctionner. Je ne l'ai testé que pour les types (double, int, bool). Les chaînes de caractères peuvent également poser problème et le code doit être étendu.


//+------------------------------------------------------------------+
//|CDynamicArray.mqh |
//|Integer |
//| https://login.mql5.com/ru/users/Integer |
//+------------------------------------------------------------------+
#property copyright "Integer"
#property link "https://login.mql5.com/ru/users/Integer"
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
template <typename T>
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Taille des morceaux
   int               m_ReservedSize; // Taille réelle du tableau
   int               m_Size;         // Nombre d'éléments actifs dans le tableau
public:
   T                 Element[];      // Le tableau proprement dit. Il se trouve dans la section publique, 
                                     // afin que nous puissions l'utiliser directement, si nécessaire
   //+------------------------------------------------------------------+
   //| Constructeur|
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Nombre d'éléments actifs
      m_ChunkSize=ChunkSize;               // Taille des morceaux
      m_ReservedSize=ChunkSize;            // Taille réelle du tableau
      ArrayResize(Element,m_ReservedSize); // Préparer le tableau
     }
   //+------------------------------------------------------------------+
   //| Fonction permettant d'ajouter un élément à la fin d'un tableau |
   //+------------------------------------------------------------------+
   void Add(T Value)
     {
      m_Size++; // Augmenter le nombre d'éléments actifs
      if(m_Size>m_ReservedSize)
        { // Le nombre requis est plus grand que la taille réelle du tableau.
         m_ReservedSize+=m_ChunkSize; // Calculer la nouvelle taille du tableau
         ArrayResize(Element,m_ReservedSize); // Augmenter la taille réelle du tableau
        }
      Element[m_Size-1]=Value; // Ajouter la valeur
     }
     
     void Set(int index, T Value)
     {
      m_Size++; // Augmenter le nombre d'éléments actifs
      if(m_Size<index)
        { 
         return;
        }
      Element[index]=Value; // Ajouter la valeur
     }
   //+------------------------------------------------------------------+
   //| Fonction permettant d'obtenir le nombre d'éléments actifs dans le tableau|
   //+------------------------------------------------------------------+
   int Count()
     {
      return(m_Size);
     }
   
   T operator[](const int index) const { return Element[index]; }
   
   bool Contains(T itemToFind)
   {
      for(int i=0;i<Count();i++)
        {
            if(Element[i] == itemToFind)
            {
               return true;
            }
        }
        
      return false;
   }
   
   int IndexOf(T itemToFind)
   {
      for(int i=0;i<Count();i++)
        {
            if(Element[i] == itemToFind)
            {
               return i;
            }
        }
        
      return -1;
   }
  };
//+------------------------------------------------------------------+


Vous pouvez alors le déclarer pour tous les types dont vous avez besoin comme ceci :


//Je les ai déclarés dans ma classe comme suit
   CDynamicArray<int> *Tickets;
   CDynamicArray<bool> *FixedSLUsed;
   CDynamicArray<bool> *PrevBarSLUsed;


// Puis je les ai déclarés dans les méthodes de ma classe comme suit

   Tickets = new CDynamicArray<int>();
   FixedSLUsed = new CDynamicArray<bool>();
   PrevBarSLUsed = new CDynamicArray<bool>();

// et je les ai utilisés dans les méthodes de ma classe comme suit :
      int ticket = PositionGetInteger(POSITION_TICKET);
      int index;
      if(!Tickets.Contains(ticket))
      {
         Tickets.Add(ticket);
         FixedSLUsed.Add(false);
         PrevBarSLUsed.Add(false);
      }
      
      index = Tickets.IndexOf(ticket);  
/plus de code a été supprimé



J'espère que cela aidera quelqu'un