Discusión sobre el artículo "Fundamentos de programación en MQL5 - Arrays" - página 2

 
Un artículo muy útil y bien explicado, gracias Dmitry Fedoseev.
 
¿Cómo devolver un array desde una función? Encontré una solución, pero obviamente debe haber una forma de hacerlo "de frente" )).
 
thejobber:
¿Cómo devolver un array desde una función? He encontrado una solución hasta ahora, pero obviamente debe haber una manera de hacerlo "de frente" )).

No hay manera de hacerlo de frente... excepto con un puntero al array. Por ejemplo:

CArrayDouble *Function(void);

No de frente, pero un enfoque bastante estándar, así, en esta sección:

void Function(double &_arr_out[]);
En general, el array devuelto es un parámetro-referencia...
 

Sí, gracias. Intenté simplemente

return *x; por costumbre, como en C++ ))

en lugar de

return GetPointer(x)

lo resolví ))

 
MetaQuotes Software Corp.:

Nuevo artículo Fundamentos de programación MQL5: Arrays está publicado:

Autor: Dmitry Fedoseev

1 Pregunta:

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

El compilador prohíbe esta construcción. ¿Por qué?

 
Muchas gracias por esta amplia reseña
 
#importar "dll.dll"
  double qwerty(double &q[]);
#Importación

Estoy haciendo una dll y quiero pasarle un puntero a un array.

Pero no consigo averiguar como hacerlo.

Algo va mal.


Necesito algún análogo de C++


doble qwerty(doble *q);

doble *q;

q = nuevo doble [100]

qwerty(q);


Como hacerlo en MQL5...

 
En mql, cualquier array que haya, eso es lo que es, no puedes hacer nada con él. No debería haber ningún problema. El error está en algún punto cercano de tu dll. Quizás deberías pasar el tamaño del array en la dll.
 

Gracias por su código que me ahorró algo de tiempo para escribir. He intentado utilizar el objeto MQL5 Array (doble, int, etc) y me frustré. Llegué a su puesto y encontré el código para cambiar el tamaño de las matrices que era impresionante gracias. He modificado el código para atender a cualquier tipo de datos. Solo no intentes usar el método Contains (Search method) para objetos ya que puede que no funcione ya que los objetos pueden ser referencias, no estoy seguro no he probado esto. Estoy tratando de recrear C # dentro MQL5 por lo tanto las abreviaturas son similares :)


¡¡¡Dios te bendiga !!!



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


// | 
CDynamicArray.mqh | 


// | 
Entero | 


// | 
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;     

// Tamaño del trozo 
   

int 

                m_ReservedSize; 

// Tamaño real de la matriz 
   

int 

                m_Size;         

// Número de elementos activos en la matriz 


public 

 : 


   T Element [];       

// El array propiamente dicho. 
Se encuentra en la sección pública, 
                                     

// para que podamos utilizarlo directamente, si es necesario 
   

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

| 
Constructor | 
   

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

void 

 CDynamicArray ( 

int 

 ChunkSize = 

1024 

 ) 


     { 


      m_Size = 

0 

 ;                             

// Número de elementos activos 


       m_ChunkSize = ChunkSize;               

// Tamaño del trozo 


       m_ReservedSize = ChunkSize;             

// Tamaño real de la matriz 
      

ArrayResize 

 (Element, m_ReservedSize); 

// Preparar la matriz 


      } 
   

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

// | 
Función para añadir un elemento al final del array | 
   

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

void 

 Add (T Value) 


     { 


      m_Size ++; 

// Aumentar el número de elementos activos 
      

if 

 (m_Size> m_ReservedSize) 


        { 

// El número requerido es mayor que el tamaño real del array 


          m_ReservedSize + = m_ChunkSize; 

// Calcular el nuevo tamaño del array 
         

ArrayResize 

 (Element, m_ReservedSize); 

// Aumentar el tamaño real del array 


         } 


      Element [m_Size- 

1 

 ] = Value; 

// Añadir el valor 


      } 
     
     

