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

 
Koldun Zloy :

아니요. 컴파일 타임에는 아직 알려지지 않았습니다.

그렇다면 SymbolInfoTick을 수십억 번 호출 할 때 수많은 검사를 피하는 것이 어떻게 도움이 될까요?

 
fxsaber :

그렇다면 SymbolInfoTick을 수십억 번 호출 할 때 수많은 검사를 피하는 것이 어떻게 도움이 될까요?

안 돼요. 문자열 자체를 불필요하게 복사하지 않는 것이 도움이 될 뿐입니다.

 
Koldun Zloy :

안 돼요. 문자열 자체를 불필요하게 복사하지 않는 것이 도움이 될 뿐입니다.

그런 다음 Optimizer에서 더 많은 효율성을 원한다면 SymbolInfo -functions에 대한 문자열을 참조하는 솔루션이 정확하다는 것이 분명합니다.

 

내 프로젝트 중 하나의 디버거가 작동을 거부합니다. 게다가 그 행동은 예측하기 어렵다. 때로는 중단점에 도달하는 것을 거부합니다. 또한 일부 기능의 진입을 전혀 거부합니다. 처음에는 그 이유가 업데이트라고 생각했습니다(갑자기 디버깅에 문제가 발생했습니다). 그러나 다른 간단한 프로그램에서는 모든 것이 작동하는 것처럼 보입니다. 메인 프로젝트를 진행 중이기 때문에 자세히 확인하지는 못했지만. 그것은 꽤 복잡한 것으로 판명되었으며 내 디자인의 15개 모듈만 포함합니다(표준 모듈의 수는 계산하지 않았습니다). 기본 모듈에는 최대 2000줄이 포함됩니다. 프로젝트의 복잡성 때문이 아닐까 생각합니다... 또한, 반복적인 코드 조각에 매크로를 사용하는 곳도 있습니다. 또한 CAppDialog, CCheckGroup, CComboBox, CButton 등과 같은 표준 UI 요소를 사용합니다. 이 요소는 내 프로그램의 기능을 위해 다시 작성했습니다. 아마도 디버깅이 작동하지 않기 때문일 것입니다. 예를 들어, 내가 특별히 작성한 CCheckGroup::itemCheckState(const string item) 메서드에 디버깅이 입력되지 않습니다. 이 메서드는 확인란 요소를 찾고 선택되었는지 확인합니다(상태).

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState( const string item) {
   int total = m_strings.Total();
  
   if (total != m_states.Total())
     return - 1 ;
    
   int i = 0 ;
   for (; i < total; i++) {
     if (m_strings.At(i) == item)
       return m_states.At(i);
  }
  
   return - 1 ;
}

다음은 내가 만든 UI입니다.

UI

일부 UI 요소는 일시적으로 분류됩니다. 그리고 여기 CAppDialog 요소의 Show() 및 Hide() 메서드를 재정의하는 방법에 대해 이야기하는 스레드가 있습니다. https://www.mql5.com/ru/forum/338301 . 그런 다음 컴파일러는 치명적인 오류가 있다고 맹세했습니다.

결과적으로 프로젝트가 정상적으로 컴파일되고 컴파일러에서 오류가 발생하지 않는 것으로 나타났습니다. 그러나 디버깅은 버그가 있으며 일부 코드 조각, 함수, 메서드 등의 실행을 표시하지 않습니다.

내가 이해하는 한 여러 가지 이유가 있을 수 있습니다.

  1. 복잡한 프로젝트 코드, 매크로 사용
  2. CAppDialog, CCheckGroup, CComboBox, CButton과 같은 표준 UI 요소를 사용하여 코드를 복잡하게 만들기
  3. 새 빌드와 관련된 디버거 버그(가능성은 있지만 가능성은 없음)

빌드 및 시스템 정보:

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 단말기 Windows 10 빌드 14393, Intel Core i5-5200U @ 2.20GHz, 2/3Gb 메모리, 61/380Gb 디스크, IE 11, UAC, GMT+2

누가 디버거와 비슷한 문제를 겪었고 그 이유는 무엇입니까?
 
fxsaber :

그렇다면 Optimizer에서 더 많은 효율성을 원한다면 SymbolInfo 함수에 대한 문자열을 참조하는 솔루션이 정확하다는 것이 분명합니다.

예, 이 링크는 의미가 없으며 개발자가 말한 것입니다. 모든 것은 참조로 전달됩니다. 차이점은 고대 MQL4에만 있었습니다. 그리고 문자열을 읽을 때 검사가 없습니다.
 
Alexey Navoykov :
예, 이 링크는 의미가 없으며 개발자가 말한 것입니다. 모든 것은 참조로 전달됩니다. 차이점은 고대 MQL4에만 있었습니다. 그리고 문자열을 읽을 때 검사가 없습니다.

그러한 주장은 지루할 뿐입니다.

 int f1( string Str )
{
   return ((Str += Str) == Str);
}

int f2( string &Str )
{
   return ((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
   int Res = 0 ;
   string Str = NULL ;
  
   for ( int i = 0 ; i < Amount; i++)
    Res += f1(Str);
    
   Print (Res);
    
   return (Res);    
}

int Bench2( const int Amount = 1 e8 )
{
   int Res = 0 ;
   string Str = NULL ;
  
   for ( int i = 0 ; i < Amount; i++)
    Res += f2(Str);

   Print (Res);
    
   return (Res);    
}

void OnStart ()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


         100000000
        Time[Bench1()] = 727585
         100000000
        Time[Bench2()] = 657464
         100000000
        Time[Bench1()] = 794205
         100000000
        Time[Bench2()] = 670440
 
fxsaber :

그러한 주장은 지루할 뿐입니다.


아마도 다음과 같이 작성하는 것이 더 쉬울 것입니다.

 int f1( string Str )
{
   return (Str == NULL || Str == "");
}

?...

왜 이렇게 술을 마십니까?

 int f1( string Str )
{
   return ((Str += Str) == Str);
}
 
Mihail Matkovskij :

아마도 다음과 같이 작성하는 것이 더 쉬울 것입니다.

다른 사람들은 논의 중입니다.

 
fxsaber :

그러한 주장은 지루할 뿐입니다.

근거가 없는지 확인하려면 선 이 변경되지 않는 테스트에 대한 벤치마크를 가져오세요.
 
TheXpert :
근거가 없는지 확인하려면 선 이 변경되지 않는 테스트에 대한 벤치마크를 가져오세요.
 int f1( const string Str )
{
   return (Str + "1" != Str);
}

int f2( const string &Str )
{
   return (Str + "1" != Str);
}
         10000000
        Time[Bench1()] = 334596
         10000000
        Time[Bench2()] = 338559
         10000000
        Time[Bench1()] = 384711
         10000000
        Time[Bench2()] = 344346