Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 263
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
int Mas[];
sonra döngüyü doldurun, gerekirse kullanın
ArrayResize(Mas,boyut);
ArrayInitialize(Mas,0);
Çok zorlaştırmıyorsa, küçük bir örnek, mümkün mü?
"sonra döngü doldurma"
Çok zorlaştırmıyorsa, küçük bir örnek, mümkün mü?
MACDBuffer[] dinamik dizisini doldurmak için onu statik ArrayResize() yapmanız gerektiği söylendi (aksi takdirde atamanın sonucu her zaman sıfır olur),
ve hesaplamaların yeterliliğinde istikrarı sağlamak için diziyi ArrayInitialize() ile başlatmak daha iyidir.
MACDBuffer[] dinamik dizisini doldurmak için onu statik ArrayResize() yapmanız gerektiği söylendi (aksi takdirde atamanın sonucu her zaman sıfır olur),
ve hesaplamaların yeterliliğinde istikrarı sağlamak için diziyi ArrayInitialize() ile başlatmak daha iyidir.
Teşekkür ederim!
Sonuç olarak, çalışan bir uzman var.
intCD=0; // kapatılan anlaşmanın sıra numarası
çift Bakiye=0; // kapatılan bir anlaşmanın sonucu
doubleMas[]; // kapatılan anlaşmaların sonuç değerleri dizisi
Mas[], int Start()'ta kapatılan anlaşmaların sonuçlarıyla nasıl doldurulur?
Belki init () ve deinit () içinde bir şey kaydetmeniz gerekir? Başlatma veya başka bir şey?
Kod nasıl görünmelidir?
Sonuç olarak, çalışan bir uzman var.
intCD=0; // kapatılan anlaşmanın sıra numarası
çift Bakiye=0; // kapatılan bir anlaşmanın sonucu
doubleMas[]; // kapatılan fırsatlar dizisi sonuç değerleri
Mas[], int Start()'ta kapatılan anlaşmaların sonuçlarıyla nasıl doldurulur?
Belki init () ve deinit () içinde bir şey kaydetmeniz gerekir? Başlatma veya başka bir şey?
Kod nasıl görünmelidir?
Herkesin kendi "doğru" tanımı vardır.
Belki başlatma ile init Mas[10000] ile tatmin olacaksınız ve başlangıçta, CD'nin değeri değiştiğinde, atama Mas[CD]=Balance ?
veya belki de her işlem için gerekli tüm verilerin saklanacağı iki boyutlu bir dizi istiyorsunuz (bakiye, zaman, puan, maksimum eşitlik, minimum eşitlik ....)
MACDBuffer[] dinamik dizisini doldurmak için onu statik ArrayResize() yapmanız gerektiği söylendi (aksi takdirde atamanın sonucu her zaman sıfır olur),
ve hesaplamaların yeterliliğinde istikrarı sağlamak için diziyi ArrayInitialize() ile başlatmak daha iyidir.
ArrayResize() bir diziyi yeniden boyutlandırır. mql4'te tüm diziler varsayılan olarak statiktir.
Yanlıştı. Ders kitabı şunları doğrular:
Tek boyutlu başlatılmış bir dizinin boyutu belirtilmemişse, bu, başlatma dizisinin boyutuna göre derleyici tarafından belirlenir. Bir dizi, standart ArrayInitialize() işlevi kullanılarak da başlatılabilir. Tüm diziler statiktir, yani. başlatma sırasında açıkça belirtilmemiş olsa bile, static formuna sahip olun. Bu, dizinin tüm öğelerinin, dizinin bildirildiği işlevin yürütülmesine yapılan çağrılar arasında değerlerini koruduğu anlamına gelir.
Ama neden böyle bir "statik" dizi değer atmıyor??? Derleyiciden ArrayResize (buffer,0) nedeniyle sonuçlar beklendiği gibi sıfır mı?
Yanlıştı. Ders kitabı şunları doğrular:
Ama neden böyle bir "statik" dizi değer atmıyor??? Derleyiciden ArrayResize(buffer,0) nedeniyle sonuçlar beklendiği gibi sıfır mı?
Çünkü dizi dinamiktir. Birinci boyuttaki boyutu, tek boyutlu bir dizi için ArraySize() işlevi ve çok boyutlu bir dizinin belirtilen boyutu için ArrayRange() işlevi kullanılarak görüntülenebilir.
Statik "varsayılan boyut" anlamına gelmez. "Statik" ve "dinamik" kavramlarını karşılaştırmayın. Bunlar zıt anlamlı değil. İşte bunlar farklı uygulama alanlarından. Analojiler: Statik bir dizi, bir " statik değişkendir ". Dinamik dizi, "programlı olarak ayarlanabilen ve değiştirilebilen bir boyuttur".
Teşekkür ederim!
Sonuç olarak, çalışan bir uzman var.
intCD=0; // kapatılan anlaşmanın sıra numarası
çift Bakiye=0; // kapatılan bir anlaşmanın sonucu
doubleMas[]; // kapatılan anlaşmaların sonuç değerleri dizisi
Mas[], int Start()'ta kapatılan anlaşmaların sonuçlarıyla nasıl doldurulur?
Belki init () ve deinit () içinde bir şey kaydetmeniz gerekir? Başlatma veya başka bir şey?
Kod nasıl görünmelidir?
Yanlıştı. Ders kitabı şunları doğrular:
Ama neden böyle bir "statik" dizi değer atmıyor??? Derleyiciden ArrayResize(buffer,0) nedeniyle sonuçlar beklendiği gibi sıfır mı?
Çünkü bu bir dizi değil, kesin olmak gerekirse. Daha fazla ayrıntı istiyorsanız - C dilinin açıklamalarına bakın.Geliştiriciler en başından beri açık olmayan veya eksik ifade edilen her şey hakkında - C standardına bakın - buna atıfta bulunmuyorum.
Ve eğer "parmaklarda" ise: bir değişken bildirdiğinizde double buffer[]; daha sonra bellek, C cinsinden "işaretçi" olarak adlandırılan, bir tamsayı tipine sahip olan ve dizinin daha sonra başlayacağı bellek hücresinin adresini saklayan bir değişken için tahsis edilir. MCL kullanarak arabellek değişkeninin boyutunu kontrol ederseniz, 0 değerini alırsınız. Bu, dizinin kendisine ayrılmış bellek olmadığı ve bir değer atamaya çalıştığınızda, onu yazacak hiçbir yer olmadığı anlamına gelir. : MCL'de adres aritmetiği yoktur ve işaretçilerle çalışamazsınız . C'de yazmak mümkündür, ancak "ayrılmamış" bellekle bu genellikle bir sistem çökmesine neden olur. AreaResize(array, N), (N>0) uyguladığınızda, bu sayede dizi için bellek tahsis edilir (en az bir eleman) ve değerleri yazmak için bir yer vardır. Ardından, kontrol ederken dizinin boyutu 0'dan farklı olacaktır.
C terimlerinde statik dizi kavramının birkaç anlamı vardır:
1. Statik bir dizi (aynı zamanda bir statik değişken/tür), boyutu derleme aşamasında (MKL4 için ön derleme) bilinen bu tür değişkenler/dizilerdir. Örneğin, çift buff[10000] tanımlanırken; derleyiciye değişkenin boyutu söylenir ve hemen bellek ayırabilir. Bu kavramın aksine, bir "dinamik dizi" kavramı vardır - yani, boyutu derleme aşamasında bilinmeyen ve yalnızca program yürütme aşamasında bilinen böyle bir dizi, bunların hepsi değişken dizileridir. boyut. Bu tür dizilere erişirken, önce bellek ayırmanız gerekir. Bellek, program statik belleğinin dışında tahsis edilir.
C/C++'da, bir dizi bir blokta açıklanıyorsa, görünürlüğü blokla sınırlıdır - statik dizi veya dinamik dizi. Yerel olarak tanımlanan dinamik diziler, programlardaki "bellek sızıntıları" gibi hatalarla ilişkilendirilir - bu, kapsam dışına çıkması nedeniyle bir bellek işaretçisinin yok edilmesi ve bunun için ayrılan belleğin dolu kalmasıdır.
2 Statik değiştirici ile açıklanan bir değişken olarak "statik" dizi kavramı - bu tür değişkenler bloğun kapsamından çıkarken yok edilmez - ayrı bir bellek alanında bulunurlar - bu nedenle değerler saklanır onların içinde. Bellek sızıntısı riski azalır. 1. fıkra anlamında dinamik olarak bildirilen bir dizi (yani, derleme aşamasında boyutu bilinmeyen bir dizi), 2. fıkra anlamında da statik olabilir, yani "statik" değiştiriciyle bildirilebilir.
Programlar sonlandırıldığında, bellek sızıntılarını önlemek için dinamik olarak ayrılmış bellek serbest bırakılmalıdır. MKL'nin geliştiricileri bunu takip ediyor mu bilmiyorum ama programlarında her zaman belleği boşaltırım - C'den bir alışkanlık - ArrayResize (dizi, 0);
MKL'de tüm diziler 2. madde anlamında statiktir.
Şimdi sorunuzla ilgili olarak: "Neden statik dizi çift arabelleğe []; değerler atanamıyor?". Bunun için bellek ayrılmadığından (aslında, statik değiştiricili dinamik bir dizidir). Değer atamadan önce, bellek ayırmanız gerekir - yani, bu diziye 0'dan büyük boyutlu bir ArrayResize uygulayın. Diziler için, ayrılan belleğin (dizinin dışında) çıkışını kontrol etmek gerekir.
PS, umarım anlatabilmişimdir. Mümkün olduğunca basit olmaya çalıştım.