Hatalar, hatalar, sorular - sayfa 1440

 

MT 4. OnTick() içinde rastgele sayı üreteci MathRand(). Owl testini yaparken aynı ayarlarda tekrar çalıştırdığınızda farklı sonuçlar alıyorsunuz. Üretilen sayı algoritmayı etkiliyorsa bu doğaldır.

Nedense optimize ederken, aynı ayarlarla yeniden başlatırken aynı sonuçlar veriliyor. Yani MathRand() optimizasyon modunda çalışmıyor mu?

 
Сергей Таболин :

İkincisi (burada bir hata yapmaktan korkuyorum, umarım Alexander Puzanov bir şey olursa beni düzeltir), eğer programcı bir nedenden dolayı dinamik diziye 20 indeksli bir eleman eklemeye karar verirse, o zaman kötü bir şey olmaz. Dizi bu boyutu alacak ve değeri oraya yazacak ve "eksik" indeksleri sıfır değerleriyle başlatacaktır.

Aynen öyle. Neden "sıfır"??? Ya da belki EMPTY_VALUE olmalıdır? Veya WRONG_VALUE ?

Bu tür örtük atamalarla ilgili sorun tam olarak örtüklüklerindedir - derleyici, bir programcının bir şey düşündüğü ve diğerinin farklı düşünebileceği bazı kodlar sunar.

Artı, verimsizdir - bir değişkeni hemen başlatmak her zaman gerekli olmaktan uzaktır ve büyük bir diziyi, evet, bir döngüde başlatmak, hızı önemli ölçüde yavaşlatabilir.

Üçüncüsü, programcının kullanılan boyutu ve indeksi kontrol etmesini kimse engelleyemez ! Tek fark, şimdi bunu yapmak zorunda olmaları! )))

Derleyici dizinin kendisinin boyutunu takip ederse, hiçbir sınıf bu kodu kaldıramaz. Verimlilik çok düşebilir.

Aynı zamanda, derleyici bu işi yapmazsa, programcı bunu yapacak bir sınıf yazabilir ve gelecekte - gerekirse sıfırlarla genişletilebilen ve başlatılabilen bir dizi kullanabilir.

İkinci durumda, esneklik daha yüksektir.

Yani sunduğunuz şey aynı zamanda birçok durum için oldukça uygun bir çözüm. Ancak verimliliği azaltabilir, ki bu iyi değildir.

 
Сергей Таболин :

Bu, prensipte, dinamik bir dizinin normalde nasıl doldurulması gerektiğine dair basit bir örnektir. Çok uzun zamandır C yazmadım, hatırlamıyorum ama php'de diziler aynen böyle dolduruluyor! Her şey mantıklı ve anlaşılır. Diziye bir eleman eklersem (dizi[] = x), dizi otomatik olarak artırılır ve eleman dizinin sonuna eklenir. Ve kendiniz uzatmanıza gerek yok ve elemanın indeksini kendiniz belirtmeniz gerekmiyor. Burada tamamen gereksiz hareketler yapmamız gerekiyor:

fark açık...

Bence bu en azından garip)))

Programlama dilleri, kesinlikle yazılan ve yazılmayan olarak ikiye ayrılır. Kesin olarak yazılmayanlar PHP, R ve diğer işlevsel dillerinizi içerir. MQL veya C# ve Java gibi güçlü yazılan dillerde, bu tür belirsiz veri manipülasyonlarına izin verilmez. Ve bu, özellikle programcının güvenliği için yapıldı. Güçlü yazma, prosedürlerinizin her birinin son derece spesifik olduğu anlamına gelir: "dizi dizisinde 0 dizininde öğe al" özel ve anlaşılır bir prosedürdür, ancak bunu "dizi dizisinden bir şey al ve onu dizi dizisinden bir şeye ekle" ile değiştirmenizi önerirsiniz. ilk önce dönüş derleyicisini çözer". - Bu konuda fazla ilerlemeyeceğinizi kabul edin.

Öte yandan, elbette, dizinin boyutunu ve sürekli kullanıcı yeniden bölümlerini bulmaktan bıkmadan basit üst düzey yapılar istiyorum. Standart kütüphane bunun içindir. Temel dizileri kullanmak yerine Array grubundaki sınıflara geçin. Örneğin, CArrayInt dizisine sıfırdan 16'ya eklemek şöyle görünecektir:

 #include <Arrays\ArrayInt.mqh>

void OnStart ()
{
   CArrayInt array;
   for ( int i = 0 ; i < 16 ; i++)
      array.Add(i);   
}

Gördüğünüz gibi, olağandışı bir şey yok. Ve dizinin mevcut boyutu ve diğer yeniden bölümler üzerinde kafanızı kırmanıza gerek yok. Güçlü yazma çerçevesinde her şey sizin için yapılır ve doğrudan kullanıcı görevine odaklanmaya davetlisiniz. OOP'nin gücü ve anlamı budur.

 

Tam kayıt mevcut değil. Derleme Hatası

 template < typename T>
class A { protected :
        A( T t ) : t( t ) {}
        T t;
};
class B : A< int > {
        B() : A< int >( 1 ) {} //'<' - member(s) initialization expected
};
 

Nerede hata yaptığımı bulamıyorum.

Görev, aralıktakimaksimum ve minimum değeri bulmaktır.

 void OnStart ()

  {
int             Kol_Kan= 10 ;       //Количество элементов для копирования
double          HI[];             //массив для хранения максимумов на интервале
double          LO[];             //массив для хранения минимумов на интервале

CopyHigh ( _Symbol , 0 , 2 ,Kol_Kan,HI); //копируем значения максимумов
CopyLow ( _Symbol , 0 , 2 ,Kol_Kan,LO); //копируем значения минимумов

ArrayResize (HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize (LO,Kol_Kan);

int in_max= 0 ;                     //индекс максимального значения в массиве
int in_min= 0 ;

in_max= ArrayMaximum (HI, WHOLE_ARRAY , 0 ); //Находим индексы максимума и мин в массивах
in_min= ArrayMinimum (LO, WHOLE_ARRAY , 0 );

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert (hi_max, "___" ,lo_min);   

  } 
 

ArrayMaximum(), ArrayMinimum() içinde yanlış argüman sırası.

 
PabloEs :

Nerede hata yaptığımı bulamıyorum.

Görev, aralıktakimaksimum ve minimum değeri bulmaktır.

Fonksiyonlar

CopyHigh ( _Symbol , 0 , 2 ,Kol_Kan,HI); // maksimum değerleri kopyala  

CopyLow ( _Symbol , 0 , 2 ,Kol_Kan,LO); // minimum değerleri kopyala

zaten diziyi yeniden boyutlandırıyor ...

Bu çok fazla

ArrayResize (HI,Kol_Kan); //dizi boyutunu ayarla

ArrayResize (LO,Kol_Kan);

 
Sergei Vladimirov :

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

Kesinlikle)) Ve bence ...

Vladimir Pastuşak :

Fonksiyonlar

CopyHigh ( _Symbol , 0 , 2 ,Kol_Kan,HI); // maksimum değerleri kopyala  

CopyLow ( _Symbol , 0 , 2 ,Kol_Kan,LO); // minimum değerleri kopyala

zaten diziyi yeniden boyutlandırıyor ...

Bu çok fazla

ArrayResize (HI,Kol_Kan); //dizi boyutunu ayarla

ArrayResize (LO,Kol_Kan);

bileceğim, teşekkürler.

 
PabloEs :
Peki sorun ne, kendim çözemiyorum?
 

Ama yazar zaten anladı. ))

PabloEs :

Kesinlikle)) Ve bence ...