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

 
TheXpert :
사실, 이것은 쓰여진 내용이 약간 망상적으로 보이기 때문에 논리적입니다.
C++은 그렇게 생각하지 않습니다. 그리고 넌센스에 대해 - 이것은 문제의 본질을 가져 오는 가장 단순화 된 예입니다.
 
A100 :
C++은 그렇게 생각하지 않습니다.

예, C++는 많은 것을 계산하지 않지만 요점은 정적 멤버 가 초기화된 순서가 아니라 선언된 순서대로 초기화될 수 있다는 것입니다.

그것에 대해 표준을 연기 할 필요가 있습니다.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - Документация по MQL5
 

너무 많이 구걸했습니다. const를 전송하지 않았습니다. 이제 모든 것이 명확해진 것을 볼 수 있습니다. 하나의 상수가 다른 상수에 의해 초기화됩니다.

 class A {
protected : //если заменить на public: то все работает
        static const int s1;
         static const int s2;
};

const int A::s1 = 0x1 ;
const int A::s2 = A::s1; //ошибка компиляции

오류로 컴파일러는 s1 구성원의 보안을 가리킵니다. protected를 public으로 바꾸면 모든 것이 시계처럼 작동합니다. 그러나 보안은 본질적으로 초기화 순서, 할당 순서 또는 특정 값으로 초기화하는 기능과 아무 관련이 없습니다.

 
TheXpert :

그것에 대해 표준을 연기 할 필요가 있습니다.

일반적인 경우 컴파일러는 컴파일러와 다르며 분류해야 한다는 점에 동의합니다.

다른 예시

 enum _ENUM { en = 0x1 };
const int cc = 0x2 ;
static int s_array1[] = { cc }; //ошибка
static int s_array2[] = { en }; //нормально

class A {
public :
         static const int s;
         static int Array[];
};
const int A::s = 0x3 ;
int A::Array[] = {
        en,     //нормально
        A::s,   //ошибка
        cc       //ошибка
};

여기서 MQL 컴파일러는 const int 값(열거형 - 전달)으로 배열을 초기화 하고 싶지 않습니다.

다시 말하지만, C++가 이것을 복사하고 올바르게 초기화한다는 사실에 호소합니다.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
아마도 호출 순서의 오류일 것입니다.
 class A {
public :
        A * operator <<( int x ) { Print ( x ); return ( GetPointer ( this )); }
        A * operator <<( string s ) { Print ( s ); return ( GetPointer ( this )); }
};

int f( int & x ) { return ( x = 4 ); }

void OnStart ()
{
         Print ( "" );
        A a;
         int x = 3 ;
        a << "(1)" <<   "(2)" << "(3)" ; // Результат: (1) (2) (3) //нормально
        a <<  x   << f( x ) <<  x;   // Результат:  4   4   3 ??? как же так?
}
후자의 경우 이전 결과와 유추하여 3 4 4 결과가 예상되었습니다. 일부 유형에는 하나의 호출 순서가 있고 다른 유형에는 다른 호출 순서가 있는 것이 정상이 아닙니다.
 
A100 :
아마도 호출 순서의 오류일 것입니다.
C++에서 표현식의 피연산자가 평가되는 순서는 UB입니다. 왜 여기에서 특정 주문에 의존합니까?
 
TheXpert :
C++에서 표현식의 피연산자가 평가되는 순서는 UB입니다. 왜 여기에서 특정 주문에 의존합니까?
어디선가 본 적 있어?
 cout << "Hello " << "word" ;

"word Hello"로 출력?

이 경우, 이것은 string 유형의 경우 모든 것이 정상적으로 표시된다는 사실에도 불구하고 int 유형 에 대한 오버로드된 연산자에 대해 발생합니다.

게다가 C++는 그것과 아무 관련이 없습니다. 코드로 작성했다고 가정해 보겠습니다.

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
그리고 당신을 위해 이러한 함수는 역순으로 실행되거나 일반적으로 다른 유형의 인수에 대해 임의의 순서로 실행되었습니다.
 
그건 그렇고, 왼쪽에서 오른쪽으로의 시프트 작업의 순서는 MQL5 자체에도 정의되어 있으며, 이는 다음 예에서 확인됩니다.
 void OnStart ()
{
         int a = 0x1 ;
         int b = a << 2 << a;   //b = 8
         int c = (a << 2 ) << a; //c = 8
         int d = a << ( 2 << a); //d = 16
         Print ( "b=" , b, ", c=" , c, ", d=" , d );
}
 

인사말!

'잘못된 포인터 액세스' 문제를 해결하는 데 도움이 됩니다.

OnInit()에는 다음이 있습니다.

SymbolsCollection = new CSymbolsCollection();
SymbolsCollection.RefreshRealSymbols();

CSymbolsCollection::RefreshRealSymbols() 메서드에 CleanSymbolsArray(myRealSymbols)에 대한 호출이 있습니다.

이 메서드와 변수는 클래스에서 다음과 같이 선언됩니다.

 public :
   CSymbol* myRealSymbols[];
   void CleanSymbolsArray(CSymbol* &inArray[]);

문제는 RefreshRealSymbols()CSymbolsCollection 생성자에서 호출될 때 제대로 실행된다는 것입니다.

그러나 SymbolsCollection .RefreshRealSymbols(); OnInit()에서; 으로 이끌다:

invalid pointer access in 'SymbolsCollection.mqh' (55,22)

CSymbolsCollection::RefreshRealSymbols() 메서드 본문에서 CleanSymbolsArray(myRealSymbols); , 위치는 여는 괄호 바로 뒤에 있습니다.

어떤 아이디어?

 
vlad_123 :
...

어떤 아이디어?

그렇지 않습니까 ?