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

 
Vasiliy Sokolov :
매우 멋지고 가장 중요하게는 이데올로기적으로 정확합니다. 두 손을 위해!
그렇다면 이념적으로 더 옳을 것이다.
 class A { public:
        bool operator !=( A* ) {}
        bool operator   <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
현재와 같이 포인터가 같은지 비교하는 대신 operator!=()가 호출됩니다. 그리고 포인터의 비교는 ::GetPointer(...)와 같은 특수 함수로 수행할 수 있습니다.

그러나 이는 큰 불편을 낳고 이념적 올바름만이 유리할 것이라는 단순한 이유 때문이 아니다.

 
오랫동안 업데이트를 받지 못했습니다: MetaTrader5 빌드 1159(MetaQuotes-Demo에 연결됨). 명령 컴파일러는 빌드 1162와 함께 로드됩니다.
 
Vasiliy Sokolov :

그런 다음 문자열은 특정 숫자의 집합이기도 합니다. 그리고 그림은 또한 숫자이자 마이크로 회로의 전기 충격입니다 ...

일반적으로 전기 공학을 배우십시오. 동료.

C++의 포인터와 MQL/C# 및 일부 다른 언어의 설명자를 이와 같이 비교할 수 있습니다.

작업 - 친구와 라이브 채팅을 하고 싶습니다.

1. 포인터. 우리는 거리, 집 번호 및 아파트를 알고 있습니다. 우리는 주소로 가고, 친구를 깨우고, 거품을 꺼내고, 그는 격렬하게 기뻐하고, 우리는 의사 소통합니다))

2. 기술자. 우리는 정확한 주소를 모릅니다. 외부인은 집에 들어갈 수 없습니다. 예를 들어 이것은 FSB 건물입니다. 집에 친구 이름으로 주소 제공을 거부하고(설명자에 의해) 친구를 집에 들어오게 하는 것을 거부하는 검문소가 있습니다(주소 공간으로). 경비원은 친구에게 전화를 걸어 나가라고 합니다. 그가 나오고, 당신은 행복하게 거품을 꺼내고, 그는 쉿 소리를냅니다. - 당신은 무엇입니까 !!! 즉시 제거!!! 그래서 우리는 걸었습니다 ... 개봉하지 않은 병을 손에 들고 집으로 걸어갈 때 설명자가 포인터 기능에 대한 대가로 보안을 제공한다는 것을 꿰뚫어 볼 수 있습니다.

 
Vasiliy Sokolov :

일반적으로 전기 공학을 배우십시오. 동료.

다른 주장이 있습니까?
 
A100 :
다른 주장이 있습니까?
그리고 너?
 
A100 :
포인터가 명시적으로 숫자로 변환되는 코드 조각이 있습니다(외부 쓰기/읽기 시스템과의 인터페이스, 오류 분석 및 디버깅용). 이것이 금지되면 유연성이 감소하고 다시 실행해야 합니다.
논쟁은 흥미롭습니다. 생각하는 데 시간이 걸립니다. 신청서를 작성해 주시면 자세히 상담해 드리겠습니다.
 

그건 그렇고, *& 연산자를 MQL에 도입하여 첫 번째 경우에는 객체에 대한 명시적 액세스를 가능하게 하고 두 번째 경우에는 (성가신 GetPointer 대신) 객체 포인터 를 가져오는 것은 어떻습니까? 그리고 별표는 단순히 필사적으로 필요합니다. 언어로 대체할 수 있는 것은 없습니다. 이것이 없으면 A100이 조금 더 높게 언급한 것처럼 개체 자체 대신 포인터로 일부 작업이 수행되는 상황을 제어할 수 없습니다. 개인적으로 이것은 끊임없는 문제입니다. 항상 경계하거나 A.operator=(B), A.operator!=(B)를 명시적으로 지정해야 합니다. 간결함이 사라지고 연산자 오버로딩은 실제로 의미를 잃습니다.

나는 어떻게 든 이미이 문제를 제기했지만 주제는 사라졌습니다. 마지막으로 이 질문을 마치겠습니다.

 

외부 변수에 대한 질문입니다.

프로그램 실행 중에 extern 변수가 변경되는 상황을 보았는데, 타임프레임이 변경되면 다시 속성 창에서 설정한 값을 취합니다. 예를 들어 실행 전에 TradeEnable 값을 EnableAll로 설정하고 프로그램이 실행될 때 값을 EnableBuy로 변경하면 차트를 다른 시간 프레임으로 클릭하면 값이 EnableAll로 돌아갑니다. 나는 타이머 이벤트에서 값을 정의하고 주석을 통해 표시합니다. 오류가 있을 수 없습니다.

 enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

차트 사이를 뒤집는 것은 TradeEnable 변수에 어떤 식으로든 영향을 미치지 않습니다. 도움말 읽기 - 입력 변수와 달리 extern 변수의 값은 프로그램 작동 중에 프로그래밍 방식으로 변경할 수 있습니다.

이것이 내가 OnDeinit와 OnInit를 가지고 있는 방법입니다.

Q: 이해가 안되는 부분이 있습니다 또는 TradeEnable을 변경하는 것이 런타임 오류입니까?

 int LastDeinitReason = 0 ;

void OnDeinit ( const int reason)
{
    LastDeinitReason = reason;
     if (reason== REASON_CHARTCHANGE || reason== REASON_TEMPLATE || reason== REASON_PARAMETERS )
         return ;
     EventKillTimer ();
// далее код при завершении работы советника
}

int OnInit ()
{
     if (LastDeinitReason== REASON_CHARTCHANGE || LastDeinitReason== REASON_TEMPLATE )
    {
        LastDeinitReason = 0 ;
         return ( INIT_SUCCEEDED );
    }
     if (LastDeinitReason== REASON_PARAMETERS )
    {
        SetParams();
         return ( INIT_SUCCEEDED );                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov :

마지막으로 이 질문을 마치겠습니다.

거기에서 다른 모든 연산자를 보존하기 위해 두 개의 연산자(== 및 !=)가 희생됩니다.

템플릿에서 출력을 봅니다.

 template < typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong (t1) == ulong (t2) );
}

그런 다음 operator==(!=)가 정의되면 호출됩니다. 정의되지 않은 경우 포인터가 동일한지 비교됩니다. 그리고 operator==(!=)가 정의되어 있고 포인터가 같은지 비교해야 하는 경우 지정된 템플릿을 사용하여 수행할 수 있습니다.

기존 시스템에 대한 변경은 최소화되며 가장 중요한 것은 operator==(!=)를 오버로드하지 않고 단순히 포인터의 동등성을 비교하는 사람들에게 영향을 미치지 않습니다.

 
A100 :

거기에서 다른 모든 연산자를 보존하기 위해 두 개의 연산자(== 및 !=)가 희생됩니다.

템플릿에서 출력을 봅니다.

그런 다음 operator==(!=)가 정의되면 호출됩니다. 정의되지 않은 경우 포인터가 동일한지 비교됩니다. 그리고 operator==(!=)가 정의되어 있고 포인터가 같은지 비교해야 하는 경우 지정된 템플릿을 사용하여 수행할 수 있습니다.

기존 시스템에 대한 변경은 최소화되며 가장 중요한 것은 operator==(!=) 오버로드 없이 단순히 포인터를 비교하는 사람들에게 영향을 미치지 않습니다.

비교는 문제의 절반입니다. 과제도 있습니다. 예, 템플릿은 목발일 뿐입니다. 물론 별도의 함수를 통해 비교와 할당을 모두 할 수 있지만 그게 무슨 소용인가? 개발자가 올바른 결정을 내리도록 설득하는 것입니다.