Hatalar, hatalar, sorular - sayfa 2243

 
Vitaly Murlenko :

mql4 göstergesindeki kod çalışmayı durdurdu. nasıl düzeltilir?

Düzenleyici 'ObjectSetInteger' yazar - aşırı yüklemelerden hiçbiri işlev çağrısına uygulanamaz

Kaç yıl çalıştı ve aniden durdu. Yazık ama.


 else { // Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger ( ChartID (),Open_name, OBJPROP_ARROWCODE ,OpenArrowCode); //код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet (Open_name, OBJPROP_COLOR ,ObjColor); //цвет стрелки
}

Ama neden iki stili karıştırdın? Ok kodunu tanımlamak için ilk satırı kullanırsanız, ikinci satırı aynı tarzda kullanın:

 ObjectSetInteger ( 0 ,Open_name, OBJPROP_COLOR ,ObjColor); //цвет стрелки
 

Göstergenin yeni bir sürümünü piyasaya yüklemeye çalıştım. Testler hatalarla sona erdi. Aşağıdaki içeriğe sahip uygulamada gösterildiği gibi hata raporu:

 EURUSD,H1 üzerinde test (netleştirme)
XAUUSD,D1 (ağ) üzerinde test edin
GBPUSD,M30 (ağ) üzerinde test edin
EURUSD,M1'de test edin (netleştirme)
 2016.05.31 21:45:00 0x00007FF7FD1CA04B'de erişim ihlali 0xFFFFFFFFFFFFFF olarak okunur
 2016.05.31 21:45:00 00007FF7FD1CA010 4885D2 testi rdx, rdx
 2016.05.31 21:45:00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090
 2016.05.31 21:45:00   
 2016.05.31 21:45:00 00007FF7FD1CA015 53 itme rbx
 2016.05.31 21:45:00 00007FF7FD1CA016 4883EC20 alt rsp, 0x20
 2016.05.31 21:45:00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi
 2016.05.31 21:45:00 00007FF7FD1CA01F 488BD9 mov rbx, rcx
 2016.05.31 21:45:00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8]
 2016.05.31 21:45:00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000
 2016.05.31 21:45:00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a
 2016.05.31 21:45:00 00007FF7FD1CA02F 4883E980 alt rcx, 0x80
 2016.05.31 21:45:00 00007FF7FD1CA033 E88852CAFF 0x7ff7fce6f2c0 çağrısı ; #2504 (metatester64.exe)
 2016.05.31 21:45:00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071
 2016.05.31 21:45:00   
 2016.05.31 21:45:00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18]
 2016.05.31 21:45:00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18]
 2016.05.31 21:45:00 00007FF7FD1CA042 4885D2 testi rdx, rdx
 2016.05.31 21:45:00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f
 2016.05.31 21:45:00   
 2016.05.31 21:45:00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
Belki de sorun test cihazındadır?
Dosyalar:
 
Artyom Trishkin :

Ama neden iki stili karıştırdın? Ok kodunu tanımlamak için ilk satırı kullanırsanız, ikinci satırı aynı tarzda kullanın:

Teşekkürler, yardımcı oldu.

2 stil? Stilleri bilmiyordum. Daha önce bu bölümü ancak bu şekilde yapmak mümkündü. Değişiklikler gerçekleşti. 10 yılı aşkın bir süredir MQL4'te programlama yapıyorum. Ve şimdi geliştiriciler dili değiştirdi ve kodlarımın çoğu çalışmayı durdurdu. çok hayal kırıklığına uğradım Daha iyisi için olmayan değişiklikler oldu. Bu, şimdi bir sürü kodu yeniden yapmam gerektiği anlamına geliyor. Eski olmalarına rağmen bütün bir vagon için kullanışlıydılar.

 
Gennadiy Stanilevych :

Göstergenin yeni bir sürümünü piyasaya yüklemeye çalıştım. Testler hatalarla sona erdi. Aşağıdaki içeriğe sahip uygulamada gösterildiği gibi hata raporu:

Test cihazıyla ilgili bir sorun olabilir mi?

Lütfen servis masasına bir talep oluşturun, biz hallederiz


UPD: Başvurunuzu buldum.
 
Artyom Trishkin :

Herhangi bir dinamik dizinin arabelleğini serbest bırakır ve boş boyutun boyutunu 0 olarak ayarlar.

Komut dosyaları ve göstergeler yazarken, ArrayFree() işlevini kullanma ihtiyacı genellikle ortaya çıkmayabilir: komut dosyası sona erdiğinde, kullanılan tüm bellek hemen serbest bırakılır ve özel göstergelerde, dizilerle yapılan ana çalışma, gösterge arabelleklerine erişimdir, boyutları, yürütme terminali alt sistemi tarafından otomatik olarak kontrol edilir.

Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa , ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.

Anlıyor musun? Gereksiz.

Doğal olarak, bellek ondan serbest bırakıldığından ve ardından dizinin boyutunu ayarlayarak yeniden tahsis ettiğinizden, kimse size içeriğini garanti etmez.

Dizi başlatmayı kullanın: ArrayInitialize()

Ne demek kimse içeriği garanti etmez? Hafıza serbest bırakıldıysa, artık orada değil, o zaman içindeki çöp ne tarafta? Yoksa belleği temizlemek, programın başka bir bölümünün bu belleği kullanmasına izin vermek ve aslında onu hiç temizlememek anlamına mı geliyor?

 
Aleksey Vyazmikin :

Ne demek kimse içeriği garanti etmez? Hafıza serbest bırakıldıysa, artık orada değil, o zaman içindeki çöp ne tarafta? Yoksa belleği temizlemek, programın başka bir bölümünün bu belleği kullanmasına izin vermek ve aslında onu hiç temizlememek anlamına mı geliyor?

ArrayResize belleği temizlemez, bu nedenle önceki "tüketiciden" gelen çöpleri içerir.

Bu hız için yapılır, çünkü. bir diziye bellek ayırdıktan sonra, %99,99(9) vakada kullanıcı onu kendi verileriyle "doldurur".


 
Vitaly Murlenko :

Teşekkürler, yardımcı oldu.

2 stil? Stilleri bilmiyordum. Daha önce bu bölümü ancak bu şekilde yapmak mümkündü. Değişiklikler gerçekleşti. 10 yılı aşkın bir süredir MQL4'te programlama yapıyorum. Ve şimdi geliştiriciler dili değiştirdi ve kodlarımın çoğu çalışmayı durdurdu. çok hayal kırıklığına uğradım Daha iyisi için olmayan değişiklikler oldu. Bu, şimdi bir sürü kodu yeniden yapmam gerektiği anlamına geliyor. Eski olmalarına rağmen bütün bir vagon için kullanışlıydılar.

Ok kodu, mql4 ObjectSetXXX işlevlerinin tanıtılmasından önce bu şekilde ayarlanmadı mı?

 ObjectSet (Open_name, OBJPROP_ARROWCODE ,OpenArrowCode);

Yaklaşık 10 yıldır mql ile yazıyorum (belki daha fazla - zaman nasıl geçiyor...) - Tamamen dörtlü fonksiyonları şimdiden unutmaya başladım - Mümkünse çok platformlu kod yazıyorum.

 
Ilyas :

ArrayResize belleği temizlemez, bu nedenle önceki "tüketiciden" gelen çöpleri içerir.

Bu hız için yapılır, çünkü. bir diziye bellek ayırdıktan sonra, %99,99(9) vakada kullanıcı onu kendi verileriyle "doldurur".


O zaman neden terminali yeniden başlattıktan sonra bile "çöp" dijital değerleri sabit?

Şahsen, başka bir dizideki hücrelerin içeriğinin basit bir toplamından bıktım ve uzun bir süre sorunun ne olduğunu şaşırdım.

       for ( int i= 1 ;i<StrokTotal; i++)
        {
         for ( int s= 3 ;s< 56 + 1 ; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin :

O zaman neden terminali yeniden başlattıktan sonra bile "çöp" dijital değerleri sabit?

Şahsen, başka bir dizideki hücrelerin içeriğinin basit bir toplamından bıktım ve uzun bir süre sorunun ne olduğunu şaşırdım.

Başlatılmamış bir dizide ne tür verilerin bulunduğu önemli değil, veriler her an değişebilir, hiç kimse değerini garanti etmez.
Bu nedenle, başlatılmamış değişkenlerin kullanılması (hafıza okuma) bazen nedenin uzun süre arandığı durumlara yol açar:

  1. Bir bilgisayarda çalışır, diğerinde değil.
  2. Test cihazında değil terminalde çalışır
  3. Terminali / işletim sistemini güncelledikten sonra program farklı davranmaya başladı
  4. Eklenen Baskı çalışmayı durdurdu
  5. vb.

Ben sadece tavsiye verebilirim.
Gelecekte başlatma eksikliğiyle ilgili hataları aramak için çok zaman harcamamak için verileri her zaman başlatma alışkanlığını geliştirmek gerekir.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin :

Ne demek kimse içeriği garanti etmez? Hafıza serbest bırakıldıysa, artık orada değil , o zaman içindeki çöp ne tarafta? Yoksa belleği temizlemek, programın başka bir bölümünün bu belleği kullanmasına izin vermek ve aslında onu hiç temizlememek anlamına mı geliyor?

"hayır" ne anlama geliyor? Hiç kimse bellek çubuğunu anakarttaki yuvadan çıkarmaz. Ve bellek mevcut olduğundan ve serbest bırakıldığından (bir değerle başlatılmadığından, yani serbest bırakıldığından), programın diğer ihtiyaçları için kullanılmaya başlar.

Neden: