Hatalar, hatalar, sorular - sayfa 2722

 
A100 :

Prensipte böyle bir durum olmamalıdır - sorun derleyici düzeyinde çözülmüş olmalıdır (C++'da olduğu gibi). Ve burada mümkün görünüyor ve sonuç olarak birkaç sayfada bir tartışma

Kesinlikle bir hata... ama muhtemelen öyle! )))

IMHO, sabit ifadeler derleme sırasında bilinmelidir, statik ifadeler - uygulama açıklama sırasına göre başlatıldığında

ve işte MQL'deki bu şema, sabitler üzerinde kontrol varmış gibi görünüyor, ancak çalışma zamanında kendime sabitler atayabilirim ve bir işlev çağrısını başlatma olarak kullanabilirsiniz, bunun gibi bir şey:

 struct A
{
   const double a;
   A():a( AccountInfoDouble ( ACCOUNT_BALANCE ))
   {
       Print ( "a = " , a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   A a1;
}
//+------------------------------------------------------------------+

ve bu "sabit" yerel görünürlükte olabilir .... nerede sabit bir ifade haline gelir ve nasıl yardımcı olur .... Bilmiyorum, bunu kılavuzlar olmadan anlamıyorum, açıklaması yok bellek modeli - bunun bir anlamı yok, beklendiği gibi maksimumu kullanın - tüm yapıcılarda bir sabitle başlatın, daha sonra gelecekte bu alanı yanlışlıkla değiştirmeye karar verirseniz derleyici bir uyarı ile yardımcı olacaktır.

 
Igor Makanu :
ve işte MQL'deki bu şema, sabitler üzerinde kontrol varmış gibi görünüyor, ancak çalışma zamanında kendim sabitleri atayabilirim

C++'ın temelleri hakkında temel bilgisizlikten ne kadar utanabilirsiniz?

 

Bunun gibi bir örnek kafa karıştırıcı:

 struct A
{
   const double a;
   A():a( SymbolInfoDouble ( _Symbol , SYMBOL_ASK ))
   {
       Print ( "a = " , a);
   }
};
void OnTick ()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) bir = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) bir = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) bir = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) bir = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) bir = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) bir = 1.07892

 
Stanislav Korotky :

Aynı dosya üzerinde aynı anda çalışan iki program vardır. Yazan, FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ bayraklarını kullanır. Okuyan FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. İlk program FileFlush kullanarak dosyayı periyodik olarak kaydetmesine rağmen, ikincisi dosyanın uzunluğunu yalnızca açılış anında görür. FileSeek'i ileri geri yapmaya çalıştım - yardımcı olmuyor.

Soru: Dosyayı okuyan programın yazılmakta olan verileri almasını nasıl sağlayabilirim?

Bu bir hata gibi görünüyor, bir süre önce İngilizce forumda bildirildi. Burada rapor edecek zamanım olmadı.

Geliştiriciler İngilizce forumu okumuyor mu?

 
Stanislav Korotky :

Aynı dosya üzerinde aynı anda çalışan iki program vardır. Yazan, FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ bayraklarını kullanır. Okuyan FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. İlk program FileFlush kullanarak dosyayı periyodik olarak kaydetmesine rağmen, ikincisi dosyanın uzunluğunu yalnızca açılış anında görür. FileSeek'i ileri geri yapmaya çalıştım - yardımcı olmuyor.

Soru: Dosyayı okuyan programın yazılmakta olan verileri almasını nasıl sağlayabilirim?

Bu iki program aynı terminalde mi yoksa iki farklı programda mı?

 

Başvuru yoluyla geçirilen bir dizi nesneden bir nesnenin yöntemleri çalışmaz.

Misal:

 //+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split( const string separator,       // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if ( StringLen (separator)== 0 ) return ( 0 );

   ushort u_sep= StringGetCharacter (separator, 0 ); 
   
   int count= StringSplit (m_string,u_sep,tmp_result);

   // временно для проверки
   result[ 0 ].Assign( "Buy" ); // НЕ РАБОТАЕТ !!!!!!
   Alert ( "ressult[0] = " ,result[ 0 ].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return (count);
  }
//+------------------------------------------------------------------+
 
Slava :

Bu iki program aynı terminalde mi yoksa iki farklı programda mı?

bir terminalde. Uzman verileri yazar, göstergeyi okur. Farklı çizelgelerde asılıydılar, ancak birde olabilecekleri açık (eğer önemliyse). 2380 oluşturun.

 

VS2019

 #include <iostream>

int x;

struct A 
{
     const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = " ;
    std::cin >> x;
     const A a;
    std::cout << "a.a = " << a.a;
}

x=12345

aa = 12345

hmm, her şey MQL5'teki gibi çalışıyor

Tamam, sözlerimi geri alıyorum, Sharp'ta derlenmeyecek

 
Vict :

Tasarımcıyı da sıkıştırdın. Elbette kendiniz karar verin, ancak yapılar sishnye varlıklardır, model orada farklıdır - harici mantığa (fonksiyonlara) sahip pasif varlıklar.

Hiç gerekli değil. Neden sish? C#'a ne dersin? - ona bir kez daha anlamca daha yakın. Yapıların pasifliği hakkındaki tüm konuşmalar, tamamen arkaik fikirlerdir, IMHO. En azından her türün bir yapıcısı olması gerektiğini düşünüyorum. Başlatılmamış alanlar kötüdür ve bundan kaçınılmalıdır.

Sizin durumunuzda, bir dizi yapı oluşturmak için bir fabrika yöntemi yapmanız gerekir, yani. aşağı yukarı şöyle:

 struct A
{
   const int a;
  A( int init_value) : a(init_value) { }

   static bool CreateArray(A &array[], int count, int init_value)
  {
     //...
  }
};

Ve dizinin öğelerini doldurmak için daha önce önerilen yollardan biri zaten var.

 

aşağıdaki sorunla karşılaştı. Gösterge mum çizer

Tabloya konur. EA ayrıca bu göstergenin arabelleklerini okuyarak çalışır

Bu nedenle, aşamaları kaydettikten ve taradıktan sonra, göstergenin genellikle gecikmeli olarak mum çizdiğini buldum.

Onlar. zaten birkaç tık önce (tam olarak birkaç dakikaya kadar) arabellekleri hesapladı ve güncelledi ve danışman onlardan verileri okudu

(hem baykuşlar hem de hindi kütüğe yazar). Ama grafikte eski resmi görüyoruz. Örneğin, ekran, bir öncekinin en düşük seviyesini kıran kırmızı bir çubuk oluştuğu anda yapıldı. Ancak grafikte yalnızca bir önceki kırmızıyı ve altı çizili yeşili görüyoruz (aslında, zaten iki kutu daha var).


ama asıl resim nedir, sonradan tamamlanmıştır. Düşük penetrasyonu görüyoruz, ekran görüntüsünün kaydını başlattı. Günlüklere göre, her şey açık.



Size neyin yanlış olduğunu ve programın güncellemesini nasıl hızlandıracağınızı kim söyleyecek? Expert Advisor'dan ChartRedraw işlevini çağırıyorum, ancak hala birkaç dakikalık gecikme var.

İki dakika bir şekilde çok fazla, nedenini hayal bile edemiyorum. Hesaplamalar bu kadar yavaşlayacak kadar kozmik değil.