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

 

어떤 기준으로 제품이 이 배너에 들어가는지 궁금합니다.

공인 판매자의 제품이 거기에 도착합니까? 즉, 이 배너에서 내 제품을 볼 수 있습니까? 30페이지를 넘겼는데 안보이더라구요...

 
Renat Fatkhullin :

난 방해하지 않아. 논스톱 프로그래밍의 26년 뒤에.

금융 부문에 대해 이야기하는 경우 경고는 본질적으로 오류입니다. 그리고 "부호 손실, 정밀도 손실, 캐스트 손실 등"에 대한 수천 개의 메시지는 모두 코드 품질에 대한 문장입니다. 결과를 완전히 이해하지 못하는 것 같습니다.

컴파일러가 오류로 표시한 코드를 충분히 완전한 형태로 제공하십시오.

이것이 없으면 전체 토론이 보기 흉하고 공정하지 않게 보입니다.

좋아요, Renat, "코드 품질"에 대한 이 논쟁은 토론 주제가 아닙니다. 여기서는 컴파일 가능성에 대해서만 이야기하고 있습니다. 코드 성능. 그리고 정확도의 손실 등이 있습니다. - 이것은 말하자면 프로그래머의 책임하에 있는 개인의 문제입니다. 결국, int to short와 같은 암시적 캐스팅은 언어 표준에 의해 금지되지 않습니까? 그렇다면 왜 지금 이러한 도덕성이 있습니까?

알겠습니다. 다음 버그 중 하나를 찾았습니다.

 class CClass
{

};


class CArr
{
  CClass* data[];
 public : 
  CClass* operator [] ( int i)  { return data[i]; }
};


template < typename T>
void Func (T* obj)      {  }
 

void OnStart ()
{  
  CArr arr;
  Func(arr[ 0 ]);
}

내가 로그에서 얻는 것:

'CClass' - TestScript.mq5 유형이 없는 선언 16 9
'CClass' - 쉼표가 필요함 TestScript.mq5 16 9

이전 빌드에서는 모든 것이 정상이었습니다.

 
Alexey Navoykov :

좋아요, Renat, "코드 품질"에 대한 이 논쟁은 토론 주제가 아닙니다. 여기서 우리는 컴파일 가능성에 대해서만 이야기하고 있습니다. 코드 성능. 그리고 정확도의 손실 등이 있습니다. - 이것은 말하자면 프로그래머의 책임하에 있는 개인의 문제입니다. 결국, int to short와 같은 암시적 캐스팅은 언어 표준에 의해 금지되지 않습니까? 그렇다면 왜 지금 이러한 도덕성이 있습니까?

2600 잠재적으로 문제가 될 수 있는 곳, 심지어 재정에서도 도덕성을 부여하는 것이 아니라 코드의 품질을 나타내는 지표입니다.


알겠습니다. 다음 버그 중 하나를 찾았습니다.

내가 로그에서 얻는 것:

이전 빌드에서는 모든 것이 정상이었습니다.

예, 이 버그는 이미 논의되었으며(아마도 A100에서) 5월 4일에 수정되었습니다. 그들은 분명히 유형 검사로 그것을 과장했습니다.

더 이상 이 오류가 발생하지 않는 최신 MetaEditor 빌드 1329를 첨부했습니다. 확인해주세요.

MT5의 출시일은 5월 12일입니다.

파일:
 
Alexey Navoykov :

이전 빌드에서는 모든 것이 정상이었습니다.

코드에서 개인 개체에 대한 비 const 포인터를 반환하고 있습니다. 프로그래머가 private을 지정했기 때문에 타사(변수 가시성 측면에서) 함수는 아키텍처적으로 사용할 수 없는 것처럼 보이는 것을 변경할 수 있습니다.

개인 객체에 대한 포인터를 반환하려면 const 수정자를 지정해야 합니다. 귀하의 경우에는 varning을 끊을 것입니다.

