Hatalar, hatalar, sorular - sayfa 2116

 

İşlev bağımsız değişkenleri sağdan sola doğru değerlendirilmez

 int i = 0 ;
int _etLastError() { return i; }
int _tringGetCharacter( string, int ) { i = 5041 ; return 0 ; }
void OnStart ()
{
     string abc = "ABC" ;
     ResetLastError ();
    Print ( :: StringGetCharacter ( abc, 1024 ), ":" , GetLastError ()); //(*)слева направо
     Print (   _tringGetCharacter( abc, 1024 ),  ":" , _etLastError()); //   справа налево
}

Satır sonucu (*) : 0:5041

Her iki durumda da beklenen: 0:0

 
A100 :

İşlev bağımsız değişkenleri sağdan sola doğru değerlendirilmez

Satır sonucu (*) : 0:5041

Her iki durumda da beklenen: 0:0

Bu bir hata değil. Derleyici, argümanları hangi sırayla değerlendireceğine karar verir.

Sadece bunu hesaba katmalısın.

 
Koldun Zloy :

Bu bir hata değil. Derleyici, argümanları hangi sırayla değerlendireceğine karar verir.

Hata aşağıdaki gibidir: yakın zamana kadar, sipariş kesinlikle https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 tarafından belirlendi (tarihe ve belgelerden alıntıya dikkat edin: garantili ). Sonra sıra sessizce değiştirildi (belgelerde dahil) ve medeni bir şekilde değiştirilebilir - satır içi https://www.mql5.com/ru/forum/1111/page2042#comment_5860752 . Kullanıcı bunu nasıl bilebilir? Tahmin etmek? Veya herhangi bir aracı kullanmadan önce belgelere bakın?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Derleme hataları ve daha fazlası

