기고글 토론 "DLL 생성이 불필요한 이유" - 페이지 2

 

이 기사의 저자는자전거 dll없이 IPC 상호 운용성에 대한 정보에 대한 접근 가능한 프레젠테이션에 대해 매우 감사합니다.

메모리 작업은 다소 복잡해 보이지만 몇 가지 질문을 제외하고는 접근 방식이 명확하므로 지식이 풍부한 사람들이 이해하는 데 도움이되기를 바랍니다:

1. memcpy의 도움으로 2바이트 변수를 짧은 배열 uchar[2]에 복사하는데, 이 정보가 배열 자체에 어떻게 저장되나요?

uchar 배열의 인덱스 0과 1에 있는 값은 어떤 형식일까요?

uchar dst[2];
short src = 13331;
memcpy(dst, src, sizeof(src));

uchar[0] = ?, uchar[1] = ?;

값은 바이트 단위로 분할되어 배열에 기록됩니다. 나는 여기서 이해한다고 생각합니다.

이 배열에 어떤 값이 속하는지, 그리고 그 값에서 원래 값을 얻는 방법을 이해할 수 없으며 문제는 이러한 값을 화면에 표시 할 수 없다는 것이 아닙니다.


2. 예를 들어 memcpy를 복사 할 때 uchar[4] 배열을 다른 유형의 값으로 올바르게 채우는 방법:

uchar dst[4];
short src1 = 2;
short src2 = 13331;
memcpy(dst, src1, sizeof(src1));
memcpy(dst, src2, sizeof(src2)); // 이미 존재하는 값을 덮어씁니다. 즉, dst에 쓸 때 src1을 쓴 후 2바이트의 오프셋으로 주소를 지정해야 한다고 가정합니다.

대답이 사소하고 모든 것이 간단하게 끝나는 것처럼 느껴지지만 올바르게 적는 방법은 무엇입니까?

 

인쇄를 사용해 보셨나요?

 

네 번째 예제에서 오류가 발생합니다: '연산자=' - 잘못된 연산 사용 SAMPLE_04.mq4 34 7

#property copyright ""

#property link      ""

#property version   ""

#property strict

//Пример 4. Копирование структур средствами MQL5

//---

struct str1

{

  double d; // 8 байт

  long   l; // 8 байт

  int i[3]; // 3 * 4 = 12 байт

};

//---

struct str2

{

  uchar c[ 8 + 8 + 12 ]; // размер структуры str1

};

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart(){

  str1 src;   // 

  src.d = -1; // 

  src.l = 20; //

  //--- заполняем параметры структуры

  ArrayInitialize(src.i, 0); 

  str2 dst;  //  

  //--- превратили структуру в байтовый массив

  dst = src; //   <----- Ошибка

}


메모리 섹션에 대한 아이디어는 이해하지만 정의가 올바르지 않을 수도 있나요?

그 이유가 무엇인지 알려주시겠어요?

미리 감사드립니다.
 
_SERG_:

메모리 위치에 대한 개념은 명확하지만 정의에 뭔가 잘못된 것이 있을까요?

그 이유는 무엇일까요?

다른 유형의 구조체는 더 이상 복사할 수 없으며, MQL은 이 가능성을 제거했습니다.

유니온 사용

//예제 4. MQL5를 사용하여 구조 복사하기
//---
struct str1
{
  double d; // 8 바이트
  long   l; // 8 바이트
  int i[3]; // 3 * 4 = 12 바이트
};

//---
struct str2
{
  uchar c[ 8 + 8 + 12 ]; // str1 구조 크기
};

union str12 { str1 s1; str2 s2; };

//------------------------------------------------------------------
void OnStart()
{
  str12 src;
  src.s1.d = -1; // 
  src.s1.l = 20; //
  ArrayInitialize(src.s1.i, 0); 

  // src.s2 - S1의 바이트 배열
}
 
_SERG_:


그런데 uchar는 틀렸고, 의심스럽게도 double도 거기에 존재합니다.

그건 그렇고 src는 정확히 무엇에 속하고 전달 될지 지정해야합니다.

누군가 이미 제안한대로 수정했습니다. 잘됐네요. 생각해보세요. 행운을 빕니다.

 
현재 MQL4에서 작동하나요?
 
Seric29:
오늘 MQL4에서 작동하나요?

언어(MQL4/MQL5)는 현재 완전히 동일합니다. 차이점은 MQL4에서 누락된 2-3개의 기능(ArrayPrint 및 기타 작은 기능)과 MQL5의 "새로운 기능"(데이터베이스, DirectX 및 OpenCL)에 있습니다.


하지만 이 기사는 8년 전에 작성되었으며, 이제 MQL은 엄격하게 타입이 지정된 언어가 되었고, 2개의 구조를 할당하려면 (기사에서 예로 든) 복사 생성자를 작성하거나 구조를 바이트 배열로 직렬화했다가 다시 되돌려야 합니다.

 
귀하의 기사는 나에게 매우 큰 도움이되었지만 기사를 복사하는 방법은 함수 포인터를 언급하지 않았으므로 콜백 함수 포인터를 다음과 같이 전달해야하기 때문에 함수 포인터를 언급하지 않았습니다. 구현하는 방법을 모르겠습니다.
 
Example 4. Copying the structures by means of MQL5
struct str1
{
  double d; // 8 바이트
  long l;   // 8 바이트
  int i[3]; // 3*4=12 바이트
};
struct str2
{
  uchar c[8+8+12]; // str1 구조 크기
};
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수|
//+------------------------------------------------------------------+
void OnStart()
{
  str1 src; 
  src.d=-1;
  src.l=20;
  //--- 구조 매개변수 채우기
  ArrayInitialize(src.i, 0); 
  str2 dst;
  //--- 구조를 바이트 배열로 바꾸기
  dst=src; 
}

다른 유형의 구조체를 할당하는 것이 더 이상 작동하지 않습니다(매개변수 변환이 허용되지 않음 - 동일한 유형의 변수가 예상됨).

하지만 유니온으로 작업하는 것은 가능합니다:

struct str1
{
  double d; // 8 바이트
  long l;   // 8 바이트
  int i[3]; // 3*4=12 바이트
};
struct str2
{
  uchar c[8+8+12]; // str1 구조 크기
};
union union1
{
  str1 src;
  str2 dst;
};

//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수|
//+------------------------------------------------------------------+
void OnStart()
{
  union1 u; 
  u.src.d=-1;
  u.src.l=20;
  //--- 구조 매개변수 채우기
  ArrayInitialize(u.src.i, 0); 

  //--- 구조를 나타내는 바이트 배열이 dst.c에 있습니다.
  ArrayPrint(u.dst.c);
 
함수에 대한 실제 포인터를 얻을 수 있는지 궁금합니다. typedef를 사용하여 얻은 포인터는 mql 프로그램 내에서 완벽하게 작동합니다. 그러나 불행히도 나는 그것들을 dll에 전달하지 못했습니다.