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

 
Комбинатор :

어레이 참조는 참조가 아니라 MQL의 목발입니다.

그리고 []가 *와 같은 유형 수정자인 경우 고유한 const가 있어야 합니다! 링크가 아닙니다.

최소한 MQL로만 작성하는 방법을 알고 있습니다.
 
A100 :
오류가 정당화됩니다. 이 식별자는 도움말에 ReadOnly(Chart Set Integer와 결합되지 않음 ) 로 지정됩니다. https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property
이미 알아 냈지만 여전히 thx :)
 
coderex :
아마도 이것이 도움이 될까요?

아주 자세히 읽었습니다. C++는 MQL보다 이해하기 훨씬 어렵습니다. 기사에서 내가 이해한 몇 가지. 그리고 나는 그것이 여기서 논의되고 있는 것과 어떤 관련이 있는지 전혀 이해하지 못했습니다.

그래도 나는 그 기회가 좋았다

완벽한 포워딩

그것이 무엇인지 설명하기 전에 이전 표준으로 돌아가 기존 문제를 설명하겠습니다. 하나의 매개변수를 취하고 이를 bar(T& something)에 전달하는 템플릿 함수 foo가 있다고 가정합니다.

template < typename T>
void foo(T& Object)
{
    bar(Object);
}

모든 것이 잘됩니다. 그러나 함수 인수로 숫자 100을 전달하려면 어떻게 해야 할까요?

걱정하지 마세요. 다음과 같이 작성해 보겠습니다.

template < typename T>
void foo( const T& Object)
{
    bar(Object); //Ooops
}

그러나 이 경우 컴파일 오류가 발생합니다. 왜냐하면. bar는 상수가 아닌 참조를 허용합니다. 그래서 당신은 2개의 막대 기능을 제공해야 합니다 - 상수 하나와 비 상수 하나. 이제 함수에 두 개 이상의 매개변수가 있지만 2,3 또는 5가 있다고 상상해 보십시오. 우리는 (2 ^ n - 1)개의 오버로드된 함수를 가지고 있기 때문에 그러한 작업을 구현하기가 매우 어렵다는 것이 밝혀졌습니다. 여기서 n은 함수 인수의 수입니다 . 이 수의 매개변수가 나쁜 스타일이고 아무도 그렇게 쓰지 않는다고 생각한다면 std::bind, std::make_shared 등을 살펴보십시오.


이제 새로운 표준이 제공하는 솔루션을 살펴보겠습니다.

template < typename T>
void foo(T && Object)
{
    bar(std::forward < T> (Object));
}

위의 코드를 사용하면 매개변수 전달 문제가 완전히 해결됩니다. 이를 완전 전달이라고 합니다. 인수의 유형은 외부 함수 foo와 내부 함수 막대에 대한 호출 사이에 유지됩니다. 더 이상 많은 기능을 오버로드할 필요가 없습니다. 일반 코드 개발자는 만족할 수 있습니다.


이 솔루션은 템플릿 매개변수가 T&&인 경우 전달된 유형이 자체적으로 유지되고 foo 함수 내부의 명명된 유형이 lvalue로 바뀌기 때문에 std::forward가 필요하고 원래 유형이 필요하기 때문에 가능합니다. - 이것은 std가 사용되는 용도입니다. :forward 인수의 원래 유형을 유지하고 이름을 변경합니다(T&&로 밝혀짐). 그러면 나중에 정확히 bar 함수에 전달할 수 있습니다.

"(2^n - 1) 오버로드된 함수, 여기서 n은 함수 인수의 수" - MQL에서 이러한 불편을 겪었습니다.
 
2016.10 . 15 09 : 48 : 01.820 MQL5    wrong type, loading of Test9 failed
그것은 무엇입니까?
 
1455 - 기록 데이터에 대한 디버깅(CTRL+F5)이 작동하지 않습니다. 테스터 창이 나타나고 시각화가 시작되지 않습니다.
 
fxsaber :
1455 - 기록 데이터에 대한 디버깅(CTRL+F5)이 작동하지 않습니다. 테스터 창이 나타나고 시각화가 시작되지 않습니다.
사실이 아니다. 또한 기술적인 세부 사항이나 귀하의 작업에 대한 설명이 없습니다. 이것은 발견된 오류에 대해 쓰기 전에 추가 정보를 준비하고 제공해야 하는 특수 스레드입니다.
 
fxsaber :

아주 꼼꼼히 읽었습니다. C++는 MQL보다 이해하기 훨씬 어렵습니다. 기사에서 내가 이해한 몇 가지. 그리고 나는 그것이 여기서 논의되고 있는 것과 어떤 관련이 있는지 전혀 이해하지 못했습니다.

그래도 나는 그 기회가 좋았다

"(2^n - 1) 오버로드된 함수, 여기서 n은 함수 인수의 수" - MQL에서 이러한 불편을 겪었습니다.

이것은 rvalue / lvalue / prvalue / xvalue / gvalue , 즉 그것이 실제로 여러 페이지에서 이야기하고 있었던 것입니다. :) 제가 이해하는 바와 같이 MQ는 rvalue / lvalue 에서만 멈추지 않고 가장 가치 있는 것을 C++ 표준에서 따랐습니다.

나는 논리적으로 앉는 것을 이해하지만 나 자신은 아직 이러한 개념을 완전히 깨닫지 못했습니다. :)

그건 그렇고, MT5의 메모리 관리자는 프로그램이 메모리를 최대한 사용하는 경우 이해할 수 없을 정도로 작동합니다. 작은 사이즈로 측정하지 않았습니다.

예를 들어 내 가상 머신에 4기가 RAM, 2코어, MT5 v1455 x64가 있습니다.

메모리를 개체로 막고 작업 관리자에서 메모리가 터미널당 1.5GB, 가상 메모리당 1.5GB로 꽉 찬 것을 볼 수 있습니다. 동시에 MQL_MEMORY_USED 는 400MB의 사용된 메모리를 보여줍니다. 시작하기 전에는 터미널까지 약 140mb, 가상 머신까지 150mb 영역에 있었습니다.

또한 사용된 메모리가 400MB를 초과하는 즉시 개체가 실제로 삭제되더라도 메모리 관리자가 메모리를 완전히 해제하지 않을 가능성이 있음을 확인했습니다. 그리고 디버거의 동작은 여기서 예측할 수 없습니다. 개체 삭제에 도달하고 개체가 완전히 삭제될 때까지 기다렸다가 디버깅을 중지한 후(디버거에서 STOP 버튼을 눌러) 중지하고 MT5 관리자가 실행하지 않았습니다. 시스템에 메모리를 포기합니다. 터미널당 1.5GB, 가상 메모리당 1.5GB가 남아 있습니다. 그러나 ME는 디버깅이 완료된 것으로 표시되지만 MT5 자체는 디버깅을 완료하지 않았습니다. 메모리를 400MB 미만의 개체로 채우면 메모리 해제 를 제외하고는 모든 것이 잘 됩니다.

메모리는 터미널 작업이 실행 중인 작업 목록에서 제거된 후에만 해제됩니다.

 
Karputov Vladimir :
사실이 아니다. 또한 기술적인 세부 사항이나 귀하의 작업에 대한 설명이 없습니다. 이것은 발견된 오류에 대해 쓰기 전에 추가 정보를 준비하고 제공해야 하는 특수 스레드입니다.

Service Desk 개발자는 이미 내 구성을 여러 번 외웠습니다.

표준 Expert Advisors 중 하나를 선택하고 메타 편집기에서 CTRL+F5를 누릅니다. 테스터의 메인 창은 메타 편집기에서 지정한 설정으로 팝업됩니다. 시각화가 시작되지 않습니다.

로그에서

2016.10 . 15 10 : 06 : 09      Tester  Leverage 1 : 100 set error
 
fxsaber :
Service Desk 개발자는 이미 내 구성을 여러 번 외웠습니다.

당신은 내가 말한 것을 이해하지도 못했습니다.

히스토리에서 디버깅을 시작하기 전에 무엇을 했습니까? MetaEditor를 구성하셨습니까 (탭 "도구" - "설정" - "디버깅")? MetaEditora(탭 "도구" - "설정" - "디버깅")의 스크린샷을 제공하십시오. 테스터의 "로그" 탭에 무엇이 기록되어 있습니까? "저널" 탭의 Visualizer에 무엇이 기록되어 있습니까?

 
fxsaber :

Service Desk 개발자는 이미 내 구성을 여러 번 외웠습니다.

표준 Expert Advisors 중 하나를 선택하고 메타 편집기에서 CTRL+F5를 누릅니다. 테스터의 메인 창은 메타 편집기에서 지정한 설정으로 팝업됩니다. 시각화가 시작되지 않습니다.

MACD 샘플이 정상적으로 실행됩니다. 설정에 문제가 있는 것은 아닐까요?