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

 
Igor Makanu :

?

이상한 상황, 클래스 외부의 모든 것이 오랫동안 정적 작업으로 작업되었습니다. 여기 십자가에 못 박고 있습니다 .... 재미를 위해 직접 코드를 재현해 보세요.

개체 인스턴스가 보이나요? ... 그리고 그것은 MQL에 있습니다 ;)

추신: 그리고 참조 수준에서 ... 나에게 주장하는 것은 무엇입니까?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

홍보


꼬마 도깨비

 
Andrey Barinov :

모든 동일한 규칙 (비공개, 보호됨, 공개)이 정적에 적용 되며 .

일반적으로 아니오: 예를 들어 public static은 파생 클래스에서 제한될 수 없습니다.

 
Andrey Barinov :



흠... 상황의 부조리함을 어떻게 설명해야 하나... 왜 또 내 말을 인용하는 거지? 나는 당신이 관리자 (개발자)의 메시지를 읽을 것을 제안했습니다. 나는 그들이 쓴 인증서를 보여주었습니다. 당신은 당신의 사진으로 나에게 무엇을 원합니까?

왜 그런지는 생각하지 않고 포럼을 읽고 도움을 주고 개발자가 추천하는 대로 합니다. 필요하다고 생각되면 "C++ 표준 보호 위원회", UN에 ... 글쎄요, 최소한 PM의 관리자에게, 약하지만 개발자의 메시지를 인용하고 방법!

추신: 어떻게든 사진이 아닌 소스를 삽입했는데 왜 당신에게 효과가 없었습니까?

 int print( int value)
{   Print (value, ":" , __FUNCTION__ ); 
 return (value);
}
class A
{
private :
   static int         a1;
   static void        inc_a1(){a1++; Print ( "a1 = " , a1);}
protected :
   static int         a2;
public :
   static int         a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print( 1 );
static int A::a2 = print( 2 );
static int A::a3 = print( 3 );

//+------------------------------------------------------------------+
void OnStart ()
{

A::inc_a1();
A::inc_a1();
A::inc_a1();

}

2019.09.17 22:11:49.534 tst (EURUSD,H1) 1: 인쇄

2019.09.17 22:11:49.535 tst (EURUSD,H1) 2: 인쇄

2019.09.17 22:11:49.535 tst (EURUSD,H1) 3: 인쇄

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 2

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 3

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 4

추신: 상황이 매우 우스꽝스럽습니다. 돕고 싶었습니다. 이제 변명을 하고 있습니다. .... 왜요? - 글쎄, 난간을 치고, 진실을 찾으십시오 ... 갈퀴를 밟으십시오 ....
 
Igor Makanu :

코드에서 오류는 개인 메서드에 대한 액세스에만 있습니다. 이 버그는 최근에 나타났습니다.

 

ChartOpen 함수 는 서비스에서 항상 0을 반환합니다. 일정 자체가 열리지만.

 #property service

//int OnInit()
void OnStart ()
  {
   long Otvet= ChartOpen ( Symbol (), PERIOD_D1 );
   Print ( "Otvet=" ,Otvet);

   // return(INIT_SUCCEEDED);
  }
 
fxsaber :

코드에서 오류는 개인 메서드에 대한 액세스에만 있습니다. 이 버그는 최근에 나타났습니다.

뭔가 잊었다고 생각해서 C# https://metanit.com/sharp/tutorial/3.6.php 에서 정적이 어떻게 작동하는지 다시 읽었습니다.

클래스의 정적 멤버는 해당 클래스의 모든 개체에 공통적이므로 클래스 이름으로 참조해야 합니다.

정적 메서드는 클래스의 정적 멤버에만 액세스할 수 있습니다. 정적 메서드 내에서 비정적 메서드, 필드, 속성을 참조할 수 없습니다.


그리고 MQL에서 정적은 OnInit()가 시작되기 전에 초기화됩니다. 이제 정적에 대한 개인 메서드의 전역 가시성을 논의하고 있습니다. 음, 이것은 MQL에서 정적의 동작입니다. 정적을 사용하는 경우에는 그렇지 않습니다. IMHO 클래스의 데이터 보호 기능 사용

그리고 이것은 어떻게 버그입니까? - 예, 개발자가 바뀌면 그렇게 될 것이지만 컨텍스트 작업을 사용할 때의 동작은 프로그래머가 결정합니다(컨텍스트 확인 연산자는 언어에서 가장 높은 우선 순위를 가진 연산자입니다!), 그리고 얼마나 컴파일러는 올바르게 도움을 줄 수 있습니다. 어떻게 진행되는지)))

이것이 어떻게 작동합니까?

 class A
  {
private :
   static void               My_function()
     {
       Print ( "^_^" );
     }
  };
  
A a;
void OnStart ()
  {
   A::My_function();
   a.My_function();   // 'A::My_function' - cannot access private member function         
  }

일반적으로 작업이 수행됩니다.


추신: 2145로 업데이트됨 - 정적 코드가 있는 코드는 같은 방식으로 작동합니다. 음, 반년 동안 이 상태를 유지하면 이것이 정적의 계획된 동작임을 알 수 있습니다.)

UPD: 속어로 어떻게 불리는지 기억합니다 - 더러운 속임수! ))) - 이 동작이 언어 표준으로 인식되고 제조업체의 특정 컴파일러와 연결된 곳에서 그물에 대한 많은 예를 찾으십시오. Python에서 eval()은 본질적으로 선형 코드 실행을 완전히 중단합니까? - 글쎄, 누군가가 그것을 사용하고 누군가 그것을 사용하지 않기 위해 씁니다. 왜냐하면 예측할 수 없는 행동


UPD: 한 달 전에 질문한 2145를 확인했습니다. https://www.mql5.com/ru/forum/320733#comment_12989063

https://www.mql5.com/ru/forum/320733#comment_12958594

 void OnStart ()
  {
   double x= 100.0 ;
   f(x);
  }
//_______________________________________________________________________
void f( bool v)
  {
  }
//_______________________________________________________________________

아무것도 변경 되지 않았습니다. 컴파일러는 유형을 확인할 때 bool에 대한 경고를 작성하는 방법을 배우지 않았습니다. 이것은 매우 불쾌 합니다. MQL 컴파일러가 항상 유형 일치를 엄격하게 모니터링한다고 확신했지만 이미 내 코드에서 오류를 찾았습니다.

 
Igor Makanu :

그리고 이것은 어떻게 버그입니까? - 예, 개발자가 바뀌면 그렇게 될 것입니다.

분명히 버그는 수정될 것입니다.

아무것도 변경 되지 않았습니다. 유형을 확인할 때 bool에서 컴파일러는 경고를 작성하는 방법을 배우지 않았습니다.

포인터와 숫자 유형을 bool로 자동 캐스팅하는 것은 매우 편리합니다.

 
Igor Makanu :

아무것도 변경 되지 않았습니다. 컴파일러는 유형을 확인할 때 bool에 대한 경고를 작성하는 방법을 배우지 않았습니다. 이것은 매우 불쾌 합니다. MQL 컴파일러가 항상 유형 일치를 엄격하게 모니터링한다고 확신했지만 이미 내 코드에서 오류를 찾았습니다.

이 캐스팅으로 데이터 손실이 없습니다. 0이든 아니든 0.

또 다른 것은 double이 캐스트되는 경우 -> 모든 정수 유형 (최대 int32 포함)

 
Slava :

이 캐스팅으로 데이터 손실이 없습니다. 0이든 아니든 0.

또 다른 것은 double이 캐스트되는 경우 -> 모든 정수 유형 (최대 int32 포함)

하지만 그 반대도 마찬가지?

코드에서 이미 버그를 찾고 있었습니다.

처음에는 테스트를 작성했지만 처음에는 int 를 사용하고 bool 방향으로 포기했지만 모든 코드를 수정하지 않았고 더 이상 기억이 나지 않지만 다음과 같습니다.

 void OnStart ()
{   int x= 100.0 ;
   f(x); }
//_______________________________________________________________________
void f( int   v)   //так тестил
{
   if (v> 0 ) v++;

}

//_______________________________________________________________________
void f( bool   v)   // потом решил, что мне нужен флаг, а ниже забыл исправить код
{
   if (v> 0 ) v++;

}
//_______________________________________________________________________


나는 이제 이 동작에 대해 일종의 준비가 되었지만 왜 그것에 대해 쓰고 있습니까... 글쎄, if()에서 MQL 조건을 검사할 때 - 엄격하게 유형을 제어합니까? 부울이 아닌 연산을 사용하면 동일한 경고가 생성됩니까? - 글쎄, 내가 VS2017에서 같은 C#으로 쓴 것처럼 - 내 예제 코드는 컴파일되지 않고 MQL은 경고를 발행하지 않습니다. 제 생각에는 MQL 프로그래밍의 초보자에게 이 동작은 약간의 놀라움으로 가득 차 있습니다.

 
fxsaber :

분명히 버그는 수정될 것입니다.

논쟁하지는 않겠지만 내 의견은 정적을 통해 클래스를 떠날 때와 컨텍스트 확인 연산자를 사용할 때 컴파일러의 제어에 의존할 가치가 없다는 것입니다.

저것들. 정적 메서드/필드를 작성했거나 ::를 적용한 경우 - 컴파일러에 의존하지 마십시오.