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

 
Igor Makanu :

typedef는 주제이고 시도했지만 매우 저속하지도 않습니다. 여전히 문제를 해결한 위치를 파악해야 합니다. 내 예제는 typedef의 도움으로 작동해야 합니다!

위에서 작성한 코드가 작동해야 합니다. 나는 그것을 직접 확인하고 싶었지만 운이 없었습니다. =))))))))))))


(빌드 1961)

 
Igor Makanu :

typedef는 주제이고 시도했지만 매우 저속하지도 않습니다. 여전히 문제를 해결한 위치를 파악해야 합니다. 내 예제는 typedef의 도움으로 작동해야 합니다!

또는 추가 대괄호와 포인터 없이 더 간단하고 우아하게 만들 수 있습니다(이상한 오류 없이 컴파일됨)))

 #property strict

class CObject{ };
class CMyclass: public CObject {
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p); 
                                 return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }
           int f(){ return 1 ; } 
} my ;

void OnStart ()
{
  CObject*co= new CMyclass;
  
  my[co].f();
}
 
Ilya Malev :

또는 추가 대괄호와 포인터 없이 더 간단하고 우아하게 만들 수 있습니다(이상한 오류 없이 컴파일됨)))

귀하의 예제는 제 경우에는 작동하지 않으며 내 개체는 동적으로 생성되며 이름을 할당하지도 않습니다. 포인터 이름을 참조하여 귀하의 예제는 다음과 같이 시도했지만 컴파일러를 건너뛰지 않습니다. '[' - 예상되는 이름 tst_cast.mq4 32 열 다섯


 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   CObject           *obj;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 )  {                       }
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p); 
                                             return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }         
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99 ;
      ((CMyclass*)base.GetCurrentNode()).y = 555 ;
        CMyclass[base.GetCurrentNode()].x = 111 ;
     }

   for ( int i= 0 ;i< 3 ;i++)
     {
       Print (((CMyclass*)base.GetNodeAtIndex(i)).x, " : " ,((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

추신: 나는 당신이 제안하는 것을 조금 이해하기 시작했지만 여전히 결과가 없습니다. dynamic_cast <> 없이 할 수 있습니다. * CObject 필드를 추가하십시오. 이론상 다음과 같아야 합니다.

...
 CObject           *obj;
 CMyclass          * operator [](CObject*p)        { obj = p; return (obj); }          
  };

나는 그것이 dynamic_cast <>를 사용한 당신의 예보다 조금 더 빨리 작동할 것이라고 생각합니다 - 의미는 같은 것 같습니다

 
Igor Makanu :

MQL에서 *CObject 포인터를 역참조하는 것이 가능한 경우?

다른 옵션을 시도했습니다. 여기에 테스트용 스크립트가 있습니다. 연결 목록에 3개의 Myclass 요소를 추가한 다음 CMyclass 필드의 값을 변경합니다. 작동 방식은 다음과 같습니다.

중간 CMyclass *result 포인터 없이 동적으로 생성된 CMyclass 요소의 여백을 변경할 수 있습니까?

( CMyclass *)(base.GetCurrentNode()).x = 99;

추신: typedef를 사용해야 한다고 생각하지만 아직까지는 운이 없습니다.

당신이 쓴 것은 같은 것을 암묵적으로 사용하는 것입니다.

result=base.GetCurrentNode();

저것들. 그런 익명의 포인터지만 실제로는 단지 구문상의 설탕일 뿐입니다. MQL에는 설탕이 거의 없으므로 이 방법으로 할 수 없습니다. 그러나 자식에 대한 유형 축소 는 검사 및 변환 없이 진행되므로 매우 빠르기 때문에 포인터를 사용한 명시적 작업이 왜 그렇게 만족스럽지 않은지 완전히 명확하지 않습니다.

 
Igor Makanu :

추신: 나는 당신이 제안하는 것을 조금 이해하기 시작했지만 여전히 결과가 없습니다. dynamic_cast <> 없이 할 수 있습니다. * CObject 필드를 추가하십시오. 이론상 다음과 같아야 합니다.

나는 그것이 dynamic_cast <>를 사용한 당신의 예보다 조금 더 빨리 작동할 것이라고 생각합니다 - 의미는 같은 것 같습니다

위에서 제안한 것처럼 별도의 필드 없이 연산자의 래퍼를 통해서만 가능합니다.

차이가 있습니다, 작은 것. 갑자기 myclass로 캐스팅할 수 없는 객체가 있는 것으로 밝혀지면 dynamic_cast가 없으면 런타임 오류가 발생 하고 반환 시 NULL만 반환됩니다. 즉, .x를 통해 즉시 액세스하면 어떤 경우에도 런타임 오류가 발생하므로 걱정할 필요가 없습니다 =)))

"의사 지시"대로 정확하게 하면 NULL의 경우 이 오류를 처리하기 위해 생성된 클래스의 특수 인스턴스와 같은 것을 반환해야 합니다.)))

추신 나는 최근에 일반 캐스트와 비교하여 dynamic_casta의 속도를 확인했습니다. 예상한 것과 클래스가 동일한 경우와 거의 같았습니다.

추신 어쨌든 for는 거기에 다소 슬퍼 보입니다. 목록으로 작업할 때 for each와 같은 루프를 사용해야 합니다(예: 내 루프).
 
Igor Makanu :

컴파일러를 건너뛰지 않습니다: '[' - 이름이 필요합니다. tst_cast.mq4 32 열 다섯

 #property strict
#include <Object.mqh>
#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class CMyclass: public CObject
  {
public :
   int                x;
   double             y;
   CObject           *obj;
   void               CMyclass( void ):x(- 1 ),y(- 2.2 )  {                       }
   public : CMyclass * operator [] (CObject*p){ CMyclass*r = dynamic_cast <CMyclass*>(p) ; 
                                             return CheckPointer (r)!= POINTER_INVALID ?r: NULL ; }         
  };
//+------------------------------------------------------------------+
void OnStart ()
  {
   CList *base= new CList;
   for ( int i= 0 ;i< 3 ;i++)
     {
      base.Add( new CMyclass);
      ((CMyclass*)base.GetCurrentNode()).x = 99 ;
      ((CMyclass*)base.GetCurrentNode()).y = 555 ;
        CMyclass[base.GetCurrentNode()].x = 111 ;
     }

   for ( int i= 0 ;i< 3 ;i++)
     {
       Print (((CMyclass*)base.GetNodeAtIndex(i)).x, " : " ,((CMyclass*)base.GetNodeAtIndex(i)).y);
     }
   delete base;
  }
//+------------------------------------------------------------------+

...

사실, 이 래퍼로 무엇을 얻었습니까? 거기에 완전히 불필요한 경우 추가 dynamic_cast? 래퍼 자체에서 동일한 CMyClass로의 명시적 변환. 저것들. 그 안의 작업량은 0%이고 코드는 더 혼란스럽습니다(인덱스 액세스 연산자는 전달된 클래스의 명시적 캐스트 연산자로 사용됩니다. 음, 전혀 명확하지 않음).

 
Ilya Malev :
추신 어쨌든 for는 거기에 다소 슬퍼 보입니다. 목록으로 작업할 때 for each와 같은 루프를 사용해야 합니다(예: 내 루프).

죄송하지만 이것은 말도 안되는 소리입니다.

 
Vasiliy Sokolov :

당신이 쓴 것은 같은 것을 암묵적으로 사용하는 것입니다.

저것들. 그런 익명의 포인터지만 실제로는 단지 구문상의 설탕일 뿐입니다. MQL에는 설탕이 거의 없으므로 이 방법으로 할 수 없습니다. 그러나 자식에 대한 유형 축소 는 검사 및 변환 없이 진행되므로 매우 빠르기 때문에 포인터를 사용한 명시적 작업이 왜 그렇게 만족스럽지 않은지 완전히 명확하지 않습니다.

예, 이 모든 것을 이해합니다. 포인터로 작업할 때 MQL의 구문을 파악할 수 없고 모든 것이 표준 C++에서와 동일한 것처럼 보이지만 계속 혼란스러워서 바로 쓰거나 읽을 수 없습니다. MT의 표준 배달에서 같은 라이브러리의 코드 .... 이미 머리카락을 모두 뽑았습니다! ...하지만 여전히 .op에 있습니다! )))) - 어쨌든 알아낼 것입니다;)


일리야 말레프 :

차이가 있습니다, 작은 것. 갑자기 myclass로 캐스팅할 수 없는 객체가 있는 것으로 밝혀지면 dynamic_cast가 없으면 런타임 오류가 발생 하고 반환 시 NULL만 반환됩니다. 즉, .x를 통해 즉시 액세스하면 어떤 경우에도 오류가 발생합니다.

이것은 모두 명확하며 이것은 작은 차이가 아닙니다. 나는 전문 프로그래머의 코드가 아마추어 코드와 정확히이 차이에서 다르다고 편견없이 말할 것입니다. 중요한 오류를 확인하는 데 .... 프로그래밍 언어의 현대적인 경향에도 불구하고 이는 try except finally 등을 사용하여 lamers - 프로그래머를 위해 단순화되었습니다. ;)

 
Vasiliy Sokolov :

죄송하지만 이것은 말도 안되는 소리입니다.

예, 부탁합니다

 
Igor Makanu :

예, 이 모든 것을 이해합니다. 포인터로 작업할 때 MQL의 구문을 파악할 수 없습니다. 모든 것이 표준 C++에서와 동일한 것처럼 보이지만 계속 혼란스러워서 바로 쓰거나 읽을 수 없습니다. MT의 표준 배달에서 같은 라이브러리의 코드 .... 이미 머리카락을 모두 뽑았습니다! ...하지만 여전히 .op에 있습니다! )))) - 어쨌든 알아낼 것입니다;)

MQL의 경우 C++를 가이드로 삼는 것은 작동하지 않습니다. :) MQL에서 불가능한 것의 양은 "호환되는" 구성의 양보다 훨씬 큽니다. IMHO, MQL은 구문상의 설탕이 전혀 없는 매우 단순한 C#과 비슷합니다.

사유: