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

 
Interesting :

동적 개체를 만들지 마십시오. 지금 및 이러한 개체와 관련된 다른 모든 것을 사용할 필요가 없습니다(참이면 많은 작업을 수행할 수 없습니다).

분명히 지금의 의미가 아니라 동적 개체로 작업하는 의미가 무엇인지 이해하고 싶습니다 ...

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 인용) :) ////////////////////////////////////////////// /// ///////////////

무효 OnStart()
{
//---
프라이머 개체;
obekt.f1();
}
//+----------------------------------------------- --------------------+
클래스 입문서
{
공공의:
무효 f1();

뇌관();
};

프라이머::프라이머()
{
Alert("여기도 초기화는 생성 시에만 있는 것 같아요.");
};

프라이머::f1()
{
국제[];
배열 크기 조정(l,3);
l[0]=87;
l[1]=67;
l[2]=57;
배열 크기 조정(l,5);
l[3]=47;
l[4]=37;
경고(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]);
};

이러한 코드는 오류를 제공하지 않으며 배열은 동적입니다. 왜????

그리고 그것을 파괴하고 싶다면:

{

프라이머 개체;
obekt.f1();


}

C++을 가져와 주소 작업을 망쳐 MQL에 밀어 넣은 것 같습니다.

 

220Volt :

추가로 내 텍스트가 있습니다 (나는 견적에서 벗어날 수 없습니다) :)

이러한 코드는 오류를 제공하지 않으며 배열은 동적입니다. 왜????

1. 그리고 왜 에러와 함께 실행되어야 하나요???

a) 객체는 자동으로 생성되고(OnStart에서 객체 인스턴스를 선언하는 방식 때문), 자동으로 삭제된다.

 primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
primer *obekt2; //Указатель на динамический объект

void OnStart ()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete (obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

객체의 경우 인스턴스를 자동으로 또는 동적으로 생성할 수 있습니다. 첫 번째 경우 생성자는 일반적으로 초기화 시 실행되고 두 번째 경우에는 new 연산자를 사용한 후에만 생성자가 실행됩니다.

b) f1()에서도 사물의 논리에 따르면 오류가 없어야 합니다(개인적으로는 다른 구현을 했을 것입니다).

동적 배열의 경우. 정적 배열과의 차이점은 이러한 배열에는 미리 알려진 차원이 없다는 것입니다. 즉, 이러한 배열로 작업하기 전에 ArrayResize 를 사용하여 지정해야 합니다(새 크기는 배열의 첫 번째 차원에 표시됨). 배열 요소는 0부터 번호가 매겨집니다.

2. 동적 개체로 작업하는 데 관심이 있다면 이 예제를 주의 깊게 연구하십시오 - Teetris (비록 나는 그가 이전 포럼에서 무엇을 하는지 여전히 이해할 수 없지만) ...

 

방해해서 죄송합니다. 정말 이해하고 싶습니다. 나는 나의 비전을 말할 것이다, 내가 무엇을 잘못했는가 ???

C++ 항목 보기(프라이머 클래스가 선언됨)

프라이머 *지시자=새로운 프라이머;

ukazatel은 우리 객체가 저장된 메모리의 주소, 즉 프라이머 클래스의 복사본을 포함한다고 말합니다. 주소는 MQL에서 제거되었으며 ukazatel에는 개체 설명자가 포함되어 있습니다. 이것은 우리에게 무엇을 제공합니까? 내가 알아차린 유일한 차이점은 블록 내부에서 new를 통해 객체를 선언하고 블록이 완료되기 전에 delete를 사용하는 것을 잊었다면 프로그램이 종료될 때만 객체가 삭제된다는 것입니다. 그리고 블록을 종료한 후에는 디스크립터를 통한 이 객체와의 연결이 끊어집니다.

new를 통해 선언하면 객체의 메모리가 동적으로 할당되고(즉, 크기를 늘릴 수 있는 기능이 있음) new가 없으면 객체는 정적 변수 만 가질 수 있다는 아이디어가 있었습니다. 그러나 내 가정은 확인되지 않았습니다 (전에 게시 한 스크립트, 객체는 new를 통해 선언되지 않지만 동적 변수를 처리합니다).

그리고 지금, 이러한 모든 열정 끝에 나는 그다지 아름답지 않은 상황에 처해 있으며 새것과 새것의 차이가 무엇인지 전혀 이해하지 못합니다 ??? 그리고 컴파일러 자체가 거기에서 뭔가를 고친다면 왜 내가 귀찮게 해야 합니까 ???

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

나는 문서에 설명된 것과 같은 것을 시도했습니다(새로운 것에 대해 알아내기 위해):

스위치(5)

{

사례 5: m_shape= 새로운 CTetrisShape1; // 이 옵션은 전혀 롤링되지 않습니다(그리고 이것은 문서에서 가져온 것입니다 !!!) 이 방법으로만

( m_shape= 새로운 CTetrisShape1; )

}

이제 m_shape.___ 개체에 액세스할 수 없습니다. 오류가 발생합니다.

 

220Volt :

그리고 지금, 이러한 모든 열정 끝에 나는 그다지 아름답지 않은 상황에 처해 있으며 새것과 새것의 차이가 무엇인지 전혀 이해하지 못합니다 ??? 그리고 컴파일러 자체가 거기에서 뭔가를 고친다면 왜 내가 귀찮게 해야 합니까 ???

객체 인스턴스는 new if 연산자를 사용하여 동적으로 생성됩니다(이것이 Tetris 예제를 보도록 요청한 이유입니다).

1. 객체 인스턴스의 수는 미리 알 수 없습니다(그러나 항상 하나 이상이 있다고 가정합니다).

2. 동일한 조상을 가진 "잡종" 개체에 대한 포인터 배열을 만들어야 하는 경우

3. 객체(또는 오히려 이 객체에 대한 포인터)가 프로시저나 함수의 매개변수로 사용된다고 가정하는 경우(이를 라이브러리에 전달해야 할 수도 있음)

4. 프로그램의 다른 위치에서 하나의 개체(이 개체에 대한 포인터로 읽음)로 작업해야 하는 경우. 예를 들어, 하나의 동일한 "주문" 개체가 다음 위치에 있을 수 있습니다. 특정 기호에 대한 주문 배열; 특정 위치와 더 많은 위치를 형성하는 주문의 배열.

5. 동적으로 생성된 서약과 그에 대한 포인터를 사용하여 해결해야 하는 더 많은 작업이 있습니다.

 
220Volt :

나는 문서에 설명된 것과 같은 것을 시도했습니다(새로운 것에 대해 알아내기 위해):

...........................

이제 m_shape.___ 개체에 액세스할 수 없습니다. 오류가 발생합니다.

실제로 테트리스 자체의 예에서 이것이 구현된 방식입니다(귀하의 경우 에는 break 문 이 누락되었습니다)

   switch (nshape)
     {
       case 0 : m_shape= new CTetrisShape1; break ;
       case 1 : m_shape= new CTetrisShape2; break ;
       case 2 : m_shape= new CTetrisShape3; break ;
       case 3 : m_shape= new CTetrisShape4; break ;
       case 4 : m_shape= new CTetrisShape5; break ;
       case 5 : m_shape= new CTetrisShape6; break ;
       case 6 : m_shape= new CTetrisShape7; break ;
     }

동시에 포인터가 NULL인지 확인하는 것을 잊지 마십시오.

 if (m_shape!= NULL )
 {
//С указателем можно работать
 }
 

도움을 주셔서 감사 합니다
 

개발자.

테스터에서 작동하지 않거나 특정 기능과 작동하는 모든 항목을 "명시적 형식"으로 문서에 지정하여 불필요한 질문이 없도록 하십시오.

예를 들어, 현지 시간 및 GMT 시간(서버 시간과 동일) 작업의 특성과 TimeGMTOffset에서 예상한 결과를 얻는 것이 어렵다는 점을 명시적으로 지적해야 합니다.

 

누가 알겠습니까? 유니코드 문자 배열을 문자열로 변환하는 일반적인 방법이 있습니까?

 
TheXpert :

누가 알겠습니까? 유니코드 문자 배열을 문자열로 변환하는 일반적인 방법이 있습니까?

배열의 각 요소를 별도로 번역해야 할 것 같습니다.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5