Diskussion zum Artikel "Grundlagen der Programmierung in MQL5: Arrays" - Seite 2

 
Ein sehr hilfreicher und gut erklärter Artikel, vielen Dank Dmitry Fedoseev.
 
Wie kann man ein Array aus einer Funktion zurückgeben? Ich habe einen Workaround gefunden, aber offensichtlich muss es einen Weg geben, es "frontal" zu tun)).
 
thejobber:
Wie kann man ein Array aus einer Funktion zurückgeben? Ich habe bisher einen Workaround gefunden, aber offensichtlich muss es einen Weg geben, es "frontal" zu tun )).

Es gibt keine Möglichkeit, es direkt zu tun... außer für einen Zeiger auf das Array. Zum Beispiel:

CArrayDouble *Function(void);

Nicht frontal, aber ein ziemlich standardmäßiger Ansatz, wie dieser, in diesem Abschnitt:

void Function(double &_arr_out[]);
Im Allgemeinen ist das zurückgegebene Array ein Parameter-Verweis...
 

Ja, danke. Ich habe versucht, einfach sofort

return *x; aus Gewohnheit, wie in C++ ))

anstelle von

return GetPointer(x)

habe es herausgefunden ))

 
MetaQuotes Software Corp.:

Neuer Artikel MQL5 Programmiergrundlagen: Arrays ist veröffentlicht:

Autor: Dmitry Fedoseev

1 Frage:

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

Der Compiler verbietet eine solche Konstruktion. Warum eigentlich?

 
Vielen Dank für diesen ausführlichen Bericht
 
#import "dll.dll"
  double qwerty(double &q[]);
#import

Ich mache eine DLL und ich möchte einen Array-Zeiger an sie übergeben.

Aber ich kann nicht herausfinden, wie man das macht.

Irgendetwas ist falsch.


Ich brauche etwas analoges zu C++


double qwerty(double *q);

double *q;

q = new doppelt [100];

qwerty(q);


Wie man es in MQL5 macht...

 
In mql ist jedes Array genau das, was es ist, man kann nichts damit machen. Es sollte keine Probleme geben. Der Fehler liegt irgendwo in der Nähe in Ihrer dll. Vielleicht sollten Sie die Array-Größe in der Dll übergeben.
 

Vielen Dank für Ihren Code es sparte mir einige Zeit zu schreiben. Ich habe versucht, die MQL5 Array-Objekt (double, int etc.) zu verwenden und ich habe nur frustriert. Ich kam zu Ihrem Beitrag und fand Ihren Code, um die Größe der Arrays zu ändern, die awesome danke war. Ich habe Ihren Code geändert, um für jeden Datentyp gerecht zu werden. Versuchen Sie nur nicht, die Contains (Search-Methode) Methode für Objekte zu verwenden, da es nicht funktionieren könnte, da Objekte Referenzen sein könnten, ich bin mir nicht sicher, ich habe das nicht getestet. Ich versuche, C# innerhalb von MQL5 nachzubilden, daher sind die Abkürzungen ähnlich :)


God Bless !!!



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


| 
CDynamicArray.mqh | 


| 
Ganzzahlig | 


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

// Größe des Stücks 
   

int 

                m_ReservedSize; 

// Tatsächliche Größe des Arrays 
   

int 

                m_Size;         

// Anzahl der aktiven Elemente im Array 


public 

 : 


   T Element [];       

// Das eigentliche Array. 
Es befindet sich im öffentlichen Bereich, 
                                     

// so dass wir sie bei Bedarf direkt verwenden können 
   

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

| 
Konstrukteur | 
   

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

void 

 CDynamicArray ( 

int 

 ChunkSize = 

1024 

 ) 


     { 


      m_Size = 

0 

 ;                             

// Anzahl der aktiven Elemente 


       m_ChunkSize = ChunkSize;               

// Größe des Stücks 


       m_ReservedSize = ChunkSize;             

// Tatsächliche Größe des Arrays 
      

ArrayResize 

 (Element, m_ReservedSize); 

// Bereiten Sie das Array vor 


      } 
   

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

// | 
Funktion zum Hinzufügen eines Elements am Ende eines Arrays | 
   

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

void 

 Add (T Value) 


     { 


      m_Size ++; 

// Erhöhen Sie die Anzahl der aktiven Elemente 
      

if 

 (m_Size> m_ReservedSize) 


        { 

// Die geforderte Anzahl ist größer als die tatsächliche Array-Größe 


          m_ReservedSize + = m_ChunkSize; 

// Berechnen Sie die neue Arraygröße 
         

ArrayResize 

 (Element, m_ReservedSize); 

// Erhöhen Sie die tatsächliche Array-Größe 


         } 


      Element [m_Size- 

1 

 ] = Value; 

// Den Wert hinzufügen 


      } 
     
     

