WHILE operatörünün garip davranışı

 

Hepinize merhaba!

625'teki bir WHILE sırasında takılıp kalan bir EA'm var (hiç 600 öncesi yapılarda test etmedim, ancak kod 2 yaşında).

Gerçek şu ki, WHILE başladığında, ifadeleri kontrol edemiyor gibi görünüyor: sonuç, asla ortaya çıkmamasıdır. Başlatma işlevine yerleştirilir.

Neler olup bittiğini anlamak için çok basit bir EA denedim:


 int counter= 0 , MaxCount = 10000 ; 

void start ()
  {
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }

İlk sayaç değeri genellikle 0'dan değil, 9500'ün üzerindeki rastgele bir değerden başlar.

Neden o? Herhangi bir öneri?

 

belki sayaç EA deneyinin içinde başka bir yerde başka bir değer alır:

 void start()
  {
   int counter= 0 , MaxCount = 10000 ;
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }
 
lord_hiro :

Hepinize merhaba!

625'teki bir WHILE sırasında takılıp kalan bir EA'm var (hiç 600 öncesi yapılarda test etmedim, ancak kod 2 yaşında).

Gerçek şu ki, WHILE başladığında, ifadeleri kontrol edemiyor gibi görünüyor: sonuç, asla ortaya çıkmamasıdır. Başlatma işlevine yerleştirilir.

Neler olup bittiğini anlamak için çok basit bir EA denedim:

İlk sayaç değeri genellikle 0'dan değil, 9500'ün üzerindeki rastgele bir değerden başlar.

Neden o? Herhangi bir öneri?

Sayacı global olarak ilan ettiniz, bu statik olduğu anlamına gelir.

OnStart(), counter++ içindeki kodunuz, sayaç değerini 10.000'e kadar iter

Öyleyse, statik olduğu için, bir sonraki tikte sayacınız başlangıçta 10.000'dir.

 
SDC :

Sayacı global olarak ilan ettiniz, bu statik olduğu anlamına gelir.

OnStart(), counter++ içindeki kodunuz, sayaç değerini 10.000'e kadar iter

Öyleyse, statik olduğu için, bir sonraki tikte sayacınız başlangıçta 10.000'dir.


o yazdı:

lord_hiro :

İlk sayaç değeri genellikle 0'dan değil, 9500'ün üzerindeki rastgele bir değerden başlar.

Neden o? Herhangi bir öneri?


yani bu benim cevabım


qjol :

belki sayaç EA deneyinin içinde başka bir yerde başka bir değer alır:

 void start()
  {
   int counter= 0 , MaxCount = 10000 ;
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }
 
lord_hiro :

Hepinize merhaba!

625'teki bir WHILE sırasında takılıp kalan bir EA'm var (hiç 600 öncesi yapılarda test etmedim, ancak kod 2 yaşında).

Gerçek şu ki, WHILE başladığında, ifadeleri kontrol edemiyor gibi görünüyor: sonuç, asla ortaya çıkmamasıdır. Başlatma işlevine yerleştirilir.

Neler olup bittiğini anlamak için çok basit bir EA denedim:


İlk sayaç değeri genellikle 0'dan değil, 9500'ün üzerindeki rastgele bir değerden başlar.

Neden o? Herhangi bir öneri?



Büyük olasılıkla, bunun gibi hızlı döngülere ayak uyduramayan Uzmanlar sekmesine bakıyorsunuz.

Gerçek günlük dosyasını açın.

 

Size bir şey söyleyebilirim, while döngüsü, kodda başka bir yerde o sayaç değişkenini tekrar çağırmadıkça ve değerini tekrar 10,001'den aşağı değiştirmedikçe, asla ikinci kez yürütülmez. Değişkenleri global olarak bildirirken dikkatli olmalısınız.

 
lord_hiro : İlk sayaç değeri genellikle 9500'ün üzerindeki rastgele bir değerden başlar ve 0'dan değil. Neden? Herhangi bir öneri?
600 başlatılmamış değişken oluşturmadan önce sıfıra başlatıldı. Şimdi, siz onları başlatmadığınız sürece rastgele değerler içeriyorlar.
 
Onları başlattı, o sayaç değişkeninin değerini değiştiren başka bir şey olmalı ...
 
GumRai'nin dediği gibi, günlük bu hızı kaldıramaz, gerçek verilerin çoğunu atlar ve size yalnızca bazı parçaları gösterir.
 

GumRai, haklısın: günlük, 1'den başlayarak tüm çıktıları bildirir.

Değişken bildirimini OnStart() yerine global alana koymak arasındaki fark, ilk durumda döngünün bir kez yürütülmesi, ikincisinde süresiz olarak tekrarlanmasıdır.

Ama... Sayma döngüsü iyi çalıştığı için yanlış hata ayıklama örneğini seçtiğim çok açık.

Her şey aşağıdaki EA ile başladı.

İşte kod:

 extern int SwingBarCount = 100;
 int start()



{

int SwingHighShift = 0 ;
string StringHighStatus = "False" ;
int SwingHigh = 0 ;


while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)
   {
   
   if ( iFractals ( NULL , 0 , MODE_UPPER , SwingHighShift) == iHigh ( NULL , 0 , SwingHighShift) && iFractals ( NULL , 0 , MODE_UPPER , SwingHighShift) > Close [ 0 ])
      {
      StringHighStatus = "True" ;
      SwingHigh = SwingHighShift;
       ObjectDelete ( "SwingHigh" );
       ObjectCreate ( "SwingHigh" , OBJ_VLINE , 0 , Time [SwingHigh], 0 );
       ObjectSet ( "SwingHigh" , OBJPROP_COLOR , Red);
      }
       else
      {
      SwingHighShift++;
      }

   }

}}

Diğer ilgili olmayan kodu netlik için kaldırdım ve daha önce bazı kesme noktaları koyduğum için WHILE'a kadar yürütülüyor.

WHILE koşulunun doğru olması ve IF ELSE'nin StringHighStatus true olana veya StringHighShift SwingBarCount'a ulaşana kadar döngüye girmesiyle başlamalıdır.

Bunun yerine asla bitmediğini görüyorum çünkü WHILE'den sonra çıktı döndürmeyen bir dizi YORUM ve YAZDIR komutu var.

StringHighStatus false olarak kalabilse de sayacın SwingBarCount'a ulaşması gerekir.

Çalışması için böyle değiştirmek zorunda kaldım:

 while (!EndCycle)
   {
   
   if ( iFractals ( NULL , 0 , MODE_UPPER , SwingHighShift) == iHigh ( NULL , 0 , SwingHighShift) && iFractals ( NULL , 0 , MODE_UPPER , SwingHighShift) > Close [ 0 ])
      {
      StringHighStatus = "True" ;
      SwingHigh = SwingHighShift;
       ObjectDelete ( "SwingHigh" );
       ObjectCreate ( "SwingHigh" , OBJ_VLINE , 0 , Time [SwingHigh], 0 );
       ObjectSet ( "SwingHigh" , OBJPROP_COLOR , Red);
      }
       else
      {
      SwingHighShift++;
      }
       if ( StringHighStatus == "True" ) EndCycle = TRUE ;
       if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
   }

Neden diğer koşulu değil de EndCycle'ı işlediğini anlamıyorum.

Cevaplarınız için hepinize teşekkürler!

 
if ( StringHighStatus == "True" ) EndCycle = TRUE ;
else if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
başka eklemeyi deneyin.
Neden: