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

 
Vict :

멋진 예가 있습니다. 그들은 모든 것을 제거하고 UB(문자열 리터럴 수정)를 남겼고 모두가 텔레파시를 해야 합니다. 어떤 종류의 합리적인 조언에 의존한다면 최소한의 작업 코드(양쪽 모두)를 제공하십시오. 그렇지 않으면 그것은 그저 잡담일 뿐입니다.

예제는 문제를 일으키는 위치, 즉 wchar_t* 포인터를 mql 문자열에 복사하는 문제를 보여줍니다.
문제와 관련이 없는 나머지 코드는 페이로드를 전달하지 않습니다. 데이터가 있는 경우에만 검사를 수행한 다음 읽는 등의 작업을 수행하기 때문입니다.
간단한 코드를 사용하더라도 많은 사람들이 문제의 본질이 무엇인지 이해하지 못할 때 예제로 작성하고 문제의 본질을 흩뜨리는 이유는 무엇입니까?
이해 getData()는 FrameOpcode를 읽고 결과 데이터를 const wchar_t* 유형의 문자열에 대한 포인터로 반환하는 네트워크 함수입니다 .

간단한 함수 wcscpy(out, data)가 복사 한다는 것은 누구나 알고 있습니다.   const wchar_t* string, to wchar_t* string , 자동 으로 문자 길이를 터미널 0까지 계산 const wchar_t*
이것은 오류가 나타나는 곳입니다. mql-ovsky 문자열은 복사된 문자열 wchar_t* 를 올바르게 수락 하지 않습니다 . 질문은 왜 그럴 수 있습니까? 기능이 자동으로 터미널 0을 결정하는 경우.
Renat의 기사에서 문자열은 바이트 크기 오류와 함께 memcpy를 통해 복사됩니다. 아마도 동일한 접근 방식이 터미널 코드 자체에서 mql string type 을 형성하는 데 사용됩니다.
memcpy 문자열 복사에 적합하지 않을 뿐만 아니라 전송된 바이트 크기의 오류로 인해 데이터가 들쭉날쭉합니다.
문자열 복사를 위해 wcscpy, wcsncpy 등과 같은 다른 C 관련 함수가 있습니다.
네, 그리고 Renat 자신이 곧 스트링 작업을 완전히 재작업할 것이라고 브랜치 중 하나에 썼습니다. 분명히 문제는 알려져 있지만 어떤 이유에서인지 제가 확인한 문제에 대한 응답으로 침묵이 있습니다.

비교를 위해 포인터 wchar_t* 및 단순 유형 wchar_t 의 바이트 크기

파일:
1.PNG  83 kb
 
Roman :

물론 getData()를 무언가로 대체하는 일반적인 재현 가능한 테스트보다 응답으로 전체 발보를 작성하는 것이 더 쉽습니다. UB가 UB에 있고 결론이 잘못된 경우 어떻게 예상하십니까?

memcpy(cp,to,wcslen(to)* sizeof (wchar_t));   // в этой строке должен быть указатель sizeof(wchar_t *)

모든 것이 바로 거기에 있습니다. 문자열에 대한 생각에 문제가 있어 오류가 발생합니다.

 
Vict :

물론 getData()를 무언가로 대체하는 일반적인 재현 가능한 테스트보다 응답으로 전체 발보를 작성하는 것이 더 쉽습니다. UB가 UB에 있고 결론이 잘못된 경우 어떻게 예상하십니까?

모든 것이 바로 거기에 있습니다. 문자열에 대한 생각에 문제가 있어 오류가 발생합니다.

이것이 타사 라이브러리를 사용하는 dll이라는 것을 스스로 이해하고 있기 때문에 재현 가능한 코드를 제공할 방법이 없습니다.
예시에 오류가 있다고 판단한 이유에 대해.
memcpy (cp,to,wcslen(to)* sizeof (wchar_t)); // 이 줄은 포인터 sizeof(wchar_t *)를 포함해야 합니다.

포인터가 없는 함수를 사용하면

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

그런 다음 줄의 끝이 추가 문자로 부동하기 시작합니다. 그림에서 줄 끝을 보세요.
그리고 문자열 wchar_t *를 포인터로 복사하면 유형의 크기가 아니라 포인터의 크기를 전달해야 한다는 것이 논리적입니다.

포인터를 사용하면

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

그러면 추가 문자 없이 행이 명확해집니다.
모든 것이 괜찮지만 두 경우 모두 어떤 이유로 구문 분석에 추가 문제가 발생하고 라인이 흐르고 간격이 생깁니다.

그리고 이 함수를 사용하면 아무 것도 흐르지 않고 모든 것이 잘 구문 분석되며 라인 버그의 끝에 하나의 추가 문자만 있으면 나타나고 사라집니다.

wcsncpy(out, data, wcslen(data));

그래서 나는 이유가 있을 수 있는 많은 옵션을 살펴보고 있지만 sizeof의 포인터 없이 memcpy를 사용하면 결과가 화면에 표시됩니다.

또한 터미널 0이 있는지 여부에 관계없이 수신된 wchar_t * 문자열을 확인하고 싶습니다.
어떻게 할 수 있습니까?

파일:
 
포인터가 없는 함수를 사용하면

여기에서 끝에 \0 없이 유지됩니다.

포인터를 사용하면

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

그리고 이 함수를 사용하면 아무 것도 흐르지 않고 모든 것이 잘 구문 분석되며 라인 버그 끝에 하나의 추가 문자만 있으면 나타나고 사라집니다.

다시 out은 \0 없이 남습니다. 부두 보기

wcsncpy, wcsncpy_s

...

전체 문자열 src가 복사되기 전에 count에 도달한 경우 결과 와이드 문자 배열은 null로 종료되지 않습니다.

...

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

 
Vict :

ZY: 일반적으로 회선과 통신할 수 없습니까? wchar_t에 배열을 저장하고 구동하고, 필요한 경우 µl 내부에서 문자열로 변환

오, 센큐 )) wcsncpy가 0을 자르는 힌트.
예, 마지막으로 배열을 남겼습니다. 포인터로 작동하지 않으면 배열을 사용하겠습니다.

 

포럼 엔진에서는 한 장의 사진으로 게시물을 작성할 수 없습니다. 텍스트 입력이 필요합니다.

공백을 넣어야 합니다.

 
fxsaber :

포럼 엔진에서는 한 장의 사진으로 게시물을 작성할 수 없습니다. 텍스트 입력이 필요합니다.

공백을 넣어야 합니다.

모든 것이 논리적인 것 같습니다. 이것은 포럼이고 가장 중요한 것은 텍스트입니다. 그리고 그림은 얼마만큼 적용됩니다. 이곳은 사진의 무덤이 아닙니다.

 

코드 완료, MT4/5에서 작동, 작은 놀라움 발생

MQL4에서 TesterStop() 을 대체할 수 있는 것

?

 
Igor Makanu :

MQL4에서 TesterStop()을 대체할 수 있는 것은 무엇입니까?

전문가제거 .

 
fxsaber :

전문가제거.

이 옵션을 알고 있지만 ExpertRemove(0은 마켓 전문가에게 사용할 수 없습니다. 마켓에 올리기 위해 함께 할 수 있습니다. 다시 실행해야 함)라는 메시지를 보았습니다.

일반적으로 두 가지 경우에 TesterStop()을 사용합니다.

- INIT_PARAMETERS_INCORRECT 대신 옵티마이저 로그를 숨김

- 주문을 열 자금이 충분 하지 않으면 주문을 열지 않고 테스트를 완료하여 최적화가 더 빨리 진행되었습니다.