Hatalar, hatalar, sorular - sayfa 2966

 
fxsaber :

tartışıldı.

Orada hata bariz değil, çünkü: "belki de bu şekilde tasarlanmıştı"

Burada GetLastError() = ERR_WRONG_STRING_DATE işlevini yürüttükten sonra. Tarih yanlışsa sonuç neden yanlış değil?

 
fxsaber :

Ben şüpheliyim.

Çok tembel değildim ... Saydım - 30 satırın var, 13'üm var

 
A100 :

Çok tembel değildim ... Saydım - 30 satırın var, 13'üm var

Ana şey, sonucun eşleşmesi ve performansın düşmemesidir.

 

Sıralanmış bir dizide ikili bir değer aranırken hata oluştu:

 void OnStart ()
  {
   long hash[]= {- 8017261424500504960 ,- 7417030212113027668 ,- 4495301772150012897 , 8444435679621798267 };
   long my_hash=hash[ 3 ];
   int index= ArrayBsearch (hash,my_hash);
   ArrayPrint (hash);
   Print (my_hash, ": " ,index);
  }

Sonuç:

 2021.02 . 19 15 : 46 : 22.937 test3 (EURUSD,M1)       - 8017261424500504960 - 7417030212113027668 - 4495301772150012897    8444435679621798267
2021.02 . 19 15 : 46 : 22.937 test3 (EURUSD,M1)       8444435679621798267 : 2

2 yerine 3 olmalı

 
Aliaksandr Hryshyn :

Sıralanmış bir dizide ikili bir değer ararken hata oluştu:

Sonuç:

2 yerine 3 olmalı

 //+------------------------------------------------------------------+
//| если добавить еще одно положительное число, то ошибки нет. где-то|
//|косяк в алгоритме бинарного поиска при переходе с минуса на плюс. |
//+------------------------------------------------------------------+
void OnStart ()
  {
   long hash[]= {- 8017261424500504960 ,- 7417030212113027668 ,- 4495301772150012897 , 8444435679621798267 , 8444435679621798268 };
   ArrayPrint (hash);
   for ( int i= 0 ; i< ArraySize (hash); i++)
     {
       long my_hash=hash[i];
       int index= ArrayBsearch (hash,my_hash);
       Print (my_hash, ": " ,index);
     }
  }
//+------------------------------------------------------------------+
//| >>>| -8017261424500504960 -7417030212113027668                   |
//|-4495301772150012897 8444435679621798267  8444435679621798268     |
//|   -8017261424500504960: 0                                        |
//|   -7417030212113027668: 1                                        |
//|   -4495301772150012897: 2                                        |
//|   8444435679621798267: 3                                         |
//|   8444435679621798268: 4                                         |
//+------------------------------------------------------------------+
 
DMITRII PECHERITSA :

Buradaki soru, hatayı atlamakla ilgili değil, onu düzeltmekle ilgili, özellikle de bu işlev standart olanlarda bile birçok kaynakta kullanılabileceğinden. Ve terminal kodunun kendisinde, kod düzenleyicide kullanılması hiç de dışlanmaz ...

 
Aliaksandr Hryshyn :

Buradaki soru, hatayı atlamakla ilgili değil, onu düzeltmekle ilgili, özellikle de bu işlev standart olanlarda bile birçok kaynakta kullanılabileceğinden. Ve terminal kodunun kendisinde, kod düzenleyicide kullanılması hiç de dışlanmaz ...

muhtemelen düzeltecektir. Bence büyük long'larla ilgili sorun, neredeyse tüm bitlerin işgal edildiği bir durumda. birinin bu hatayı bu kadar uzun süre sonra bulması şaşırtıcı.


 
DMITRII PECHERITSA :

muhtemelen düzeltecektir. Bence büyük long'larla ilgili sorun, neredeyse tüm bitlerin işgal edildiği bir durumda. birinin bu hatayı bu kadar uzun süre sonra bulması şaşırtıcı.


Bu kadar uzun süredir sıkça kullanılan bir fonksiyonda bu hatanın bulunmamış olması şaşırtıcı.

 

Ve yine başlatılmamış değişkenler hakkında. Değerlerinin tahmin edilemez olabileceği açıktır. Ancak ilk defa, işlevin yürütülmesi sırasında değeri kendi başlarına değiştirebilecekleri gerçeğiyle karşı karşıyayım (böyle bir arama bulamadım). İşte komut dosyası kodu ve aldığım şey:

//--- проверка поведения неинициализированных переменных
void OnStart ()
  {
   Print ( "проверка поведения неинициализированных переменных" );
   long a, b;


//тест без изменения значений переменных
   PrintFormat ( "a==%I64d, b==%I64d" , a, b);
   Print ( "a==1:" , a == 1 );
   Print ( "a==2:" , a == 2 );
   Print ( "b==1:" , b == 1 );
   Print ( "b==2:" , b == 2 );

   PrintFormat ( "%I64d" , 1 );   //после этого начинаются чудеса

   PrintFormat ( "a==%I64d" , a);
   PrintFormat ( "b==%I64d" , b);
   Print ( "a==1:" , a == 1 );
   Print ( "a==2:" , a == 2 );
   Print ( "b==1:" , b == 1 );
   Print ( "b==2:" , b == 2 );
   PrintFormat ( "a==%I64d, b==%I64d" , a, b);
   Print ( "a==1:" , a == 1 );
   Print ( "a==2:" , a == 2 );
   Print ( "b==1:" , b == 1 );
   Print ( "b==2:" , b == 2 );

//тест с изменением значения переменных
   int x, y = 0 ;
   Print ( "x=" , x, " y=" , y);
   Print ( "y = x++" );
   y = x++;
   Print ( "x=" , x, " y=" , y);
  }

sonuç:

 2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    проверка поведения неинициализированных переменных
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 0 , b==- 10289152
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 1 : false
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 2 : false
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 1 : false
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 2 : false
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)     1
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 1
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 1
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 1 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 2 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 1 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 2 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 1 , b==- 10289152
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 1 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    a== 2 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 1 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    b== 2 : true
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    x= 1 y= 0
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    y = x++
2021.02 . 19 20 : 23 : 07.446 TestBug (Eu- 3.21 ,H1)    x= 1 y= 0

terminal:
2021.02.19 19:30:47.003 "Otkritie Broker" JSC için Terminal Otkritie Broker x64 build 2755 başladı
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb bellek, 41 / 287 Gb disk, IE 11, UAC, GMT+3

Komut dosyası çalıştırmalarını tekrarlarsanız, a,b ve x değişkenlerinin başlangıç değerleri değişebilir, ancak genel davranış sabittir:

1. Komut dosyasının ilk bölümünde, koddaki a ve b değişkenlerinin değerleri değişmez, ancak PrintFormat("%I64d", 1) yürütüldükten sonra aniden PrintFormat("a==%I64d", a ) 1 verir, b için aynı. Ve en ilginç olanı (a==1)==true ve hemen (a==2)==true (b için de)!!! PrintFormat'a yapılan son çağrıda ("a==%I64d, b==%I64d", a, b) a==1 gösterir, ancak betiğin başındaki değere b == gösterir.

2. Komut dosyasının ikinci bölümünde, ilk olmayan bir değişkenin değerini değiştirmeye çalışıyorum. y=x++'dan sonra x'in değeri değişmelidir. Ama aynı kalır (bu çalışmada ==1).

Deneyin, pliz, biri betiği çalıştırın ve çıktıyı gönderin.

Bu nedenle uzmanlar için soru - bu normal davranış mı (tanımsız davranış gibi)? Yoksa bu bir bug mı?

 
mktr8591 :

Ve yine başlatılmamış değişkenler hakkında. Değerlerinin tahmin edilemez olabileceği açıktır. Ancak ilk defa, işlevin yürütülmesi sırasında değeri kendi başlarına değiştirebilecekleri gerçeğiyle karşı karşıyayım (böyle bir arama bulamadım). İşte komut dosyası kodu ve aldığım şey:

sonuç:


terminal:
2021.02.19 19:30:47.003 "Otkritie Broker" JSC için Terminal Otkritie Broker x64 build 2755 başladı
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb bellek, 41 / 287 Gb disk, IE 11, UAC, GMT+3

Komut dosyası çalıştırmalarını tekrarlarsanız, a,b ve x değişkenlerinin başlangıç değerleri değişebilir, ancak genel davranış sabittir:

1. Komut dosyasının ilk bölümünde, koddaki a ve b değişkenlerinin değerleri değişmez, ancak PrintFormat("%I64d", 1) yürütüldükten sonra aniden PrintFormat("a==%I64d", a ) 1 verir, b için aynı. Ve en ilginç olanı (a==1)==true ve hemen (a==2)==true (b için de)!!! PrintFormat'a yapılan son çağrıda ("a==%I64d, b==%I64d", a, b) a==1 gösterir, ancak betiğin başındaki değere b == gösterir.

2. Komut dosyasının ikinci bölümünde, ilk olmayan bir değişkenin değerini değiştirmeye çalışıyorum. y=x++'dan sonra x'in değeri değişmelidir. Ama aynı kalır (bu çalışmada ==1).

Deneyin, pliz, biri betiği çalıştırsın ve çıktıyı gönderin.

Bu nedenle uzmanlar için soru - bu normal davranış mı (tanımsız davranış gibi)? Yoksa bu bir bug mı?

Değişkenlerinizi başlatmamak normal davranış değildir. Başlatın ve böyle bir soru olmayacak.