오류, 버그, 질문 - 페이지 2577

 
Igor Makanu :

이 옵션을 알고 있습니다

그런 다음 0으로 나눕니다 .

 
fxsaber :

그런 다음 0으로 나눕니다 .

mon...희망은 있었지만 언제나처럼 하드코어)))

 
Vict :

ZY: 일반적으로 회선과 통신할 수 없습니까? wchar_t에 배열을 저장하고 구동하고 필요한 경우 µl 내부에서 문자열로 변환합니다. https://www.mql5.com/en/docs/convert/shortarraytostring

동의한다

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

WinAPI -> MQL5 x64

A100 , 2018.05.29 14:11

모든 규칙이 언급되었습니다. 항상 작동하게 하려면 ushort를 사용해야 하고 문자열 작업이 갑자기 중단된 이유(어제 작동한 것)를 파악하려면 string을 사용할 수 있습니다.

 
Vict :

여기 당신은 범위를 벗어났습니다


StringInit(out, 165, 32);

도움말 StringInit에 따르면 두 번째 매개 변수는 문자열의 길이이고 내가 이해하는 문자열의 길이는 문자열의 문자 수입니다.
제 경우에는 입력 문자열이 164자라 두 번째 매개변수에 165를 설정하고 * 2, 330 이상을 시도했습니다.

포인터와 함께 memcpy_s 사용,

memcpy_s( out , wcslen(data) * sizeof (wchar_t*), data, wcslen(data) * sizeof (wchar_t*));

결과는 동일하고 문자열의 끝은 항상 문자 수만큼 부동하며 구문 분석 중에 누수가 있습니다.
포인터가 없으면 문자열도 부동합니다.

그러나 여기에서 당신은 나에게 아이디어를 주었고 StringInit(out, 1400, 32)에서 나는 문자열의 길이가 아니라 포인터의 바이트 단위 크기를 설정했습니다.
그리고 보라, 그 행은 추가 출력 문자 없이 문제 없이 구문 분석되었으며 단일 누출도 없었습니다.
포인터 없이 문자열이 떠 있는 크기의 포인터가 있다는 점에 유의하고 싶습니다.

이것은 개발자에게 질문을 던집니다. StringInit 도움말이 올바른가요???
도움말이나 StringInit 함수 자체에서 문자열의 길이가 문자열의 크기와 섞여 있습니까?
일반적으로 이제 memcpy를 사용하면 포인터의 크기를 전달하면 올바르게 작동하고 StringInit는 길이가 아닌 이 크기로 초기화됩니다!

 
A100 :

동의한다

예, 저도 동의합니다. 그러나 특히 이 문자열을 여러 함수를 통해 전달해야 하는 경우 문자열을 배열로 사용하는 것이 항상 편리한 것은 아닙니다.
이 경우 포인터가 더 편리하며 각 전송 함수에서 이 배열을 다시 채우고 배열에 대한 매개변수인 크기를 하나 더 입력할 필요가 없습니다.

 
A100 :

따라서 분명히 과도한 크기(경계 이동)의 버퍼를 할당했고 오류는 단순히 표시되지 않습니다. 이는 경계에서 정확하게 발생했기 때문입니다.

나도 그렇게 생각했는데 문자열의 길이가 164이고 165로 설정하고 330으로 설정합니다.
문자열이 문자로 계산되는 경우 330은 분명히 문자열 길이 제한이 아닙니다.
길이가 아니라 바이트 크기에 관한 것으로 밝혀졌습니다.
그러나 도움말은 StringInit 이 정확히 길이를 가져야 한다고 반대합니다.

일반적으로 내가 이해하는 것처럼 mql 문자열 유형은 포인터이며 포인터와 마찬가지로 이 유형으로 작업해야 합니다.

 
또한 터미널 0이 있는지 dll에서 결과 문자열을 확인하기로 결정했습니다.
제로 사용 가능
 for ( int index = 0 ; index <= wcslen(data); ++index)
   wcout << static_cast< int >(data[index]) << " " ;
 123 34 101 34 58 34 97 103 103 84 114 97 100 101 34 44 34 69 34 58 49 53 54 57 54 50 52 50 50 57 50 51 54 44 34 115 34 58 34 66 84 
67 85 83 68 84 34 44 34 97 34 58 49 54 54 50 49 57 49 55 53 44 34 112 34 58 34 56 50 48 50 46 49 48 48 48 48 48 48 48 34 44 34 113 
34 58 34 48 46 48 51 51 50 51 48 48 48 34 44 34 102 34 58 49 56 51 57 54 49 54 55 50 44 34 108 34 58 49 56 51 57 54 49 54 55 50 44 
34 84 34 58 49 53 54 57 54 50 52 50 50 57 50 51 49 44 34 109 34 58 116 114 117 101 44 34 77 34 58 116 114 117 101 125 0
 
Roman :

당신이 주장한다면, 당신의 방법이 되십시오.

 
Roman :

나도 그렇게 생각했는데 문자열의 길이가 164이고 165로 설정하고 330으로 설정합니다.
문자열이 문자로 계산되는 경우 330은 분명히 문자열 길이 제한이 아닙니다.
요점은 길이가 아니라 바이트 크기에 있습니다.
그러나 여기 도움말은 StringInit 이 정확히 길이를 가져야 한다고 반대합니다.

일반적으로 내가 이해하는 것처럼 mql 문자열 유형은 포인터이며 포인터와 마찬가지로 이 유형으로 작업해야 합니다.

mql 문자열 유형은 포인터, 문자열 길이 및 가능한 다른 것을 포함하는 구조입니다.

DLL에 문자열을 전달하면 포인터만 전달됩니다. 문자열 길이는 수동으로 전달해야 합니다.

그리고 항상 선을 넘지 않도록 합니다.

모든 행 크기 변경은 MQL 측에만 있습니다.

DLL 쪽에서는 사용 중인 기능에 대한 도움말을 주의 깊게 읽어야 합니다. 당신의 모든 문제는 그저 그렇습니다.

sizeof( wchar_t* )는 포인터의 크기를 반환합니다. 이것은 전혀 필요한 것이 아닙니다.

 
Koldun Zloy :

mql 문자열 유형은 포인터, 문자열 길이 및 가능한 다른 것을 포함하는 구조입니다.

DLL에 문자열을 전달하면 포인터만 전달됩니다. 문자열의 길이는 수동으로 전달해야 합니다.

그리고 항상 선을 넘지 않도록 합니다.

모든 행 크기 변경은 MQL 측에만 있습니다.

DLL 쪽에서는 사용 중인 기능에 대한 도움말을 주의 깊게 읽어야 합니다. 당신의 모든 문제는 그저 그렇습니다.

sizeof( wchar_t* )는 포인터의 크기를 반환합니다. 이것은 전혀 필요한 것이 아닙니다.

맞습니다. out 문자열에 버퍼를 할당하고 공백으로 초기화합니다.
또한 dll에서 이 줄(포인터)을 전송합니다.

 string out ;
StringInit ( out , 1400 , 32 );

Func( out );

dll에서는 wchar_t * 데이터가 out, 즉 포인터에 복사됩니다. 논리적으로 문제가 없어야 합니다.
내가 알기로는 도움말에 따르면 StringInit 함수는 문자열의 길이를 설정해야 합니다.
그러나 StringInit 함수 자체에는 여전히 약간의 오해가 있습니다. 문자열의 길이를 표시하고, 가비지를 상승시키고, 포인터의 크기를 표시하고, 모든 것이 작동했습니다.
어떤 종류의 문자열 길이 수동 전송을 의미하는지 이해하지 못합니다.

그리고 포인터 없이 sizeof(wchar_t)를 사용하면 문자열이 추가 문자와 함께 떠다니기 시작하여 구문 분석 및 누출 문제가 발생합니다.
문자열을 dll로 전송하기 위해 Renat의 dll 작성 방법에 대한 기사에서 예제를 사용했습니다.
하지만 어떤 이유로 sizeof(wchar_t) 포인터 없이 전달하면 문자열이 뜨지만 sizeof(wchar_t*) 포인터에는 문제가 없습니다.
논리적으로 보이지만 문자열을 포인터로 복사하면 크기가 유형이 아니라 포인터로 전달되어야 합니다.

사유: