Hatalar, hatalar, sorular - sayfa 2725
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Keskinliğinizin açık bir alanda göründüğünü düşünüyor musunuz? Kökü C'de olan struct, fazladan şeker içermeyen aptal bir kaptır.
Evet, insanlar maymunlardan evrimleşmiştir. Ancak bu, bir kişinin "fazladan şekersiz" aptal bir maymun olduğu anlamına gelmez, değil mi? ) Aslında MQL yapılarının = C# yapıları olduğunu, küçük bir farkla zaten açıkladım: C#'da hala arayüzleri uygulayabilirler. Arayüzler, Carl! )
Çünkü bu en banal ve ilkel olan, ki buna optimizasyon demek bile zor. Hata Ayıklama modunda bile tüm derleyicilerin bunu varsayılan olarak yaptığını düşünüyorum. O zaman daha kolay ne olabilir? Kodu ayrıştırırken değişkenlere erişimi izleyin. Tekrarlanan bir yazma işlemi varsa ve okuma işlemi yapılmadıysa, önceki kaydı kesin.
Bunu görmezden gelebilirsiniz, ancak düzgün kodlayıcıların, işlevle doldurulmuş yapılarınızı gördüklerinde size bir bok kodlayıcı gibi bakacağına şaşırmayın.
Yaklaşımınızı govnokoding başlatmadan çalışma ile aramayı tercih ederim. Bir bilgisayar programının ana kalitesi nedir? istikrar. Aynı girdi verileriyle aynı sonuçları vermelidir. Ve giymeyi teklif ediyorsun. Bir yerde bir değişken başlatmayı unuttum, bir yerde program boyunca başlatılmayan yapıya yeni bir alan ekledim ve gidiyoruz. Program şöyle çalışıyor...
C dili, donanımın yeteneklerinin son derece zayıf olduğu eski zamanlarda oluşturuldu, bu nedenle optimizasyon çalışmalarının önemli bir kısmı programcıya kaydırıldı. Ve şimdi bu mazoşizm artık geçerli değil. Eğer çok kaşınıyorsanız, neden örneğin montajcıya değil de C'ye atıfta bulunuyorsunuz? Ticaret sistemlerini doğrudan montajcıda kodlayın. En hızlı olacaklarından eminim, hatta belki de pazarın önünde)
Çünkü bu en banal ve ilkel olan, ki buna optimizasyon demek bile zor. Hata Ayıklama modunda bile tüm derleyicilerin bunu varsayılan olarak yaptığını düşünüyorum. O zaman daha kolay ne olabilir? Kodu ayrıştırırken, değişkenlere erişimi izleyin. Tekrarlanan bir yazma işlemi varsa ve okuma işlemi yapılmadıysa, önceki kaydı kesin.
Program derleme zamanında tamamen öngörülebilir olsaydı, çalışma zamanında yürütülmesine hiç gerek kalmazdı. Tanım olarak, dış dünyadan bir şeyler alıp buna dayalı bir sonuç üretmelidir ve bu, optimize ediciye müdahale eden belirsizliktir. Ayrıca, çalışma zamanında yürütülebilir dosyayla bağlantılı paylaşılan bir gizli kitaplık açıklayacağım, optimize edici orada hiçbir şeyi izleyemez. Hala bir milyon her türlü davayı atabilirsin. Milyon Carl!
Bir yerde bir değişken başlatmayı unuttum, bir yerde program boyunca başlatılmayan yapıya yeni bir alan ekledim ve gidiyoruz. Program şöyle çalışıyor...
Bir yerde 3 yerine 2 ile çarpılır, fn_() yerine fn() olarak adlandırılır, ... . Eller çarpıksa, o zaman sorun.
C dili, donanımın yeteneklerinin son derece zayıf olduğu eski zamanlarda oluşturuldu, bu nedenle optimizasyon çalışmalarının önemli bir kısmı programcıya kaydırıldı. Ve şimdi bu mazoşizm artık alakalı değil. Eğer çok kaşınıyorsanız, neden örneğin montajcıya değil de C'ye atıfta bulunuyorsunuz? Ticaret sistemlerini doğrudan montajcıda kodlayın. En hızlı olacaklarından eminim, hatta belki de pazarın önünde)
Program derleme zamanında tamamen öngörülebilir olsaydı, çalışma zamanında yürütülmesine hiç gerek kalmazdı. Tanım olarak, dış dünyadan bir şeyler alıp buna dayalı bir sonuç üretmelidir ve bu, optimize ediciye müdahale eden belirsizliktir. Ayrıca, çalışma zamanında yürütülebilir dosyayla bağlantılı paylaşılan bir gizli kitaplık açıklayacağım, optimize edici orada hiçbir şeyi izleyemez. Hala bir milyon her türlü davayı atabilirsin. Milyon Carl!
Dış dünya ile veri alışverişi zaten özel bir durum. Ve özel çözümlere ihtiyaçları var. Ve bu şekilde programlamadan ve derleyicinin değişkenin dışarıdan kontrol edilmediğini bilmesinin garanti edildiği durumlardan bahsediyoruz. Ve bu vakaların büyük çoğunluğu olmalıdır. Aksi takdirde, C'de gerçekten daha iyi ve hatta daha iyi - montajcıda yapılan tamamen sistem programlaması ile sonuçlanırsınız.
Bir yerde 3 yerine 2 ile çarpılır, fn_() yerine fn() olarak adlandırılır, ... . Eller çarpıksa, o zaman sorun.
3 yerine 2 ile çarparsanız, programda teşhis edilmesi ve bulunması kolay olan kararlı bir hata alırsınız. Ve başlatılmamış bir değişkenle, zaman zaman öngörülemeyen sonuçlarla çalışan ya da çalışmayan şeytanla karşılaşacaksınız. Genel olarak, kendinizi deneyimli bir programcı olarak konumlandırarak size bu tür temel bilgileri açıklamam oldukça garip.
Dış dünya ile veri alışverişi zaten özel bir durum. Ve özel çözümlere ihtiyaçları var. Ve bu şekilde programlamadan ve derleyicinin değişkenin dışarıdan kontrol edilmediğini bilmesinin garanti edildiği durumlardan bahsediyoruz. Ve bu vakaların büyük çoğunluğu olmalıdır. Aksi takdirde, C'de gerçekten daha iyi ve hatta daha iyi - montajcıda yapılan tamamen sistem programlaması ile sonuçlanırsınız.
Dış dünya ile değişim, herhangi bir programın ayrılmaz bir parçasıdır. Tekrar ediyorum - aksi takdirde derleme zamanında hesaplanabilir. Örneğin, derleyici burada başlatmayı kesecek mi?
Açıkçası, orada read_socket() öğesinin ne döneceği hakkında hiçbir fikri yok. Tüm program, dış dünyayla etkileşime "geçirilir". + burada harici modüllere bir çağrı ekleyin, ... .
3 yerine 2 ile çarparsanız, programda teşhis edilmesi ve bulunması kolay olan kararlı bir hata alırsınız. Ve başlatılmamış bir değişkenle, zaman zaman öngörülemeyen sonuçlarla çalışan ya da çalışmayan şeytanla karşılaşacaksınız. Genel olarak, kendinizi deneyimli bir programcı olarak konumlandırarak size bu tür temel bilgileri açıklamam oldukça garip.
Bakın, kararlı bir hata almak istiyorsanız yığını başlatmak çok basittir:
Kalçadan hafızayı başlatmak da önemsiz bir meseledir. Bir tür temsil tuzağına düşersek, genellikle bir çekirdek dökümü alırız.
Bir kez daha tekrar ediyorum, eğer optimize ediciler çok akıllıysa, varsayılan init değeri init ile eşitlenir ve derleyici gerekirse bazı C11'de başlatma talimatlarını ekler, ama ne yazık ki. Kimse seni zorlamıyor, sen istemiyorsan her yerde yap T val{}; Temel şeyleri açıklamaktan bıktım.
Bir kez daha tekrar ediyorum, eğer optimize ediciler çok akıllıysa, varsayılan init değeri init ile eşitlenir ve derleyici gerekirse bazı C11'de başlatma talimatlarını ekler, ama ne yazık ki. Kimse seni zorlamıyor, sen istemiyorsan her yerde yap T val{}; Temel şeyleri açıklamaktan bıktım.
Çünkü C++ standardı, anladığım kadarıyla, kuralları bağlam olmadan çok resmi bir şekilde açıklıyor. Onlar. Başlatma ya her zaman yapılır ya da hiç yapılmaz. Karşılaştırma için, C#'da başlatma olmadan bir değişken bildirebilirsiniz, ancak kodun devamında, bunun başlatılması gerekir. Onlar. derleyici sonraki kodu analiz eder ve sadece mevcut komutu değil, bu dilin kurallarına gömülüdür. Ancak C++'da standart tarafından herhangi bir analiz sağlanmaz. Esneklik yoktur. Bu nedenle, zorunlu başlatma reçete edilirse, kızmaya başlayacaksınız, diyorlar ki, nasıl oluyor, ben kendim her şeyi kontrol etmek ve başlatmak istiyorum! )
Çünkü C++ standardı, anladığım kadarıyla, kuralları bağlam olmadan çok resmi bir şekilde açıklıyor. Onlar. Başlatma ya her zaman yapılır ya da hiç yapılmaz. Karşılaştırma için, C#'da başlatma olmadan bir değişken bildirebilirsiniz, ancak kodun devamında, bunun başlatılması gerekir. Onlar. derleyici sonraki kodu analiz eder ve sadece mevcut komutu değil, bu dilin kurallarına gömülüdür. Ancak C++'da standart tarafından herhangi bir analiz sağlanmaz. Esneklik yoktur. Bu nedenle, zorunlu başlatma reçete edilirse, kızmaya başlayacaksınız, diyorlar ki, nasıl oluyor, ben kendim her şeyi kontrol etmek ve başlatmak istiyorum! )
Sadece alıştırma çözümleri oraya ulaşır ve bir güdük güvertesinde çalışırsa, genellikle fazladan bir yük verir, o zaman kimse onu açmaz. Örneğin, standartta derleyicinin c++17'de kopyalama seçmesi yapması için YÜKÜMLÜLÜK'ü yazdılar.
Konunun adı "Hatalar, Hatalar, Sorular".
Lütfen kendinize MQL ve C#, C++ ve sözdizimi, derleyiciler ve zihinsel egzersizlerle ilgili diğer şeyleri tartışacağınız bir konu oluşturun.
Konuyu tıkarsınız ve kullanıcılardan gelen diğer sorular ve mesajlar tartışmanızda boğulur.
Bana nerede soru soracaklarını soruyorlar - buraya gönderiyorum ve bana cevap veriyorlar: orada adamlar yüz sayfa tartışıyorlar - karışmayacağım, gerisi anlamsız ...
'DEFAULT_INT_VALUE' - sabit beklenen NoConstForInput.mq5 13 33
1 hata, 0 uyarı 2 1
2361 ve 2390'ı oluşturun
'DEFAULT_INT_VALUE' - sabit beklenen NoConstForInput.mq5 13 33
1 hata, 0 uyarı 2 1
2361 ve 2390'ı oluşturun
Bakın, kararlı bir hata almak istiyorsanız yığını başlatmak çok basittir:
Kalçadan hafızayı başlatmak da önemsiz bir meseledir. Bir çeşit temsil tuzağına düşersek, genellikle bir çekirdek dökümü alırız.
Son yorum, moderatörler kızmasın))).
Burada açıklığa kavuşturmak gerekiyor - yığında neden çağrıdan çağrıya farklı değerler var? Her şey https://ru.wikipedia.org/wiki/ASLR'yi korumakla ilgili ve daha önce söylediğim gibi hiçbir şeyi başlatmanıza bile gerek yok. Benim durumumda, yazılımı her başladığında aynı adreslere yerleştirecek olan gdb (hata ayıklayıcı) altında çalıştırıyorum, yani. yığın "rastgele" dönüş adresleriyle kirlenmeyecektir.