Hatalar, hatalar, sorular - sayfa 2725

 
Vict :

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! )

Böyle bir güven nereden geliyor? Farklı bir çeviri biriminden/farklı modülden/döngülerden/tür dışı derleyiciden/... . Optimize edicinin yeteneklerini abartmayın. Bu, derleyicilerin yapması gereken bir kopyalama seçme optimizasyonu değildir. Optimize ediciler çok akıllı hale gelir ve bir şeye mal olmayı bırakırsa, bir sonraki C standardında şunu yazarlar: "varsayılan başlatma, bir nesneyi belirsiz bir durumda bırakmaz."

Çü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)

 
Alexey Navoykov :

Çü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)

referans için: C standartları (en son, bunlar C++ standartları değildir): C11, C18, C2x hazırlanmaktadır. Daha doğrusu beceriksizliğin sonucu yazmışsın.
 
Vict :

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.

 
Alexey Navoykov :

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?

 int i = 54 ;
if (read_socket() == SIGNAL) {
   fn(i);
}
i = 100 ;
...

// естественно, что никто не пишет такой бред:
int q = 3;
q = 7;
q = 9;
fq(q);

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:

 int main() {
     if ( true )
         int init_stack[ 10000 ] { 0 };
}

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.

 
Vict :

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! )

 
Alexey Navoykov :

Çü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 ...

 
const int DEFAULT_INT_VALUE   = 147 ;
input int thisIsAnInput       = DEFAULT_INT_VALUE;
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
'DEFAULT_INT_VALUE' - sabit beklenen NoConstForInput.mq5 13 33
1 hata, 0 uyarı 2 1

2361 ve 2390'ı oluşturun

 
Alain Verleyen :
'NoConstForInput.mq5' NoConstForInput.mq5 1 1
'DEFAULT_INT_VALUE' - sabit beklenen NoConstForInput.mq5 13 33
1 hata, 0 uyarı 2 1

2361 ve 2390'ı oluşturun

 #define DEFAULT_INT_VALUE 147
 
Vict :

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.

Neden: