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

 
simpleton :

Yerel değişkenler ve parametreler aynı kapsamdadır, bu nedenle parametrenin böyle bir adı veya yerel bir değişkeni olup olmadığı önemli değildir, ancak her durumda bu ad, adı dış kapsamda gizler.

Hiçbirinde değil. Bir değişkeni referans olarak geçirirken, yerel bir kopya oluşturulmaz ve iş doğrudan iletilen değişkenle yapılır. Peki buradaki örtbas ne oluyor?
 
Andrei01 :
Hiçbirinde değil. Bir değişkeni referans olarak geçirirken, yerel bir kopya oluşturulmaz ve iş doğrudan iletilen değişkenle yapılır. Peki buradaki örtbas ne oluyor?

İsim gizlemenin gerçekleştiği yer burasıdır. Diğer her şey - kopya değil, kopya - ikincildir. Fonksiyon içerisinde link ismi kullanılırken linkin atıfta bulunduğu nesne ile çalışma yapılacaktır. Dış kapsamdaki bir nesneye atıfta bulunuyorsa, onunla iş yapılır. Ancak isim gizleme olmadığı için değil - tıpkı diğer durumlarda olduğu gibi gizleme mevcut - ancak referans bu nesneye işaret ettiği için. Fonksiyonu şöyle çağırdı. Bu nesne referans yoluyla iletildi ve şimdi ona işaret ediyor. Başka bir nesnenin çağrılması sırasında çağrıldığında ve iletildiğinde, aynı işlev kodu başka bir nesneyle çalışacaktır.

Gizlemenin özel olarak isimler için geçerli olduğunu / atıfta bulunduğunu ve diğer her şeyin ikincil olduğunu göstermek için bir tür adı ve bir değişken adıyla, yani doğası gereği olabildiğince farklı varlıklarla bir örnek verdim.

Ancak, MQL4++'da bu konuyla ilgili başka bir örnek oluşturmaya çalışırken, yanlışlıkla MQL4++'daki parametreler için ek bir kapsam oluşturulduğunu keşfettim. Ve yerel değişkenlerin kapsamı zaten iç içe geçmiş durumda:

 #property strict

void f( int a) {
   int saved = a;
   int a = a + 1 ;

   Print ( "saved = " , saved, ", a = " , a);
}

void OnStart () {
  f( 3 );
}

Bu örnek, belirli bir uyarıyla DERLER:

declaration of 'a' hides local declaration at line 3      3 .mq4   5        7

Ve gelecekte başarıyla yürütülür:

 23 : 52 : 22 Script 3 EURUSDm,H1: loaded successfully
23 : 52 : 22 3 EURUSDm,H1: initialized
23 : 52 : 22 3 EURUSDm,H1: saved = 3 , a = 4
23 : 52 : 22 3 EURUSDm,H1: uninit reason 0
23 : 52 : 22 Script 3 EURUSDm,H1: removed

Açıkçası, MQL4++'da parametreler için bir "katmanlı" kapsam daha yaratılmıştır. Bu nedenle, parametre adıyla aynı ada sahip yerel bir değişken bildirmek mümkündür.

C/C++'da böyle bir "katman" yoktur:

 void f( int a) {
   int saved = a;
   int a = a + 1 ;
}

Derleyici, verilen kapsamda zaten bu ada sahip bir değişken olduğunu açıklar:

$ icpc -c 1 .cpp
1 .cpp( 3 ): error: "a" has already been declared in the current scope
     int a = a + 1 ;
        ^

Yani, fonksiyon parametrelerinin kapsamı ve yerel değişkenleri aynıdır.

Neden MQL4++'da durum böyle değil, ne amaçla, elbette ilginç bir soru...

 
simpleton :

 void f( int a)

Bu örnek, belirli bir uyarıyla DERLER:

Bu durumda, yerel bir kopya oluşturma değil, bir değişkeni referans olarak geçirme ve hatalı bir uyarı durumu tartışılır.

 void f( int & a)
 

Sadece ilk birkaç mesajı okudum.

Tabii ki, her şey sorunsuz ve paspasın altında gitmiyor. Son kullanıcıya ulaşan bir ürünün test edilmesinde geliştiricilerin ihmal ettiği bazı noktalar aşağıda verilmiştir. Bununla birlikte, MT4, çoklu para birimi stratejilerinde (test) güçlü değildir, ancak iyileştirilmesi gerekmektedir. Bu yüzden hala bir gün olacağını umuyorum ..

Programlamayı kesmeyin, gerçeğe gitmeyin ve şimdilik demoyu kullanın. Kötü bir dansçı, her zaman olduğu gibi, altın ve pembe olanlar da dahil olmak üzere "yumurtalar" tarafından engellenir.

İyi şanlar!

 
Andrei01 :

Bu durumda, yerel bir kopya oluşturma değil, bir değişkeni referans olarak geçirme ve hatalı bir uyarı durumu tartışılır.

 void f( int & a)

Uyarının özü açısından bu önemsizdir. Ayrıca, değişkenin yalnızca referansla mı yoksa değerle mi iletildiği değil, aynı zamanda ne tür olduğu da önemli değildir:

 #property strict

int a; // line 3
class A { };
void f(A *&a) { } // line 5
void OnStart () { }

Kod derlenir ve tartışılan uyarı verilir:

declaration of 'a' hides global declaration at line 3    3 .mq4   5        12

Nedense anlamak istemiyorsun.

Uyarının kendisi hiç de yanlış değil. Ayrıca, MQL4++'daki hazırlıksız izleme kapsamları, diğer şeylerin nasıl yapıldığına kıyasla şaşırtıcı derecede iyi yapılır.

Uyarı, doğru olsa da, pratik değildir ve kapatılamaz - mesele bu. Ama referanstan geçmekle değil.

 
simpleton :

Uyarının özü açısından bu önemsizdir. Ayrıca, değişkenin yalnızca referansa göre mi yoksa değere göre mi iletildiği önemli değildir.

Değişkenin kendisi değişmeden kalırken, değişkenin kendisini iletmek ve onu bir fonksiyonda değiştirmek ve bir kopyasını yapmak arasında uyarının niteliğinde büyük bir fark vardır.

Eh, uyarıların kapatılamayacağı veya kendiniz için özelleştirilemeyeceği gerçeği, o zaman bu klasik MK kurumsal tarzıdır - "gitmesine izin verme" :)) Bu konuda hiçbir şey yapılamaz, ancak bu tarz olduğundan, yalnızca basit ve alçakgönüllülükle kabul edilir. dini bir nitelik kategorisine yükseltilir ... uygulamanın gösterdiği gibi, burada en azından biraz mantık ve adalet aramak işe yaramaz. ))

 

Pah pah, her şey metaquote benim için saat gibi çalışıyor

hiç şikayet yok.

 
simpleton :

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.

...

Burada insanlar tuhaf. Bu tür donquixotes, ana şeyi anlamadan bir yel değirmeni gibi derleyiciyle savaşır: derleyici sizin müttefikinizdir ! Derleyicinin kodun potansiyel olarak tehlikeli kısımlarına yemin etmesine sevinin. Uygulama başlatıldıktan hemen sonra bir hata satırıyla çöktüğünde bile sevinin. Ancak Tanrı, hiçbir hata ve uyarı olmadığında ve program dışa doğru normal çalıştığında, ancak zaman zaman nedeni hiçbir yerde izlenmeyen garip aksaklıklar ortaya çıkmaya başladığında, yönetilmeyen kod almanızı yasaklar. Böyle anlarda buhara kapılırsınız ve " geçersiz işaretçi " veya "sıfıra bölme" gibi hataların hayalini kurmaya başlarsınız.
 
C-4 :
Ancak Tanrı, hiçbir hata ve uyarı olmadığında ve program dışa doğru normal çalıştığında, ancak zaman zaman nedeni hiçbir yerde izlenmeyen garip aksaklıklar ortaya çıkmaya başladığında, yönetilmeyen kod almanızı yasaklar. Böyle anlarda buharla kaplanır ve "geçersiz işaretçi" veya "sıfıra bölme" gibi hatalar hakkında rüya görmeye başlarsınız.

Derleyicinin bununla hiçbir ilgisi yoktur, bu tipik bir çarpık yazıdır, kodda tanımsız veya hatalı durumların mümkün olduğu tehlikeli yerlerde test kontrolleri olmadığında, bu nedenle aksaklıklar ortaya çıkar.

İşlevsel kod denetimlerinin derleyiciyle hiçbir ilgisi yoktur ve başlangıçta ondan beklemenin bir anlamı yoktur.

Yine, profesyonel programcılar genellikle uyarılara bakmazlar çünkü derleyicinin mantığını zaten bilirler ve derleyiciler kodun işlevselliğini kontrol etmede işe yaramazlar.

 
Andrei01 :

Değişkenin kendisi değişmeden kalırken, değişkenin kendisini iletmek ve onu bir fonksiyonda değiştirmek ve bir kopyasını yapmak arasında uyarının niteliğinde büyük bir fark vardır.

Bu sadece başka bir uyarı türüdür. İsimleri gizleme hakkında.

Ve değişkenin kendisi iletilmez. Bunun için bir bağlantı gönderiyor.

Neden: