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

 
Roman :

빈 문자열은 어떻습니까? 소켓에서 문자열이 도착하면 다른 경우에는 곡선이지만 비어 있지 않습니다.
귀하의 버전이 정확하지 않다는 말은 아니지만 귀하의 버전에서는 문자열 배열을 사용하고 있습니다.
제 경우에는 포인터입니다.

소켓 함수는 const wchar_t*에 대한 포인터를 반환합니다.
이것이 내가 mql 버그에 죄를 지은 이유입니다. C-S 기능을 시도하지 않았기 때문에 +1 또는 +2의 하드 코어 기능을 사용했기 때문입니다.
그것은 전혀 가지 않는다.

파일과 병렬로 memcpy() 뒤에 줄을 작성합니다. μl이 문제인 경우(인수 복사가 포함된 호출 위에 일종의 래퍼가 있음) 파일이 비어 있지 않을 것입니다.

추신: 글쎄요, 만약을 위해 - µl에서 라이브러리 함수가 링크로 선언되었습니까? 무효 fn(문자열 s)?
 
Vict :

파일과 병렬로 memcpy() 뒤에 줄을 작성합니다. μl이 문제인 경우(인수 복사가 포함된 호출 위에 일종의 래퍼가 있음) 파일이 비어 있지 않을 것입니다.

추신: 글쎄요, 만약을 위해 - µl에서 라이브러리 함수가 링크로 선언되었습니까? 무효 fn(문자열 s)?

나는 주석의 차트에 모든 선을 표시하거나 터미널의 인쇄물에 표시합니다. 선이 도착하면 곡선인지 아닌지 주석에 표시되는지 여부가 즉시 명확합니다.
시차가 크면 차트에 선이 거의 나타나지 않고 인쇄에 구멍이 있습니다.
문자열이 소켓에서 나오지 않는다는 것은 의심의 여지가 없으며, 틱 데이터는 밀리초의 빈도로 수신됩니다.
getData() 소켓에서 변수에 대한 포인터를 가져왔고 포인터 변수에서 래퍼가 아닌 mql에 즉시 복사했습니다.
예, Feng Shui에 따라 선언됩니다))

 #import "ExampleDll.dll"
   void Func( string task, string & out);
#import
일반적으로 mql string에 문제가 있는 경우. 이미 많은 옵션을 시도하고 테스트했습니다.
소켓의 문자열은 터미널 0과 함께 제공되며 가장 안정적인 테스트 기능
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
mql에서 문제를 정확하게 보여줍니다.

일반적으로 지금은 sizeof(wichar_t *)를 사용하여 동작을 살펴보겠습니다.
그러나 아마도 MQ의 변경 사항으로부터 자신을 보호하기 위해 아마도 배열에 문자열을 작성할 것입니다.
 
그러나 아마도 MQ의 변경 사항으로부터 자신을 보호하기 위해 아마도 배열에 문자열을 작성할 것입니다.

골드 단어. 물론 문자열을 사용하고 싶지만 dll로 전송할 때 구현 및/또는 동작을 설명하는 표준이 없기 때문에 이것은 순수한 ub입니다. 그래서 문자열을 short[]에 넣고 침착하게 배열을 전달하면 배열을 생성하고 복사하는 오버헤드가 유일한 것입니다.

추신. 그래도 문제는 mql이 아니라 lib에 있는 것 같습니다. 내 모든 테스트는 정상적으로 통과했으며 논리적으로 버그가 있는 것은 없습니다. string은 wchar_t *에 대한 다소 사소한 래퍼이지만 wstring보다 문제가 될 가능성이 높습니다.

 
Vladimir Simakov :

골드 단어. 물론 문자열을 사용하고 싶지만 dll로 전송할 때 구현 및/또는 동작을 설명하는 표준이 없기 때문에 이것은 순수한 ub입니다. 그래서 문자열을 short[]에 넣고 침착하게 배열을 옮기면 배열을 생성하고 복사하는 데 드는 오버헤드만 남는다.

추신. 그래도 문제는 mql이 아니라 lib에 있는 것 같습니다. 내 모든 테스트는 정상적으로 통과했으며 논리적으로 버그가 있는 것은 없습니다. string은 wchar_t *에 대한 다소 사소한 래퍼이지만 wstring보다 문제가 될 가능성이 높습니다.

저도 Libu에 대해 의심을 가지고 있었는데, 가능한 이유로 배제하지 않습니다.
하지만 소켓에서 받은 문자열을 ASCII 코드로 변환해 보니 문자열이 맞는 것을 알 수 있습니다.
다음은 간단한 사본입니다.
mql은 문자열에 대한 포인터를 올바르게 허용하지 않습니다.

파일:
1.PNG  32 kb
 
Roman :