void 

 Set ( 

int 

 index, T Value) 


     { 


      m_Size ++; 

// Aumentar el número de elementos activos 
      

if 

 (m_Size <index) 


        { 
         

return 

 ; 


        } 


      Element [index] = Value; 

// Añadir el valor 


      } 
   

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

// | 
Función para obtener el número de elementos activos en el array | 
   

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

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 

 ; 


   } 


  }; 


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

Entonces puedes declararlos así

CDynamicArray 

< 

int 

> 

  *Tickets; 


CDynamicArray 

< 

bool 

> 

 *FixedSLUsed; 


CDynamicArray 

< 

bool 

> 

 *PrevBarSLUsed; 

y crearlos como:

                        Tickets = 

new 

 CDynamicArray< 

int 

>(); 


                        FixedSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 


                        PrevBarSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 

y en el código las usas como una clase normal:



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 vamos a probar la versión en Inglés de MQL.


Gracias por su código post. Me ahorró tiempo. Traté de usar las matrices MQL y eran confusas. Entonces yo estaba muy deprimido que necesito una vez más la necesidad de escribir las estructuras básicas que se suponía que debía estar allí, pero luego me encontré con su código que me salvó algún tiempo de investigación sobre las matrices y cómo hacer que crezcan y aumenten dinámicamente. AWESOME gracias.

El código de abajo funciona para todos los tipos de datos. Funcionará en objetos también pero el método Contains (search) podría no funcionar. Sólo lo he probado en los tipos (double, int, bool). String podría dar problemas también y el código podría necesitar ser extendido.


//+------------------------------------------------------------------+
//|CDynamicArray.mqh ||
//|Entero
//| 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;    // Tamaño del trozo
   int               m_ReservedSize; // Tamaño real de la matriz
   int               m_Size;         // Número de elementos activos en la matriz
public:
   T                 Element[];      // El array propiamente dicho. Se encuentra en la sección pública, 
                                     // para que podamos utilizarlo directamente, si es necesario
   //+------------------------------------------------------------------+
   //| Constructor|
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Número de elementos activos
      m_ChunkSize=ChunkSize;               // Tamaño del trozo
      m_ReservedSize=ChunkSize;            // Tamaño real de la matriz
      ArrayResize(Element,m_ReservedSize); // Preparar la matriz
     }
   //+------------------------------------------------------------------+
   //| Función para añadir un elemento al final del array |
   //+------------------------------------------------------------------+
   void Add(T Value)
     {
      m_Size++; // Aumentar el número de elementos activos
      if(m_Size>m_ReservedSize)
        { // El número requerido es mayor que el tamaño real del array
         m_ReservedSize+=m_ChunkSize; // Calcular el nuevo tamaño del array
         ArrayResize(Element,m_ReservedSize); // Aumentar el tamaño real del array
        }
      Element[m_Size-1]=Value; // Añadir el valor
     }
     
     void Set(int index, T Value)
     {
      m_Size++; // Aumentar el número de elementos activos
      if(m_Size<index)
        { 
         return;
        }
      Element[index]=Value; // Añadir el valor
     }
   //+------------------------------------------------------------------+
   //| Función para obtener el número de elementos activos en el array||
   //+------------------------------------------------------------------+
   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;
   }
  };
//+------------------------------------------------------------------+


Entonces puedes declararlo para todos los tipos que necesites así:


//los declaré en mi clase así
   CDynamicArray<int> *Tickets;
   CDynamicArray<bool> *FixedSLUsed;
   CDynamicArray<bool> *PrevBarSLUsed;


// Luego los declaré en los métodos de mi clase así

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

// y los usé en los métodos de mi clase así:
      int ticket = PositionGetInteger(POSITION_TICKET);
      int index;
      if(!Tickets.Contains(ticket))
      {
         Tickets.Add(ticket);
         FixedSLUsed.Add(false);
         PrevBarSLUsed.Add(false);
      }
      
      index = Tickets.IndexOf(ticket);  
//se eliminó más código



Espero que esto ayude a alguien