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...
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
;
}
};
// + ----------------------------------------------- ------------------- +
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);
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ücksint m_ReservedSize; // Tatsächliche Größe des Arraysint m_Size; // Anzahl der aktiven Elemente im Arraypublic:
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 ArraysArrayResize(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 Elementeif(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ößeArrayResize(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 Elementeif(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[](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;
}
};
//+------------------------------------------------------------------+
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
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:
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 ))
Neuer Artikel MQL5 Programmiergrundlagen: Arrays ist veröffentlicht:
Autor: Dmitry Fedoseev
1 Frage:
Der Compiler verbietet eine solche Konstruktion. Warum eigentlich?
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...
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 !!!
Dann können Sie sie wie folgt deklarieren:
und erstellen Sie sie wie:
und im Code verwenden Sie sie wie eine normale Klasse:
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.
Dann können Sie es für alle Typen, die Sie benötigen, so deklarieren:
Hoffentlich hilft das jemandem