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...
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
;
}
};
// + ----------------------------------------------- ------------------- +
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);
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 morceauxint m_ReservedSize; // Taille réelle du tableauint m_Size; // Nombre d'éléments actifs dans le tableaupublic:
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 tableauArrayResize(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 actifsif(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 tableauArrayResize(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 actifsif(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[](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;
}
};
//+------------------------------------------------------------------+
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é
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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 :
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 ))
Nouvel article : MQL5 Programming Basics : Arrays est publié :
Auteur : Dmitry Fedoseev
1 Question :
Le compilateur interdit cette construction. Pourquoi ?
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...
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 ! !!
Vous pouvez alors les déclarer comme suit
et les créer comme :
et dans le code vous les utilisez comme une classe normale :
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.
Vous pouvez alors le déclarer pour tous les types dont vous avez besoin comme ceci :
J'espère que cela aidera quelqu'un