WHILE operatörünün garip davranışı - sayfa 2

 

Bu bence fark etmez. Ayrıca IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

Mesele, IF'nin çıkış koşulunu algılamasının ve ardından WHILE'nin bool değişkenine tepki vermesinin nedeni, aynı koşulu WHILE içine koyarsam bitmemesidir?

 
lord_hiro :

Bu bence fark etmez. Ayrıca IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

Mesele, IF'nin çıkış koşulunu algılamasının ve ardından WHILE'nin bool değişkenine tepki vermesinin nedeni, aynı koşulu WHILE içine koyarsam bitmemesidir?


bana göre bu işe yarıyor

 while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)

gibi

 while (!EndCycle)
   {
   
  ...
       if ( StringHighStatus == "True" ) EndCycle = TRUE ;
       if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
   }
 
Evet, bazen mantığı tersine çevirmek, elde etmek istediğimiz şeyi elde edebilir.
 

deVries, belki yanılıyorum ama bir IF dizisinin mantıksal VEYA'nın yaptığı gibi boole değerini DOĞRU'ya çevirdiğini düşünüyorum.

İlk koşul eşleşirse, EndCycle DOĞRU olur, ikincisi uymazsa DOĞRU kalır.

Viceversa, ilki karşılanmazsa, ikincisi karşılanırsa, DOĞRU olur.

Bu sırada WHILE çıkış koşulunu tanır.

Böylece, sırayla iki IF mantıksal bir VEYA gibi davranır ve aynısı bir IF...ELSE IF dizisi gibi davranır.

Ve bir VEYA olmalıdır, VE olamaz, aksi halde WHILE takılıp kalabilir (dizedeki koşul sonsuza kadar yanlış olabilir).

Neden WHILE, koşul tanımında aynı mantıksal OR işleminin sonucunu belirleyemezken değeri döngü içinde ayarlanmış tek bir boole değişkenini yönetiyor?

Bu EA geçmişte, 600'den önce ve ayrıca 500'den önce birçok kişi tarafından kullanılmıştır ve bu son sürümdür. Kimse şikayet etmedi.

Öyleyse sorum şu: 600'ü inşa ettikten sonra WHILE operatörüyle sorun yaşayan var mı?

 
Cevap evet.... ancak bunun yapı ile ilgisi olmayabilir ve kodlama ile çok ilgisi olabilir....LOL
 
So my question is : is there anyone experiencing troubles with the WHILE operator after build 600 ? 
Sormak yerine, olması gerektiği gibi çalışıp çalışmadığını doğrulamak için çok basit bir while mantıksal işlemi denediniz mi?
 
lord_hiro :

deVries, belki yanılıyorum ama bir IF dizisinin mantıksal VEYA'nın yaptığı gibi boole değerini DOĞRU'ya çevirdiğini düşünüyorum.

İlk koşul eşleşirse, EndCycle DOĞRU olur, ikincisi uymazsa DOĞRU kalır.

Viceversa, ilki karşılanmazsa, ikincisi karşılanırsa, DOĞRU olur.

Bu sırada WHILE çıkış koşulunu tanır.

Böylece, sırayla iki IF mantıksal bir VEYA gibi davranır ve aynısı bir IF...ELSE IF dizisi gibi davranır.

Ve bir VEYA olmalıdır, VE olamaz, aksi halde WHILE takılıp kalabilir (dizedeki koşul sonsuza kadar yanlış olabilir).

Neden WHILE, koşul tanımında aynı mantıksal OR işleminin sonucunu belirleyemezken değeri döngü içinde ayarlanmış tek bir boole değişkenini yönetiyor?

Bu EA geçmişte, 600'den önce ve ayrıca 500'den önce birçok kişi tarafından kullanılmıştır ve bu son sürümdür. Kimse şikayet etmedi.

Öyleyse sorum şu: 600'ü inşa ettikten sonra WHILE operatörüyle sorun yaşayan var mı?

