Hatalar, hatalar, sorular - sayfa 2045

 

Doğru, dizinin boyutunu yanlış boyuta ayarladım, belki bir şekilde etkilemiştir (her ne kadar onu hiçbir şekilde etkilememesi gerekir).

Burada boyut = 3 ile deneyin

 template < typename T>
int F1( const T& array[]) { return ArrayMaximum (array); }

template < typename T>
int F2( const T& array[]) { return F1(array); }

void OnStart ()
  {
     int arr[ 3 ]= { 1 , 2 , 3 };
     Print (F2(arr));   // Выдаёт -1 !!!
  }
 

Tutarsızlığın nedenini buldu. OPTIMIZE=0 modunda bir hata var, ancak OPTIMIZE=1 ile değil. Genelde her zaman yalnızca OPTIMIZE=0 kullanırım

 
fxsaber :

Sonuç için mantıklı (tutarlı) bir açıklama bulursam bir hata görmüyorum. Sonuç C++ ile eşleşmiyorsa hata kanıtının kabul edilebilir olduğunu düşünmüyorum. C++'da birisi öyle düşündü ve yaptı. Ve öyle düşünmeyebilir ve buna göre yapmayabilir. Bu nedenle, orada bir şeye atıfta bulunmamak, olması gerektiği gibi bir tür içsel kavrama dayanmak daha iyidir. Ve "kendine ait" olması arzu edilir, gerçekten de kişinin kendine ait olması. Ve programlama deneyimi kazandıkça "olması gerektiği gibi" klişelerin algılanamaz şekilde dayatılmasının sonucu değil.

Açıklama yoksa hata da yoktur. Ve bir yıl içinde bu açıklama ortaya çıkar ve çok ikna edici ise, o zaman her şey herkes için yeniden yapılmalı ??? C ++'da bunun neden böyle olduğunu yüzlerce kez düşündüler, başka türlü değil. MQL'de bir şey C++'dan farklı düzenlenmişse ve bunun tersi geçerli değilse bir açıklama gerekir.

 
Alexey Viktorov :
Statik bir değişken, herhangi bir ifadeyle başlatılabilen basit bir yerel değişkenin aksine , türüne karşılık gelen bir sabit veya sabit bir ifadeyle başlatılabilir.


Ama bir işlev değil.

Ardından, statik sınıf örneklerini devre dışı bırakmanız gerekir - çünkü bunlar yapıcı işlevi tarafından başlatılır

 

Ve işte değişken başlatma konusunda daha fazlası. Belgelerde belirtilenleri takip ederseniz, diğer global / statik değişkenlere atıfta bulunmak da imkansızdır. Çünkü bu sabit bir ifade değil:

 int a= 1 ;
int b= a+ 1 ;  // Согласно документации, такая инициализация не возможна

void OnStart ()
{
   Print (b);
}

Ancak şimdilik işe yarıyor. Ve birçoğunun hiçbir şeyden şüphelenmeden her zaman bu tür yapıları kullandığına inanıyorum. Ancak, geliştiricilerin herhangi bir zamanda onu kesebilecekleri ortaya çıktı. İşlev başlatmada olduğu gibi, bu kodlar başarıyla derlenmeye devam edecek, ancak düzgün çalışmayacaktır. Genel olarak, tüm MQL bir saatli bombadır.

 
Alexey Navoykov :

Ve işte değişken başlatma konusunda daha fazlası. Belgelerde belirtilenleri takip ederseniz, diğer global / statik değişkenlere atıfta bulunmak da imkansızdır. Çünkü bu sabit bir ifade değil:

 //+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

yapıcı işlevi tarafından başlatıldı - yasakla!

Bu, en son mesajları mantıklı bir şekilde özetlerseniz

Alexey Navoykov :

Tutarsızlığın nedenini buldu. OPTIMIZE=0 modunda bir hata var, ancak OPTIMIZE=1 ile değil. Genelde her zaman yalnızca OPTIMIZE=0 kullanırım

32 bitlik bir terminalde, herhangi bir OPTIMIZE ile bir hata oluşur.

 int g1( int & t[] ) { return ArraySize ( t ); }
int g2( int & t[] ) { return g1( t ); }
void OnStart ()
{
         int t[] = { 1 , 2 , 3 , 4 , 5 }; //всего 5
         Print ( g2(t)); //Результат:          3
}
 
A100 :

yapıcı işlevi tarafından başlatıldı - yasakla!

Bu, en son mesajları mantıklı bir şekilde özetlerseniz

Şey, sadece kişi kendini yanlış ifade etti. Tabii ki, bir başlatma işlevinden değil, bir başlatma değerinden bahsediyoruz.


Evet ve Tanrı onları yasaklarla kutsasın. Kendi başlarına bir sorun teşkil etmezler. Ancak bu yasak hiçbir şekilde derleyici tarafından kontrol edilmediğinde, bunun yerine dilin kurallarını atlayarak çalışan bir algoritma ürettiğinde, bu hiçbir şekilde çerçeveye sığmaz. Şimdi bu tür anları arayarak tüm kodları küreklemelisiniz ve genel olarak her zaman tetikte olmalısınız. Pekala, böyle programlama nedir, eski yapıda kalmayı tercih ederim.

 
Alexey Navoykov :
Tamam o zaman kusura bakmayın hemen fark etmemişim Şaşırtıcı, elbette, bunu nasıl sinsice değiştirmeyi başardılar ve kimseye hiçbir şey söylemediler. O zaman derleyicinin neden yasadışı bir işlemin gerçekleştirildiği gerçeğine hiçbir şekilde tepki vermediği açık değildir. Onlar. neyse bir bug var
Sizce neden değiştiler, neden kabul edilemez? Lütfen kendi takdirinize bağlı olarak kullanın. Bütün sorun, statik bir değişken bir fonksiyon tarafından başlatıldığında , başlatmanın "askıya alınması" ve bu fonksiyonun yürütülmesidir. Ve yukarıdaki örnekte, bu fonksiyonda henüz başlatılmamış olan statik bir değişken var. Buradan ve işlev tarafından başlatılan değişken, karşılık gelen değeri kabul etmez.
 
Alexey Navoykov :

Ve işte değişken başlatma konusunda daha fazlası. Belgelerde belirtilenleri takip ederseniz, diğer global / statik değişkenlere atıfta bulunmak da imkansızdır. Çünkü bu sabit bir ifade değil:

Ancak şimdilik işe yarıyor. Ve birçoğunun hiçbir şeyden şüphelenmeden her zaman bu tür yapıları kullandığına inanıyorum. Ancak, geliştiricilerin herhangi bir zamanda onu kesebileceği ortaya çıktı. İşlev başlatmada olduğu gibi, bu kodlar başarıyla derlenmeye devam edecek, ancak düzgün çalışmayacaktır. Genel olarak, tüm MQL bir saatli bombadır.

Pekala... bu örnekteki belgelerdeki açıklama ile HİÇBİR tutarsızlık yok... Belgelerden alıntıyı dikkatlice inceleyin

Statik bir değişken, herhangi bir ifadeyle başlatılabilen basit bir yerel değişkenin aksine , türüne karşılık gelen bir sabit veya sabit bir ifadeyle başlatılabilir.


veya sabit ifade

 int a= 1 ;
int b= a+ 1 ;

Böyle bir başlatma mümkündür. Çünkü 'a' değişkeni bir sabitle başlatılır ve 'b' değişkeni sabit bir ifadeyle başlatılır.

 
A100 :

Ardından, statik sınıf örneklerini devre dışı bırakmanız gerekir - çünkü bunlar yapıcı işlevi tarafından başlatılır

dikkat et

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Alexey Viktorov , 2017.10.18 09:19

Sizce neden değiştiler, neden kabul edilemez? Lütfen kendi takdirinize bağlı olarak kullanın. Bütün sorun, statik bir değişken bir fonksiyon tarafından başlatıldığında , başlatmanın "askıya alınması" ve bu fonksiyonun yürütülmesidir. Ve yukarıdaki örnekte, bu fonksiyonda henüz başlatılmamış statik bir değişken var . Buradan ve işlev tarafından başlatılan değişken, karşılık gelen değeri kabul etmez.
Yapıcıda statik değişkenleri bildirmek ve başlatmak caiz midir, ne yazık ki bilmiyorum, ama umarım öyle söylersiniz. Ve anladığım kadarıyla, başlatma sırası çok önemli.
Neden: