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

 
Slava :

이 캐스팅으로 데이터 손실이 없습니다. 0이든 아니든 0.

또 다른 것은 double이 캐스트되는 경우 -> 모든 정수 유형 (최대 int32 포함)

내 생각에 경고를 가지고 놀았던 것, 판단의 일관성이 충분하지 않습니다.

 bool continuation() const { return this .last_level;}   // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict :

내 생각에 경고를 가지고 놀았던 것, 판단의 일관성이 충분하지 않습니다.

동의한다

여기에서도 이런 의미에서 데이터 손실이 없습니다( 0이든 아니든)

 void OnStart ()
{
         int i = -1 ;
         while ( ++i ); //Warning: expression not boolean
}

그러나 경고가 있습니다. 통일된 접근이 기대됨

 

동일한 클래스의 정적 함수에서 클래스 인스턴스의 속성에 액세스하려는 시도의 결과:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
컴파일러는 이전에 침묵했습니다.
 

터미널 0으로 빈 문자열을 초기화하지 않습니다.

 void OnStart ()
{      
   string str;
   StringInit (str, 100 , 0 );
   
   Print ( StringLen (str));     
}

결과

 2019.09 . 18 22 : 16 : 54.380 TestScript (EURUSD,H1)   0

예상되는

 2019.09 . 18 22 : 16 : 54.380 TestScript (EURUSD,H1)   100

StringInit 함수 에 대한 도움말 참고

Примечание

Если  character= 0 и размер new_len> 0 , то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю , так как весь буфер заполнен терминаторами строки.

사실, 배포가 없습니다.
즉, 이러한 방식으로 10개의 공백을 배포합니다.

 string str = "          " ;

같지 않다

 string str;
StringInit (str, 10 , 0 );

그리고 어떻게 든 도움말 텍스트에서 빨간색으로 강조 표시된 행동 논리가 수렴되지 않습니다.

 
Vict :

내 생각에 경고를 가지고 놀았던 것, 판단의 일관성이 충분하지 않습니다.

부울 경고 작업에는 작동하지 않습니다. 이제 실수로 코드에서 오타를 발견했습니다. 여기에서 재현했습니다.

 #define               getAsk(dummy)           SymbolInfoDouble ( _Symbol , SYMBOL_ASK )
#define               getBid(dummy)           SymbolInfoDouble ( _Symbol , SYMBOL_BID )
//+------------------------------------------------------------------+
void OnStart ()
  {
       double sl = 0.0 ,tp= 0.0 ;
       if (sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print ( "" );  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return (getAsk());
}

double OrderTakeProfit()
{
   return (getBid());
}
 
Roman :

터미널 0으로 빈 문자열을 초기화하지 않습니다.

결과

예상되는

StringInit 함수 에 대한 도움말 참고

사실, 배포가 없습니다.
즉, 이러한 방식으로 10개의 공백을 배포합니다.

같지 않다

그리고 어떻게 든 도움말 텍스트에서 빨간색으로 강조 표시된 행동 논리가 수렴되지 않습니다.

StringBufferLen 함수를 놓쳤습니다. 할당된 버퍼의 크기를 반환합니다. StringLen은 문자열의 길이, 즉 맨 처음에 있는 경우 터미널 문자까지를 반환합니다. 길이가 0인 경우 버퍼 != 문자열입니다.

 
Stanislav Korotky :

StringBufferLen 함수를 놓쳤습니다. 할당된 버퍼의 크기를 반환합니다. StringLen은 문자열의 길이, 즉 맨 처음에 있는 경우 터미널 문자까지를 반환합니다. 길이가 0인 경우 버퍼 != 문자열입니다.

그리고 그 자신도 모른다.

 
Stanislav Korotky :

StringBufferLen 함수를 놓쳤습니다. 할당된 버퍼의 크기를 반환합니다.
StringLen은 문자열의 길이, 즉 맨 처음에 있는 경우 터미널 문자까지를 반환합니다. 길이가 0인 경우 버퍼 != 문자열입니다.

이것은 이해할 수 있습니다. 우리는 터미널 0 으로 문자열을 초기화하는 것에 대해 이야기하고 있습니다.
StringInit(str, 10, 0); 10개의 터미널 0으로 채우지 않습니까? 그리고 문자열의 실제 길이를 반환합니다.
빈 문자열을 초기화해야 하는 경우 패딩이 없습니다! 예를 들어 100자,
그런 다음 str = "a lot of poking into keyboard" 형식으로 100개의 공백을 입력하거나 가비지 StringInit(str, 100, 65)로 초기화합니다.
왜 쓰레기로 초기화하는지 이해가 가지 않습니다. 어쨌든 충분합니다))


 
Roman :

이것은 이해할 수 있습니다. 우리는 터미널 0 으로 문자열을 초기화하는 것에 대해 이야기하고 있습니다.
StringInit(str, 10, 0); 10개의 터미널 0으로 채우지 않습니까? 그리고 문자열의 실제 길이를 반환합니다.
빈 문자열을 초기화해야 하는 경우 패딩이 없습니다! 예를 들어 100자,
그런 다음 str = "a lot of poking into keyboard" 형식으로 100개의 공백을 입력하거나 가비지 StringInit(str, 100, 65)로 초기화합니다.
왜 쓰레기로 초기화하는지 이해가 가지 않습니다. 어쨌든 충분합니다))


그리고 채워지지 않은 것은 어디서 얻었습니까? 문자열의 길이가 마이크로리터로 저장되지 않고 터미널 0으로 인식된다는 것입니다.

 StringInit (str, 100 , ' ' );

아니다?

그리고 정확히 0이 필요한 경우 μl std의 내부 어딘가에 String 클래스가 있습니다.

 
Vict :

그리고 채워지지 않은 것은 어디서 얻었습니까? 문자열의 길이가 마이크로리터로 저장되지 않고 터미널 0으로 인식된다는 것입니다.

아니다?

그리고 정확히 0이 필요한 경우 μl std의 내부 어딘가에 String 클래스가 있습니다.

아니오. 이것은 또한 0을 반환합니다. 그리고 세 번째 매개변수인 ushort에는 정수 문자 코드가 필요합니다.

str = " "; 형식으로 초기화하면 그런 다음 dll에서 데이터를 전송하면 모든 것이 정상입니다.
그리고 StringInit(str, 10, 0)을 초기화하면 데이터가 수신되지 않습니다. 필요한 크기의 문자열에 할당된 메모리가 없기 때문입니다.

공간에 대한 코드가 있었다면 작동했을 수도 있지만 어떻게 든 다른 테이블에서 그러한 코드를 찾지 못했습니다.
미래의 문자 수에 대한 메모리를 할당해야 하며, 이는 이미 초기화된 빈 문자열로 이동합니다.
그러나 문자열을 초기화하기 위한 쓰레기는 comme il faut가 아닙니다.
따라서 StringInit(str, 100, 0); 터미널 0으로 채워야 하고 길이 100을 반환해야 합니다.