오류, 버그, 질문 - 페이지 2966

 
fxsaber :

논의했다.

오류는 분명하지 않습니다. "아마도 그렇게 의도된 것일 수 있습니다"

여기서 GetLastError() = ERR_WRONG_STRING_DATE 함수를 실행한 후. 날짜가 잘못된 경우 결과가 잘못된 이유는 무엇입니까?

 
fxsaber :

나는 의심한다.

나는 너무 게으르지 않았습니다 ... 나는 세었습니다-당신은 30 줄이 있고 나는 13 줄이 있습니다

 
A100 :

나는 너무 게으르지 않았습니다 ... 나는 세었습니다-당신은 30 줄이 있고 나는 13 줄이 있습니다

가장 중요한 것은 결과가 일치하고 성능이 떨어지지 않는다는 것입니다.

 

정렬된 배열에서 값을 이진 검색하는 동안 오류가 발생했습니다.

 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);
  }

결과:

 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가 아닌 3이어야 합니다.

 
Aliaksandr Hryshyn :

정렬된 배열에서 값을 이진 검색하는 동안 오류가 발생했습니다.

결과:

2가 아닌 3이어야 합니다.

 //+------------------------------------------------------------------+
//| если добавить еще одно положительное число, то ошибки нет. где-то|
//|косяк в алгоритме бинарного поиска при переходе с минуса на плюс. |
//+------------------------------------------------------------------+
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 :

여기서 문제는 오류를 우회하는 것이 아니라 수정하는 것입니다. 특히 이 기능은 표준 소스에서도 많은 소스에서 사용할 수 있기 때문입니다. 그리고 터미널 코드 자체, 코드 편집기에서 사용된다는 점을 전혀 배제하지 않고...

 
Aliaksandr Hryshyn :

여기서 문제는 오류를 우회하는 것이 아니라 수정하는 것입니다. 특히 이 기능은 표준 소스에서도 많은 소스에서 사용할 수 있기 때문입니다. 그리고 터미널 코드 자체, 코드 편집기에서 사용된다는 점을 전혀 배제하지 않고...

아마 고칠 것입니다. 내 생각에 큰 long의 문제는 거의 모든 비트가 사용되는 상황에 있습니다. 누군가가 너무 오래 후에이 오류를 발견했다는 사실이 놀랍습니다.


 
DMITRII PECHERITSA :

아마 고칠 것입니다. 내 생각에 큰 long의 문제는 거의 모든 비트가 사용되는 상황에 있습니다. 누군가가 너무 오래 후에이 오류를 발견했다는 사실이 놀랍습니다.


이렇게 오랜 기간 동안 자주 사용하는 기능에서 이 오류가 발견되지 않았다는 것이 놀랍습니다.

 

그리고 다시 초기화되지 않은 변수에 대해. 그들의 가치는 예측할 수 없음이 분명합니다. 그러나 처음으로 나는 그들이 함수를 실행하는 동안 바로 값을 스스로 변경할 수 있다는 사실에 직면했습니다 (나는 그런 검색을 찾지 못했습니다). 다음은 스크립트 코드와 내가 얻은 것입니다.

//--- проверка поведения неинициализированных переменных
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);
  }

결과:

 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

단말기:
2021.02.19 19:30:47.003 JSC ''Otkritie Broker''용 Terminal Otkritie Broker x64 빌드 2755가 시작되었습니다.
2021.02.19 19:30:47.113 터미널 Windows 7 서비스 팩 1 빌드 7601, Intel Core i5-2520M @ 2.50GHz, 5/7 Gb 메모리, 41/287 Gb 디스크, IE 11, UAC, GMT+3

스크립트 실행을 반복하면 변수 a,b 및 x의 초기 값이 변경될 수 있지만 일반적인 동작은 일정합니다.

1. 스크립트의 첫 부분에서 코드의 변수 a와 b의 값은 변하지 않지만, PrintFormat("%I64d", 1) 실행 후 갑자기 PrintFormat("a==%I64d", a )는 1을 제공하고 b도 마찬가지입니다. 그리고 가장 흥미로운 것은 (a==1)==true이고 즉시 (a==2)==true(b도 마찬가지입니다)!!! PrintFormat("a==%I64d, b==%I64d", a, b)에 대한 마지막 호출에서 a==1을 표시하지만 b ==는 스크립트 시작 부분의 값입니다.

2. 스크립트의 두 번째 부분에서 비초기 변수의 값을 변경하려고 합니다. y=x++ 이후에는 x 값이 변경되어야 합니다. 그러나 동일하게 유지됩니다(이 실행에서 ==1).

누군가 스크립트를 실행하고 출력을 게시해 보세요.

따라서 감정가에 대한 질문 - 이것이 정상적인 행동(정의되지 않은 행동과 같은)입니까? 아니면 버그입니까?

 
mktr8591 :

그리고 다시 초기화되지 않은 변수에 대해. 그들의 가치는 예측할 수 없음이 분명합니다. 그러나 처음으로 나는 그들이 함수를 실행하는 동안 바로 값을 스스로 변경할 수 있다는 사실에 직면했습니다 (나는 그런 검색을 찾지 못했습니다). 다음은 스크립트 코드와 내가 얻은 것입니다.

결과:


단말기:
2021.02.19 19:30:47.003 JSC ''Otkritie Broker''용 Terminal Otkritie Broker x64 빌드 2755가 시작되었습니다.
2021.02.19 19:30:47.113 터미널 Windows 7 서비스 팩 1 빌드 7601, Intel Core i5-2520M @ 2.50GHz, 5/7 Gb 메모리, 41/287 Gb 디스크, IE 11, UAC, GMT+3

스크립트 실행을 반복하면 변수 a,b 및 x의 초기 값이 변경될 수 있지만 일반적인 동작은 일정합니다.

1. 스크립트의 첫 부분에서 코드의 변수 a와 b의 값은 변하지 않지만, PrintFormat("%I64d", 1) 실행 후 갑자기 PrintFormat("a==%I64d", a )는 1을 제공하고 b에 대해서도 동일합니다. 그리고 가장 흥미로운 것은 (a==1)==true이고 즉시 (a==2)==true(b도 마찬가지입니다)!!! PrintFormat("a==%I64d, b==%I64d", a, b)에 대한 마지막 호출에서 a==1을 표시하지만 b ==는 스크립트 시작 부분의 값입니다.

2. 스크립트의 두 번째 부분에서 비초기 변수의 값을 변경하려고 합니다. y=x++ 이후에는 x 값이 변경되어야 합니다. 그러나 동일하게 유지됩니다(이 실행에서 ==1).

누군가 스크립트를 실행하고 출력을 게시해 보세요.

따라서 감정가에 대한 질문 - 이것이 정상적인 행동(정의되지 않은 행동과 같은)입니까? 아니면 버그입니까?

변수를 초기화하지 않는 것은 정상적인 동작이 아닙니다. 초기화하면 그러한 질문이 없을 것입니다.