mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 113

 
pavlick_ :

내 솔루션이 더 나쁜 이유를 이해할 수 없습니다. 여기에 삽입하겠습니다.

처음에는 '어떻게 하면 되나'라는 퍼포먼스였다는 사실과 사전에 생각한 정확한 솔루션이 필요했다. 그리고 당신은 생산에 적합하지 않았습니다.

그러나 감독조차도 문서에 따르면 매개 변수가 계산되는 순서가 보장되지 않는다는 점을 고려하지 않았습니다.

 
A100 :

그러나 감독조차도 문서에 따르면 매개 변수가 계산되는 순서가 보장되지 않는다는 점을 고려하지 않았습니다.

공정하게 말하면 MQL 문서 는 여전히 이 순간을 설명하고 있습니다.

메모

매개변수는 함수에 역방향으로 전달된다는 점을 기억해야 합니다. 즉, 가장 최근의 매개변수가 먼저 계산 되어 전달된 다음 끝에서 두 번째 매개변수가 전달되는 식입니다. 여는 괄호 다음에 가장 먼저 오는 매개변수가 평가 되고 차례로 마지막에 전달됩니다.

그리고 이 순서를 사용하는 예도 있습니다. C ++의 관점에서 이것은 물론 야생이지만 이것이 MQL의 문서화 된 규칙이라면 앞으로 코드를 이식 할 계획이 없다면 정상 일 수 있습니다. 그리고 계획하고 있다면 #ifdef __MQL__을 확인하여 이 장소를 보호할 수 있습니다.

 
A100 :

매개변수가 평가되는 순서는 보장되지 않습니다 .

이제 막 링크를 발견했습니다. 사실, 보장은 없습니다. 여기에 이 모순된 MQL이 있습니다))

 
Alexey Navoykov :

이제 막 링크를 발견했습니다. 사실, 보장은 없습니다. 여기에 이 모순된 MQL이 있습니다))

x32에서는 스택과 직접 연결되어 있기 때문에 반대가 사실입니다(남아 있을 것이라고 생각합니다). 그리고 x64에서는 그 반대의 요점이 없으므로 미래에 대한 보장이 없습니다 ... 게다가 부자연스러워 보입니다.

최적화가 있는 순서와 없는 순서가 달라도 놀라지 않아요

 

모든 제안에 감사드립니다. 실용적인 문제를 해결하는 데 건설적으로 도움이 되었습니다.


이 작업은 void TimeCurrent() 가 호출되었다면 아무 일도 일어나지 않았을 것임을 잘 보여주었습니다. 현재 형태의 void는 많은 것을 손상시킬 수 있습니다.

 

부모 메서드를 호출하고 싶습니다

여기 코드가 있습니다. 내가 무엇을 잘못하고 있습니까 ???

//+------------------------------------------------------------------+
class A
  {
public:
   virtual int Test_A()
     {
      return 100;
     }
  };
//+------------------------------------------------------------------+
class B :public A
  {
public:
   virtual int Test_A()
     {
      return 200;
     }
  };

B b;
//+------------------------------------------------------------------+
void OnStart()
  {
   Comment (A::b.Test_A());
  }
//+------------------------------------------------------------------+


 
Vladimir Pastushak :

부모 메서드를 호출하고 싶습니다

올바른 구문은 다음과 같습니다.

b.A::Test_A()

그러나 mql에는 옳고 그름이 없습니다.

그러나 질문은 당신을 위한 것입니다. 함수가 파생물에서 호출되어야 한다면 왜 기본 가상 함수 로 밀어넣습니까?

 

fxsaber :

작업은 void TimeCurrent()가 호출되었다면 아무 일도 일어나지 않았을 것임을 잘 보여주었습니다. 현재 형태의 void는 많은 것을 손상시킬 수 있습니다.

아무렇게나:

 #define MACROSV(NEW_HANDLE_, VOIDFN_) \
do {                                   \
   int prev=GetHandle();              \
   if (SelectHandle(NEW_HANDLE_))      \
      VOIDFN_;                        \
   SelectHandle(prev);                \
} while ( false )

매크로 2개, 별로 아프지 않은 것 같습니다. µl의 힘에 의해 더 우아한 것이 마음에 떠오르지 않습니다.

 
pavlick_ :

아무렇게나:

그리고 왜 do...while이 있습니까? 중괄호로 충분합니다
 
Alexey Navoykov :
그리고 왜 do...while이 있습니까? 중괄호로 충분합니다.

작동하게 하려면:

 if (...)
   MACROSV(...) ;
else
{
}
사유: