Hatalar, hatalar, sorular - sayfa 416

 
Yedelkin :

Öyleyse, değişken bool türündeyse default : return ( false ) belirtmenin amacı nedir? Başka bir deyişle, varsayılan etiket hiçbir zaman yürütülmemelidir.

Not 1. Ayrıca, yaklaşımınızı izlerseniz, isteğe bağlı olan varsayılan etiket zorunlu hale gelir.

2. Her iki sürümdeki break deyimleri gereksizdir.

switch ifadesi , bool_var'ınızı bir tamsayı türüne dönüştürür.

Ve derleyicinin bu değişkenin iki değeri olduğunu bilmesi gerekmez. Algoritmanın mantıksal bir analizini yapmaz.

 
Interesting :

Bir şeyi daha unutuyorsunuz - herhangi bir değişken yanlış bir değere sahip olabilir veya başlatılmamış olabilir ("çöp" değerine sahip) ...

Unutmam. Bu nedenle, örneğimde değişken başlatıldı. Buna rağmen derleyici hata verdi.

bool bool_var=- 1 olan örnek son derece yanlıştır. Kendin için gör:

 bool bool_var=- 1 ;
void OnStart ()
  {
   Print ( "bool_var=" ,bool_var);
  }   
 
Dima_S :

switch ifadesi , bool_var'ınızı bir tamsayı türüne dönüştürür.

Ve derleyicinin bu değişkenin iki değeri olduğunu bilmesi gerekmez. Algoritmanın mantıksal bir analizini yapmaz.

Bu arada, booleanlarda, başlatılmamış bir değişkenin veya örneğin -1 değerine sahip bir değişkenin doğru / yanlış olarak değiştirileceği bazı iyi seçenekler var.

Bir değişkeni açıkça int olarak bildirirseniz, elbette bu olmaz.

Yedelkin :

Unutmam. Bu nedenle, örneğimde değişken başlatıldı. Buna rağmen derleyici hata verdi.

bool bool_var=- 1 olan örnek son derece yanlıştır. Kendin için gör:

Zaten ikna oldum, ben de kaldırdım. Ancak bu, tabiri caizse rastgele şanstır (bunu dilin bir özelliği olarak düşünün).

Ancak switch bloğunda olası bir hatayı işlerken, derleyici girdi olarak neyin ve nasıl beslendiğini bulmak zorunda değildir, bu yüzden derleyici bunu bir uyarı değil bir hata olarak kabul eder.

 
Dima_S :

Ve derleyicinin bu değişkenin iki değeri olduğunu bilmesi gerekmez. Algoritmanın mantıksal bir analizini yapmaz.

Yani derleyicinin numaralandırmadaki değerler listesini ve toplam sayısını dikkate almadığını mı söylemek istiyorsunuz?

 
Interesting :

Ancak switch bloğunda olası bir hatayı işlerken, derleyici girdi olarak neyin ve nasıl beslendiğini bulmak zorunda değildir, bu yüzden derleyici bunu bir uyarı değil bir hata olarak kabul eder.

Ara sonuç şudur: "numaralandırma+anahtar" bağlamasıyla, varsayılan etiketin kullanımı zorunlu hale gelir?
 
Yedelkin :

1. bool zaten bir "tamsayı türüdür". Veya anahtarda daha eski bir tamsayı türüne bir döküm olduğunu söylemek istersiniz.

2. Yani derleyicinin numaralandırmadaki değerlerin listesini ve toplam sayısını dikkate almadığını mı söylemek istiyorsunuz?

1. bool, bir baytlık bir tam sayı türüdür. Oyuncular int'e gidiyor, haklısın.

2. Burada da her şey doğru yazılmış. Yalnızca durum bir numaralandırma değil, yalnızca koşullu dallanma için bir etikettir.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Dima_S :

1. bool, bir baytlık bir tam sayı türüdür. Oyuncular int'e gidiyor, haklısın.

El Kitabına göre bool, tamsayılardan farklı özel bir türdür... Bu nedenle yanlış ifademi kaldırdım. Her ne kadar tartışmayacağım - özel değil.

Dima_S :

Yedelkin :

Yani derleyicinin numaralandırmadaki değerler listesini ve toplam sayısını dikkate almadığını mı söylemek istiyorsunuz?

2. Burada da her şey doğru yazılmış. Yalnızca durum bir numaralandırma değil, yalnızca koşullu dallanma için bir etikettir.

Vaka etiketlerini değil, numaralandırmaları kastettim (bool türünü en küçüğü olarak kabul ederek). İşte aynı derleme hatasına sahip bir örnek:

 enum Triple
  {
   err=- 1 ,
   no = 0 ,
   hay= 1
  };
Triple triple_var=err;
Triple Test( void )
  {
   switch (triple_var)
     {
       case   err: return (err);
       case    no: return (no);
       case   hay: return (hay);
       //default:return(hay);
     }
  }
void OnStart ()
  {
   Test();
  }

Bu nedenle soruyu bu örnekle ilgili olarak tekrar edeceğim: Derleyicinin Üçlü numaralandırmadaki değerler listesini ve bunların toplam sayısını dikkate almadığını mı söylüyorsunuz? Switch deyiminde kullanılan numaralandırmadaki tüm değerlere sahibim.

 
Yedelkin :
Ara sonuç şudur: "numaralandırma+anahtar" bağlamasıyla, varsayılan etiketin kullanımı zorunlu hale gelir?

Bu seçeneği hayal edin (bu arada, 3 değeri, değerin açık bir beyanıyla çalışmayacak, ancak -1 kolayca çalışacaktır). Ancak değişkenin açık bir şekilde başlatılmasının olmaması, değerin 0 indeksine sahip olana eşit olduğunu gösterecektir (burada her şey düşünülmüştür).

Varsayılan seçeneği hariç tutarsak işlev ne döndürmeli?

 ENUM_CHART_MODE ChartMode = - 1 ;

string Test()
  {
   switch (ChartMode)
     {
       case 0 : return ( "Bars" ); break ;
       case 1 : return ( "CANDLES" ); break ;
       case 2 : return ( "LINE" ); break ;      
       default : return ( "Unknown" );
     }
  }
void OnStart ()
{
Comment (Test());
}
 
Yedelkin :
Ara sonuç şudur: "numaralandırma+anahtar" bağlamasıyla, varsayılan etiketin kullanımı zorunlu hale gelir?

evet, karşılığında bir şey döndürmeniz gerekiyorsa ().

veya en azından derleyicinin işlevin bir şey döndüreceğinden emin olması için:

 bool bool_var= false ;
bool Test( void )
  {
   switch (bool_var)
     {
       case    true : return ( true );
       case false : return ( false );
     }
     return ( false ); //хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart ()
  {
   Test();
  }
 
Bilim için hepinize teşekkürler! İsteksizce ek satırlar eklemek zorunda kalacağım :)