일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항 - 페이지 27

 
Artyom Trishkin :
  1. 그것은 당신이 생성한 모든 개체의 터미널 하위 시스템에 의한 자동 제거를 호출하고 목록에 있는 개체에 대한 포인터를 목발이라고 불렀지만 개체의 수동 관리와 목발 생성은 고려하지 않았습니다. 이것은 목발
  2. 이것은 단락 1의 진술에 비추어 의문의 여지가 없었으며 결과적으로 귀하에게 답변한 주된 이유입니다.
  3. 그리고 이것에 대해서도, 그리고 같은 이유로.

컬렉션과 개체의 자동 삭제를 위해 컬렉션을 만드는 이유는 무엇입니까? :))) 수동 제어에 대해서는 전혀 이야기하지 않았습니다. 이거 어디서 났어?)

먼저 STL을 배우고 내가 말하는 내용을 이해하십시오.

 
Igor Makanu :

올바르게 복사하는 방법, 이 템플릿의 예를 들어 주시겠습니까?

도움말을 사용하여 AddValue 메서드를 작성했습니다. https://www.mql5.com/ru/docs/basis/types/classes

나는 머리를 다 깨버렸지만 MQL에서 내가 예제에서 쓴 것보다 다른 솔루션을 볼 수 없습니다!

적절한 데이터 스토리지 구현을 보여주세요.

당신의 경우에, 나는 그것을 의미했습니다.
 void   AddValue (const T & value )  { Tptr = new T( value ); mlist.Add(Tptr); }

하지만 여전히 잘못된 결정입니다. 정상적인 결정 - STL과 같은 것을 사용합니다. 귀하의 경우 std::list.

MQL5는 이것에 제한이 없다고 생각합니다. 동일한 VS의 STL 소스를 MQL로 변환할 수 있습니다.

 
구세대 중재자에는 적어도 두 명의 교수가 있었습니다. 프로그램 제작자. 지금은 없습니다. 그리고 그것은 매우 눈에 띈다)
 
Andrey Pogoreltsev :
당신의 경우에, 나는 그것을 의미했습니다.

그러나 여전히 잘못된 결정입니다. 정상적인 결정 - STL과 같은 것을 사용합니다. 귀하의 경우 std::list.

MQL5는 이것에 제한이 없다고 생각합니다. 동일한 VS의 STL 소스를 MQL로 변환할 수 있습니다.

다시 한 번 반복합니다. MQL은 C++가 아닙니다.

MQL의 객체에 대한 포인터는 본질적으로 핸들이고 C++의 포인터는 물리적 메모리 주소입니다.

C++ 라이브러리를 일대일로 MQL로 이식하는 요점은 무엇입니까?

 
Igor Makanu :

다시 한 번 반복합니다. MQL은 C++가 아닙니다.

MQL의 객체에 대한 포인터는 본질적으로 핸들이고 C++의 포인터는 물리적 메모리 주소입니다.

C++ 라이브러리를 일대일로 MQL로 이식하는 요점은 무엇입니까?

디자인 패턴을 적절하게 구현하고 제네릭을 사용하여 잠재적인 문제를 일으키지 않습니다.

놀랄 수도 있지만 OS 포인터도 가상입니다. 그들은 여전히 물리적 인 것으로 변환해야하지만 이것은 포인터로 작업하는 완전히 다른 수준입니다.

1 대 1 포팅은 작동하지 않지만 스트립 다운 C ++ 03은 가능하다고 생각합니다. 템플릿 및 연산자 지원도 가능합니다.

 
Andrey Pogoreltsev :

1. 놀랄 수도 있지만 OS 포인터도 가상입니다. 그들은 여전히 물리적 인 것으로 변환해야하지만 이것은 포인터로 작업하는 완전히 다른 수준입니다.

2. 1 대 1 포팅은 작동하지 않지만 스트립 다운 C ++ 03은 가능하다고 생각합니다. 템플릿 및 연산자 지원도 가능합니다.

1. 놀라지 않는다

2. 그게 사실입니다. 여러분이 함께 모여 C ++에서 포트를 만든다고 해도 여전히 의문이 제기될 것입니다. 왜 원본과 같지 않습니까? - 의미?

MQL 의 표준 라이브러리 가 있습니다. 이를 사용하면 향후 개발자의 지원이 제공될 것이라는 최소한의 보장이 있습니다. 이미 몇 번이나 화상을 입었습니다. 몇 년 전에 작성된 기사의 그래픽 구성 요소를 사용했지만 사용하기 편리하고 Delphi 구성 요소로 작업하는 것과 매우 유사하지만 더 심각한 프로젝트를 구현하려고 시작했을 때 기사 작성자로부터 단일 답변이 아닌 많은 질문을 받았습니다.

저명한 프로그래머가 누구에게 말했는지 기억나지 않지만 다음과 같습니다. 코드는 아름답거나 읽을 수 없어야 하며 작업을 수행해야 합니다.

당신과의 대화처럼, 내가 틀리지 않았다면 당신은 목록에 데이터가 있는 구조를 저장하기를 원했습니다. 동일한 작업에 대해 수행한 구현을 보여주었습니다. 구현이 작동합니까? - MQL 프로그램 실행 오류가 발생합니까? - 커뮤니케이션 과정에서 알아내는 것에 관심이 있습니다.

 

Andrey Pogoreltsev :

C++03이 가능하다고 생각합니다. 템플릿 및 연산자 지원도 가능합니다.

글쎄, 네, 성공))

 
Igor Makanu :

코드는 예쁘거나 읽을 수 없어야 하며 제 역할을 해야 합니다.

이것은 수정하기 전까지만 해당됩니다.

 

여하튼 이미 CLinkedList 클래스의 기존 버그를 지적했지만 복제하겠습니다. 목록의 시작 노드와 끝 노드는 서로 닫혀 있습니다. 마지막 노드의 다음은 첫 번째 노드를 가리키고 첫 번째 노드의 이전은 마지막 노드를 가리킵니다. 결과적으로 표준 반복 루프는 무한 루프로 바뀝니다.

 #include <Generic\LinkedList.mqh>

void OnStart ()
{
  CLinkedList< string > list;
   
  list.AddLast( "One" );
  list.AddLast( "Two" );
  list.AddLast( "Three" );
   int i= 0 ;
   for (CLinkedListNode< string > *node= list.First();  node!= NULL ;  node=node.Next())   // Цикл бесконечно бегает по кругу
    { }
} 

물론 C#에는 그런 넌센스가 없습니다. 마지막 노드의 Next 는 초기 노드의 Previous와 마찬가지로 0입니다.

이것이 개발자가 발명한 일종의 "기능"인지는 모르겠지만(비록 이점은 없지만) 어쨌든 라이브러리의 동작은 원본과 일치해야 합니다.

 
Alexey Navoykov :

이미 CLinkedList 클래스의 기존 버그를 어떻게든 지적했지만 복제하겠습니다. 목록의 시작 노드와 끝 노드는 서로 닫혀 있습니다. 마지막 노드의 다음은 첫 번째 노드를 가리키고 첫 번째 노드의 이전은 마지막 노드를 가리킵니다. 결과적으로 표준 반복 루프는 무한 루프로 바뀝니다.

물론 C#에는 그런 넌센스가 없습니다. 마지막 노드의 Next 는 초기 노드의 Previous와 마찬가지로 0입니다.

이것이 개발자가 발명한 일종의 "기능"인지는 모르겠지만(비록 이점은 없지만) 어쨌든 라이브러리의 동작은 원본과 일치해야 합니다.

도대체 여기서 또 무슨 일이? LinkedList 주제에 대한 적절한 게시물을 삭제합니다. 그래서 나는 유럽 어딘가에 익명의 중재자가 앉아 증오하는 러시아인의 게시물을 삭제하고 화를 내며 킥킥대는 모습을 상상합니다. 일종의 쓰레기 덤프, 쓰고 싶은 욕구가 사라집니다.