높이 나는 새가 아니므로 내가 묻는 것입니다. 그런 코드를 어딘가에 사용해야 합니까 아니면 const를 넣는 것이 너무 게으른가요?

 
A100 :

나는 그들을 다소 다르게 처분 할 계획이라는 사실에도 불구하고 거의 완전히 이틀을 보냈습니다 (내 나이에 이것은 이미 많습니다).

백 개 이상의 버그를 가져왔습니다. 당신이 그렇게 미친 시간을 보낼 때마다?! 왜 개발자들에게 관대합니까?
알렉세이 나보이코프 :

그래서 다시 A100의 인내심을 위해 모자를 벗습니다. 그리고 나는 이미 이것에 지쳤 습니다. 서비스 데스크에서 일하는 새 빌드에서 버그의 원인을 찾는 것보다 모든 것이 잘 작동하는 이전 빌드에 앉아있는 것이 더 쉽습니다. 아니면 누군가가 이 일에 대해 나에게 돈을 지불할 것인가?

예, 서비스 데스크는 타사 테스터가 무료로 작업할 수 있는 멋진 곳입니다. 분명히 이것은 이것을 위해 수행되지 않았지만 실제로 무료로 일하는 타사 테스터의 고용주가되었습니다. 이러한 버그 보고서가 없으면 컴파일러를 완료하는 데 훨씬 더 오랜 시간이 걸립니다.

모든 사람들은 세계에서 실행되는 것처럼 발견된 버그에 대한 보상이 있어야 한다고 지지할 것입니다. A100은 국가 테스터의 급여를 받아야 합니다. 그리고, 테스터의 연봉인 것 같습니다.

 
Renat Fatkhullin :

예, 이 버그는 이미 논의되었으며(아마도 A100에서) 5월 4일에 수정되었습니다. 그들은 분명히 유형 검사로 그것을 과장했습니다.

더 이상 이 오류가 발생하지 않는 최신 MetaEditor 빌드 1329를 첨부했습니다. 확인해주세요.

MT5의 출시일은 5월 12일입니다.

확인했습니다. 컴파일 오류는 프로그램과 별도로 재생할 수 없지만 임의의 방법으로 처리할 수 있는 몇 가지 이상한 경이를 제외하고는 현재 거의 존재하지 않습니다.

다음은 문제 영역에 대한 예제 코드입니다. 반복하지만 별도로 정상적으로 컴파일되지만 내 프로그램의 일부로 오류가 발생합니다.

 class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public :
 
   template < typename T>
   void Run(T& arr[])
  {
     struct Struct
    {
       template < typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set( this , arr, arr[ 0 ]);
  }

  
   template < typename T>
   void Set(T& arr[]) 
  {  
     for ( int i= 0 ; i< ArraySize (arr); i++) Set(arr[i]);   // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
   template < typename T>
   void Set(T& obj)    { } 
  
   template < typename T>
   void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

   return ;
}

Main 함수의 모든 위치(예: 반환 후)에 다음 줄을 추가합니다.

작업 세트(arr[0]);

잘 컴파일됩니다.

최적화에 문제가 있는 것 같습니다.

또한 런타임에 이미 몇 가지 결함이 있습니다. 예를 들어, 구조체의 일부 멤버에 값을 할당했지만 그 값이 오래된 것으로 판명되었습니다. 아무것도 할당되지 않았습니다. 임의의 작업으로 옆에 한 줄을 추가하면 모든 것이 정상이 됩니다. 이 버그는 컴파일러 최적화를 수행한 가을 빌드에서 시작되었습니다. 일반적으로 모든 것이 원시입니다.

또한 컴파일 자체에는 여전히 20초가 걸리지만 빌드 1159에서는 약 1-2초 밖에 걸리지 않습니다. 동시에, 나는 내 프로그램 작업의 상당한 가속을 관찰하지 못하고, 이득은 10-20% 이내입니다. 따라서 가속에 대한 이야기를 2~10배 잊어버릴 수 있습니다. 이것은 특별히 선택된 테스트 샘플에서 발생할 수 있지만 더미가 아닌 실제 프로그램이 있습니다.

전체적으로 약간의 성능 향상을 위해 컴파일 속도가 10-20배 느려집니다. IMHO, 가치가 없습니다. 잃어버린 프로그래머의 시간은 훨씬 더 가치가 있습니다.

1159 빌드에 계속 남아 있어야 합니다.

 
Anton Zverev :

코드에서 개인 개체에 대한 비 const 포인터를 반환하고 있습니다. 프로그래머가 private을 지정했기 때문에 타사(변수 가시성 측면에서) 함수는 아키텍처적으로 사용할 수 없는 것처럼 보이는 것을 변경할 수 있습니다.

개인 객체에 대한 포인터를 반환하려면 const 수정자를 지정해야 합니다. 귀하의 경우에는 varning을 끊을 것입니다.

높이 나는 새가 아니므로 내가 묻는 것입니다. 그런 코드를 어딘가에 사용해야 합니까 아니면 const를 넣는 것이 너무 게으른가요?

개인적으로 배열만 숨깁니다. 그리고 CClass 개체 자체는 사용자가 전체 액세스를 위해 사용할 수 있습니다. 이것이 목표입니다. 읽기 전용이면 const를 넣습니다.

 
Anton Zverev :
모든 사람들은 세계에서 실행되는 것처럼 발견된 버그에 대한 보상이 있어야 한다고 지지할 것입니다. A100은 국가 테스터의 급여를 받아야 합니다. 그리고 테스터의 연봉인 것 같습니다.
나는 지원한다. 그러나 나는 그들이 명예 이사회와 졸업장으로만 자신을 제한할까봐 두렵습니다. :)
 

이것이 버그인지 아니면 CDealInfo PositionId () 및 Ticket () 클래스 메서드에 대한 잘못된 설명인지 모르겠습니다. 이 코드를 작성했습니다

 //+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong   ticket_deal;       // тикет сделки
ulong   ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   trade.Buy( 0.1 , _Symbol );
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print ( "ResultDeal() = " ,ticket_deal);
   Print ( "deal.PositionId() = " ,ticket_position);
  }
//+------------------------------------------------------------------+

결과

NM       0        14 : 06 : 49.083     test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE       0        14 : 06 : 49.083     test_01 (EURUSD,H1)     deal.PositionId() = 0

HistorySelect() 함수를 사용하여 트랜잭션 내역 요청을 추가하면 클래스 메서드가 작동하기 시작했습니다.

 //+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong   ticket_deal;       // тикет сделки
ulong   ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   trade.Buy( 0.1 , _Symbol );
   ticket_deal=trade.ResultDeal();
   HistorySelect ( 0 , TimeCurrent ());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print ( "ResultDeal() = " ,ticket_deal);
   Print ( "deal.PositionId() = " ,ticket_position);
  }
//+------------------------------------------------------------------+

결과

JM       0        14 : 16 : 33.055     test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF       0        14 : 16 : 33.055     test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov :

개인적으로 배열만 숨깁니다. 그리고 CClass 개체 자체는 사용자가 전체 액세스를 위해 사용할 수 있습니다. 이것이 의 목적입니다 . 읽기 전용이면 const를 넣습니다.

알았습니다. 어떤 디자인에서 유용할 수 있습니까? 이 접근 방식을 사용하면 배열 자체(크기 조정, 요소 교체 등)로 아무 것도 할 수 없다는 것을 이해합니다. 그러나 삭제를 적용할 수 있습니다 ...

다른 유형의 객체 에 대해 동일한 operator [] 구문이 있도록 템플릿을 사용하여 어딘가에서 수행한다고 가정합니다. 일반적으로 이 구조의 사용이 편리할 때 보여줄 수 있습니까?