Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 113

 
pavlick_ :

Çözümümün neden daha kötü olduğunu anlamıyorum, buraya ekleyeceğim:

Başlangıçta bunun bir "bak nasıl yapabilirim" bir performans olması ve tam olarak önceden düşünülmüş bir çözüm gerekliydi. Ve seninki üretime uymadı.

Ancak yönetmen bile, Belgelere göre parametrelerin hesaplanma sırasının garanti edilmediğini hesaba katmadı.

 
A100 :

Ancak yönetmen bile, Belgelere göre parametrelerin hesaplanma sırasının garanti edilmediğini hesaba katmadı.

Adil olmak gerekirse, MQL belgelerinin hala bu anı tanımladığını belirtmek gerekir:

Not

Parametrelerin fonksiyona geriye doğru iletildiği, yani en son parametrenin önce hesaplanıp iletildiği, ardından sondan bir önceki parametrenin vb. Açılan parantezden sonra ilk gelen parametre değerlendirilir ve sırayla en son geçer.

Ve sonra bu sırayı kullanmanın bir örneği bile var. C ++ bakış açısından, bu elbette çılgınlık, ancak bu MQL'de belgelenmiş bir kuralsa, gelecekte kodlarınızı taşımayı planlamamanız normal olabilir. Ve planlıyorsanız, #ifdef __MQL__ öğesini işaretleyerek burayı güvence altına alabilirsiniz.

 
A100 :

parametrelerin değerlendirildiği sıra garanti edilmez

Linkinizi şimdi fark ettim. Doğrusu, garantisi yoktur. İşte bu çelişkili MQL))

 
Alexey Navoykov :

Linkinizi şimdi fark ettim. Doğrusu, garantisi yoktur. İşte bu çelişkili MQL))

x32'de bunun tersi doğrudur (bence öyle kalacaktır), çünkü yığınla doğrudan bir bağlantı vardır. Ve x64'te bunun tersinin bir anlamı yok, bu nedenle gelecek için hiçbir garanti yok ... dahası, orada doğal görünmüyor

Optimizasyonlu ve optimizasyonsuz farklı bir sıralama olsa şaşırmam

 

Tüm öneriler için teşekkür etmek istiyorum. Pratik bir sorunun çözülmesine yapıcı bir şekilde yardımcı oldu.


Görev, void TimeCurrent() çağrılsaydı hiçbir şey olmayacağını gösterdi. void mevcut haliyle pek çok şeyi bozabilir.

 

ebeveyn yöntemini çağırmak istiyorum

İşte kod, neyi yanlış yapıyorum ???

//+------------------------------------------------------------------+
class A
  {
public:
   virtual int Test_A()
     {
      return 100;
     }
  };
//+------------------------------------------------------------------+
class B :public A
  {
public:
   virtual int Test_A()
     {
      return 200;
     }
  };

B b;
//+------------------------------------------------------------------+
void OnStart()
  {
   Comment (A::b.Test_A());
  }
//+------------------------------------------------------------------+


 
Vladimir Pastushak :

ebeveyn yöntemini çağırmak istiyorum

doğru sözdizimi:

b.A::Test_A()

ama mql'de doğru ya da yanlış yoktur.

ama soru sizin için daha fazla - eğer fonksiyonelin türevden çağrılması gerekiyorsa - neden onu temel sanal fonksiyona itiyorsunuz?

 

fxsaber :

Görev, void TimeCurrent() çağrılmış olsaydı, hiçbir şey olmayacağını gösterdi. void mevcut haliyle pek çok şeyi bozabilir.

hazırlıksız:

 #define MACROSV(NEW_HANDLE_, VOIDFN_) \
do {                                   \
   int prev=GetHandle();              \
   if (SelectHandle(NEW_HANDLE_))      \
      VOIDFN_;                        \
   SelectHandle(prev);                \
} while ( false )

İki makro, pek zararı yok gibi. µl'nin gücüyle daha zarif bir şey akla gelmiyor.

 
pavlick_ :

hazırlıksız:

Ve neden do...while var? Kıvırcık parantez yeterli
 
Alexey Navoykov :
Ve neden do...while var? Kıvırcık parantez yeterli

Çalışmasını sağlamak için:

 if (...)
   MACROSV(...) ;
else
{
}