void 

 Set ( 

int 

 index, T Value) 


     { 


      m_Size ++; 

// Erhöhen Sie die Anzahl der aktiven Elemente 
      

if 

 (m_Size <index) 


        { 
         

return 

 ; 


        } 


      Element [index] = Value; 

// Den Wert hinzufügen 


      } 
   

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

| 
Funktion zur Ermittlung der Anzahl der aktiven Elemente im 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 

 ; 


   } 


  }; 


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

Dann können Sie sie wie folgt deklarieren:

CDynamicArray 

< 

int 

> 

  *Tickets; 


CDynamicArray 

< 

bool 

> 

 *FixedSLUsed; 


CDynamicArray 

< 

bool 

> 

 *PrevBarSLUsed; 

und erstellen Sie sie wie:

                        Tickets = 

new 

 CDynamicArray< 

int 

>(); 


                        FixedSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 


                        PrevBarSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 

und im Code verwenden Sie sie wie eine normale Klasse:



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, versuchen wir die englische Version von MQL.


Danke für deinen Code-Post. Es hat mir Zeit gespart. Ich habe versucht, die MQL-Arrays zu verwenden und sie waren verwirrend. Ich war dann sehr deprimiert, dass ich noch einmal grundlegende Strukturen schreiben muss, die eigentlich da sein sollten, aber dann fand ich Ihren Code, der mir einige Zeit bei der Suche nach Arrays ersparte und wie man sie dynamisch wachsen lässt. Großartiger Dank.

Ich hoffe, ich kann mich revanchieren! Der folgende Code funktioniert für alle Datentypen. Er funktioniert auch bei Objekten, aber die Methode Contains (search) funktioniert möglicherweise nicht. Ich habe es nur mit den Typen double, int und bool getestet. Bei String könnte es ebenfalls zu Problemen kommen und der Code muss eventuell erweitert werden.


//+------------------------------------------------------------------+
//|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;    // Größe des Stücks
   int               m_ReservedSize; // Tatsächliche Größe des Arrays
   int               m_Size;         // Anzahl der aktiven Elemente im Array
public:
   T                 Element[];      // Das eigentliche Array. Es befindet sich im öffentlichen Bereich, 
                                     // so dass wir sie bei Bedarf direkt verwenden können
   //+------------------------------------------------------------------+
   //| Konstruktor|
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Anzahl der aktiven Elemente
      m_ChunkSize=ChunkSize;               // Größe des Stücks
      m_ReservedSize=ChunkSize;            // Tatsächliche Größe des Arrays
      ArrayResize(Element,m_ReservedSize); // Bereiten Sie das Array vor
     }
   //+------------------------------------------------------------------+
   //| Funktion zum Hinzufügen eines Elements am Ende eines Arrays |
   //+------------------------------------------------------------------+
   void Add(T Value)
     {
      m_Size++; // Erhöhen Sie die Anzahl der aktiven Elemente
      if(m_Size>m_ReservedSize)
        { // Die geforderte Zahl ist größer als die tatsächliche Array-Größe
         m_ReservedSize+=m_ChunkSize; // Berechnen Sie die neue Arraygröße
         ArrayResize(Element,m_ReservedSize); // Erhöhen Sie die tatsächliche Array-Größe
        }
      Element[m_Size-1]=Value; // Den Wert hinzufügen
     }
     
     void Set(int index, T Value)
     {
      m_Size++; // Erhöhen Sie die Anzahl der aktiven Elemente
      if(m_Size<index)
        { 
         return;
        }
      Element[index]=Value; // Den Wert hinzufügen
     }
   //+------------------------------------------------------------------+
   //| Funktion zur Ermittlung der Anzahl der aktiven Elemente im 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;
   }
  };
//+------------------------------------------------------------------+


Dann können Sie es für alle Typen, die Sie benötigen, so deklarieren:


//Ich habe sie in meiner Klasse wie folgt deklariert
   CDynamicArray<int> *Tickets;
   CDynamicArray<bool> *FixedSLUsed;
   CDynamicArray<bool> *PrevBarSLUsed;


// Dann habe ich sie in meinen Klassenmethoden wie folgt deklariert

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

// und ich habe sie in meinen Klassenmethoden wie folgt verwendet:
      int ticket = PositionGetInteger(POSITION_TICKET);
      int index;
      if(!Tickets.Contains(ticket))
      {
         Tickets.Add(ticket);
         FixedSLUsed.Add(false);
         PrevBarSLUsed.Add(false);
      }
      
      index = Tickets.IndexOf(ticket);  
//weiterer Code wurde entfernt



Hoffentlich hilft das jemandem