MQL5에는 항상 위업을 위한 장소가 있습니다! ;) - 페이지 8

 
박격포에 뭔가 kalamutite 물입니다.
변수에 대한 포인터, 함수에 대한 포인터, 참조로 주소를 가져오는 것 - 모두 MQL 제한 사항입니다.
이것은 구문에 의해 제공되지 않는 것이 아니라 메모리 작업에 대한 금지입니다.
void* 포인터도 일반적인 C 의미에서 포인터가 아닙니다.
이것은 클래스 객체가 복사되는 것을 방지하기 위해 작업하기 위한 객체입니다.
동일한 참조 &는 주소를 사용하지 않지만 스택에 복사하지 않고 개체를 전달하는 컴파일러 지정자입니다.
Xia로 작성하고 싶다면 Xia로 작성하고 dll을 import 하세요.

계란이 정말 가렵고 외부 dll이 허용되지 않는 경우 기본 dll에서 가져오는 것은 큰 죄가 아니며 이로 인해 MQL 제품의 가치가 손실되지 않습니다.

예를 들어, 터미널 프로세스 내부에서 메모리 작업을 하지 않으려면 4바이트 포인터를 사용하고 memcpy를 가져올 수 있습니다.

#가져오기 "msvcrt.dll"
int memcpy(short&,short&,int);
int memcpy(int&,int&,int);
int memcpy(더블&,더블&,int);
int memcpy(문자열, 문자열, 정수);
#수입

일종의 래퍼 클래스:

구조체 TPtr
{
정수 주소;
TPtr():addr(0){}
TPtr(const TPtr& r):addr(r.addr){}
템플릿<유형 이름 _T> TPtr 연산자 =(_T& r) {
addr = memcpy(r, r, 0);
이것을 반환하십시오;
}
};


글쎄, yusaja의 예:

문자열 sval = "123";
짧은 bval = 123;
정수 = 123;
이중 dval = 123.123;

TPtrp = sval;
intptrs = p.addr;
p = bval;
정수 ptrb = p.addr;
p = 이발;
정수 ptri = p.addr;
p = dval;
정수 ptrd = p.addr;

이런 식으로 원하는대로 메모리를 휘두를 수 있습니다 ... 일반적인 C 포인터는 아니지만 그럼에도 불구하고

무엇이 유용할 수 있습니까?
예를 들어 글로벌 변수를 사용하여 모듈 간에 데이터를 전송하지 않도록 GlobalAlloc 가져오기 기능을 사용할 수 있습니다.
GlobalAlloc은 올빼미 또는 칠면조 작업을 위해 엉덩이 또는 정적 내부 가상 머신과 연관되지 않은 프로세스에 메모리를 할당합니다.
모든 크기의 배열을 배치할 수 있으며 색인 생성을 위해 memcpy를 사용할 수 있습니다.

가져오기 예:

#define HANDLE int
#define LPVOID 정수

#가져오기 "kernel32.dll"
HANDLE GlobalAlloc(단위 플래그, 단위 cnt);
LPVOID GlobalLock(HANDLE hmem);
int GlobalUnlock(HANDLE hmem);
HANDLE GlobalFree(HANDLE hmem);
#가져오기 "ntdll.dll"
// GetLastError는 이미 MT에 존재하므로 WinAPI에서 사용:
정수 RtlGetLastWin32Error();
#수입


사용 예:

// 올빼미 N1, 요금 배열을 준비합니다.

MqlRates 비율[123];
// 여기에 기입
HANDLE memid = GlobalAlloc(GMEM_MOVEABLE, 123*sizeof(MqlRates));
LPVOID ptr=GlobalLock(중간);
memcpy(ptr,rates[0].time, 123*sizeof(MqlRates)); // 여기에서 컴파일하려면 가져오기에서 int memcpy(int&,const datetime&,int) 프로토타입을 만들어야 합니다.
GlobalUnlock(중간);
// 헬멧 메모리 설명자
EventChartCustom(CID, MY_SEND_DATA, 중간, 0, "");

// 올빼미 N2
무효 OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if( 아이디 == CHARTEVENT_CUSTOM+MY_SEND_DATA )
{
LPVOID ptr = GlobalLock((HANDLE)lparam);
MqlRates 비율[123];
// 수신된 요금
memcpy(rate[0].time,ptr,123*sizeof(MqlRates)); // 프로토타입 int memcpy(datetime&,const int&,int)
GlobalUnlock(중간);
글로벌프리(미드);
}
}

그게 다야.. 파이프 없음, 외부 파일, 왼쪽 dll 가져오기
나는 큰 가능성을 가진 작은 샘플만을 빠르게 던졌지만 생각의 비행에는 제한이 없습니다.
예, GlobalAlloc과 관련하여 특정 작업에 대한 포인터를 받기 위해 메모리 잠금 및 잠금 해제와 함께 GMEM_MOVEABLE을 사용하는 것이 좋습니다.
고정 글로브를 사용하는 경우. 메모리가 열리면 N번째 열린 디스크립터로 조각화가 발생할 수 있습니다 ...
로드에 따라 OS 커널이 원하는 방식입니다.
행운을 빌어요 해커들
 
alexsis78 :

예를 들어, 터미널 프로세스 내부에서 메모리 작업을 하지 않으려면 4바이트 포인터를 사용하고 memcpy를 가져올 수 있습니다.
당신은 스레드가 잘못되었습니다.
 

늙은 헨리 워렌의 "프로그래머를 위한 알고리즘 트릭"이라는 책이 있어서 그런 트릭이 많이 있습니다. 사실, 대부분의 예제는 C++ 포인터가 없기 때문에 MQL에서 작동하지 않습니다.

재미있는 걸 찾아봐야겠습니다.

 
C)))에서 내 예와 유사한 것을 찾지 못할 것입니다. 첫째, MQL입니다. 둘째, 포인터의 C 구문을 우회합니다.

플러스를 아는 사람들을 위한 또 다른 작은 설명.

C:
정수 변수 = 0; // var 변수 선언
정수*ptr = &var; // var 변수에 대한 포인터를 얻습니다.
intvar2 = *ptr; // var에 대한 포인터로 값을 var2에 복사

MQL에서:
#가져오기 "msvcrt.dll"
uint memcpy(int& 대상, const int& 소스, int cnt); // 목적지 변수의 주소를 얻기 위한 memcpy 프로토타입
uint memcpy(int& 대상, uint ptr, int cnt); // 주소 ptr에서 복사할 memcpy 프로토타입
// 컴파일러는 두 번째 인수의 유형 차이에 따라 두 프로토타입 중 하나를 대체합니다.
// uint와 같은 포인터 유형을 취합니다.
#수입

정수 변수 = 0;
단위 포인트 = memcpy(var,var,0); // var에 대한 ptr 포인터를 얻습니다(여기서 memcpy는 아무 것도 복사하지 않고 var의 주소를 반환함)
intvar2;
memcpy(var2, ptr, 4); // ptr 포인터에서 var2 변수로 4바이트 또는 sizeof(int) 복사(두 번째 memcpy 프로토타입 작동)

수신기가 당신에게 유용하기를 바랍니다)))
 
alexsis78 :
C)))에서 내 예와 유사한 것을 찾지 못할 것입니다. 첫째, MQL입니다. 둘째, 포인터의 C 구문을 우회합니다.
수신기가 당신에게 유용하기를 바랍니다)))

사람들이여, 무엇인가를 쓰기 위해 어떻게든 쓰지 마십시오.

memcpy 의 이러한 모든 옵션은 몇 년 전에 씹혀서 이 주제에 적합하지 않습니다.

 
o_O :

사람들이여, 무엇인가를 쓰기 위해 어떻게든 쓰지 마십시오.

memcpy의 이러한 모든 옵션은 몇 년 전에 씹혀서 이 주제에 적합하지 않습니다.

동의합니다. 포인터 산술이 없는 변형, 즉 결함이 있는 변형이 설명되었습니다. 예, 실제로 필요하지 않으며 C #에 없습니다. 안전하지 않은 것이 있지만 이것은 개인적인 용도로만 사용되며 네트워크 설치 금지 등 많은 제한이 있을 것입니다.
 

코드 베이스에 넣고 싶었지만 마음이 바뀌었습니다.

Kaggle에서 MQL5 사용, Digit Recognizer 작업

Digit Recognizer | Kaggle
  • www.kaggle.com
Kaggle is your home for data science. Learn new skills, build your career, collaborate with other data scientists, and compete in world-class machine learning challenges.
파일:
sampleMNIST.mq5  25 kb
 
o_O :

사람들이여, 무엇인가를 쓰기 위해 어떻게든 쓰지 마십시오.

memcpy의 이러한 모든 옵션은 몇 년 전에 씹혀서 이 주제에 적합하지 않습니다.

"적합하지 않은" 이유는 무엇입니까?

어딘지 잊어서 못찾았는데...

그건 그렇고, 나는 외부 DLL을 포함하지 않고 배열에 대한 포인터를 저장하는 것이 위업이라고 생각합니다. 표시기를 시작할 때마다 DLL에서 함수 가져오기에 동의한다는 것을 확인하고 싶지 않습니다.

 
George Merts :

"적합하지 않은" 이유는 무엇입니까?

어딘지 잊어서 못찾았는데...

그건 그렇고, 나는 외부 DLL을 포함하지 않고 배열에 대한 포인터를 저장하는 것이 위업이라고 생각합니다. 표시기를 시작할 때마다 DLL에서 함수 가져오기에 동의한다는 것을 확인하고 싶지 않습니다.

클래스에서 배열을 래핑하면 new를 통해 배열에 대한 MQL 의사 포인터를 만들 수 있습니다.
 
Alexey Volchanskiy :
클래스에서 배열을 래핑하면 new를 통해 배열에 대한 MQL 의사 포인터를 만들 수 있습니다.

Aleksey, OnCalculate() 함수 에 의해 생성된 배열을 클래스로 래핑하는 방법을 알려주실 수 있습니까? 이 경우 포인터 복사는 필수 불가결합니다.

이제 - 데이터를 배열 클래스에 복사한 다음 이미 이 개체에 대한 포인터를 가져오고 있습니다. 그러나 내가 볼 때 빈번한 틱과 많은 차트로 인해 "무거움"이 상당히 눈에 띄게 추가되는 불필요한 복사가 나타납니다. 나는 이 카피에서 벗어나고 싶다. 그러나 DLL을 통한 목발을 제외하고(적어도 표준, 최소한 samopisnuyu) - 아무것도 제공하지 않을 때까지.

서비스 데스크에서 그들은 반격하며 "객체를 삭제할 수 있습니다."라고 말합니다. 이것들은 그들 자신의 배열입니다! 객체를 생성한 다음 삭제할 수 있으며 포인터가 무효화될 수 있다고 하면 "이는 내가 책임지겠습니다."라고 대답합니다. "이중 도덕"이 있습니다.

그리고 지옥에, 이 DLL을 사용하여 - 그러나 시작 시 그러한 표시기는 지속적인 확인을 요구합니다 - 이는 매우 혼란스럽습니다 ...