sanırım bundan bahsediyorsun

 while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)

Kodunuz, tam olarak gönderdiğiniz gibi, herhangi bir derlemede beklediğiniz gibi yapılmamışsa, bu nedenle bir şeyi değiştirmiş olmalısınız.

   while (StringHighStatus== "False" || SwingHighShift<=SwingBarCount)
     {

       if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)== iHigh ( NULL , 0 ,SwingHighShift) && iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)> Close [ 0 ])
        {
         //IF THIS CONDITION IS TRUE AT, FOR EXAMPLE SwingHighShift=10
         StringHighStatus= "True" ;
         SwingHigh=SwingHighShift;
         ObjectDelete ( "SwingHigh" );
         ObjectCreate ( "SwingHigh" , OBJ_VLINE , 0 , Time [SwingHigh], 0 );
         ObjectSet ( "SwingHigh" , OBJPROP_COLOR ,Red);
         //THEN StringHighStatus="True" BUT SwingHighShift IS NOT INCREASED IN THIS BLOCK OF CODE
         //SO WHEN CONTROL IS HANDED BACK TO THE WHILE OPERATOR, SwingHighShift WILL REMAIN UNCHANGED AT 10
         //SO THIS BLOCK OF CODE WILL BE REPEATED OVER AND OVER CHECKING BAR SHIFT 10, BECAUSE THERE IS NO WAY OUT!
         //HOW TO RESOLVE? SIMPLY USE         
         break ;
        }
       else
        {
         SwingHighShift++;
        }

     }
 
deysmacro :
Sormak yerine, olması gerektiği gibi çalışıp çalışmadığını doğrulamak için çok basit bir while mantıksal işlemi denediniz mi?


Gönderim, şu anda tartıştığımız EA yığınına çok benzer olağandışı bir davranış döndürüyor gibi görünen bir WHILE örneğiyle başladı, bu yüzden önce denedim sonra sordum.

Bu çok basit hata ayıklama konusundaki yorumum yanlış olduğu için tartışma EA'nın kendisine taşındı.

 

Sabrınız için teşekkürler GumRai.

Belki yanılıyorum ve dik kafalıyım ama mantığını anlayamıyorum...

İlk IF, sizin önerdiğiniz gibi, dizeyi SwinghHighShift=10'da "true" olarak döndürürse, o döngüde sayılan artmaz; bundan sonra kontrol WHILE'a geri döner: WHILE mantıksal bir VEYA içerdiğinden ve koşullarından biri sağlandığından döngü bu noktada sona ermelidir.

Tersine, değişken yanlış kalırsa, sayaç maksimum değerine ulaşmalıdır ve yine çıkış koşuluna sahipsiniz.

Bence düşünceniz bir AND operatörü ile doğru olacaktır.

Yorumunuzu takiben WHILE içindeki OR'yi atlayabilirim; İlk IF koşulunu dizgeye koyabilirim: "doğru" olursa, mola WHILE'ı sona erdirir, aksi takdirde sayaç maksimum değerine kadar devam eder.

Kod şuna dönecek:

   while (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);
        
         break ;
        }
       else
        {
         SwingHighShift++;
        }

     }


Ancak bu hala bir geçici çözüm ve ne yazık ki, WHILE'ın OR ile neden ilgilenmediğini (bana) açıklamıyor.

 
lord_hiro :


İlk IF, sizin önerdiğiniz gibi, dizeyi SwinghHighShift=10'da "true" olarak döndürürse, o döngüde sayılan artmaz; bundan sonra kontrol WHILE'a geri döner: WHILE mantıksal bir VEYA içerdiğinden ve koşullarından biri sağlandığından döngü bu noktada sona ermelidir.

Evet, while koşullarından biri sağlanıyor, ancak bu durumda kod çıkmıyor, for'ya geçiyor ve sonsuz bir döngüde.