Hatalar, hatalar, sorular - sayfa 1576

 

Ürünlerin bu afişe hangi temelde girdiğini merak ediyorum.

ve yetkili satıcıların ürünleri oraya ulaşıyor mu? Yani bu banner'da ürünümü görebilir miyim? Kendi 30 sayfamı çevirdim ve göremedim ...

 
Renat Fatkhullin :

rahatsız etmiyorum 26 yıllık kesintisiz programlamanın arkasında.

Mali sektörden bahsediyorsak, uyarılar aslında hatalardır. Ve "işaret kaybı, kesinlik kaybı, yayınlarda kayıp, vb" ile ilgili binlerce mesajın tümü, kodun kalitesine bir cümledir. Görünüşe göre, sonuçları tam olarak anlamıyorsunuz.

Lütfen derleyicinin hata olarak belirttiği kod parçasını yeterince eksiksiz bir biçimde sağlayın.

Bu olmadan, tüm tartışma çirkin ve adil değil.

Pekala Renat, "kod kalitesi" hakkındaki bu tartışma, tartışmanın konusu değil. Burada sadece derlenebilirlikten bahsediyoruz, yani. kod performansı. Ve doğruluk kaybı vb. - bu, tabiri caizse, onun sorumluluğunda olan programcının kişisel bir meselesidir. Sonuçta, örneğin, int to short, örtük döküm, dil standardı tarafından yasaklanmamıştır, değil mi? Peki neden şimdi bu ahlak?

Tamam, şu hatalardan birini buldum:

 class CClass
{

};


class CArr
{
  CClass* data[];
 public : 
  CClass* operator [] ( int i)  { return data[i]; }
};


template < typename T>
void Func (T* obj)      {  }
 

void OnStart ()
{  
  CArr arr;
  Func(arr[ 0 ]);
}

günlükte ne alıyorum:

'CClass' - TestScript.mq5 türü olmadan bildirim 16 9
'CClass' - virgül bekleniyor TestScript.mq5 16 9

Önceki yapılarda her şey yolundaydı.

 
Alexey Navoykov :

Pekala Renat, "kod kalitesi" hakkındaki bu tartışma, tartışmanın konusu değil. Çünkü burada sadece derlenebilirlikten bahsediyoruz, yani. kod performansı. Ve doğruluk kaybı vb. - bu, tabiri caizse, onun sorumluluğunda olan programcının kişisel bir meselesidir. Sonuçta, örneğin, int to short, örtük döküm, dil standardı tarafından yasaklanmamıştır, değil mi? Peki neden şimdi bu ahlak?

2600 potansiyel olarak sorunlu yer ve hatta finansta bile ahlaki değil, kodun kalitesinin bir göstergesidir.


Tamam, şu hatalardan birini buldum:

günlükte ne alıyorum:

Önceki yapılarda her şey yolundaydı.

Evet, bu hata zaten tartışıldı (muhtemelen A100 ile) ve 4 Mayıs'ta düzeltildi. Görünüşe göre tip kontrolü ile abartmışlar.

Artık bu hatayı almayan en son MetaEditor yapı 1329'u ekledim. Lütfen kontrol edin.

MT5'in sürümü 12 Mayıs'ta yayınlanacak.

Dosyalar:
 
Alexey Navoykov :

Önceki yapılarda her şey yolundaydı.

Kodunuzda, özel bir nesneye const olmayan bir işaretçi döndürüyorsunuz. Programcı private olarak belirlediğinden, üçüncü taraf (değişkenlerin görünürlüğü açısından) işlevlerinin, mimari olarak kendilerine uygun olmayan şeyleri değiştirebileceği ortaya çıktı.

Özel bir nesneye bir işaretçi döndürmek istiyorsanız, bir const değiştirici belirtmeliyim. Senin durumunda verning'i kapatacaktı.

Yüksekten uçan bir kuş değil, o yüzden soruyorum. Böyle bir kodu bir yerde kullanmak zorunda mısınız yoksa const koymak için çok mu tembelsiniz?

 
A100 :

Onları biraz farklı şekilde elden çıkarmayı planlamış olmama rağmen, neredeyse tamamen iki gün geçirdim (benim yaşımda bu zaten çok fazla).

Yüzden fazla böcek getirdin. Ne zaman bu kadar çılgınca zaman harcadın?! Geliştiricilere karşı bu cömertlik neden?
Alexey Navoykov :

Bu yüzden, sabrı için tekrar şapkamı A100'e çıkarıyorum. Ve ben kendim bundan zaten bıktım, her şeyin yolunda gittiği eski yapıda oturmak benim için yeni yapıdaki hataların nedenlerini aramak , hizmet masası için çalışmaktan daha kolay. Yoksa biri bana bu iş için para mı verecek?

Evet, hizmet masası üçüncü taraf test kullanıcılarının ücretsiz çalışması için harika bir şey. Açıkçası, bu bunun için yapılmadı, ancak aslında ücretsiz çalışan üçüncü taraf test cihazları için bir işveren oldu. Bu hata raporları olmasaydı, derleyicinin tamamlanması daha uzun sürerdi.

Dünyada uygulandığı gibi, bulunan hata için bir ödül olması gerektiğini herkes destekleyecektir. A100, eyalet testçisinin maaşını almalıdır. Ve öyle görünüyor ki, testçinin yıllık maaşı.

 
Renat Fatkhullin :

Evet, bu hata zaten tartışıldı (muhtemelen A100 ile) ve 4 Mayıs'ta düzeltildi. Görünüşe göre tip kontrolü ile abartmışlar.

Artık bu hatayı almayan en son MetaEditor yapı 1329'u ekledim. Lütfen kontrol edin.

MT5'in sürümü 12 Mayıs'ta yayınlanacak.

Kontrol. Derleme hataları, programdan ayrı olarak yeniden oluşturamadığım, ancak rastgele bir şekilde dolaşmayı başardığım bazı garip harikalar dışında, artık neredeyse yok.

Aşağıda sorun alanı için bir örnek kod verilmiştir. Tekrar ediyorum, ayrı ayrı normal olarak derleniyor, ancak programımın bir parçası olarak hata veriyor.

 class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public :
 
   template < typename T>
   void Run(T& arr[])
  {
     struct Struct
    {
       template < typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set( this , arr, arr[ 0 ]);
  }

  
   template < typename T>
   void Set(T& arr[]) 
  {  
     for ( int i= 0 ; i< ArraySize (arr); i++) Set(arr[i]);   // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
   template < typename T>
   void Set(T& obj)    { } 
  
   template < typename T>
   void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

   return ;
}

Ana işlevin herhangi bir yerindeyse (örneğin, dönüşten sonra) şu satırı ekleyin:

workSet(dizi[0]);

iyi derler.

Optimizasyonla ilgili bir şeyler ters gitti gibi görünüyor.

Ayrıca, çalışma zamanında zaten bazı aksaklıklar var. Örneğin, yapının bazı üyelerine bir değer atadım, ama sonra oradaki değerin eski olduğu ortaya çıktı, yani. hiçbir şey atanmamıştır. Rastgele bir işlemle yanına bir satır eklersem, her şey normalleşir. Bu hatalar, derleyici optimizasyonları yaptığınız o sonbahar derlemesinden başladı. Genel olarak, her şey çiğ.

Ek olarak, derlemenin kendisi hala 20 saniye sürüyor, 1159 derlemesinde ise sadece 1-2 saniyeydi. Aynı zamanda, programlarımın çalışmasında önemli bir hızlanma gözlemlemiyorum, kazanç% 10-20 arasında. Böylece ivme ile ilgili hikayeleri 2-10 kat unutabilirsiniz. Belki bu, özel olarak seçilmiş test örneklerinde olur, ancak gerçek programlarımız var, sahte değil.

Toplamda, performansta küçük bir artış uğruna 10-20 kat daha yavaş derleme. IMHO, buna değmez. Kaybedilen programcı zamanı çok daha değerlidir.

Hala 1159 yapısında kalmaya zorlandı.

 
Anton Zverev :

Kodunuzda, özel bir nesneye const olmayan bir işaretçi döndürüyorsunuz. Programcı private olarak belirlediğinden, üçüncü taraf (değişkenlerin görünürlüğü açısından) işlevlerinin, mimari olarak kendilerine uygun olmayan şeyleri değiştirebileceği ortaya çıktı.

Özel bir nesneye bir işaretçi döndürmek istiyorsanız, bir const değiştirici belirtmeliyim. Senin durumunda verning'i kapatacaktı.

Yüksekten uçan bir kuş değil, o yüzden soruyorum. Böyle bir kodu bir yerde kullanmak zorunda mısınız yoksa const koymak için çok mu tembelsiniz?

Özelde, sadece diziyi gizlerim. Ve CClass nesnelerinin kendileri tam erişim için kullanıcıya açıktır, amaç budur. Salt okunur olsaydı, const koyardım.

 
Anton Zverev :
Dünyada uygulandığı gibi, bulunan hata için bir ödül olması gerektiğini herkes destekleyecektir. A100, eyalet testçisinin maaşını almalıdır. Ve öyle görünüyor ki, testçinin yıllık maaşı.
Desteklerim. Ama korkarım kendilerini sadece bir onur kurulu ve diploma ile sınırlayacaklar :)
 

Bunun bir hata mı yoksa CDealInfo PositionId () ve Ticket () sınıf yöntemlerinin yanlış bir açıklaması mı olduğunu bilmiyorum. Bu kodu yazdı

 //+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong   ticket_deal;       // тикет сделки
ulong   ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   trade.Buy( 0.1 , _Symbol );
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print ( "ResultDeal() = " ,ticket_deal);
   Print ( "deal.PositionId() = " ,ticket_position);
  }
//+------------------------------------------------------------------+

sonuç

NM       0        14 : 06 : 49.083     test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE       0        14 : 06 : 49.083     test_01 (EURUSD,H1)     deal.PositionId() = 0

HistorySelect() işlevini kullanarak bir işlem geçmişi isteği ekledi, sınıf yöntemleri çalışmaya başladı.

 //+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong   ticket_deal;       // тикет сделки
ulong   ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   trade.Buy( 0.1 , _Symbol );
   ticket_deal=trade.ResultDeal();
   HistorySelect ( 0 , TimeCurrent ());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print ( "ResultDeal() = " ,ticket_deal);
   Print ( "deal.PositionId() = " ,ticket_position);
  }
//+------------------------------------------------------------------+

sonuç

JM       0        14 : 16 : 33.055     test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF       0        14 : 16 : 33.055     test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov :

Özelde, sadece diziyi gizlerim. Ve CClass nesnelerinin kendileri tam erişim için kullanıcıya açıktır, amacı budur . Salt okunur olsaydı, const koyardım.

Apaçık. Söyle bana, hangi tasarımlarda faydalı olabilir? Bu yaklaşımla dizinin kendisiyle hiçbir şey yapılamayacağını anlıyorum (yeniden boyutlandırma, öğeleri değiştirme vb.). sil, ancak uygulanabilir ...

Bunu bir şablonla bir yerde yaptığınızı varsayıyorum, böylece farklı nesne türleri için aynı operatör [] sözdizimi var. Genel olarak, uygun olduğunda bu yapının kullanımını gösterebilir misiniz?

Neden: