MT5'te dizilerin zorla temizlenmesi? - sayfa 2

 
Artyom Trishkin :

Tabii ki gerekli.

Kendine ve programlarına saygı duyan herhangi bir programcı, her şeyin yoluna girmesine izin vermez. MQL4'te #property strict kullanmazsanız, o zaman dizin 20'de 10 boyutunda bir diziye başvurabilirsiniz. Ve hiçbir şey olmayacak - program çalışmaya devam edecek, ancak programcı orada NE alacak ve kullanacak - yatıyor omuzlarında. Akıllıysa, kesinlikle dizi dışında değerler almamak için her şeyi kontrol edecek ve kontrol edecektir, ancak eğer bir "gaf" ise, o zaman böyle bir kontrolle uğraşmaz ve "ana şey" işe yarıyor mu, ama nasıl - peki, nasıl - bir iş parçacığı...".
Çoğunlukla, uluyanlar - hiçbir şeyle uğraşmayan ve şimdi "kötü, kötü ve karmaşık MQL5" i suçlayanlar sadece bu tür kullanıcılardı, çünkü eskisi gibi el sanatlarıyla uğraşmalarına izin vermiyor. Ancak başlangıçta alınan verilerin kontrolleri ve kontrolü ile kodu düşünen ve yapanlar, dillerin karmaşıklığında herhangi bir fark görmediler ve şimdi kafaları karıştı - "karmaşıklık nerede - her şey aynı ..."

#özellik katı olmadan sıfıra bölmeye izin verilir ve gezegen bir kara deliğe çökmez, ancak bazen gerçekten sıfıra bölmek istersiniz, ancak izin vermezler
 
Алексей Тарабанов :

Nikolay, MQL4 için endişelenme, orada her şey yolunda. Topikstarter dizileri rastgele doldurur . Herşey.

Artyom Trishkin :

Tabii ki gerekli.

Kendine ve programlarına saygı duyan herhangi bir programcı, her şeyin yoluna girmesine izin vermez. MQL4'te #property strict kullanmazsanız, o zaman dizin 20'de 10 boyutunda bir diziye başvurabilirsiniz. Ve hiçbir şey olmayacak - program çalışmaya devam edecek, ancak programcı orada NE alacak ve kullanacak - yatıyor omuzlarında. Akıllıysa, kesinlikle dizi dışında değerler almamak için her şeyi kontrol edecek ve kontrol edecektir, ancak eğer bir "gaf" ise, o zaman böyle bir kontrolle uğraşmaz ve "ana şey" işe yarıyor mu, ama nasıl - peki, nasıl - bir iş parçacığı...".
Çoğunlukla, uluyanlar - hiçbir şeyle uğraşmayan ve şimdi "kötü, kötü ve karmaşık MQL5" i suçlayanlar sadece bu tür kullanıcılardı, çünkü eskisi gibi el sanatlarıyla uğraşmalarına izin vermiyor. Ancak başlangıçta alınan verilerin kontrolleri ve kontrolü ile kodu düşünen ve yapanlar, dillerin karmaşıklığında herhangi bir fark görmediler ve şimdi kafaları karıştı - "karmaşıklık nerede - her şey aynı ..."

Teneke!
Pekala, Piotr, MQL5'in katılığı sayesinde, kodu göreceli bir düzene sokma ve çöp yığınlarını ayırma şansı var.
Hatta sabit kodu #property strict ile MQL4'e geri derlemeyi deneyebilirsiniz ve belki de MT4'te fark edilir şekilde daha hızlı çalışacaktır.

 
Nikolai Semko :

Teneke!
Pekala, Piotr, MQL5'in katılığı sayesinde, kodu göreceli bir düzene sokma ve çöp yığınlarını ayırma şansı var.
Hatta sabit kodu #property strict ile MQL4'e geri derlemeyi deneyebilirsiniz ve belki de MT4'te fark edilir şekilde daha hızlı çalışacaktır.

Yani, a priori, kodumda çöp tıkanıklıkları olduğuna karar verdiniz.

Açıklıyorum: çekirdek birkaç ziyarette aşamalar halinde doldurulur. MT5'te bir dizi bildirirken çöp içeriyorsa (ki bilmiyordum), o zaman çekirdeği fonksiyonlarda oluşturmanın ilk aşamalarında, dizi sınırların ötesine geçer, çünkü değişkenlere işaretçiler yerine bir çekirdek hücresine atıfta bulunurum başka aracılığıyla. Sıfırsa sorun yok, ikinci çalıştırmada istenilen değeri alıyor ve çöp içeriyorsa kritik bir hata oluşuyor .

Anlıyor musun?

 
Nikolai Semko :
Peter, ne demek istediğini anlamıyorum?
...

İşte tam da bunu anlamıyorsun. Görevlerimi karşılaştırdı ve ...

 
...
Taşmalarınız varsa, kendinizde hatalar arayın.
Ve eğer çöp varsa, almadığın çöplerindir.

Herhangi bir taşkınlığım yok. Teknolojimin özelliklerini düşünün (bunu görmezden geldiğinizi unutmuşum). Bir hücreye işaretçi olarak dizinin başka bir hücresini kullanırsanız ve içinde çöp varsa, dizinin ötesine geçersiniz. Sorun şu ki, başvurduğunuz hücrenin doğru değeri alabilmesi için çekirdeği oluşturmanın ikinci aşamasına gitmeniz gerekiyor. Ve ikinci turda değer doğru olacaktır. Ancak kritik bir hatadan dolayı ikinci tura çıkamazsınız.

Bütün bunlar, bildirilen dizideki çöplerden kaynaklanmaktadır.

Bu, boyutun ilk ayarı (düzenli alanın oluşturulması) aşamasında ve çekirdeğin ikinci değişikliği aşamasında iki boyutlu bir diziyi (çekirdek) temizlemek için mekanizmalar bulmanın gerekli olduğu anlamına gelir. boyut, kullanıcı alanını oluştururken.

 
Реter Konow :

İşte tam da bunu anlamıyorsun. Görevlerimi karşılaştırdı ve ...

Ve nuka bir monolog yaratır - arka arkaya 10 mesaj daha.

 
Реter Konow :

Yani, a priori, kodumda çöp tıkanıklıkları olduğuna karar verdiniz.

Açıklıyorum: çekirdek birkaç ziyarette aşamalar halinde doldurulur. MT5'te bir dizi bildirirken çöp içeriyorsa (ki bilmiyordum), o zaman çekirdeği fonksiyonlarda oluşturmanın ilk aşamalarında, dizi sınırların ötesine geçer, çünkü değişkenlere işaretçiler yerine bir çekirdek hücresine atıfta bulunurum başka aracılığıyla. Sıfırsa sorun yok, ikinci çalıştırmada istenilen değeri alıyor ve çöp içeriyorsa kritik bir hata oluşuyor .

Anlıyor musun?

Reter hiç öyle değil. Suçlanacak olan çöp değil, mql4'te katı #özellik eksikliği. Bu gadget olmadan, dizinin ötesine geçmek yerine 0 alırsınız ve mql5'te zaten kritik bir hata vardır. Muhtemelen var olmayan bir dizi indeksinin içeriği yerine bir dizinin uzunluğunu kontrol etmek daha iyidir.

 
Alexey Viktorov :

Reter hiç öyle değil. Suçlanacak olan çöp değil, mql4'te katı #özellik eksikliği. Bu gadget olmadan, dizinin ötesine geçmek yerine 0 alırsınız ve mql5'te zaten kritik bir hata vardır. Muhtemelen var olmayan bir dizi indeksinin içeriği yerine bir dizinin uzunluğunu kontrol etmek daha iyidir.

İşaretleme hücresinde çöp olduğu için sınırların dışında oluşur.

Örneğin:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

İlk olarak:

G_CORE[Nesne][Tuval] = -123423452345; (çöp)

G_CORE[Pencere][Its_canvas] = -452345; (çöp)

//------------------------------------------------ -----------------

Sonuç, sınırların dışında bir dizidir.

Tekrarlıyorum. Çekirdeği doldurmanın ilk aşamasında, bazı hücreler MT4'te sıfır değerlere sahiptir ve ikinci turda doldurulur.

MT5'te hücrelerdeki çöp nedeniyle ilk turda kritik bir hata oluşuyor.

Dizi hücrelerinde sıfırlar olsaydı hata olmazdı ve çekirdek sırayla (olması gerektiği gibi) doldurulurdu.

 

İşte daha doğru bir örnek:

Çekirdeği inşa etmenin ilk turu. Fonksiyonlardan birinde:

 int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345 ; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0 ; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow :

İşaretleme hücresinde çöp olduğu için sınırların dışında oluşur.

Örneğin:

İlk olarak:

G_CORE[Nesne][Tuval] = -123423452345; (çöp)

G_CORE[Pencere][Its_canvas] = -452345; (çöp)

//------------------------------------------------ -----------------

Sonuç, sınırların dışında bir dizidir.

Tekrarlıyorum. Çekirdeği doldurmanın ilk aşamasında, bazı hücreler MT4'te sıfır değerlere sahiptir ve ikinci turda doldurulur.

MT5'te hücrelerdeki çöp nedeniyle ilk turda kritik bir hata oluşuyor.

Dizi hücrelerinde sıfırlar olsaydı hata olmazdı ve çekirdek sırayla (olması gerektiği gibi) doldurulurdu.

Dizi başlatma tamamen kod yazarının hatasıdır. Hataları kendinizde arayın. Algoritmanızı yeniden oluşturun.