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

 
fxsaber :

차이 없음


입력하면 입력하는 숫자에 따라 다릅니다. 일부는 전화 걸기를 허용하지 않습니다. 그리고 뭔가 - 허용합니다.

이상한 동작... 12자 미만의 정수 부분을 입력하면 총 14개 이상의 숫자는 건너뛸 수 있습니다.

개발자가 응답할 때까지 기다려 보겠습니다.

 
간단한 일을 도와주세요
 class A
{
public :  
   int i;
  
  A* operator *( const A &Value ) const
  {
    A* Res = new A;
    
    Res.i = this .i * Value.i;
    
     return (Res);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
  
   delete d;
}

코드는 분명히 메모리 누수가 있음을 보여줍니다. 그리고 그것이 정확히 일어나고 있습니다. 그러나 개체를 "곱하기"할 수 있도록 올바르게 작성하는 방법은 무엇입니까? "*=" 연산자를 사용하면 구조의 경우에서와 같이 모든 것이 명확해집니다. 그리고 클래스를 사용하여 이 간단한 기능을 구현하는 방법은 무엇입니까?


추신 그리고 이 코드

 class A
{
private :
  A Tmp;
  
public :
   int i;
  
  A* operator *( const A &Value )
  {
     this .Tmp.i = this .i * Value.i;
    
     return (&Tmp);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
}

F7로 ME를 충돌시키고 F5로 터미널을 죽입니다. 나는 왜 이렇게 운이 좋은가?!

 
fxsaber :

추신 그리고 이 코드

F7로 ME를 충돌시키고 F5로 터미널을 죽입니다. 나는 왜 이렇게 운이 좋은가?!

 class A
{
private :
  A Tmp;
  
public :
   int i;
  
  A* operator *( const A &Value )
  {
     this .Tmp.i = this .i * Value.i;
    
     return (&Tmp);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A* d = a * b * c;
  
   Print (d.i); // 30
}

가능한 무한 재귀 및 스택 오버플로.

 
Sergey Dzyublik :

가능한 무한 재귀 및 스택 오버플로.

물론 선택에 문제가 있지만 그 이유는 더 깊은 것 같다.

그리고 런타임에는 분명히 재귀가 없어야 합니다.

 
fxsaber :
간단한 일을 도와주세요
 class A
{
public :
  A() {}
  A( const A& other) 
  {
   this .i = other.i;
  }
  
   int i;
  
  A operator *( const A &Value ) const
  {
    A Res;
    
    Res.i = this .i * Value.i;
    
     return (Res);
  }
};

void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A d = a * b * c;
  
   Print (d.i); // 30
}
물론 오버헤드가 있겠지만, 편의성이 더 중요하다면...
 
Комбинатор :
물론 오버헤드가 있겠지만, 편의성이 더 중요하다면...

고맙습니다! 객체를 정의할 때 객체와 "="의 반환은 추가를 거친다는 것이 밝혀졌습니다. 건설자.

나는 어딘가에서 시각적 테이블을 보고 싶습니다. 어떤 경우에는 생성자(그리고 어떤 것)에 대한 호출이 있고 어떤 경우에는 - 연산자가 있습니다. 이제 모든 것이 직관의 수준에 있지만 물론 실패합니다.

 
fxsaber :

나는 어딘가에서 시각적 테이블을 보고 싶습니다. 어떤 경우에는 생성자(그리고 어떤 것)에 대한 호출이 있고 어떤 경우에는 - 연산자가 있습니다. 이제 모든 것이 직관의 수준에 있지만 물론 실패합니다.

값으로 무언가를 반환하는 경우 정의인 경우 복사 생성자(동일한 유형인 경우)를 통해 할당되고 그렇지 않은 경우 명령문을 통해 할당됩니다.

 void OnStart ()
{
  A a, b, c;
  
  a.i = 2 ;
  b.i = 3 ;
  c.i = 5 ;
  
  A d = a * b * c;
   // код аналогичен A d(a * b * c);
   // будет вызван копи-конструктор.

  A e;
  e = a * b * c;
   // будет вызван оператор =
  // но копи-конструктор все равно нужен для множественного умножения
  
  Print (d.i); // 30
}
 
Комбинатор :

값으로 무언가를 반환하는 경우 정의인 경우 복사 생성자(동일한 유형인 경우)를 통해 할당되고 그렇지 않은 경우 명령문을 통해 할당됩니다.

명확하게 명시되어 있습니다. 감사합니다!


PS 코드를 인쇄했습니다

 class A
{
public :
  A() { Print ( __FUNCSIG__ ); }
  A( const A& other) 
  {
   Print ( __FUNCSIG__ );
   this .i = other.i;
  }
  
  ~A()
  {
   Print ( __FUNCSIG__ );
  }
  
   int i;
  
  A operator *( const A &Value ) const
  {
     Print ( __FUNCSIG__ );

    A Tmp;
    
    Tmp.i = this .i * Value.i;
        
     return (Tmp);
  }
};

void OnStart ()
{
   if ( true )
  {
    A a, b, c;
    
    a.i = 2 ;
    b.i = 3 ;
    c.i = 5 ;
    
    A d = a * b * c;

     Print (d.i); // 30
  }
  
   Print ( "Kill!" );  
}


결과

 void A::A() // a
void A::A() // b
void A::A() // c
A A:: operator *( const A&) const
void A::A() // Tmp
void A::A( const A&) // return
void A::~A() // Tmp
A A:: operator *( const A&) const
void A::A() // Tmp
void A::A( const A&) // return
void A::~A() // Tmp
void A::A( const A&) // d
30
void A::~A() // a
void A::~A() // b
void A::~A() // c
void A::~A() // d
void A::~A() // return
void A::~A() // return
Kill!

강조 표시된 라인은 질문을 제기합니다. 임시 개체가 사용되자마자 충돌하지 않는 이유는 무엇입니까? 저것들. 서른이 끝날 때까지. 그러한 물체는 내 차를 충돌시킬 것입니다. 수천만 개의 진드기와 함께 작동해야 합니다. 각 개체는 기가바이트의 RAM을 차지하므로 즉시 죽이는 대신 이러한 임시 개체를 전혀 갖고 싶지 않습니다.

 
fxsaber :

강조 표시된 라인은 질문을 제기합니다. 임시 개체가 사용되자마자 충돌하지 않는 이유는 무엇입니까? 저것들. 서른이 끝날 때까지.

일반적으로 임시 개체는 즉시 삭제되지 않고 컨텍스트가 끝날 때 삭제됩니다. C++에서는 틀리지 않았다면 표준으로 작성되었습니다.

빠른 삭제를 원하면 컨텍스트를 관리하십시오.

 void OnStart ()
{
   if ( true )
  {
    A a, b, c;
    
    a.i = 2 ;
    b.i = 3 ;
    c.i = 5 ;
    
    A d;
    {
      d = a * b * c;
    }

     Print (d.i); // 30
  }
  
   Print ( "Kill!" );  
}

사실, 연산자를 =로 만들어야 합니다.

 
A100 :

내 새 차트에서 예제(모든 버튼)를 다시 시작할 때만 작동했는데 그 자체로는 이해할 수 없습니다. 하지만 지금은 분명하다

거래 개시와 함께 지정된 효과(재시작 시에만)가 사라짐

문서를 변경했습니다. 코드의 문제는 마우스 이벤트를 수신하기 위해 차트에 명령을 보내는 것이 차트의 대기열에 명령을 넣는 것뿐이라는 것입니다. 그리고 이 대기열이 처리되지 않으면(예: 주말) 차트가 지정된 이벤트를 수신할 수 없습니다. ChartSetInteger 설명에 메모 추가 및 수정된 예:

메모

함수는 비동기식입니다. 즉, 함수는 지정된 차트에 성공적으로 대기 중인 명령의 실행을 기다리지 않고 즉시 제어를 반환합니다. 속성은 차트 대기열에서 명령이 처리된 후에만 변경됩니다. 차트 대기열에서 즉시 명령을 실행하려면 ChartRedraw 함수를 호출하십시오.

한 번에 여러 차트 속성을 즉시 변경하려면 하나의 코드 블록에서 해당 함수( ChartSetString , ChartSetDouble , ChartSetString )를 실행한 다음 ChartRedraw 를 한 번 호출해야 합니다.

실행 결과를 확인하려면 지정된 차트 속성( ChartGetInteger , ChartGetDouble , ChartSetString )을 쿼리하는 함수를 사용할 수 있습니다. 이러한 함수는 동기식이며 실행 결과를 기다립니다.

예시:

//+----------------------------------------------- ------ --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- ------ --------------------+
무효의   초기화 ()
{
//--- 차트 창에서 마우스 움직임에 대한 메시지 활성화
    ChartSetInteger (0, CHART_EVENT_MOUSE_MOVE , 1);
//--- 차트 속성의 강제 업데이트는 이벤트 처리 준비를 보장합니다.
    차트 다시 그리기 ();

}