Hatalar, hatalar, sorular - sayfa 2046

 
Alexey Viktorov :

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.

Buradaki 'b' sabit bir ifadeyle başlatılmaz. Bu nedenle, bu belgelerde açıklanan kurallara aykırıdır.

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.

Evet, başlatma işlemi askıya alınabilir. Tüm işlemler, dilin sözdizimi tarafından tanımlanan katı bir sırayla gerçekleştirilir. Önce fonksiyon yürütülür, ardından bu fonksiyonun dönüş değeri değişkenimizin yapıcısına iletilir - buna başlatma denir. Ve bu durumda, başlatma işlemi derleyici tarafından yüzsüzce göz ardı edilir ve kod hiçbir şey olmamış gibi daha fazla derlenir. Kabul edilemez. Şunun gibi bir dizi ilan etmişsiniz gibi aynıdır: int a[]= { f(), g(), h() }; ve derlenir, ancak elbette hiçbir şey başlatılmaz.

 
A100 :

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

Gerçekten. MT4'te kontrol edildi, herhangi bir senaryoda gerçekten hatalar. Ve oradaki insanlar yeni yapılarda bir şeyi nasıl kodluyor?
 
Alexey Navoykov :

Buradaki 'b' sabit bir ifadeyle başlatılmaz. Bu nedenle, bu belgelerde açıklanan kurallara aykırıdır.

Evet, başlatma işlemi askıya alınabilir. Tüm işlemler, dilin sözdizimi tarafından tanımlanan katı bir sırayla gerçekleştirilir. Önce fonksiyon yürütülür, ardından bu fonksiyonun dönüş değeri değişkenimizin yapıcısına iletilir - buna başlatma denir. Ve bu durumda, başlatma işlemi derleyici tarafından yüzsüzce göz ardı edilir ve kod hiçbir şey olmamış gibi daha fazla derlenir. Kabul edilemez. Şunun gibi bir dizi ilan etmişsiniz gibi aynıdır: int a[]= { f(), g(), h() }; ve derlenir, ancak elbette hiçbir şey başlatılmaz.

Sabit bir ifade değilse, NEDİR???

Alexey, bu kodu kendin alırsan ve hata ayıklayıcıdaki başlatma sırasına bakarsan daha kolay olacak. Yine de, bu örnekte hemen fark etmedim

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

Hatalar, hatalar, sorular

Alexey Navoykov , 2017.10.17 20:31

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.


global düzeydeki değişkenlerden bahsediyoruz, herhangi bir işlevin içinde bulunan statik değişkenlerden değil.

Anlaşılır bir şekilde anlatacak kadar bilgim yok, sizin de yeterince dikkatiniz yok. tırnak içinde "askıya alındı" !!!

Statik ve sıradan değişkenlerin, özellikle yerel değişkenlerin başlatılmasını bir yığına dökmek gerekli değildir.

 
Alexey Viktorov :

Sabit bir ifade değilse, NEDİR???

sabit olmayan ifade

Yine de, bu örnekte herhangi bir işlevin içinde bulunan statik değişkenlerden değil, küresel düzeydeki değişkenlerden bahsettiğimizi hemen fark etmedim .

Erişilebilir bir şekilde anlatacak kadar bilgim yok, sizin de yeterince dikkatiniz yok ...

Hiçbir şeyi karıştırmıyor musun?

Ayrıca, global ve statik değişkenler kesinlikle aynı şekilde davranır. İşte belgelerden :

Global bir değişken, yalnızca türüne karşılık gelen bir sabitle veya sabit bir ifadeyle başlatılabilir.

Benim için statik değişkenlerle aynı keşif olduğunu itiraf ediyorum. Tüm bunların belgelerde ne zaman ortaya çıktığını bilmiyorum ya da belki daha önceydi, sadece kimse dikkat etmedi çünkü. aslında her şey C++'da olduğu gibi çalışıyordu, yani soru sorulmadı.

 
Alexey Navoykov :

sabit olmayan ifade

Hiçbir şeyi karıştırmıyor musun?

Ayrıca, global ve statik değişkenler tamamen aynı şekilde davranır . İşte belgelerden:

Benim için statik değişkenlerle aynı keşif olduğunu itiraf ediyorum. Tüm bunların belgelerde ne zaman ortaya çıktığını bilmiyorum ya da belki daha önceydi, sadece kimse dikkat etmedi çünkü. aslında her şey C++'da olduğu gibi çalışıyordu, yani soru yoktu.

Bana öyle geliyor ki kesinlikle yanılıyorsunuz. Bazıları programda tanımlanan tüm fonksiyonlardan ve diğerleri sadece bildirildikleri fonksiyonda mevcutsa, değişkenlerin kimliği hakkında nasıl konuşabiliriz.

Ancak statik değişkenler ile yerel değişkenler arasındaki fark, statik değişkenlerin global olanlardan hemen sonra başlatılması ve sıradan yerel olanların (statik değil) program yürütülürken ve ardından kod yürütme onlara ulaştığında başlatılmasıdır.

 
Alexey Viktorov :

Bana öyle geliyor ki kesinlikle yanılıyorsunuz. Bazıları programda tanımlanan tüm fonksiyonlardan ve diğerleri sadece bildirildikleri fonksiyonda mevcutsa, değişkenlerin kimliği hakkında nasıl konuşabiliriz.

Genel olarak değil, tartışmanın özel bağlamı ( değişken başlatma ) ile ilgiliydi.

 
Tam teşekküllü bir sohbet yoluyla mesaj gönderdikten sonra, gönderilen mesaj mevcut sayfadaki sohbet geçmişine otomatik olarak eklenmez.
Gönderilen mesaj yalnızca sayfa yeniden yüklendikten sonra görünür.

Bir vskidku'da, bir mesaj gönderirken sunucudan gelen yanıt yeterli gelir, belki de olay işleyicilerinde js kodlarında bir şey yüzer.
 
Alexey Navoykov :

Genel olarak değil, tartışmanın özel bağlamı ( değişken başlatma ) ile ilgiliydi.

Hatırladığım kadarıyla, bir STATIC değişkeni başlatmakla ilgiliydi.

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

Hatalar, hatalar, sorular

Alexey Navoykov , 2017.10.17 17:16

Statik değişkenlerin başlatılmasıyla ilgili hata. Eski yapılarda yoktu.

 class A
{
 public :
   static int f()
  { 
     static int a= 1 ;
     Print (a);       // Получаем a=0 !!
     return a;  
  }   
};


int a= A::f();


void OnStart ()
  {
   
  }

Kimse için zor değil, bunu servis masasına gönderin. Artık orada onlarla ilişki kurmak istemiyorum.


Yoksa bu senin mesajın değil mi?

Değişken başlatma sırasını anlayın. Bu örnek, önce bir genel düzey değişkenini başlatır

 int a= A::f();

aynı adı taşıyan değişkenin henüz başlatılmamış olduğu bir işlevi çağıran

 static int a= 1 ;

ve derleyici uyarılarına dikkat etmezseniz ne konuşabilirsiniz ki...


 
Alexey Navoykov :

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

Mesaj için teşekkürler.
Gerçekten de, bu bir derleyici iyileştirici hatasıdır, düzeltilmiştir.
Düzeltme sonraki yapıya dahil edilecektir.
 
Alexey Viktorov :

Hatırladığım kadarıyla, bir STATIC değişkeni başlatmakla ilgiliydi.

Yoksa bu senin mesajın değil mi?

Ne istediğini anlamıyorum. Dedim ki, bu bir "değişkenlerin başlatılması" meselesiydi. Ve bu bağlamda, statik ve global değişkenler aynı şekilde davranır. Hatta size belgelere bir bağlantı verdim: değişken başlatma

Statik ve global değişkenlerin her yerde birleştirildiğini unutmayın.

Ve başlatma sırasını mahkum etmiyoruz, çünkü bu, incelenen sorunla ilgili değil. Sorunun derleyicinin olması gereken yere bir hata atmaması olduğunu hatırlatmama izin verin. Statik bir değişken henüz başlatılmamışsa, erişilemez.

ve derleyici uyarılarına dikkat etmezseniz ne konuşabilirsiniz ki...

Peki, kafanızı çok karıştırıyorsa, global değişkenin adını değiştirin. Sonucu hiçbir şekilde etkilemeyecektir.