Güle güle robot, yaşasın delilik - sayfa 6

 
pansa :

Hey Vinyn!

Göstergeyi kontrol ettiniz mi?   : AltrTrend_Signal_v2_2.mq4

ve mantıksal bir hata buldu

içinde formül :   SSP=MathCeil(Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1));

sonunda 1'in altını çizdin

Sizce burada ne olmalı?

pansa



Muhtemelen 0! Dene! Ve eğer bir döngüdeyse, i'yi ya da önemli olan her şeyi deneyin!
 
pansa :

Hey Vinyn!

Göstergeyi kontrol ettiniz mi?   : AltrTrend_Signal_v2_2.mq4

ve mantıksal bir hata buldu

içinde formül :   SSP=MathCeil(Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1));

sonunda 1'in altını çizdin

Sizce burada ne olmalı?

pansa



vardiya olmalı
 
Andrei01 :

Bu standart, yasal ve yaygın C standartları yapısı için, editör bir uyarı verir: "'a' beyanı 4. satırda global beyanı gizler" ve "'b' beyanı 4. satırda global beyanı gizler", ki bu hala yanlıştır ve doğası gereği okuma yazma bilmeyen, çünkü ne işlev içinde yeni bir değişken bildirimi ne de en azından bazı olası değişken çakışmalarına dair bir ipucu yoktur.

Sonuç olarak, çok büyük olmayan program kodunda bile yüzlerce uygunsuz uyarımız var.

Yazılar %100 doğru.

Derleyicilerin derin kontrolünün faydasını takdir etmek için kodunuz için tam sorumlulukla 5-10 yıllık aktif programlamaya ihtiyacınız var. C/C++ dilleri, isteksiz ve kaliteyi derinlemesine analiz edemeyen ve yazarları koruyamayan en zayıf derleyiciler nedeniyle arbalet tabancasının itibarını hiç de küçük olmayan bir ölçüde kazandı.

Şimdi 2014'te bile, C/C++ derleyicileri (Microsoft onları tamamen yok ettikten sonra Windows'ta kalanlar) programcıları kendilerinden korumaz. Evet, bir miktar para için zayıf (pratik olarak işe yaramaz) var ve Visial Studio'da ayrı olarak başlatılan Kod Analizi var, ancak yine de derin hata tespiti için PVS Studio'yu (bu adamlar için Tanrı'ya şükür), CPP Check ve Lint'i ayrı ayrı kullanmanız gerekiyor.

Bu örneğin test edilmesi:

  • MQL4/MQL5 - olası bir hata hakkında uyarı verir
    declaration of 'a' hides global declaration at line 6    Test.mq4         13        14
    declaration of 'b' hides global declaration at line 6    Test.mq4         13        22
    

  • Kod Analizi dahil Visual Studio 2012 - hiçbir şey, potansiyel hatalar için analizin kalitesi genellikle sıfırdır. Uzun süredir rakipleri olmadığı için buhar banyosu yapmıyorlar.

  • PVS Studio doğru raporlar
    V669 The 'a' , 'b' arguments are non-constant references. The analyzer is unable to determine the position at which this argument is being modified.
         It is possible that the function contains an error. test.cpp 17

  • Lint - benzer şekilde çıktılar, 'x' bildirimi gizle...


Görevimiz kalite kontrolünde iyi olan ve intihara meyilli / pervasız C/C++ dil tekniklerinin kullanımına izin vermeyen kaliteli bir derleyici yapmaktır.

 
Renat :

Ayrıca mesajların tamamen yararsız olduğunu düşünüyorum. Ben profesyonel bir programcı değilim, ancak mikrolitrelerdeki bu tür saçmalıklar beni rahatsız ediyor. İlginç bir şekilde, a ve b'ye yapılan referanslar sabitse, PVS Studio bir uyarı verir (bunu kendiniz kontrol etmenin bir yolu yoktur)?

 int a= 1 ,b= 2 ;
//--------------------------------------------------------------------
void start(){        
         int k=sum(a,b);
         Alert (k);
}
//--------------------------------------------------------------------
int sum( const int & a, const int & b){        
         return (a+b);
}
 
Renat :

Bu örneğin test edilmesi:

  • MQL4/MQL5 - olası bir hata hakkında uyarı verir

1. Derleyicinin uyardığı bu basit koddaki olası bir hatanın tam olarak ne olabileceğine dair bir örnek verebilir misiniz?

Makul bir mantıklı açıklaması olması ve fazla müdahaleci biçimler almaması koşuluyla, programcılarla ilgilenmek kesinlikle iyi bir şeydir.

2. Yazılan kodun kalitesinin, derleyicinin kalitesi ve kodun sözdizimini analiz etme yeteneği ile ilgisi olmadığını düşünüyorum, ancak yalnızca iyi yazılmış bir test ortamı sürecinde kendini gösterir, bu da size izin verir. yazılı kodun derin bir işlevsel analizini yapmak. Kodun test kabuğundan ayrı olarak yararlı bir şekilde ayrıştırılmasına inanmak bir ütopya ve enerji kaybıdır.

Bu nedenle profesyonel programcılar uyarılara neredeyse hiç bakmazlar, çünkü derleyiciler tanım gereği işlevsel kod analizine sahip olamazlar ve acemi bir programcı bile dilin sözdizimini zaten bilir.

 
Renat :

Yazılar %100 doğru.

Doğru, bunlar doğru, ancak pratik değil. Derleyicinin bu davranışının kontrol edilememesi de burada çok önemlidir.

Renat :

Derleyicilerin derin kontrolünün faydasını takdir etmek için kodunuz için tam sorumlulukla 5-10 yıllık aktif programlamaya ihtiyacınız var. C/C++ dilleri, isteksiz ve kaliteyi derinlemesine analiz edemeyen ve yazarları koruyamayan en zayıf derleyiciler nedeniyle arbalet tabancasının itibarını hiç de küçük olmayan bir ölçüde kazandı.

Merak ediyorum o zaman neden bu diller MQL4/MQL4++/MQL5 için temel alındı?

Sonuçta mesele, her şeyden önce, derleyicilerde değil, bu dillerin yapısındadır.

Renat :

Şimdi 2014'te bile, C/C++ derleyicileri (Microsoft onları tamamen yok ettikten sonra Windows'ta kalanlar) programcıları kendilerinden korumaz. Evet, biraz para için zayıf (pratik olarak işe yaramaz) var ve Visial Studio'da ayrı olarak başlatılan Kod Analizi, ancak yine de derin hata tespiti için PVS Studio'yu (bu adamlar için Tanrı'ya şükür), CPP Kontrolü ve Lint'i ayrı ayrı kullanmanız gerekiyor.

Bu örneğin test edilmesi:

  • MQL4/MQL5 - olası bir hata hakkında uyarı verir

  • Kod Analizi dahil Visual Studio 2012 - hiçbir şey, potansiyel hatalar için analizin kalitesi genellikle sıfırdır. Uzun süredir rakipleri olmadığı için buhar banyosu yapmıyorlar.

  • PVS Studio doğru raporlar

  • Lint - benzer şekilde çıktılar, 'x' bildirimi gizle...

İlk olarak, Microsoft her şeye gücü yeten veya her yerde hazır bulunan değildir. İkincisi, 2014'te Windows'ta kalan başka derleyiciler var. Ancak, Linux altından derleyerek bir örnek vereceğim, ancak "derin hata arama" açısından, bu derleyicinin Windows altındaki ve Linux altındaki sürümleri farklı değil. Kaynak kodu biraz değiştirildi:

 int a= 1 ,b= 2 ;
//--------------------------------------------------------------------
int sum( int & a, int & b){        
         return (a+b);
}
//--------------------------------------------------------------------
int main(){        
         return sum(a,b);
}

Derleme ve derleyici mesajları:

$ icpc -c -Wremarks 1 .cpp
1 .cpp( 3 ): remark # 1418 : external function definition with no prior declaration
   int sum( int & a, int & b){        
      ^

1 .cpp( 3 ): remark # 3280 : declaration hides variable "a" (declared at line 1 )
   int sum( int & a, int & b){        
               ^

1 .cpp( 3 ): remark # 3280 : declaration hides variable "b" (declared at line 1 )
   int sum( int & a, int & b){        
                       ^

Görüyorsunuz, 2014'te çok "derin hata arama" hizmetine sahip Windows için derleyiciler var - var.

"Derin arama" kullanıp kullanmamaya karar verme hakkının programcıya verildiğini unutmayın: aynı kod, "-Wremarks" seçeneği olmadan daha pratik olarak derlendiğinde, ancak "-Wall" seçeneği kullanılarak tüm uyarılar etkinleştirildiğinde , herhangi bir açıklama yapmadan derler:

$ icpc -c -Wall 1 .cpp
$ 

Ayrıca, bu derleyici, programcının kendisi için gereksiz olduğunu düşündüklerini yasaklayarak, bireysel açıklamalar düzeyinde "derin aramayı" kontrol etmenizi sağlar.

Aşağıdaki derleyici sürümü kullanıldı:

$ icpc -- version
icpc (ICC) 15.0 . 0 20140723
Copyright (C) 1985 - 2014 Intel Corporation.  All rights reserved.

Bu arada, bu derleyici Visual Studio'ya entegre edilmiştir, en azından önceki sürümleri Visual Studio'nun önceki sürümlerine entegre edilmiştir.

Renat :

Görevimiz kalite kontrolünde iyi olan ve intihara meyilli / pervasız C/C++ dil tekniklerinin kullanımına izin vermeyen kaliteli bir derleyici yapmaktır.

Yüksek kaliteli bir derleyici her şeyden önce en azından "çalışmalı", yani dilin tanımına uymalıdır, aksi takdirde diğer tüm avantajlarının anlamı tamamen kaybolur:

 #property strict

/******************************************************************************/
class A {
private :
   /******************************************************************************/
  A() { }

   /******************************************************************************/
   void f() { }

public :
   /******************************************************************************/
   static void sf1(A &a) {
    a.f(); // Нет ошибки
  }

   /******************************************************************************/
   static void sf2() {
    A a; // Место "ошибки"

    a.f(); // Нет ошибки
  }
};

/******************************************************************************/
void OnStart () {
}

Özel bölümde bildirilen f() yöntemi neden olması gerektiği gibi statik yöntemden mükemmel bir şekilde çağrılıyor, ancak aynı statik yöntemden özel bölümde de bildirilen sınıf yapıcısı artık "çağrılmıyor". değişken tanımlı mı?

Hata mesajları:

'A::A' - cannot call private member function

Bu derleyici hatası, örneğin, Myers singleton'unun insani bir şekilde uygulanmasına izin vermez (bu örnek, bahsedilen singleton'un bir uygulaması DEĞİLDİR). Ve bu, özel bölümde açıklanan varlıklara erişim açısından son hata değil.

Bu bir hatadır ve örneğin intihar/pervasız uygulamalara yönelik bir tür özellik değildir, çünkü otomatik değişken tanımını dinamik nesne oluşturma ile değiştirir değiştirmez, yapıcı aniden en dikkat çekici şekilde çağrılmaya başlar. yol:

   /******************************************************************************/
   static void sf2() {
    A *a = new A;

    a.f();
     delete a;
  }

Bu kod hatasız derlenir. Ayrıca, bu durumda yapıcının zaten çağrıldığını, yapıcı kodundan bir mesajın çıktısını ekleyerek doğrulayabilirsiniz.

Bu tür hatalar devam ederken, kaliteli bir derleyiciden bahsetmek garip. Dil uygulamasının kendisindeki hatalar açısından, hem ticari hem de ticari olmayan C/C++ derleyicileri MQL4++ derleyicisinden önemli ölçüde üstündür, çünkü böyle bir utançları yoktur. O kadar üstünler ki, onlara kıyasla MQL4++ derleyicisinin hiç "çalışmadığını" söyleyebilirim.

Bu aşamada gerçekten ciddi kod kalite kontrolü sağlayan MQL4++ derleyicisinin gerçekten güçlü olan tek özelliği, programcı kodunun, örneğin ticaret fonksiyonları gibi başarısız olabilecek fonksiyonların döndürdüğü değerleri kontrol etmemesi durumunda uyarılar vermesidir. Ancak, dilin uygulanmasındaki düşük kalite göz önüne alındığında, derleyicinin bu kadar güçlü bir özelliği bile çok sınırlı bir değere sahiptir.

 
Pavlick :

Ayrıca mesajların tamamen yararsız olduğunu düşünüyorum. Ben profesyonel bir programcı değilim, ancak mikrolitrelerdeki bu tür saçmalıklar beni rahatsız ediyor. İlginç bir şekilde, a ve b'ye yapılan referanslar sabitse, PVS Studio bir uyarı verir (bunu kendiniz kontrol etmenin bir yolu yoktur)?

 int a= 1 ,b= 2 ;
//--------------------------------------------------------------------
void start(){        
         int k=sum(a,b);
         Alert (k);
}
//--------------------------------------------------------------------
int sum( const int & a, const int & b){        
         return (a+b);
}
Intel C++ derleyici sürümü 15.0.0, -Wremarks seçeneğiyle derlendiğinde her iki durum için de aynı açıklamaları üretir.
 
simpleton :

Doğru, bunlar doğru, ancak pratik değil.

Peki, olası hataların göstergeleri doğruysa, o zaman bu hataların düzeltilmesi gerekir.
 
Renat :
Peki, olası hataların göstergeleri doğruysa, o zaman bu hataların düzeltilmesi gerekir.

Potansiyel bir hata potansiyel bir hatadır, mutlaka bir hata değildir. Bu nedenle, "bu hataların düzeltilmesi gerektiği anlamına gelir" ifadesi yanlıştır, çünkü bunlar hiç hata olmayabilir.

Başarısız olabilecek bir işlev çağrısının sonucunun kontrol edilmemesi gibi, neredeyse kesinlikle bir hatanın olduğu durumlar vardır. Böyle bir durumla ilgili bir uyarı hem yerinde olur hem de çok faydalıdır. Ve bir hata olup olmadığını anlayamadığınız bir durumla ilgili uyarı genellikle hem uygunsuz hem de yardımcı olmaz. İsimlerin gizlenmesi durumunda neredeyse kesin olarak bir hata oluştuğu söylenemez.

Evet, programcıya olası hataların, yani yanlışlıkla yapılmış hataların olup olmadığını belirlemek için "derin arama"ya dayalı her türlü teşhis alma fırsatı verilebilir. Ancak bu, derleyicinin ana modu olmamalıdır, bu modu devre dışı bırakmak mümkün olmalıdır. Yeni başlayanları bu tür olası hatalardan korumak için, varsayılan olarak, yani kurulumdan sonra tanılama etkinleştirilebilir. Ama yine de kapatmak için bir seçenek olmalı.

Açıkçası, Intel derleyicisinde, daha önce bir dış kapsamda bildirilen bir adı iç içe geçmiş bir kapsamda gizleme gerçekleri, uyarı olarak değil, yalnızca açıklamalar olarak algılanır - aynı nedenden dolayı: bunlar hiç hata olmayabilir. Ve ticari olmayanlar da dahil olmak üzere diğer derleyicilerde, bu tür gizleme gerçekleri herhangi bir uyarıya karşılık DEĞİLDİR. Çünkü derleyici kullanıcılarının, yani programcıların tüm toplu deneyimi, bunun bir uyarı olmaması gerektiğini gösteriyor. Ve elbette, kullanıcı hangi uyarıların / açıklamaların yayınlanıp hangilerinin yapılmayacağını yapılandırabilmelidir.

Bu arada, MQL, C/C++ standartlarını takip etmesi gerekmeyen ayrı bir dil olduğundan, iç içe kapsamlarda isimlerin gizlenmesini tamamen yasaklamak daha kolay değil mi?

 
1 .cpp( 3 ): remark # 3280 : declaration hides variable "a" (declared at line 1 )
   int sum( int & a, int & b){        

Bu açıklama anlamsızdır ve belirtildiği gibi başlangıçta "a" değişkeni gizlenmediğinden programcıya prensipte herhangi bir yararlı bilgi taşımaz.

Gizleme, yalnızca değişkenin yerel bir kopyası yapıldığında gerçekleşir ve bu da tamamen yasal bir şeydir. Bu gizleme nedeniyle aniden kodda bir hata ortaya çıksa bile, arama aynı isimleri hemen bulduğu için kesin olarak kolayca bulunur. Fonksiyon şablonundaki isimleri değiştirmeye ve karıştırmaya başlarsanız ve bu kesinlikle bu açıklamanın derleyici mantığına göre "çözümüdür", o zaman hata bulma durumu çok daha zor olacak ve anlamada kafa karışıklığı ölçülemez şekilde artacaktır. kod. Belli gibi görünüyor.

Neden: