uzmanlar için soru #define - sayfa 4

 
Alexandr Andreev :

Normal işlevleri dağıtmak elbette bir meseledir

onlar. (int i=0; i<ArraiSize(max); i++) için

burada ArraySize(maks); açılır ve orada bu dizinin boyutu için bir adres gibi bir şey ortaya çıkar (diziye bakarsanız, boyutu değişkendedir ve burada bu değişken için "bellekteki adres" ikamesi gerçekleşir) yani. genel olarak, onu bir değişkene dönüştürmenin bir anlamı yoktur.

(int i=0; i<ArraiSize(max); i++) için

ve

için (int i=0; i<boyut; i++)

Bu durumda, ArraySize(max) ve size, dizinin boyutunu belirlemek için aynı zamanlamalara sahiptir.

yanlış ifade

test edildi: 1000 kez ölçüldü, her dizi için 3 dizi ve 3 iç içe yineleme döngüsü, 2 seçenek: 1. ve 2 .

sonuç stabildir (3 kez test edilmiştir):

2020.11.02 21:17:25.952 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=114.5013

2020.11.02 21:17:40.713 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=99.7722

Test metodolojisini tartışmanın mantığını anlamıyorum - çok uzun ve gerekli
 
Roman :

Bu döngü örneğinde, muhtemelen zamanlamalar konusunda aynı fikirde değilim.
Aksine, sonucu boyut değişkenine almak ve onu koşulda kullanmak tavsiye edilir.
ArraySize(max) için her yinelemedeki döngü, gereksiz açma işlemini gerçekleştirerek döngüyü yavaşlatacaktır.

ArraySize(max) işlevi, bir uzunluk kaydıyla diziden bir hücre çıkaran ve onu, dizinin uzunluğunun kaydedildiği hücrenin adresini döndüren genişletilir.

ve herhangi bir değişken nedir, bizim durumumuzda boyut, dizinin uzunluğunun yazıldığı hücrenin adresidir.

onlar. çıktı aynıdır ve döngü sırasında dizinin boyutunu değiştirsek bile, ilk veya ikinci durumda hücre başına adres değişmez.

Dan beri mas değerimiz her zaman statiktir (bu bir bağlantı değildir), o zaman burada başka bir mantık olamaz)))

ArraySize (max) işlevinin kendisi, burada dizinin uzunluğundan sorumlu olan max dizisinin bellek bölümünün kullanılması gerektiğini ve bunun derleme aşamasında yapıldığını söylüyor - işlev dağıtımı

 
Igor Makanu :

yanlış ifade

test edildi: 1000 kez ölçüldü, her dizi için 3 dizi ve 3 iç içe yineleme döngüsü, 2 seçenek: 1. ve 2 .

sonuç stabildir (3 kez test edilmiştir):

2020.11.02 21:17:25.952 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=114.5013

2020.11.02 21:17:40.713 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=99.7722

Test metodolojisini tartışmanın mantığını anlamıyorum - çok uzun ve gerekli

sonra montajla ilgili bazı sorunlar ....

 
Alexandr Andreev :

sonra montajla ilgili bazı sorunlar ....

Çıktının aynı olduğu açıktır.
Sadece hafızanın bu bölümüne farklı şekillerde erişilecek ve asıl mesele buydu.
Değişken zaten bir değer içerdiğinden, bir değişkene erişmek, bir işleve erişmekten daha hızlıdır.
Ve fonksiyonun yine de bu değeri alması ve geri döndürmesi gerekiyor, yani bir hafıza hücresine, ekstra bir talimata bakın.

Igor örneği, bahsettiğim şeyin sadece bir teyidi.

 
Alexandr Andreev :

sonra montajla ilgili bazı sorunlar ....

Yalan

ArraySize() çağrısı her yinelemede gerçekleşir

dizinin boyutu her seferinde kontrol edilmese bile, prosedür yine de çağrılır ve en azından dizinin boyutunun değerini depolayan değişkenin kontrolü

işte yazdığım şey hakkında bir test, bir döngüde dizinin boyutunu değiştiriyoruz, döngü beklendiği gibi kesintiye uğradı, yani. döngünün her yinelemesinde, döngü gövdesinin yürütülmesinden sonra dizinin boyutu belirlendi:

 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000 );
   int cnt = 0 ;
   for ( int i = 0 ; i < ArraySize (arr); i++)
   {
       ArrayResize (arr, sz--);
      cnt++;
   }
   printf ( "cnt = %i" , cnt);   //cnt = 50001
}
 
Igor Makanu :

Yalan

ArraySize() çağrısı her yinelemede gerçekleşir

dizinin boyutu her seferinde kontrol edilmese bile, prosedür yine de çağrılır ve en azından dizinin boyutunun değerini depolayan değişkenin kontrolü

işte yazdığım şey hakkında bir test, bir döngüde dizinin boyutunu değiştiriyoruz, döngü beklendiği gibi kesintiye uğradı, yani. döngünün her yinelemesinde, döngü gövdesinin yürütülmesinden sonra dizinin boyutu belirlendi:

Bize testimizin tam kodunu verin

Roma :

Çıktının aynı olduğu açıktır.
Sadece hafızanın bu bölümüne farklı şekillerde erişilecek ve asıl mesele buydu.

Igor örneği, bahsettiğim şeyin sadece bir teyidi.

Ve testi kendin yaptın, 11000000000000000'de böyle bir şeyim yok

Daha doğrusu, LONG_MAX tekrarlarla bile hiçbir testte böyle bir şeye sahip değilim.
 
Alexandr Andreev :

ArraySize(max) işlevi, bir uzunluk kaydıyla diziden bir hücre çıkaran ve onu, dizinin uzunluğunun kaydedildiği hücrenin adresini döndüren genişletilir.

ve herhangi bir değişken nedir, bizim durumumuzda boyut, dizinin uzunluğunun yazıldığı hücrenin adresidir.

onlar. çıktı aynıdır ve döngü sırasında dizinin boyutunu bir şekilde değiştirsek bile, hücre başına adres bundan ne birinci ne de ikinci durumda değişmez.

Dan beri mas değerimiz her zaman statiktir (bu bir bağlantı değildir), o zaman burada başka bir mantık olamaz)))

ArraySize (max) işlevinin kendisi, burada dizinin uzunluğundan sorumlu olan max dizisinin bellek bölümünün kullanılması gerektiğini ve bunun derleme aşamasında yapıldığını söylüyor - işlev dağıtımı

Bu karar aceleye getirilmiş gibi görünüyor. ArraySize işlevinin cephesinin arkasında tam olarak ne olduğu bilinmiyor, değil mi? MQL'de bu bir kara kutudur. for (int i=0; i<ArraiSize(max); i++) birden çok ifadenin yürütülmesine neden olabilir. Örneğin, bir işlev girdi parametrelerini doğrulayabilir . Kaydet - verileri yığından itin. Kayıtları kaydedin. Kayıtları geri yükle. İşlev çağrısı - arayın, ardından geri dönün. Demek istediğim, arka planda birçok şey olabilir ve biz bunu göremeyiz. Bu nedenle for (int i=0; i<size; i++) kullanmak ve beklediğimiz şeyi yapması için derleyiciye güvenmemek daha güvenlidir.

 
Alexandr Andreev :

Ve testi kendin yaptın, 11000000000000000'de böyle bir şeyim yok


Bu uzun süredir test edildi, bu yüzden döngülerde sadece değişkenleri kullanıyorum.

 
Roman :

Bu uzun süredir test edildi, bu yüzden döngülerde sadece değişkenleri kullanıyorum.

Bana kodlu bir test göster

 
Alexandr Andreev :

Bana kodlu bir test göster

Evet, ne testi? ))
Döngü koşulunun her iki çeşidini de kendiniz gösterdiniz.
Igor da yukarıdaki kodu getirdi.
Döngünün yürütülmesini size değişkeni ve döngü koşulunda ArraySize() ile ölçün.

Neden: