배열 참조 - 페이지 6

 

정보를 위해:

  1. MQL5의 모든 배열은 참조(스택의 4 또는 8바이트)로만 전달되므로 함수 내부에 배열을 전달하는 것을 두려워하지 마십시오. 특별한 비용은 없습니다.
  2. 추출된 실제 메모리 참조, 특히 터미널 자체에서 관리하는 배열에 대한 참조( 표시기 버퍼 , OHLC 버퍼)를 저장하는 것은 실제로 변경/재할당되기 때문에 매우 위험합니다. 또한 Expert Advisor의 호출(스크립트 코드 종료 및 입력) 간의 문서화되지 않은 링크를 저장하는 것은 불가능합니다.
  3. 배열을 DLL에 전달할 때 데이터 블록의 시작 주소를 지정하고 차원을 별도로 지정해야 합니다.
 
mql5 :

먼저 WHY를 이해해야 합니다. 그리고 그게 무슨 소용입니까?

글쎄요, 당신은 링크를 만들고 싶지 않습니다. 우리가 직접 만들 것입니다.

그리고 참가자들 덕분에 이 스레드의 메시지 덕분에 도움말의 설명 이 구식이라는 것을 알았습니다...

네, 농담입니다.) 근데 사실 이게 도움말에 올라올 줄은 상상도 못했어요.

그러면 모든 깃발에 대해 말씀해 주시겠습니까?

레나트 :

정보를 위해:

  1. MQL5의 모든 배열은 참조(스택의 4 또는 8바이트)로만 전달되므로 함수 내부에 배열을 전달하는 것을 두려워하지 마십시오. 특별한 비용은 없습니다.

나는 두렵지 않다, 나는 그것이 싸다는 것을 완벽하게 잘 이해한다. 불편할 뿐입니다.

  1. 추출된 실제 메모리 참조, 특히 터미널 자체에서 관리하는 배열에 대한 참조( 표시기 버퍼 , OHLC 버퍼)를 저장하는 것은 실제로 변경/재할당되기 때문에 매우 위험합니다. 또한 Expert Advisor의 호출(스크립트 코드 종료 및 입력) 간의 문서화되지 않은 링크를 저장하는 것은 불가능합니다.

이 순간에 대해 더 자세히 알려주세요 - OnCalculate 동안 스토리지 재할당이 가능하지 않다면?? 파이퍼입니다.

통화 사이에 대해서는 물론입니다.

일반적으로 칠면조나 터미널을 충돌시키는 기능을 갖는 것은 제 관심사가 아니므로 가장 안전한 옵션을 게시하겠습니다.

 
TheXpert :

이 순간에 대해 좀 더 자세히 알려주세요 - OnCalculate 동안 스토리지 재할당이 가능하지 않다면?? 파이퍼입니다.


"중"이 아니라 - 그리고 그 사이.
 
TheXpert :

이 순간에 대해 좀 더 자세히 알려주세요 - OnCalculate 동안 스토리지 재할당이 가능하지 않다면?? 파이퍼입니다.

통화 사이에 대해서는 물론입니다.

확실히 통화 간의 가능한 재분배에 대한 연설입니다.

문제는 누군가가 분명히 실수로 호출 사이의 링크를 명시적으로 저장하거나 99%의 경우 충돌이 발생할 때까지 모든 것이 작동한다는 것입니다. 그 다음에는 "메타쿼츠 탓이다"라는 생각이 꽤 들 것이다.

예를 들어, 우리 동지 중 한 명이 그러한 생각을 방송하고 몇 년 동안 계속 방송하면서 도전 사이의 역사가 펌프 / 변경 될 수 있다는 사실을 받아들이지 못했습니다.

 
Renat :

확실히 통화 간의 가능한 재분배에 대한 연설입니다.

문제는 누군가가 분명히 실수로 호출 사이의 링크를 명시적으로 저장하거나 99%의 경우 충돌이 발생할 때까지 모든 것이 작동한다는 것입니다. 그 다음에는 "메타쿼츠 탓이다"라는 생각이 꽤 들 것이다.

"죄책감을 두려워하기 위해-앞으로 가지 마십시오"(c)

그리고 한 가지 더: 하지 않은 것보다 한 것을 후회하는 것이 낫다.

Renat, 참조 변수가 문제의 잠재적인 원인이라는 데 동의한다고 가정해 보겠습니다. 그러나 이것은 거의 모든 악기에 대해 말할 수 있습니다. 스크루드라이버를 가지고 있는 사람들이 때때로 다른 사람들을 찌릅니다. 이제 드라이버를 금지하지 않습니까? 게다가 집에서 아무 문제 없이 만들 수 있기 때문에 단순히 생산에서 제거하는 것은 의미가 없습니다.

mql 엔터티로서의 "참조"는 변수의 형태가 아니라 함수에서 참조( lvalue )를 반환하는 기능의 형태로 매우 바람직합니다. 이렇게 하면 컨테이너에 대해 최소한 매우 빠른 왼쪽 인덱서를 만들고 모든 종류의 기타 추가 기능을 많이 제공할 수 있습니다. 유형:

MyTree.Search(Key).GetElement() = NewVal;

그리고 결국, 나는 분명히 함수에서 지역 변수 에 대한 참조를 반환하려는 사람들이 있다는 것을 이해합니다!

그리고 이제 무엇을? 바보가 그들과 함께 인생을 어렵게 만들 수 있기 때문에 링크를 잊어 버리셨습니까? :)

--

이것은 mql5의 한계입니다(링크 부족과 유사). 때때로 "DLL로 탈출"하도록 강력하게 동기를 부여하여 MT5를 브로커와의 통신을 제공하는 "시장 동인"으로 바꿉니다. 그러나 원래 아이디어는 정반대였습니다. " 모든 것이 바로 여기에 있습니다 ."

 

우리는 최대한의 언어 보안을 목표로 하므로 돌아갈 방법이 없습니다.

원시 링크로 작업하는 것은 충돌을 향한 견고하고 확실한 단계입니다. 그리고 전체 가상화 시스템을 제거한 프로그램은 떨어질 수 없습니다.

우리의 결정은 완전히 의식적입니다. MQL5는 사람의 개입 없이 수많은 컴퓨터에서 실행되는 프로그램을 작성 하는 데 사용됩니다.

 

일반적으로 누가 그것을 필요로하는지, 나는 원칙이 명확하기를 바랍니다. 나는 자기 이익을 위해 당분간 구현을 유지할 것입니다. 그러나 그것은 열릴 것이고 열릴 것입니다.

int와 같은 기본 유형에 대한 참조가 훨씬 쉽고 문제 없이 만들어졌다고 설명할 필요가 없다고 생각합니다.

구현에서 어려움과 질문을 일으키는 유일한 문제는 기본 변수의 범위입니다. 실제로 구현 및 아이디어에 대한 매우 넓은 분야가 있습니다.

__________

동기를 부여하기 위해 링크가 래퍼와 같은 추가 기능의 전체 계층을 열어준다는 점은 주목할 가치가 있습니다.

 
lvalue 참조가 계획되어 있습니다...
 
mql5 :
lvalue 참조가 계획되어 있습니다...
젠장, 그들은 즉시 말할 것입니다) 나는 고통받지 않을 것입니다. 그러나 이것은 훌륭합니다.
 

모두를 환영합니다.


8년 동안 달라진 것이 있는지 궁금합니다.

아니면 msvcrt.dll과 memcpy 함수를 사용해야만 OnCalculate()에서 배열 주소를 얻을 수 있습니까?

아니면 모든 사람들이 여전히 전체 클래스 구조 를 통해 배열에 대한 참조를 "끌고" 있습니까(선택 사항은 자체 배열을 구성하고 매번 내용을 복사하는 것입니다)?