배열 참조

 

동기:

사실 칠면조에서는 종종 OnCalculate에 전달되는 시계열에 액세스해야 합니다.

이러한 함수의 중첩은 매우 중요할 수 있으며 전체 호출 체인을 따라 매개변수로 OnCalculate에서 이 배열을 끌어야 합니다.

체인의 상당 부분에서 이 배열이 필요하지 않다는 사실에도 불구하고.

원하는 것:

다음과 같은 일종의 배열 참조:

 class TimeReference
{
//
   datetime Time[];
};

TimeReference TimeRef;

datetime F()
{
   return TimeRef.Time[ 0 ];
}

int OnCalculate ( const int bars,
                 const int counted,
                 const datetime & time[],
                 const double & open[],
                 const double & high[],
                 const double & low[],
                 const double & close[],
                 const long & tick_volume[],
                 const long & volume[],
                 const int & sprd[])
{
   TimeRef.Assign(time);
   F();
}

하지만. 전제 조건은 어레이 복사 가 없어야 한다는 것입니다.

언뜻보기에 욕망은 실현 불가능한 것처럼 보일 것입니다. 그러나 이것이 가능하다는 의심이 있습니다.

무슨 말씀이세요, 여러분?

 

그것은 기억의 조각입니다. MQL에는 명시적 메모리 포인터가 없습니다.

그러나 memcpy 를 통해 얻을 수 있습니다. 그녀는 필요한 것을 반환합니다.

그런 다음 원하는 위치로 값을 끌 수 있습니다. 마찬가지로 memcpy를 값으로 사용합니다.

DLL에 대한 내 기사를 참조하십시오.

 
sergeev :
이 포인터를 다시 가져오려면 어떻게 해야 합니까?
 
같은 memcpy . 실제로 포인터도 해당 포인터로 전송됩니다.
 
sergeev :
같은 memcpy. 실제로 포인터도 해당 포인터로 전송됩니다.

아니요, 포인터를 잡을 수는 있지만 미끄러지지는 않습니다.

__________

좋아, 간단히 말해서, 여전히 정상적으로 하기에는 여전히 비현실적이다.

 
TheXpert :
아니요, 포인터를 잡을 수는 있지만 미끄러지지는 않습니다.

그리고 그것을 미끄러 져 확인하십시오.

 
sergeev :

그리고 그것을 미끄러 져 확인하십시오.

예를 보여주세요.
 
TheXpert :
예를 보여주세요.

글쎄, 기사에서

코드를 붙여넣으려고 합니다. 서버가 멈춥니다.

 
sergeev :

글쎄, 기사에서

그냥 기사에 없습니다. 여기서 메모리 복사만 어레이에서 사전 준비된 어레이로 이루어집니다.
 
https://www.mql5.com/en/articles/364#3

첫 번째 예

int 소스가 전달됨 - 기본적으로 메모리 주소

배열 char Dest[10]에 복사

Избавляемся от балласта самодельных DLL
Избавляемся от балласта самодельных DLL
  • 2012.01.31
  • o_O
  • www.mql5.com
Если MQL5-программисту недостаточно функционала языка, он вынужден обращаться к дополнительным инструментам. Для этого приходится использовать другой язык программирования и создавать промежуточную DLL. В MQL5 имеется механизм представления разных типов данных с помощью структур и передачи их в API, но к сожалению, MQL5 не отвечает нам на вопрос о том, как вытянуть данные из принятого указателя. В данной статье мы поставим точку в этом вопросе и покажем простые механизмы обмена сложными типами данных и работе с ними.
 

글쎄, 당신은 그것을 어떻게 얻었습니까? 지금 모든 유형에 대해 memcpy를 오버로드하시겠습니까?

64비트의 경우 주소 크기가 길다는 것을 잊지 마십시오.

--------------

제안 번호 1: 개발자에게 long ArrayGetAddress( object array) 와 같은 기본 함수를 만들도록 요청할 가치가 있다고 생각하십니까?

그들이 이에 동의하지 않으면 두 가지 제안을 하십시오. #ifdef를 통해 푸시해야 합니다. Renat는 그것을 소개하기로 약속했습니다.