#define MACRO( X )      #X
void OnStart ()
{
         Print ( MACRO( AC/DC    )); //нормально
         Print ( MACRO( AC\\DC   )); //error: '\' - illegal escape sequence
         Print ( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence
         Print ( MACRO( 'ABC'    )); //error: '' - single quote needed
         Print ( MACRO( "ABC     )); //error: '' - double quotes are needed
         Print ( MACRO( "ABC"    )); //Результат: ABC вместо "ABC"
         Print ( MACRO( '"'ABC   )); //нормально
}
 
A100 :

Hata aşağıdaki gibidir: yakın zamana kadar, sipariş kesinlikle https://www.mql5.com/ru/forum/1111/page2040#comment_5858419 tarafından belirlendi (tarihe ve belgelerden alıntıya dikkat edin: garantili ). Sonra sıra sessizce değiştirildi (belgelerde dahil) ve medeni bir şekilde değiştirilebilir - satır içi https://www.mql5.com/ru/forum/1111/page2042#comment_5860752 . Kullanıcının bunu nasıl bilmesi gerekiyor? Tahmin etmek? Veya herhangi bir aracı kullanmadan önce belgelere bakın?

Argümanların değerlendirildiği sıraya bağlı olarak kod yazmanız gerekmez.

C++'da derleyici, satır içi anahtar sözcüğü olmasa bile bir işlevi satır içi yapma hakkına sahiptir.

MQL'de satır içi anahtar kelime yoktur, derleyici uygun gördüğü şekilde yalnızca satır içi çalışır.

Sağdan sola değerlendirme sırası, bu sıradaki argümanların yığına itilmesinden kaynaklanıyor gibi görünüyor.

ancak kayıtlar aracılığıyla da aktarılabilirler.

Ve yerleşik işlevler için, hiçbir şekilde geçen bir argüman yoktur.

 
Koldun Zloy :

1. Sadece argümanların değerlendirildiği sıraya bağlı olarak kod yazmanız gerekmez.

2. C++'da derleyici, satır içi anahtar sözcüğü olmasa bile bir işlevi satır içi yapma hakkına sahiptir.

3. MQL'de satır içi anahtar sözcük yoktur, derleyici satır içi yalnızca kendi takdirine bağlı olarak çalışır.

4. Sağdan sola değerlendirme sırası, görünüşe göre, bu sıradaki argümanların yığına yerleştirilmesi gerçeğinden kaynaklanıyordu,

ama sonuçta bunlar kayıtlar aracılığıyla aktarılabilir.

5. Ve yerleşik işlevler için, bu şekilde hiçbir argüman geçmez.

1. Belgeler tarafından ters sıra garanti edildiyse ve aynı zamanda kodun daha basit ve daha anlaşılır olduğu ortaya çıktıysa neden gerekli değil. Aynı başarı ile, 5 + 2 * 3 işlemlerinin önceliğinin kullanımı reddedilebilir ve aniden değiştirilmesi durumunda parantez (5 + (2 * 3)) her yere yerleştirilmesini isteyebilir.

2. C++ derleyicisi, böyle bir durum dışında, satır içi işlevlere belirli gereksinimler getirir https://www.mql5.com/ru/forum/1111/page2136#comment_6454818

3. Bu yüzden tanıtılması önerildi

4. Kayıtlarda (yığından farklı olarak), argümanlar ters dahil olmak üzere herhangi bir sıraya yerleştirilebilir.

5. Sıra önemlidir, aktarım değil, argümanların hesaplanması. Ve birden fazla argümana sahip herhangi bir fonksiyon içindir. Ve C++ bunu satır içi bir işlev yapmadan (veya yapmadan) önce hesaba katar (2. maddeye bakın)

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.01.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100 :

1. Belgeler tarafından ters sıra garanti edildiyse ve aynı zamanda kodun daha basit ve daha anlaşılır olduğu ortaya çıktıysa neden gerekli değil. Aynı başarı ile, 5 + 2 * 3 işlemlerinin önceliğinin kullanımı reddedilebilir ve aniden değiştirilmesi durumunda parantez (5 + (2 * 3)) her yere yerleştirilmesini isteyebilir.

2. C++ derleyicisi, böyle bir durum dışında, satır içi işlevlere belirli gereksinimler getirir https://www.mql5.com/en/forum/1111/page2136#comment_6454818

3. Bu yüzden tanıtılması önerildi

4. Kayıtlarda (yığından farklı olarak), argümanlar ters dahil olmak üzere herhangi bir sıraya yerleştirilebilir.

5. Sıra önemlidir, aktarım değil, argümanların hesaplanması. Ve birden fazla argümana sahip herhangi bir işlev içindir. Ve C++ bunu satır içi bir işlev yapmadan (veya yapmadan) önce hesaba katar (2. maddeye bakın)

3. Sana ne vereceğini bilmiyorum. Derleyicinin, satır içi açıkça belirtmeden işlevleri satır içine almasını engellemek istiyor musunuz?

2. Ne demek istediğini anlamıyorum.

4. Böyle bir emrin ve iptalinin neyle bağlantılı olduğunu varsaydım. Bunun tesadüfen yapılmadığını düşünüyorum ve şimdi her zaman böyle olacak. Bunda korkunç bir şey yok.

5. yanılıyorsunuz. C++'da argümanların değerlendirildiği sıra tanımlanmamıştır.

1. Uzun yıllardır C++ ile yazıyorum ve bunu hiçbir zaman bir problem olarak görmedim.


 
Koldun Zloy :

3. Sana ne vereceğini bilmiyorum. Derleyicinin, satır içi açıkça belirtmeden işlevleri satır içine almasını engellemek istiyor musunuz?

4. Böyle bir emrin ve iptalinin neyle bağlantılı olduğunu varsaydım. Bunun tesadüfen yapılmadığını düşünüyorum ve şimdi her zaman böyle olacak. Bunda korkunç bir şey yok.

5. yanılıyorsunuz. C++'da argümanların değerlendirildiği sıra tanımlanmamıştır.

3. Derleyicinin satır içi olmayan işlevler için argümanların değerlendirme sırasını değiştirmesini yasaklamayı önerdim.

5. Değerlendirme sırası uygulama (derleyici) tarafından belirlenir ve oldukça spesifiktir (sağdan sola veya soldan sağa), ancak burada örneğin:

 void OnStart ()
{
     ResetLastError ();
     Print ( GetLastError (), ":" , StringGetCharacter ( "abc" , 1024 ), ":" , GetLastError ());
}

2-1-3 veya 2-3-1'in ne olduğu veya başka ne olduğu hiç belli değil

Sonuç: 5041:0:5041

Beklenen: 0:0:5041 soldan sağa veya

5041:0:0 sağdan sola

 
A100 :

2-1-3 veya 2-3-1'in ne olduğu veya başka ne olduğu hiç belli değil

Neden açıkça belirsiz kod yazdığını anlamıyorum?

 
fxsaber :

Neden açıkça belirsiz kod yazdığını anlamıyorum?

Sizin için benzer bir soru https://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
Neden: