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

 
Alexey Viktorov :

이러한 초기화가 가능합니다. 변수 'a'는 상수로 초기화되고 변수 'b'는 상수 표현식으로 초기화되기 때문입니다.

여기서 'b'는 상수 표현식으로 초기화되지 않습니다. 따라서 이는 문서에 설명된 규칙에 위배됩니다.

전체 문제는 정적 변수가 함수에 의해 초기화될 때 초기화가 "일시 중단"되고 이 함수가 실행된다는 것입니다. 그리고 위의 예에서 그 함수에는 아직 초기화되지 않은 정적 변수가 있습니다. 여기에서 함수로 초기화된 변수는 해당 값을 받지 않습니다.

예, 초기화가 중단될 수 있습니다. 모든 작업은 언어 구문에 정의된 엄격한 순서로 수행됩니다. 먼저 함수가 실행된 다음 이 함수의 반환 값이 변수의 생성자에 전달됩니다. 이를 초기화라고 합니다. 그리고 이 경우 컴파일러는 초기화 작업을 뻔뻔하게 무시하고 아무 일도 없었던 것처럼 코드를 추가로 컴파일합니다. 받아들일 수 없습니다. 다음과 같이 배열을 선언한 것과 같습니다. int a[]= { f(), g(), h() }; 컴파일되지만 물론 아무것도 초기화되지 않습니다.

 
A100 :

32비트 터미널에서 모든 OPTIMIZE와 함께 오류가 발생합니다.

정말로. 모든 시나리오에서 실제로 오류가 발생한 MT4를 확인했습니다. 그리고 사람들이 새 빌드에서 코드를 작성하는 방법
 
Alexey Navoykov :

여기서 'b'는 상수 표현식으로 초기화되지 않습니다. 따라서 이는 문서에 설명된 규칙에 위배됩니다.

예, 초기화가 중단될 수 있습니다. 모든 작업은 언어 구문에 정의된 엄격한 순서로 수행됩니다. 먼저 함수가 실행된 다음 이 함수의 반환 값이 변수의 생성자에 전달됩니다. 이를 초기화라고 합니다. 그리고 이 경우 컴파일러는 초기화 작업을 뻔뻔하게 무시하고 아무 일도 없었던 것처럼 코드를 추가로 컴파일합니다. 받아들일 수 없습니다. 다음과 같이 배열을 선언한 것과 같습니다. int a[]= { f(), g(), h() }; 컴파일되지만 물론 아무것도 초기화되지 않습니다.

상수 표현식이 아니면 WHAT???

Alexey, 해당 코드를 직접 가져와서 디버거의 초기화 순서를 보면 더 쉬울 것입니다. 그러나 나는 이 예에서

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

오류, 버그, 질문

알렉세이 나보이코프 , 2017.10.17 20:31

그리고 여기에 변수 초기화 주제에 대한 자세한 내용이 있습니다. 설명서에 나온 대로 따라하면 다른 전역/정적 변수 참조도 불가능합니다. 왜냐하면 이것은 상수 표현식이 아닙니다.

 int a= 1 ;
int b= a+ 1 ;  // Согласно документации, такая инициализация не возможна

void OnStart ()
{
   Print (b);
}

그러나 지금은 작동합니다. 그리고 나는 많은 사람들이 아무 것도 의심하지 않고 항상 그러한 구조를 사용했다고 믿습니다. 그러나 개발자는 언제든지 이를 차단할 수 있습니다. 그리고 함수 초기화와 마찬가지로 이러한 코드는 계속 성공적으로 컴파일되지만 제대로 작동하지 않습니다. 일반적으로 전체 MQL은 시한 폭탄입니다.


우리는 전역 수준 변수에 대해 이야기하고 있으며 함수 내부에 있는 정적 변수에 대해 이야기하지 않습니다.

나는 접근하기 쉬운 방식으로 설명하기에 충분한 지식이 없으며 충분한 주의력도 없습니다. 따옴표로 묶인 "suspended" !!!

정적 및 일반 변수, 특히 로컬 변수의 초기화를 하나의 힙에 덤프할 필요가 없습니다.

 
Alexey Viktorov :

상수 표현식이 아닌 경우 WHAT???

일정하지 않은 표현.

그러나 나는 이 예제에서 우리가 함수 내부에 있는 정적 변수가 아니라 전역 수준 변수에 대해 이야기하고 있다는 것을 즉시 알아차리지 못했습니다 .

접근 가능한 방식으로 설명할 지식도 부족하고, 주의력도 부족하고 ...

아무것도 혼동하지 않습니까?

게다가 전역 변수와 정적 변수는 완전히 동일하게 동작합니다. 다음은 문서 에서 가져온 것입니다.

전역 변수는 해당 유형에 해당하는 상수 또는 상수 표현식으로만 초기화할 수 있습니다.

나는 그것이 정적 변수와 같은 발견이었다는 것을 고백합니다. 이 모든 것이 문서에 언제 나타 났는지, 아니면 더 일찍 나타났는지 모르겠습니다. 아무도 관심을 기울이지 않았기 때문입니다. 사실 모든 것이 C ++에서와 같이 작동했기 때문에 질문이 없었습니다.

 
Alexey Navoykov :

일정하지 않은 표현.

아무것도 혼동하지 않습니까?

게다가 전역 변수와 정적 변수는 정확히 같은 방식으로 작동합니다 . 다음은 문서에서 가져온 것입니다.

나는 그것이 정적 변수와 같은 발견이었다는 것을 고백합니다. 이 모든 것이 문서에 언제 나타 났는지, 아니면 더 일찍 나타났는지 모르겠습니다. 아무도 관심을 기울이지 않았기 때문입니다. 사실 모든 것이 C ++에서와 같이 작동했기 때문에 질문이 없었습니다.

당신은 완전히 착각하고있는 것 같습니다. 일부는 프로그램에 정의된 모든 함수에서 사용 가능하고 나머지는 선언된 함수에서만 사용할 수 있는 경우 변수의 ID에 대해 어떻게 이야기할 수 있습니까?

그러나 정적 변수와 로컬 변수의 차이점은 정적 변수는 전역 변수 직후에 초기화되고 일반 로컬 변수 는 프로그램이 실행될 때(정적이 아님) 코드 실행이 해당 변수에 도달할 때 초기화된다는 것입니다.

 
Alexey Viktorov :

당신은 완전히 착각하고있는 것 같습니다. 일부는 프로그램에 정의된 모든 함수에서 사용 가능하고 나머지는 선언된 함수에서만 사용할 수 있는 경우 변수의 ID에 대해 어떻게 이야기할 수 있습니까?

일반적으로가 아니라 토론의 특정 컨텍스트( 변수 초기화 )에 대한 것이었습니다.

 
본격 채팅을 통해 메시지를 보낸 후 현재 페이지의 채팅 기록에 보낸 메시지가 자동으로 추가되지 않습니다.
보낸 메시지는 페이지를 새로고침한 후에만 나타납니다.

vskidku에서는 메시지를 보낼 때 서버의 응답이 적절합니다. 아마도 js 코드의 이벤트 핸들러에 떠 있는 무언가가 있을 수 있습니다.
 
Alexey Navoykov :

일반적으로가 아니라 토론의 특정 컨텍스트( 변수 초기화 )에 대한 것이었습니다.

내가 기억하는 한, 그것은 STATIC 변수를 초기화하는 것에 관한 것이었습니다.

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

오류, 버그, 질문

알렉세이 나보이코프 , 2017.10.17 17:16

정적 변수 초기화 버그. 오래된 건물에는 없었습니다.

 class A
{
 public :
   static int f()
  { 
     static int a= 1 ;
     Print (a);       // Получаем a=0 !!
     return a;  
  }   
};


int a= A::f();


void OnStart ()
  {
   
  }

누구나 어렵지 않으니 서비스데스크에 보내주세요. 나는 더 이상 그곳에서 그들과 어울리고 싶지 않습니다.


아니면 이것은 당신의 메시지가 아닙니까?

변수 초기화 순서를 이해합니다. 이 예제는 먼저 전역 수준 변수를 초기화합니다.

 int a= A::f();

같은 이름의 변수가 아직 초기화되지 않은 함수를 호출합니다.

 static int a= 1 ;

그리고 컴파일러 경고에 주의를 기울이지 않는다면 무슨 이야기를 할 수 있겠습니까...


 
Alexey Navoykov :

사실, 배열의 차원을 잘못된 것으로 설정했습니다. 아마도 어떤 식으로든 영향을 미쳤을 것입니다(어떤 식으로든 영향을 주어서는 안 되지만).

차원 = 3으로 여기에서 시도하십시오.

메시지 주셔서 감사합니다.
실제로 이것은 컴파일러 최적화 프로그램 버그가 수정되었습니다.
수정 사항은 다음 빌드에 포함됩니다.
 
Alexey Viktorov :

내가 기억하는 한 그것은 STATIC 변수를 초기화하는 것이었습니다.

아니면 이것은 당신의 메시지가 아닌가요?

나는 당신이 원하는 것을 이해하지 못합니다. 나는 그것이 "변수의 초기화"의 문제라고 말했다. 그리고 이 컨텍스트에서 정적 및 전역 변수는 동일하게 동작합니다. 나는 심지어 당신에게 문서에 대한 링크를 주었다: 변수 초기화

정적 및 전역 변수는 모든 곳에서 함께 병합됩니다.

그리고 고려중인 문제와 관련이 없기 때문에 초기화 순서를 비난하지 않습니다. 문제는 컴파일러가 오류를 발생시켜야 하는 곳에 오류를 던지지 않는다는 것입니다. 정적 변수가 아직 초기화되지 않은 경우 액세스할 수 없습니다.

그리고 컴파일러 경고에 주의를 기울이지 않는다면 무슨 이야기를 할 수 있겠습니까...

글쎄, 그것이 당신을 너무 혼란스럽게한다면 전역 변수의 이름을 변경하십시오. 어떤 식으로든 결과에 영향을 미치지 않습니다.