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

 
fxsaber :

이 아이디어에 대해 자세히 설명해 주시겠습니까?

아래는 제 주관적인 의견이니 틀린 부분이 있으면 도움을 드리겠습니다.


StringLen은 문자열의 첫 번째 NULL 문자(0x0000)까지 O(n)을 실행하는 데 사용되었지만 이제는 O(1)을 실행합니다.
문자열의 길이는 항상 StringSetCharacter(str, pos, 0x00)를 통해 잘라낼 수 있지만 어떤 이유로 StringSetLength를 도입합니다.

대부분 문자열로 작업할 때 코드 속도를 높이는 문제를 해결했습니다.
속도를 높이는 작업은 해결되었지만 이제 기능의 절반이 문자열의 NULL 문자로 작동하고 다른 하나는 작동하지 않는다는 사실 - 아무도 신경 쓰지 않습니다.

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123456789" ;
   PRINT(str);
   PRINT( StringLen (str));
   
   PRINT( StringSetCharacter (str, 7 , 0x00 ));
   PRINT( StringLen (str));
   
   str += "\x00" + str;
   PRINT( StringLen (str));
   
   str += str;
   PRINT(str);
   PRINT( StringLen (str));
   
   ushort array[];
   PRINT( StringToShortArray (str, array));
   ArrayPrint (array);
   
   PRINT( StringLen (str));
   PRINT( StringLen ( ShortArrayToString (array)));
   PRINT( StringLen ( ShortArrayToString (array, 0 , StringLen (str))));
} 

결과:

 2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)      str: 123456789
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 9
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringSetCharacter (str, 7 , 0x00 ): true
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 7
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 15
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)      str: 1234567
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 30
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringToShortArray (str,array): 31
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       49 50 51 52 53 54 55    0 49 50 51 52 53 54 55 49 50 51 52 53 54 55    0 49 50 51 52 53 54 55    0
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen (str): 30
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen ( ShortArrayToString (array)): 7
2019.05 . 15 14 : 02 : 11.895 StringFormat_1 (EURUSD,H1)       StringLen ( ShortArrayToString (array, 0 , StringLen (str))): 7
 
Sergey Dzyublik :

아래는 제 주관적인 의견이니 틀린 부분이 있으면 도움을 드리겠습니다.


StringLen은 문자열의 첫 번째 NULL 문자(0x0000)까지 O(n)을 실행하는 데 사용되었지만 이제는 O(1)을 실행합니다.
문자열의 길이는 항상 StringSetCharacter(str, pos, 0x00)를 통해 잘라낼 수 있지만 어떤 이유로 StringSetLength를 도입합니다.

대부분 문자열로 작업할 때 코드 속도를 높이는 문제를 해결했습니다.
속도를 높이는 작업은 해결되었지만 이제 기능의 절반이 문자열의 NULL 문자로 작동하고 다른 하나는 작동하지 않는다는 사실은 아무도 신경 쓰지 않습니다.


결과:

감정을 억제하십시오.
다음에는 욕설을 금지해야 합니다. 우리는 여기 선술집이 아닙니다. 예, 그리고 선술집에서 - 맹세하는 것은 더 이상 유행이 아닙니다.
 
Sergey Dzyublik :

StringLen은 문자열의 첫 번째 NULL 문자(0x0000)까지 O(n)을 실행하는 데 사용되었으며 이제 O(1)을 실행합니다.

버그를 부분적으로 수정했습니다 ... 왜 안 돼요!? 내 기억에 StringLen은 항상 올바르게 작동했습니다(적어도 x32에서는).
 
Sergey Dzyublik :
개발자:
기본적으로 할당 연산자(복사 생성자)에 대한 강제 코드 생성을 지정하는 기능을 추가하세요.

뭔가 어렵네요. 기본 생성자와 비유하면 더 쉽습니다.

1) 모든 할당 연산자 가 기본 할당 연산자보다 우선합니다.

2) 모든 복사 문은 기본 복사 문을 재정의합니다.

 
A100 :
버그를 부분적으로 수정했습니다 ... 왜 안 돼요!?

MQL은 NULL 문자가 있는 문자열로 작업할 때 일관된 아이디어가 없기 때문에 이것이 문제입니다.
예를 들어 StringToShortArray는 문자열에서 NULL 문자를 지원하며 그 역함수 ShortArrayToString은 더 이상 존재하지 않습니다...

결과적으로 특정 문제를 해결하는 것보다 버그를 포착하고 해결 방법을 찾는 데 더 많은 시간이 소요됩니다.

 
A100 :

뭔가 어렵네요. 기본 생성자와 비유하면 더 쉽습니다.

1) 모든 할당 연산자 가 기본 할당 연산자보다 우선합니다.

2) 모든 복사 문은 기본 복사 문을 재정의합니다.

취소가 필요없고 반대로 강제 생성이 필요합니다.
MQL에는 복잡한 유형을 딥 복사하는 기능이 없으며 기본적으로 할당 연산자와 복사 생성자에서 구현됩니다.

 
Sergey Dzyublik :

MQL은 NULL 문자가 있는 문자열로 작업할 때 일관된 아이디어가 없기 때문에 이것이 문제입니다.
예를 들어 StringToShortArray는 문자열에서 NULL 문자를 지원하며 그 역함수 ShortArrayToString은 더 이상 존재하지 않습니다...

한편으로는 예, 다른 한편으로는 문서 에 명시적으로 명시되어 있습니다. "터미널 0이 충족될 때까지"

 
Sergey Dzyublik :
음, 말하자면, 처음에는 null 문자열이 플러스에서 끌어온 이유가 명확하지 않았습니다.
 
A100 :

한편으로, 예, 다른 한편으로 이것은 문서 에 명확하게 명시되어 있습니다(그렇지 않음)

그리고 동일한 내용이 StringToShortArray 에 작성되었습니다.

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию - 1 , что означает копирование до конца массива, либо до встречи терминального 0 .

그러나 이것이 문자열에서 NULL 문자를 적절하게 처리하는 것을 방해하지는 않습니다.

 
안녕하세요. 모바일 버전 의 MT5는 Alpari 브로커에 연결되지 않습니다. 무슨 일이야? 언제 수정되나요?