thejobber: Bir fonksiyondan bir dizi nasıl döndürülür? Şimdiye kadar geçici bir çözüm buldum, ancak açıkçası bunu "kafa kafaya" yapmanın bir yolu olmalı )).
Bunu yapmanın bir yolu yok... diziye bir işaretçi dışında. Örneğin:
CArrayDouble *Function(void);
Kafa kafaya değil, ama bu bölümdeki gibi oldukça standart bir yaklaşım:
void Function(double &_arr_out[]);
Genel olarak, döndürülen dizi bir parametre referansıdır...
Mql'de dizi ne ise odur, onunla hiçbir şey yapamazsınız. Herhangi bir sorun olmamalı. Hata dll'inize yakın bir yerde. Belki de dll'de dizi boyutunu geçmelisiniz.
Kodunuz için teşekkürler, yazmak için bana biraz zaman kazandırdı. MQL5 Array nesnesini (double, int vb.) kullanmaya çalıştım ve sadece hayal kırıklığına uğradım. Gönderinize geldim ve dizileri yeniden boyutlandırmak için kodunuzu buldum, bu harikaydı teşekkürler. Kodunuzu herhangi bir veri türüne hitap edecek şekilde değiştirdim. Sadece Contains (Arama yöntemi) yöntemini nesneler için kullanmaya çalışmayın çünkü nesneler referans olabileceğinden çalışmayabilir, bunu test etmediğimden emin değilim. C#'ı MQL5 içinde yeniden oluşturmaya çalışıyorum, bu nedenle kısaltmalar benzer :)
Tanrı korusun !!!
// + ----------------------------------------------- ------------------- +
// |
CDynamicArray.mqh |
// |
Tamsayı |
// |
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;
// Yığın boyutu
int
m_ReservedSize;
// Dizinin gerçek boyutu
int
m_Size;
// Dizideki aktif eleman sayısı
public
:
T Element [];
// Uygun dizi.
Public bölümünde yer alır,
// böylece gerekirse doğrudan kullanabiliriz
// + --------------------------- --------------------------------------- +
|
Kurucu |
// + ----------------------------------------------- ------------------- +
void
CDynamicArray (
int
ChunkSize =
1024
)
{
m_Size =
0
;
// Aktif eleman sayısı
m_ChunkSize = ChunkSize;
// Yığın boyutu
m_ReservedSize = ChunkSize;
// Dizinin gerçek boyutu
ArrayResize
(Element, m_ReservedSize);
// Diziyi hazırlayın
}
// + ----------------------------------------- ------------------------- +
// |
Dizinin sonuna bir eleman ekleme işlevi |
// + ----------------------------------------------- ------------------- +
void
Add (T Value)
{
m_Size ++;
// Etkin öğe sayısını artırın
if
(m_Size> m_ReservedSize)
{
// İstenen sayı gerçek dizi boyutundan daha büyüktür
m_ReservedSize + = m_ChunkSize;
// Yeni dizi boyutunu hesapla
ArrayResize
(Element, m_ReservedSize);
// Gerçek dizi boyutunu artırın
}
Element [m_Size-
1
] = Value;
// Değeri ekleyin
}
void
Set (
int
index, T Value)
{
m_Size ++;
// Etkin öğe sayısını artırın
if
(m_Size <index)
{
return
;
}
Element [index] = Value;
// Değeri ekleyin
}
// + ----------------------------------------- ------------------------- +
// |
Dizideki aktif eleman sayısını elde eden fonksiyon |
// + ----------------------------------------------- ------------------- +
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
>();
ve kodda onları normal bir sınıf gibi kullanırsınız:
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);
Kod gönderiniz için teşekkürler. Bana zaman kazandırdı. MQL dizilerini kullanmayı denedim ve kafa karıştırıcıydılar. Daha sonra orada olması gereken temel yapıları bir kez daha yazmam gerektiği için çok üzüldüm AMA sonra diziler ve bunların dinamik olarak nasıl büyütüleceği / artırılacağı konusunda bana biraz araştırma süresi kazandıran kodunuzu buldum. HARİKA teşekkürler.
Umarım size geri verebilirim! Aşağıdaki kod tüm veri türleri için çalışır. Nesneler üzerinde de çalışacaktır ancak Contains (arama) yöntemi çalışmayabilir. Ben sadece (double, int, bool) tipleri üzerinde test ettim. String de size sorun çıkarabilir ve kodun genişletilmesi gerekebilir.
//+------------------------------------------------------------------+//|CDynamicArray.mqh |//|Tamsayı |//| 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; // Yığın boyutuint m_ReservedSize; // Dizinin gerçek boyutuint m_Size; // Dizideki aktif eleman sayısıpublic:
T Element[]; // Uygun dizi. Public bölümünde yer alır, // böylece gerekirse doğrudan kullanabiliriz//+------------------------------------------------------------------+//| Kurucu|//+------------------------------------------------------------------+void CDynamicArray(int ChunkSize=1024)
{
m_Size=0; // Aktif eleman sayısı
m_ChunkSize=ChunkSize; // Yığın boyutu
m_ReservedSize=ChunkSize; // Dizinin gerçek boyutuArrayResize(Element,m_ReservedSize); // Diziyi hazırlayın
}
//+------------------------------------------------------------------+//| Dizinin sonuna bir eleman ekleme fonksiyonu |//+------------------------------------------------------------------+void Add(T Value)
{
m_Size++; // Etkin öğe sayısını artırınif(m_Size>m_ReservedSize)
{ // İstenen sayı gerçek dizi boyutundan daha büyüktür
m_ReservedSize+=m_ChunkSize; // Yeni dizi boyutunu hesaplaArrayResize(Element,m_ReservedSize); // Gerçek dizi boyutunu artırın
}
Element[m_Size-1]=Value; // Değeri ekleyin
}
void Set(int index, T Value)
{
m_Size++; // Etkin öğe sayısını artırınif(m_Size<index)
{
return;
}
Element[index]=Value; // Değeri ekleyin
}
//+------------------------------------------------------------------+//| Dizideki aktif eleman sayısını elde eden fonksiyon|//+------------------------------------------------------------------+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;
}
};
//+------------------------------------------------------------------+
Daha sonra ihtiyacınız olan tüm tipler için bu şekilde bildirimde bulunabilirsiniz:
//bunları sınıfımda şu şekilde bildirdim
CDynamicArray<int> *Tickets;
CDynamicArray<bool> *FixedSLUsed;
CDynamicArray<bool> *PrevBarSLUsed;
// Sonra bunları sınıf metotlarımda şu şekilde bildirdim
Tickets = new CDynamicArray<int>();
FixedSLUsed = new CDynamicArray<bool>();
PrevBarSLUsed = new CDynamicArray<bool>();
// ve bunları sınıf metotlarımda şu şekilde kullandım:int ticket = PositionGetInteger(POSITION_TICKET);
int index;
if(!Tickets.Contains(ticket))
{
Tickets.Add(ticket);
FixedSLUsed.Add(false);
PrevBarSLUsed.Add(false);
}
index = Tickets.IndexOf(ticket);
//daha fazla kod kaldırıldı
Bir fonksiyondan bir dizi nasıl döndürülür? Şimdiye kadar geçici bir çözüm buldum, ancak açıkçası bunu "kafa kafaya" yapmanın bir yolu olmalı )).
Bunu yapmanın bir yolu yok... diziye bir işaretçi dışında. Örneğin:
CArrayDouble *Function(void);Kafa kafaya değil, ama bu bölümdeki gibi oldukça standart bir yaklaşım:
Genel olarak, döndürülen dizi bir parametre referansıdır...Evet, teşekkürler. Ben sadece hemen denedim
return *x; alışkanlık dışında, C++'da olduğu gibi ))
yerine
return GetPointer(x)
anladım ))
Yeni makale MQL5 Programlama Temelleri: Diziler yayınlandı:
Yazar Dmitry Fedoseev
1 Soru:
Derleyici böyle bir yapıyı yasaklar. Neden?
double qwerty(double &q[]);
#import
Bir dll yapıyorum ve ona bir dizi işaretçisi aktarmak istiyorum.
Ama bunu nasıl yapacağımı bulamıyorum.
Bir sorun var.
C++'ın bir benzerine ihtiyacım var
double qwerty(double *q);
double *q;
q = yeni çift [100];
qwerty(q);
MQL5'te nasıl yapılır...
Kodunuz için teşekkürler, yazmak için bana biraz zaman kazandırdı. MQL5 Array nesnesini (double, int vb.) kullanmaya çalıştım ve sadece hayal kırıklığına uğradım. Gönderinize geldim ve dizileri yeniden boyutlandırmak için kodunuzu buldum, bu harikaydı teşekkürler. Kodunuzu herhangi bir veri türüne hitap edecek şekilde değiştirdim. Sadece Contains (Arama yöntemi) yöntemini nesneler için kullanmaya çalışmayın çünkü nesneler referans olabileceğinden çalışmayabilir, bunu test etmediğimden emin değilim. C#'ı MQL5 içinde yeniden oluşturmaya çalışıyorum, bu nedenle kısaltmalar benzer :)
Tanrı korusun !!!
O zaman onları şu şekilde bildirebilirsiniz:
ve şöyle oluşturabilirsiniz:
ve kodda onları normal bir sınıf gibi kullanırsınız:
Tamam, MQL'in İngilizce sürümünü deneyelim.
Kod gönderiniz için teşekkürler. Bana zaman kazandırdı. MQL dizilerini kullanmayı denedim ve kafa karıştırıcıydılar. Daha sonra orada olması gereken temel yapıları bir kez daha yazmam gerektiği için çok üzüldüm AMA sonra diziler ve bunların dinamik olarak nasıl büyütüleceği / artırılacağı konusunda bana biraz araştırma süresi kazandıran kodunuzu buldum. HARİKA teşekkürler.
Umarım size geri verebilirim! Aşağıdaki kod tüm veri türleri için çalışır. Nesneler üzerinde de çalışacaktır ancak Contains (arama) yöntemi çalışmayabilir. Ben sadece (double, int, bool) tipleri üzerinde test ettim. String de size sorun çıkarabilir ve kodun genişletilmesi gerekebilir.
Daha sonra ihtiyacınız olan tüm tipler için bu şekilde bildirimde bulunabilirsiniz:
umarım bu herkese yardımcı olur