Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 263

 
evillive :

int Mas[];


sonra döngüyü doldurun, gerekirse kullanın

ArrayResize(Mas,boyut);

ArrayInitialize(Mas,0);

"sonra döngü doldurma"
Çok zorlaştırmıyorsa, küçük bir örnek, mümkün mü?
 
Leo59 :
"sonra döngü doldurma"
Çok zorlaştırmıyorsa, küçük bir örnek, mümkün mü?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer ,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
  double min,max;
 int start(){
     for ( int i= 0 ; i< 20 ; i++)
      MACDBuffer[i]= iMA ( NULL , 0 , 12 , 0 , MODE_EMA , PRICE_CLOSE ,i)- iMA ( NULL , 0 , 26 , 0 , MODE_EMA , PRICE_CLOSE ,i);
    min= ArrayMinimum (MACDBuffer);
    max= ArrayMaximum (MACDBuffer);
     Print (min, "____" ,max);
 }

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.

 
ALXIMIKS :


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?

 
Leo59 :
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 ....)

 
ALXIMIKS :


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.
 
artmedia70 :
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ı?

 int start(){
   double buffer[];
   for ( int i= 10 ;i>= 0 ;i--){
      buffer[i]=i;
       Print ( "buffer[i]=" ,buffer[i]);
   }
}
 
ALXIMIKS :

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".

 int start(){
   double buffer[];
   for ( int i= 0 ;i< 10 ;i++){
       ArrayResize (buffer,i+ 1 );
      buffer[i]=i;
       Print ( "Размер массива = " +( string ) ArraySize (buffer)+ ", Значение в buffer[" +( string )i+ "] = " ,buffer[i]);
   }
   return ( 0 );
}
 
Leo59 :

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?

Kapatılan işlemlerin tüm sonuçları hesap geçmişinde görüntülenebilir. Programlı olarak. Ve sürekli olarak onlarla bir dizide çekiçleyin - gerekli mi? Birçoğu olabilir. Kendinizi tarihin gerekli derinliğiyle sınırlamak ve onsuz yaşayamıyorsanız diziyi doldurmak daha iyidir.
 
Beyler, android'de RSI'ye nasıl yardımcı seviye ekleneceğini bilen var mı?
 
ALXIMIKS :

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.