나는 주석의 차트에 모든 선을 표시하거나 터미널의 인쇄물에 표시합니다. 선이 도착하면 곡선인지 아닌지 주석에 표시되는지 여부가 즉시 명확합니다.
시차가 크면 차트에 선이 거의 나타나지 않고 인쇄에 구멍이 있습니다.
문자열이 소켓에서 나오지 않는다는 것은 의심의 여지가 없으며, 틱 데이터는 밀리초의 빈도로 수신됩니다.
getData() 소켓에서 변수에 대한 포인터를 가져왔고 포인터 변수에서 래퍼가 아닌 mql에 즉시 복사했습니다.
예, Feng Shui에 따라 선언됩니다))

일반적으로 mql string에 문제가 있는 경우. 이미 많은 옵션을 시도하고 테스트했습니다.
소켓의 문자열은 터미널 0과 함께 제공되며 가장 안정적인 테스트 기능
mql에서 문제를 정확하게 보여줍니다.

일반적으로 지금은 sizeof(wichar_t *)를 사용하여 동작을 살펴보겠습니다.
그러나 아마도 MQ의 변경 사항으로부터 자신을 보호하기 위해 아마도 배열에 문자열을 작성할 것입니다.

파일에 쓰기 - dll 쪽에서 파일에 기록되지만 µl에 들어가지 않으면 버그에 대한 설명이 포함된 이미 중요한 인수이므로 수정할 수 있습니다.

그리고 당신이 원하지 않는 래퍼가 있습니다. MQ는 외부 세계에서 코드/주소를 숨기고 모든 것이 간접적으로 진행됩니다.

 
Vict :

파일에 쓰기 - dll 쪽에서 파일에 기록되었지만 µl에 들어가지 않으면 버그에 대한 설명이 포함된 이미 중요한 인수이므로 수정할 수 있습니다.

그리고 당신이 원하지 않는 래퍼가 있습니다. MQ는 외부 세계에서 코드/주소를 숨기고 모든 것이 간접적으로 진행됩니다.

받은 줄을 파일에 씁니다.
소켓 함수는 문자열에 대한 포인터를 반환하므로 문자열에 대한 포인터가 파일에 기록되고 이 포인터가 mql에 복사됩니다.
기능 사용

wcscpy(out,  data);

결과 문자열의 길이는 164이고 mql에 200이 할당됩니다.

 StringInit (out, 200 , 32 );

mql에서 수신한 복사된 문자열의 길이가 짝수이지만 복사에 하드 갭이 있습니다.
mql 스크립트에서 while 루프가 Sleep(1)과 함께 회전합니다.

파일:
458.PNG  71 kb
 
그리고 기능을 사용하면
wcsncpy(out, data, wcslen(data));
그런 다음 간격은 없지만 복사된 줄이 고르지 않고 줄 끝에 추가 문자가 나타납니다.
wcslen(data)+1을 추가해도 도움이 되지 않습니다.

내가 여기에 쓰는 모든 페이지의 결과입니다.
mql-ovsky 문자열은 dll에서 문자열 const wchar_t*에 대한 복사된 포인터를 올바르게 수락하지 않습니다.
파일:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman :

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

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

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

때로는 옳은 일을 하고도 제대로 되지 않을 때가 있습니다.

당신은 그것을 잘못했습니다 - 그것은 작동하는 것 같습니다.

이러한 경우 올바른 일을 하고 다른 곳에서 오류를 찾아야 합니다.

 
Roman :

받은 줄을 파일에 씁니다.
소켓 함수는 문자열에 대한 포인터를 반환하므로 문자열에 대한 포인터가 파일에 기록되고 이 포인터가 mql에 복사됩니다.
기능 사용

결과 문자열의 길이는 164이고 mql에 200이 할당됩니다.

mql에서 수신한 복사된 문자열의 길이가 짝수이지만 복사에 하드 갭이 있습니다.
mql 스크립트에서 while 루프가 Sleep(1)과 함께 회전합니다.

1. MQL에서는 포인터가 복사되지 않고 문자열이 복사됩니다.

2. MQL에서 200자의 문자열을 선택했습니다. 그런 다음 164자를 복사했습니다. 그런 다음 MQL에서 문자열의 크기를 확인합니다. 그는 200을 머물렀다.

 
Koldun Zloy :

때로는 옳은 일을 하고도 제대로 되지 않을 때가 있습니다.

당신은 그것을 잘못했습니다 - 그것은 작동하는 것 같습니다.

이러한 경우 올바른 일을 하고 다른 곳에서 오류를 찾아야 합니다.

이것이 정확하기 위해 나는 memcpy를 포기하고 wcscpy 또는 wcsncpy를 사용했습니다.
결과, 위의 게시물.