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

 
Yurixx :

Lütfen bana söyle.

Göstergede, örneğin dizideki sıra. close[], ArraySetAsSeries() tarafından bir kez mi yoksa başka bir şekilde mi ayarlandı?

Bu OnCalculate() içinde mi yapılıyor yoksa OnInit() içinde mi yapılabilir?

Garip bir durumla karşılaştım:

İlk tıklamada girişte AS_SERIES tarafından belirlenen yakın[] sıralaması, bir sonraki tıklamada kendiliğinden normale döner, yani. !AS_SERİSİ.

Kodda neyle bağlantılı olduğunu bulamadım.

skaler &arr[] alan herhangi bir işlevde dizi indeksleme yönünden %100 emin olamazsınız :-(

dahası, içindeki "serileştirmeyi" değiştirirseniz, işlevinizi tamamladıktan sonra bu yön kalacaktır.. bu, kimsenin beklemediği bir yan etki olarak ortaya çıkacaktır.

bu nedenle, ne yazık ki, işlevin girişinde bir dizi alırken, diziselliğini unutmayın, sizin için uygun bir diziye ayarlayın ve işlevden herhangi bir çıkışta, DAİMA orijinali geri döndürün

OnCalculate ile bu nadir bir durumdur, ancak pratikte başka kodlardan da çağrıldığı görülmüştür.

 
Maxim Kuznetsov :

ayrıca içindeki "serileştirmeyi" değiştirirseniz, işlevinizi tamamladıktan sonra bu yön kalacaktır..

Bu tam olarak güvendiğim şeydi. Bu nedenle, ilk girişte yalnızca bir kez yürütülen bir bloğa ArraySetAsSeries'i (kapat, doğru) OnCalculate() içine koydum. Ve bu "serileştirme" gerçekten kuruldu. Ancak, benim için sürpriz, ikinci tikte ve sonrasında "dizi" zaten tam tersiydi.

Maksim Kuznetsov :

OnCalculate ile bu nadir bir durumdur, ancak pratikte başka kodlardan da çağrıldığı görülmüştür.

Böyle egzotiklere sahip değilim ve ayrıca program içindeki zaman serilerinin ve arabellek dizilerinin "seri hale getirilmesini" değiştirmiyorum. Bu nedenle, göstergenin başında bir kez ayarlamam yeterli olacaktır. Ancak, bu dizilerin "seri hale getirilmesinin" korunduğundan emin olamıyorsanız, bunu her OnCalculate() döngüsünün başında ayarlamanız gerekir. Tamamen doğal olmayan bir şey gibi görünüyor.

 
input string inStr = NULL ; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define PRINT(A) Print ( #A + " = " + ( string )(A));

void OnStart ()
{
   string Str = NULL ;
  
  PRINT(inStr == NULL ); // false
  PRINT(Str == NULL );   // true


  PRINT(inStr == "" ); // true
  PRINT(Str == "" );   // false
}
Derleme zamanında bir uyarı oluşturmak güzel olurdu.
 
fxsaber :
Derleme zamanında bir uyarı oluşturmak güzel olurdu.

Eski zamanlardan beri hiçbir şey değişmediyse, NULL != "" Birçok kişi buna çoktan rastladı.

 
Alexey Viktorov :

Eski zamanlardan beri hiçbir şey değişmediyse, NULL != "" Birçok kişi buna çoktan rastladı.

Başka bir şeyle ilgili.

 
fxsaber :

Başka bir şeyle ilgili.

O zaman neden olmadığını açıkla. Niye ya

 input string inStr = "";

belki bir

 input string inStr = NULL ;

olamaz.

 
Alexey Viktorov :

O zaman neden olmadığını açıkla.

Aşağıdaki komut dosyası bunu göstermektedir.

 
fxsaber :

Aşağıdaki komut dosyası bunu göstermektedir.

Gösterseydim, soru kalmazdı. Her zaman etrafınızdaki herkesin düşüncelerinizi okuması veya programlama konusunda sizden daha hazırlıklı olması gerektiğini düşünüyorsunuz.

 
Alexey Viktorov :

Gösterseydim, soru kalmazdı. Her zaman etrafınızdaki herkesin düşüncelerinizi okuması veya programlama konusunda sizden daha hazırlıklı olması gerektiğini düşünüyorsunuz.

Böyle bir tepkinin nedenlerini anlamıyorum. Kısa kod, özelliği %100 gösterir.

 
fxsaber :

Böyle bir tepkinin nedenlerini anlamıyorum. Kısa kod, özelliği %100 gösterir.

Normal reaksiyon. Kodlarınızı anlamıyorum, açıklama istedim ama cevaben...

NULL, dikkatle ele alınması gereken bir belirsizliktir. Özellikle dize değişkenlerine uygulandığında.

Belgelerden

 //--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if (some_string== NULL ) some_string= "empty" ;

Bu nedenle, bu örnekte NULL , dizenin uzunluğunun sıfır olduğu değil, değişkenin başlatılmadığı anlamına gelir.

senin örneğinde

 input string inStr = NULL ;

değişken başlatılır. Benim için net olmayan ve anlama arzusu yok.

Buradan

PRINT(inStr == NULL ); // false

değişkenin başlatıldığını gösterir. Yine, büyük soru nedir. NULL'a başlatmanın neden imkansız olduğunu düşündünüz?

Görünüşe göre, böyle bir başlatma, dizenin uzunluğunun sıfır olduğu gerçeğine yol açar, bu kontrolün söylediği şey budur.

PRINT(inStr == "" ); // true
Neden: