새로운 MQL4 구문 - 페이지 4

 
맞습니다. 아주 좋은 이유가 없는 한 내 코드에는 bool, int, double 및 string만 있습니다. 인덱스에서 -1로 신경쓰지 않을 것입니다. 그렇지 않으면 이 인덱스에 더 가까운 모든 정수를 캐스팅해야 했습니다.
 
RaptorUK :

uchar - 부호 없는 문자, 이것을 루프에 사용하는 이유는 무엇입니까? 그것은 나에게 의미가 없습니다. . . 정수를 사용합니다. 당신은 ulongs와 함께 일하게 될 것입니다. 그것이 새로운 datetime 입니다. . . 그리고 미래 에 그것에 대해 생각 하지 않고 typecast 하면 경고 를 받게 됩니다 . . . 경고를 처리하거나 무시하십시오. 그래도 좋은 것만 바라지 말고 지금 하는 대로 하고 배우고 이해해

stackoverflow에서 게시한 내용은 나에게 의미가 있습니다. 좋은 조언이라고 생각합니다.

내 질문은 작은 변수 유형의 사용과 관련되어 있으므로 uchar는 단지 예일 뿐입니다. uchar는 0에서 255 사이의 8비트 양수 값이므로 0에서 100까지의 루프에 대해 원하는 경우 32비트 정수 대신 8비트 uchar를 사용할 수 있습니다.
 
SDC :
내 질문은 작은 변수 유형의 사용과 관련되어 있으므로 uchar는 단지 예일 뿐입니다. uchar는 0에서 255 사이의 1바이트 양수 값이므로 루프 0에서 100까지 1바이트 uchar를 사용할 수 있습니다.
예, 할 수 있습니다. . . 하지만 당신은 왜 하시겠습니까? 그것은 작동하지만 루프 카운터에 대한 문자 값을 위한 변수 유형을 사용하는 것이 논리적으로 의미가 있는 이유는 무엇입니까?

함수 에서 반환된 값을 저장해야 하고 해당 함수가 uchar를 반환하면 uchar 변수를 사용하여 반환된 값을 저장합니다. . . 원래 mql4에서는 이것이 문제가 아니었지만 새로운 mql4에서는 더 많은 문제가 될 것입니다.
 

제가 질문을 했을 때 제가 왜 원하는지 몰라서 질문을 한 이유입니다 lol ...

8비트 변수 유형이 32비트보다 빠르게 처리되는지 또는 속도가 더 느리거나 같을지, 8비트 값이 RAM이나 디스크 공간을 적게 사용하는지 알 수 없습니다. 이제 우리가 사용할 수 있는 작은 변수 유형이 있으므로 코드 블록의 요구 사항에 맞을 때 사용하는 것과 전체적으로 32비트 정수를 사용하는 것의 장단점을 알고 싶었습니다.

32비트 OS가 4개의 8비트 값을 동시에 처리할 수 있을 거라고 생각했지만 몰랐습니다. 분명히 아닙니다. 이것은 64비트 OS가 더 많은 RAM에 액세스할 수 있다는 사실을 제외하고는 32비트보다 실제로 훨씬 빠르지 않은 이유를 설명합니다. 나는 종종 그것에 대해 궁금했다.

 

해결책을 찾지 못한 질문이 있습니다.

void& 어떻게 사용하나요? 내 말은, DLL에 대한 포인터를 보내야 하는 경우입니다. 도움말 파일에는 이 void 유형을 사용하는 functions 가 있지만 소스의 아무 곳에나 배치하면 컴파일되지 않습니다. 템플릿을 해결 방법으로 사용하려고 했지만 #import 문 내에서 템플릿이 금지되어 있습니다.

단일 유형에 대한 구성을 관리했지만 명시적 유형을 지정하지 않는 한 DLL에 대한 전달 void& 배열 포인터를 구현할 수 없습니다.

 int   FileReadArray(
   int     file_handle,               // File handle
   void &  array[],                   // Array to record
   int     start= 0 ,                   // start array position to write
   int     count= WHOLE_ARRAY            // count to read
);
 
 

구조체 배열을 DLL에 전달하는 데 제한이 있습니까?

MT4Structure 가 단순한 구조 라고 가정 합니다.

kernel32.dll을 가져오면 단일 구조가 제대로 작동합니다.

 bool ReadFile(
     /*_In_         HANDLE*/ int hFile,
     /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
     /*_In_         DWORD*/ uint nNumberOfBytesToRead,
     /*_Out_opt_    LPDWORD*/ uint & lpNumberOfBytesRead[],
     /*_Inout_opt_  LPOVERLAPPED*/ int lpOverlapped
);

그러나 나는 구조 배열을 받아들이는 일을 시작할 수 없습니다. 컴파일러는 이 선언에 대한 매개변수로 전송되는 경우 MT4Structure&[] 로 컴파일되지 않습니다.

 bool ReadFile( int , MT4Structure&[], uint , uint &[], int );
 
Ovo :

구조체 배열을 DLL에 전달하는 데 제한이 있습니까?

다음과 같은 문제를 볼 수 없습니다.

 struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

예상대로 작동합니다(MT4 및 DLL에서 다른 기본 구조 정렬을 허용하는 경우).

(BTW, 실제로 MQL4 bool의 내부 표현이 무엇인지 확실하지 않지만 Win32 함수 를 int를 반환하는 것으로 선언하고 싶습니다. Win32 함수는 C++ bool이 아닌 BOOL을 반환합니다. BOOL은 Windows 매크로입니다. 4바이트 정수의 경우 값이 1/0인 반면 C++ bool은 단일 바이트입니다. 실제로 4바이트를 반환할 때 함수에서 단일 바이트의 반환 값을 기대하도록 MT4에 지시하면 다음을 수행할 수 있습니다. 가능성은 매우 낮습니다 - 스택 손상으로 끝납니다.)

 
Ovo :

void& 어떻게 사용하나요? 내 말은, DLL에 대한 포인터를 보내야 하는 경우입니다.

귀하의 질문이 무엇인지 잘 모르겠습니다. 예를 들어, Win32 API 문서에서는 void*를 사용하여 "이것은 모든 유형의 포인터를 허용합니다. Win32 함수 는 메모리 블록이 무엇인지 상관하지 않습니다"를 의미합니다.

 
gchrmt4 :

귀하의 질문이 무엇인지 잘 모르겠습니다. 예를 들어, Win32 API 문서에서는 void*를 사용하여 "이것은 모든 유형의 포인터를 허용합니다. Win32 함수는 메모리 블록이 무엇인지 상관하지 않습니다"를 의미합니다.


정확히. 그러나 MQL4에서는 불가능하고 #import 블록 내에서 템플릿 사용이 허용되지 않는 것 같습니다. 따라서 winapi와 함께 추가 구조 를 사용하면 새 유형이 필요할 때마다 #import 선언을 수동으로 업데이트하게 됩니다. 수입품을 한곳에서 관리하는 것이 제 의도였기 때문에 다소 불편했습니다.
 
Ovo :

정확히. 그러나 MQL4에서는 불가능하고 #import 블록 내에서 템플릿 사용이 허용되지 않는 것 같습니다. 따라서 winapi와 함께 추가 구조를 사용하면 새 유형이 필요할 때마다 #import 선언을 수동으로 업데이트하게 됩니다. 그것은 나에게 오히려 불편합니다.
여전히 이해하고 있는지 확실하지 않지만... MQL4 가져오기 를 void*로 선언할 수 있다고 생각하지 않습니다. 가져오기에서 특정 데이터 형식을 사용해야 하며 그런 다음 해당 데이터 형식으로 DLL 가져오기만 사용할 수 있습니다. 데이터 유형이 다른 동일한 DLL 함수를 사용하려는 경우 https://www.mql5.com/en/forum/148934 와 같은 해결 방법이 없는 한 문제가 있습니다.