Programlamayı öğrenmeme yardım et. - sayfa 3

 
Tio Nisla :
Daha önce eklemek istedim, eğer somefunc() işlevi, bir şeyin miktarını döndürmenin yanı sıra, başka bazı manipülasyonlar gerçekleştirirse, örneğin, ticaret parametrelerini hesaplarsa, o zaman bu tür kullanım ince eserler üretir ve kodun yazarını bir şeye yönlendirebilir. stupor: "Ne??? 4 kez nasıl??? O_o F$#@!!! Orada da üç kez olmalı? Danışman neden bana yalan söylüyor?". Bu, uzmanı saçının köklerine kadar çileden çıkaran "bok kodu" dediğim şeydi. Odaklanmadım çünkü belli ki ama sen benim için yaptın. Ancak diziyi yeniden başlatmadan dinamik olarak hesaplanan bir dizinle adreslemenin bir şey olduğu gerçeğini hesaba katmadılar. Çıplak "sya"da bu genellikle GPF'ye, akıllı işaretçiler ve dizilerle "artılar"da bir istisna ve işleyicisine yol açar. Mql'de neden olduğu belli değil.

Ve "zor eserler" nelerdir? Bu din aleminden bir şey mi? Kendin mi uydurdun, kendin mi inandın?

 
Aleksandr Slavskii :

Beyler, bireyler bireylerdir, ama yine de gerçeği öğrenelim.

bu örnekte görüyorum ki   PozisyonlarToplam ()   döngünün her yinelemesinde çağrılır.

Sen, Dmitry, derleyicinin farklı çalıştığını iddia ediyorsun. Anlamıyorum. Açıklamak.

işlevi olduğunu söylemek istiyorsanız   PositionsTotal () her seferinde pozisyonları yeniden hesaplamaz, sadece açık pozisyonların sayısının kaydedildiği değişkenin değerini döndürür, o zaman evet, haklısınız, başka bir değişken bildirmenin bir anlamı yok, ama o zaman ne yapar? derleyici bununla ne ilgisi var?

Ve eğer bu fonksiyon her seferinde açık pozisyonları yeniden hesaplarsa, o zaman derleyicinin bu fonksiyonun değerinin daha sonraki hesaplamaları etkileyip etkilemediğini anlaması ve buna dayanarak bir fonksiyonu veya bir değişkeni ikame etmesi gerektiği ortaya çıkar.

Bir şey benim için çalışmıyor.

Her seferinde yeniden hesaplayın veya yeniden hesaplamayın, ancak PositionTotal()'ı çağırmak kesinlikle pahalıdır. Ve bu basit bir deneyle kolayca kanıtlanır. Ama beni paramparça edecek öldürücü bir deneyi gündeme getirmek yerine, "bulunması zor eserler" içeren fantastik argümanlar icat ediliyor. O kod örneğini bildiğiniz ilk sayfadan bulabilir ve orada nasıl göründüğünü görebilirsiniz))) Foruma eklenmeden önce özel olarak değiştirildi (yüksek alkışlar). Ve bu sadece yeni başlayanların gereksiz yere yüklenmemesi için yapıldı.

Ve derleyici - kodu optimize ettiği ve değişkene bir işlev aracılığıyla değil, doğrudan erişildiği anlamına geliyordu:

 int x;

for (;i<x;)

и

for (;i<F();)

int F(){ return (x);}

Bu, ArraySize() işlevinde çok belirgindir, bir işlevi çağırmak ile bir değişkeni kullanmak arasındaki farkı söyleyemez. Ama ne yazık ki PositionsTotsl() ile durum böyle değil.

Bu arada, yine de döngü içindeki değişken bildiriminin en altına inebilirsiniz, bu da hızı azaltır. Ne geçmedi? Bilmemek? Burada tartışılabilse de, 4 ile 5 arasında bir fark var.

 

PositionsTotal() her seferinde tam olarak açık pozisyonların sayısını mı soruyor? Ya da belki değeri bir güncelleme bayrağıyla bir sabitte optimize eder ve saklar ve değişmezse her zaman aynı sayıyı döndürür?)

Elbette bu işlevin bir tür dahili optimizasyonu vardır. Geliştiriciler bu kadar önemli ve potansiyel olarak maliyetli bir işlevi "ve öyle yapacak" konusunda aptal değiller.

Öfkeli olanlar, lütfen aynı döngünün her iki versiyonunu tamamlamak için ne kadar zaman ve kaynak gerektiğini kontrol edin.

Kaka atmaya gerek yok.


PositionsTotal()'ın kaynak kodunu tamamen akademik ilgiden görmek istiyorum.


Evet, eğer düşünürseniz, en kolay şey, bu değeri saklayacak bir global terminal değişkeni yapmak olacaktır. Ve sadece bu değeri döndür. Ve pozisyonları açarken veya kapatırken, değişkeni emniyete alırken, senkronize ederken, Allah korusun, orada yanlış bir şey kaydedilecek şekilde güncelleyin.

Bence hemen hemen böyle yapılır.

Ayrıca, muhtemelen bazı veri yapılarında saklanan konumların kendileriyle ilgili veriler de var, böylece bir kez daha sunucularla iletişim kurmadan elde edilebilirler. Genel olarak, for / call'un herhangi bir sürümünde performansla ilgili her şeyin yolunda olduğunu düşünüyorum.


Ve kod stilinin estetik olarak güzel olup olmadığına herkes kendisi karar verir)

 
Nikolay Mitrofanov :

Öfkelenen herkes, lütfen aynı döngünün her iki versiyonunu tamamlamak için ne kadar zaman ve kaynak gerektiğini kontrol edin.

Kaka atmaya gerek yok.

Umarım bu benim için değildir, çünkü Dmitry benim için şüphesiz bir otoritedir.   Tio Nisla   ayrıca görünüşe göre ilk gün kodlaması değil,


Öğreniyorum, o yüzden soruyorum.

 

PositionsTotal() ile ilgili bir zorluk var, pozisyon sayısı değiştiğinde değerini değiştirirken her zaman doğru sayıyı döndürmesi gerekiyor. Bu nedenle, bir değişkene erişmek veya ArraySize() işlevini çağırmak kadar hızlı olması pek olası değildir.

 
Aleksandr Slavskii :

...


Öğreniyorum, o yüzden soruyorum.

Öğreniyorsan, bu küçük şeylerle hiç uğraşma. Fikrinizi koda (veya belli belirsiz tanımlanmış bir süreci bir dizi eyleme) çevirme yeteneğine odaklanın. Ve sonra kod istediğiniz gibi taranabilir.

 
Dmitry Fedoseev :

Öğreniyorsan, bu küçük şeylerle hiç uğraşma. Fikrinizi koda (veya belli belirsiz tanımlanmış bir süreci bir dizi eyleme) çevirme yeteneğine odaklanın. Ve sonra kod istediğiniz gibi taranabilir.

Ve benim için o kadar iyi ki, bir kişi onu anlamaya çalışıyor ve daha derine iniyor ..

Küçük şeylere dikkat etmeden, kodlayıcı daha sonra rastgele kod yazma alışkanlığına girer. Ve sonra kodu taramak, çifte iş yapmak anlamına gelir ve genellikle sadece yazar için değil, kodla çalışacak kadar şanslı olanlar için de.

Doğru yazmayı ve hemen iyi ve ayrıntıları anlayarak yazmayı öğrenebiliyorsanız neden rastgele yazıyorsunuz?)

Tavsiyen .. peki, bu .. IMHO


Tavsiyeniz, daha sonra saçlarını tarayabilen deneyimli bir programcı (kendine güveni yüksek) için iyidir, çünkü nerede ve neyi tarayacağını bilir.

 
Nikolay Mitrofanov :

Ve benim için o kadar iyi ki, bir kişi onu anlamaya çalışıyor ve daha derine iniyor ..

Küçük şeylere dikkat etmeden, kodlayıcı daha sonra rastgele kod yazma alışkanlığına girer. Ve sonra kodu taramak, çifte iş yapmak anlamına gelir ve genellikle sadece yazar için değil, kodla çalışacak kadar şanslı olanlar için de.

Doğru yazmayı ve hemen iyi ve ayrıntıları anlayarak yazmayı öğrenebiliyorsanız neden rastgele yazıyorsunuz?)

Tavsiyeniz .. peki, bu .. IMHO


Tavsiyeniz, daha sonra saçlarını tarayabilen deneyimli bir programcı (kendine güveni yüksek) için iyidir, çünkü nerede ve neyi tarayacağını bilir.

Yeni başlayanlar için, dahası - sorunu bir şekilde çözmek daha iyidir, ancak “buraya const olmadan nasıl yazabilirsiniz, ancak burada statik olmadan, vb., vb. veya - oh ahbap” gibi forum rendeleri düzeyinde takılıp kalmamak daha iyidir. , Eğer bu soruyu soruyorsan, programlamaya hiç yaklaşmasan iyi olur."

Birisinin şuna benzer bir kodla düzeltme için bir gösterge göndermemesi benim için bir hafta sürmüyor: for(int i=0;i<Bars;i++). Ve burada hızlanma verebilecek sürtünme sorunları var ... peki, yüzde 30.

Etkili Uzman Danışmanlar bile (test sırasındaki çalışmalarının hızı açısından), sözdizimi incelikleri sorunu değil, her belirli strateji için duruma göre her seferinde yeniden doğan algoritmalarının sorunlarıdır.

 
Dmitry Fedoseev :

Yeni başlayanlar için, dahası - sorunu bir şekilde çözmek daha iyidir, ancak “buraya const olmadan nasıl yazabilirsiniz, ancak burada statik olmadan, vb., vb. veya - oh ahbap” gibi forum rendeleri düzeyinde takılıp kalmamak daha iyidir. , Eğer bu soruyu soruyorsan, programlamaya hiç yaklaşmasan iyi olur."

Birisinin şuna benzer bir kodla düzeltme için bir gösterge göndermemesi benim için bir hafta sürmüyor: for(int i=0;i<Bars;i++). Ve burada hızlanma verebilecek sürtünme sorunları var ... peki, yüzde 30.

Acemi bir programcı forumda bir şey sorarsa, cevabı bilmek istiyor demektir, ilgileniyor ve buna ihtiyacı var demektir. Hatta tavsiye almak için bir konu bile oluşturdu.

Konunun yazarını doğru anladıysam, fikrini ondan önce uygulama sorunu artık "her nasılsa, sadece çalışmak" değil, mümkün olan en iyi şekilde ve nasıl doğru yapılacağıdır. Bu iyi. Bu doğru.

Herhangi bir faaliyet için "en azından bir şekilde" korkunç bir yaklaşımdır.

Önce anla, sonra bilgiyle yap - en iyisi.

 
Nikolay Mitrofanov :

Acemi bir programcı forumda bir şey sorarsa, cevabı bilmek istiyor demektir, ilgileniyor ve buna ihtiyacı var demektir. Hatta tavsiye almak için bir konu bile oluşturdu.

Konunun yazarını doğru anladıysam, fikrini ondan önce uygulama sorunu artık "her nasılsa, sadece çalışmak için" değil, mümkün olan en iyi şekilde ve doğru şekilde hemen. Bu iyi. Bu doğru.

Herhangi bir faaliyet için "en azından bir şekilde" korkunç bir yaklaşımdır.

Önce anla, sonra bilgiyle yap - en iyisi.

Neyin bilgisi ile? Bu algoritma doğada yoksa, ancak onu kendiniz icat etmeniz gerekiyorsa ve her şeyi belirleyen odur.

Neden: