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

 
Alexey Navoykov :

일반적으로 MQL 컴파일러가 내가 생각한 것만큼 똑똑하지 않다는 것을 유감스럽게 인정해야 합니다. ) 나는 심지어 말할 것입니다. - 전혀 똑똑하지 않습니다. 아무데도 사용되지 않고 아무 것도 하지 않는 더미 개체가 만들어지므로 컴파일러는 상관하지 않습니다. 최적화가 없습니다. 나는 순전히 일의 속도로 판단한다. 그리고 어떤 이유로 새 빌드에서는 이전 빌드보다 느리게 작동합니다.

개발자 는 알고 있습니다. 그러나 컴파일러에 의한 이러한 최적화는 해결되는 작업의 우선 순위와는 거리가 멀습니다.

ZY 컴파일러에는 이러한 모호성도 있습니다.

 
fxsaber :

개발자 는 알고 있습니다. 그러나 컴파일러에 의한 이러한 최적화는 해결되는 작업의 우선 순위와는 거리가 멀습니다.

예, 하지만 놀랍습니다. 지난 몇 년 동안 여기에서 너무 많이 자랑해서 옵티마이저의 품질을 전례 없는 수준으로 끌어올렸다고 가정하지만 실제로는 그런 간단한 것조차 처리할 수 없습니다. 더 복잡한 것에 대해 무엇을 말할 수 있습니까?

 
fxsaber :

따라서 OnTesterInit에서 기본 패스 테이블을 변경하는 기능을 추가할 것을 제안합니다.

 int PassesSet( const int Index, const MqlParam & Parameters[] );

매개변수 세트 자체는 시스템에 저장되지 않고 고유한 조합 번호로 계산된다고 생각합니다(이제 통과 번호와 일치함). 따라서 조합의 순서만 변경할 수 있으며 구성은 변경할 수 없습니다. 저것들. 이 경우 SwapPasses(long index1, long index2)와 같습니다.

하지만 내가 틀릴 수 있습니다.

 
Alexey Navoykov :

매개변수 세트 자체는 시스템에 저장되지 않고 고유한 조합 번호로 계산된다고 생각합니다(이제 통과 번호와 일치함). 따라서 조합의 순서만 변경할 수 있으며 구성은 변경할 수 없습니다. 저것들. 이 경우 SwapPasses(long index1, long index2)와 같습니다.

당신이 옳은 것 같다. 이제 순서는 EA 소스 코드의 입력 라인 교체를 통해 여전히 영향을 받을 수 있습니다.

 
fxsaber :

당신이 옳은 것 같다. 이제 순서는 EA 소스 코드의 입력 라인 교체를 통해 여전히 영향을 받을 수 있습니다.

이것은 최적화 알고리즘을 죽입니다. 이는 임의의 방향으로 최적화하는 것과 같습니다.

 
Stanislav Korotky :

이것은 최적화 알고리즘을 죽입니다. 이는 임의의 방향으로 최적화하는 것과 같습니다.

우리는 처음에 완전한 흉상에 대해 이야기하고 있습니다.

[삭제]  

점차적으로 OOP를 마스터하고 하나의 명확하지 않은 것을 만났습니다.

클래스 A가 있고 그 필드는 다른 클래스 B의 객체입니다.

클래스 A에서 클래스 B의 개체를 반환하는 상수 메서드 가 호출됩니다.

그 후 클래스 B의 메소드가 호출되어 수신된 객체의 매개변수를 지웁니다.

다음과 같습니다(예제는 브라우저에 작성되어 단순화됨).

 class B
{
private :
   int m_width;
   int m_length;
public :
   void Reset() { m_width = 0 ; m_length = 0 ; }
}
class A
{
private :
   B m_member;
public :
   B GetBMember() const { return ( m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();

결과적으로 Reset()이 작동하지 않는 것으로 나타났습니다. m_member 필드는 지워지지 않습니다.

질문: 컴파일러는 빌드 시 const 개체(또는 이와 유사한 것)에서 비 const 메서드가 호출되고 있다고 보고(오류/경고)하지 않아야 합니까?

 
Alexey Kozitsyn :

질문: 컴파일러는 빌드 시 const 개체(또는 이와 유사한 것)에서 비 const 메서드가 호출되고 있다고 보고(오류/경고)하지 않아야 합니까?


이유는 암시적 복사 생성자가 임시 개체 에서 호출되는 Reset 의 결과로 호출되기 때문일 수 있습니다.

[삭제]  
Sergey Dzyublik :

이유는 암시적 복사 생성자가 임시 개체 에서 호출되는 Reset 의 결과로 호출되기 때문일 수 있습니다.

고맙습니다. 아마도 당신이 옳았을 것이고 const 지정자는 결과에 영향을 미치지 않습니다(그것이 있거나 없는 리셋은 없습니다).
 
Alexey Kozitsyn :

점차적으로 OOP를 마스터하고 하나의 명확하지 않은 것을 만났습니다.

필드가 다른 클래스 B의 객체인 클래스 A가 있습니다.

클래스 A에서 클래스 B의 개체를 반환하는 상수 메서드 가 호출됩니다.

그 후 클래스 B의 메소드가 호출되어 수신된 객체의 매개변수를 지웁니다.

다음과 같습니다(예제는 브라우저에 작성되어 단순화됨).

결과적으로 Reset()이 작동하지 않는 것으로 나타났습니다. m_member 필드는 지워지지 않습니다.

질문: 컴파일러는 빌드 시 const 개체(또는 이와 유사한 것)에서 비 const 메서드가 호출되고 있다고 보고(오류/경고)하지 않아야 합니까?

포인터를 반환합니다.
 class B
{
private :
   int m_width;
   int m_length;
public :
   void Reset() { m_width = 0 ; m_length = 0 ; }
}
class A
{
private :
   B m_member;
public :
   B * GetBMember() const { return ( & m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();