In mql, qualsiasi array ci sia, è quello che è, non si può fare nulla con esso. Non dovrebbero esserci problemi. L'errore è da qualche parte vicino alla vostra dll. Forse si dovrebbe passare la dimensione dell'array nella dll.
Grazie per il tuo codice che mi ha fatto risparmiare un po' di tempo per scrivere. Ho provato a usare l'oggetto MQL5 Array (double, int ecc.) e mi sono sentito frustrato. Sono arrivato al tuo post e ho trovato il tuo codice per ridimensionare gli array: fantastico, grazie. Ho modificato il tuo codice per adattarlo a qualsiasi tipo di dati. Solo non provare a usare il metodo Contains (Search method) per gli oggetti perché potrebbe non funzionare in quanto gli oggetti potrebbero essere riferimenti, non ne sono sicuro, non l'ho testato. Sto cercando di ricreare C# all'interno di MQL5, quindi le abbreviazioni sono simili :)
Dio ti benedica!!!
// + ----------------------------------------------- ------------------- +
// |
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;
// Dimensione del pezzo
int
m_ReservedSize;
// Dimensione effettiva dell'array
int
m_Size;
// Numero di elementi attivi nell'array
public
:
T Element [];
// L'array vero e proprio.
Si trova nella sezione pubblica,
// in modo da poterlo usare direttamente, se necessario
// + --------------------------- --------------------------------------- +
|
Costruttore
// + ----------------------------------------------- ------------------- +
void
CDynamicArray (
int
ChunkSize =
1024
)
{
m_Size =
0
;
// Numero di elementi attivi
m_ChunkSize = ChunkSize;
// Dimensione del pezzo
m_ReservedSize = ChunkSize;
// Dimensione effettiva dell'array
ArrayResize
(Element, m_ReservedSize);
// Preparare l'array
}
// + ----------------------------------------- ------------------------- +
// |
Funzione per aggiungere un elemento alla fine dell'array |
// + ----------------------------------------------- ------------------- +
void
Add (T Value)
{
m_Size ++;
// Aumenta il numero di elementi attivi
if
(m_Size> m_ReservedSize)
{
// Il numero richiesto è superiore alla dimensione effettiva dell'array
m_ReservedSize + = m_ChunkSize;
// Calcolo della nuova dimensione dell'array
ArrayResize
(Element, m_ReservedSize);
// Aumenta la dimensione effettiva dell'array
}
Element [m_Size-
1
] = Value;
// Aggiungere il valore
}
void
Set (
int
index, T Value)
{
m_Size ++;
// Aumenta il numero di elementi attivi
if
(m_Size <index)
{
return
;
}
Element [index] = Value;
// Aggiungere il valore
}
// + ----------------------------------------- ------------------------- +
// |
Funzione per ottenere il numero di elementi attivi nell'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
;
}
};
// + ----------------------------------------------- ------------------- +
Tickets =
new
CDynamicArray<
int
>();
FixedSLUsed =
new
CDynamicArray<
bool
>();
PrevBarSLUsed =
new
CDynamicArray<
bool
>();
e nel codice le usi come una normale classe:
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);
Grazie per il tuo post sul codice. Mi ha fatto risparmiare tempo. Ho provato a usare gli array di MQL e mi hanno confuso. Ero molto depresso per il fatto di dover scrivere ancora una volta le strutture di base che avrebbero dovuto esserci, ma poi ho trovato il tuo codice che mi ha fatto risparmiare un po' di tempo di ricerca sugli array e su come farli crescere o aumentare dinamicamente. Fantastico, grazie.
Spero di poter ricambiare! Il codice qui sotto funziona per tutti i tipi di dati. Funzionerà anche sugli oggetti, ma il metodo Contains (search) potrebbe non funzionare. L'ho testato solo su tipi (double, int, bool). Anche le stringhe potrebbero dare problemi e potrebbe essere necessario estendere il codice.
//+------------------------------------------------------------------+//|CDynamicArray.mqh |//|Intero |//| 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; // Dimensione del pezzoint m_ReservedSize; // Dimensione effettiva dell'arrayint m_Size; // Numero di elementi attivi nell'arraypublic:
T Element[]; // L'array vero e proprio. Si trova nella sezione pubblica, // in modo da poterlo usare direttamente, se necessario//+------------------------------------------------------------------+//| Costruttore|//+------------------------------------------------------------------+void CDynamicArray(int ChunkSize=1024)
{
m_Size=0; // Numero di elementi attivi
m_ChunkSize=ChunkSize; // Dimensione del pezzo
m_ReservedSize=ChunkSize; // Dimensione effettiva dell'arrayArrayResize(Element,m_ReservedSize); // Preparare l'array
}
//+------------------------------------------------------------------+//| Funzione per aggiungere un elemento alla fine dell'array |//+------------------------------------------------------------------+void Add(T Value)
{
m_Size++; // Aumenta il numero di elementi attiviif(m_Size>m_ReservedSize)
{ // Il numero richiesto è maggiore della dimensione effettiva dell'array
m_ReservedSize+=m_ChunkSize; // Calcolo della nuova dimensione dell'arrayArrayResize(Element,m_ReservedSize); // Aumenta la dimensione effettiva dell'array
}
Element[m_Size-1]=Value; // Aggiungere il valore
}
void Set(int index, T Value)
{
m_Size++; // Aumenta il numero di elementi attiviif(m_Size<index)
{
return;
}
Element[index]=Value; // Aggiungere il valore
}
//+------------------------------------------------------------------+//| Funzione per ottenere il numero di elementi attivi nell'array|//+------------------------------------------------------------------+int Count()
{
return(m_Size);
}
T operator[](constint index) const { return Element[index]; }
bool Contains(T itemToFind)
{
for(int i=0;i<Count();i++)
{
if(Element[i] == itemToFind)
{
returntrue;
}
}
returnfalse;
}
int IndexOf(T itemToFind)
{
for(int i=0;i<Count();i++)
{
if(Element[i] == itemToFind)
{
return i;
}
}
return -1;
}
};
//+------------------------------------------------------------------+
Quindi è possibile dichiararlo per tutti i tipi di cui si ha bisogno in questo modo:
//li ho dichiarati nella mia classe in questo modo
CDynamicArray<int> *Tickets;
CDynamicArray<bool> *FixedSLUsed;
CDynamicArray<bool> *PrevBarSLUsed;
// Poi li ho dichiarati nei metodi della mia classe in questo modo
Tickets = new CDynamicArray<int>();
FixedSLUsed = new CDynamicArray<bool>();
PrevBarSLUsed = new CDynamicArray<bool>();
// e li ho utilizzati nei metodi della mia classe in questo modo:int ticket = PositionGetInteger(POSITION_TICKET);
int index;
if(!Tickets.Contains(ticket))
{
Tickets.Add(ticket);
FixedSLUsed.Add(false);
PrevBarSLUsed.Add(false);
}
index = Tickets.IndexOf(ticket);
//altro codice è stato rimosso
Come restituire un array da una funzione? Finora ho trovato una soluzione, ma ovviamente ci deve essere un modo per farlo "di petto" )).
Non c'è modo di farlo di petto... se non con un puntatore all'array. Per esempio:
CArrayDouble *Function(void);Non è un approccio diretto, ma piuttosto standard, come questo, in questa sezione:
In generale, l'array restituito è un riferimento a un parametro...Sì, grazie. Ho provato a fare immediatamente
restituire *x; per abitudine, come in C++ ))
invece di
restituire GetPointer(x)
l'ho capito ))
Nuovo articolo Fondamenti di programmazione MQL5: Array è stato pubblicato:
Autore: Dmitry Fedoseev
1 Domanda:
Il compilatore vieta questa costruzione. Perché?
double qwerty(double &q[]);
#importazione
Sto creando una dll e voglio passarle un puntatore ad un array.
Ma non riesco a capire come farlo.
C'è qualcosa che non va.
Ho bisogno di un analogo del C++
doppio qwerty(doppio *q);
doppio *q;
q = nuovo doppio [100];
qwerty(q);
Come farlo in MQL5...
Grazie per il tuo codice che mi ha fatto risparmiare un po' di tempo per scrivere. Ho provato a usare l'oggetto MQL5 Array (double, int ecc.) e mi sono sentito frustrato. Sono arrivato al tuo post e ho trovato il tuo codice per ridimensionare gli array: fantastico, grazie. Ho modificato il tuo codice per adattarlo a qualsiasi tipo di dati. Solo non provare a usare il metodo Contains (Search method) per gli oggetti perché potrebbe non funzionare in quanto gli oggetti potrebbero essere riferimenti, non ne sono sicuro, non l'ho testato. Sto cercando di ricreare C# all'interno di MQL5, quindi le abbreviazioni sono simili :)
Dio ti benedica!!!
Allora puoi dichiararli così:
e crearli come:
e nel codice le usi come una normale classe:
Ok, proviamo la versione inglese di MQL.
Grazie per il tuo post sul codice. Mi ha fatto risparmiare tempo. Ho provato a usare gli array di MQL e mi hanno confuso. Ero molto depresso per il fatto di dover scrivere ancora una volta le strutture di base che avrebbero dovuto esserci, ma poi ho trovato il tuo codice che mi ha fatto risparmiare un po' di tempo di ricerca sugli array e su come farli crescere o aumentare dinamicamente. Fantastico, grazie.
Spero di poter ricambiare! Il codice qui sotto funziona per tutti i tipi di dati. Funzionerà anche sugli oggetti, ma il metodo Contains (search) potrebbe non funzionare. L'ho testato solo su tipi (double, int, bool). Anche le stringhe potrebbero dare problemi e potrebbe essere necessario estendere il codice.
Quindi è possibile dichiararlo per tutti i tipi di cui si ha bisogno in questo modo:
Spero che questo aiuti qualcuno