Hatalar, hatalar, sorular - sayfa 417

 
joo :

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:

bu sadece için geçerli değil
 switch

ancak genel olarak, void dışındaki tüm işlevler için

bu kodu derlemeye çalışın:

 //+----------------------------------------------------------------------------+
//|                                                                  Scale.mqh |
//|                                             Copyright © 2010, JQS aka Joo. |
//|                                           http://www.mql4.com/ru/users/joo |
//|                                        https://www.mql5.com/ru/users/joo |
//——————————————————————————————————————————————————————————————————————————————
double Scale( double In, double InMIN, double InMAX, double OutMIN, double OutMAX)
{
   if (OutMIN==OutMAX)
     return (OutMIN);
   if (InMIN==InMAX)
     return ((OutMIN+OutMAX)/ 2.0 );
   else
  {
     if (In<InMIN)
       return (OutMIN);
     if (In>InMAX)
       return (OutMAX);
     //return(((In-InMIN)*(OutMAX-OutMIN)/(InMAX-InMIN))+OutMIN);
  }
}
//——————————————————————————————————————————————————————————————————————————————

derleme yapmaz.

ve şimdi yorumsuz:

 //return(((In-InMIN)*(OutMAX-OutMIN)/(InMAX-InMIN))+OutMIN);

ve bir mucize olacak! :)

[Silindi]  
Yedelkin :

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.

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

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.

Derleyici (geliştiriciler) anladığım kadarıyla reasüranslı. Sonuç olarak, değişken açıkça başlatılmazsa, türe bağlı olarak false / 0 değeri atanacaktır (ikincisi numaralandırmalar için geçerlidir).

Ancak olası seçeneklerin sınırlarını aşan bir değer parametre olarak alınırsa (Üçlü örnekte bunlar -1 - +1 aralığına ait olmayan herhangi bir değer olabilir), yürütülürken ciddi sorunlar ortaya çıkacaktır. varsayılan bir sonuç olmadan.

 
Interesting :

Varsayılan seçenek hariç tutulursa işlev ne döndürmeli?

Bence ENUM_CHART_MODE numaralandırmasındaki son değer. Şimdi kontrol edeceğim.

...M-dya, işe yaramadı. Aşağıdakileri yazdırır: ChartMode=ENUM_CHART_MODE::-1
 
Interesting :

Derleyici (geliştiriciler) anladığım kadarıyla reasüranslı. Sonuç olarak, değişken açıkça başlatılmazsa, türe bağlı olarak false / 0 değeri atanacaktır (ikincisi numaralandırmalar için geçerlidir).

Ancak parametre olarak olası seçenekler aralığının ötesine geçen bir değer varsa (Üçlü örnekte bunlar -1 - +1 aralığına ait olmayan herhangi bir değer olabilir), aşağıdaki durumlarda ciddi sorunlar ortaya çıkacaktır. varsayılan bir sonuç olmadan yürütülüyor.

Bu gerçekten bununla ilgili değil. Bir önceki paylaşımıma bakın.
[Silindi]  
joo :
Bu gerçekten bununla ilgili değil. Bir önceki paylaşımıma bakın.

Evet, derleyici en azından bir şey döndüreceğinden emin olmalıdır. Bunun makul bir reasürans olduğunu düşünüyorum (özellikle, örnekte anahtar işlerken bir temerrütün varlığı).

Başka bir şey, bir değer döndürmeniz gerekmiyorsa.

 
Yedelkin :

Bence ENUM_CHART_MODE numaralandırmasındaki son değer. Şimdi kontrol edeceğim.

...M-dya, işe yaramadı. Aşağıdakileri yazdırır: ChartMode=ENUM_CHART_MODE::-1

Tüm bu karmaşıklıkların derinliklerine inmek istiyorsanız, Bjorn Stroustrup, C++ okuyun.

Dürüst olmak gerekirse, özellikle MQL5 belgelerini okumadım bile - sadece C++ gibi yazıyorum. Geliştiriciler bu dilin standartlarını oldukça yakından takip ederler.

 

Tünaydın!

466 oluşturun.

Başlıyorum, bir bağlantı belirir ve birkaç kilobayt indirilir yüklenmez terminal kapanır. İnterneti kapatıyorum - kapanmıyor.

/logs/Crash/ dizininden bir dosya ekliyorum

Sorunun çözümü var mı?

teşekkürler

)) bağlı değil. İşte metin:

Saat : 2011.06.16 10:28 (0:00:11)

Program : İstemci Terminali

Sürüm : 500.466 (09 Haz 2011)

Revizyon: 32925

İşletim Sistemi : Windows 7 Professional Service Pack 1 (Derleme 7601)

İşlemciler : 2 x AMD Athlon 64 X2 Çift Çekirdekli İşlemci 5000+

Bellek : 911 ücretsiz 1983 Mb

Sanal : 1815 ücretsiz 2047 Mb

CrashMD5 : 2219A3BB7215B179256A7E41D40BD511

İstisna: 007B41B4'te C00000094 NA ila 00000000


Modüller : 00400000 00B96000 terminal.exe (5.0.0.466)

: 6FDC0000 00027000 wlidnsp.dll (7.250.4225.0)


007B41A0:00014 [007B41B4] #22663 (terminal.exe)

774D58FC:00C74 [774D6570] strcspn (ntdll.dll)

774D58FC:00CAA [774D65A6] strcspn (ntdll.dll)

74A5DC14:000EC [74A5DD00] func_0x74A5DC14 (dbghelp.dll)

74A5E10D:0016E [74A5E27B] SymGetLineFromAddr64 (dbghelp.dll)

74A5F73A:0085A [74A5FF94] func_0x74A5F73A (dbghelp.dll)

74A6189C:000D2 [74A6196E] func_0x74A6189C (dbghelp.dll)

74A5F73A:00A54 [74A6018E] func_0x74A5F73A (dbghelp.dll)

74A5DC14:000EC [74A5DD00] func_0x74A5DC14 (dbghelp.dll)

74A5E10D:0016E [74A5E27B] SymGetLineFromAddr64 (dbghelp.dll)

74A5F73A:0085A [74A5FF94] func_0x74A5F73A (dbghelp.dll)

74A6189C:000D2 [74A6196E] func_0x74A6189C (dbghelp.dll)

74A5F73A:00A54 [74A6018E] func_0x74A5F73A (dbghelp.dll)

774D68C7:000E0 [774D69A7] RtlLogStackBackTrace (ntdll.dll)

774D58FC:004D7 [774D5DD3] strcspn (ntdll.dll)


Kayıtlar : EAX=00000000 EIP=007B41B4 EFLGS=00010246 ES=0023

: EBX=00000000 ESP=0012E2CC EBP=0012E320 FS=003b

: ECX=00000000 ESI=04C74C48 CS=001b GS=0000

: EDX=00000000 EDI=00000007 DS=0023 SS=0023

 

Değer döndüren işlevlerde switch deyimini kullanma temasına devam etmek . Dün, "numaralandırma+anahtar" bağlaması kullanılırken varsayılan etiket kullanımının zorunlu hale geldiğine dair bir ara sonuç alındı ve onaylandı. Ama işte bu sonucun çürütüldüğü bir örnek:

 enum Triple
  {
   err=- 1 ,
   no = 0 ,
   hay= 1
  };
Triple triple_var1,triple_var2;
Triple Test( void )
  {
   switch (triple_var1)
     {
       case   err: return (err);
       case    no: return (no);
       case   hay: return (hay);
       default :
         switch (triple_var2)
           {
             case   err: return (err);
             case    no: return (no);
             case   hay: return (hay);
           }
     }
  }
void OnStart ()
  {
   Test();
  }
Burada switch ifadesi iki kez uygulanır ve tekrar uygulandığında (2. seviye) varsayılan etiket hariç tutulur. Aynı operatör, aynı derleyici - ama işe yarıyor. Derleyicinin triple_var1 ve triple_var2 değişkenlerinde herhangi bir çöp bulma olasılığını dikkate aldığı ve aynı zamanda Üçlü numaralandırmadaki değerler listesini ve sayılarını dikkate almadığı varsayımlarından devam edersek, neden derleyici, switch ifadesini kullanmanın 2. düzeyinde bir hata bildirmiyor mu? Ara sonuçlarımız/varsayımlarımız yanlış mıydı, yoksa derleyici operatörleri yalnızca "1. düzeyde" kontrol etmekle mi sınırlı? Özellikle, anahtardan (triple_var 2 ) etiket(ler)i yorumlarsanız, Test() işlevi void türünde olmasa bile yine de hiçbir hata mesajı olmayacaktır.

Switch (triple_var 1 ) deyimindeki herhangi bir büyük/küçük harf etiketinden sonra bir switch (triple_var 2 ) ifadesi ( varsayılan etiket olmadan) eklenirse benzer bir sonuç elde edilir.

 
Yedelkin :

Değer döndüren işlevlerde switch deyimini kullanma temasına devam etmek . Dün, "numaralandırma+anahtar" bağlaması kullanılırken varsayılan etiket kullanımının zorunlu hale geldiğine dair bir ara sonuç alındı ve onaylandı. Ama işte bu sonucun çürütüldüğü bir örnek:

Burada switch ifadesi iki kez uygulanır ve tekrar uygulandığında (2. seviye) varsayılan etiket hariç tutulur. Aynı operatör, aynı derleyici - ama işe yarıyor. Derleyicinin triple_var1 ve triple_var2 değişkenlerinde herhangi bir çöp bulma olasılığını dikkate aldığı ve aynı zamanda Üçlü numaralandırmadaki değerler listesini ve sayılarını dikkate almadığı varsayımlarından devam edersek, neden derleyici, switch ifadesini kullanmanın 2. düzeyinde bir hata bildirmiyor mu? Ara sonuçlarımız/varsayımlarımız yanlış mıydı, yoksa derleyici operatörleri yalnızca "1. düzeyde" kontrol etmekle mi sınırlı? Özellikle, anahtardan (triple_var2) etiketi/etiketleri yorumlarsanız, Test() işlevi void türünde olmamasına rağmen yine de hata mesajı olmayacaktır.

Bu bizim kusurumuz, bulduğun için teşekkürler, düzelteceğiz. Bir hata atılacak.
Derleme kapsamı dışında olması durumunda olası tüm değerleri kapsayacak şekilde kontrol anahtarı.
MQL5'in bir "özelliği" olarak bu ilginç, neler yapılabileceğini düşüneceğiz.
 
Hata düzeltildi.
Anahtar kontrolünün "özelliği" tartışıldı, doğru / doğru kontrolün uygulanması imkansız.
Switch ifadesinin değeri herhangi bir şey olabilir, örneğin:

 enum EV { v1, v2, };

string Test( void )
  {
   switch (EV( 3 ))
     {
       case v1: return ( "v1" );
       case v2: return ( "v2" );
     }
   return ( "oops" );
  }
  
void OnStart ()
  {
   Print (Test());
  }