2012-07-19 4 views
4

내가 이해하지 못하는 컴파일러 경고를 받고 오전 :변수가 초기화되지 않을 것이라는 컴파일러 경고 메시지가 나타나는 이유는 무엇입니까?

procedure Test; 
var 
    Var1: Integer; 
begin 
    while True do 
    begin 
     try 
      if System.Random > 0.5 then 
      begin 
       ShowMessage('Skipping'); 
       continue; // If I remove this line, the warning goes away 
      end; 
      Var1:=6; 
     except on 
      E:Exception do 
      begin 
       ShowMessage('Error'); 
       raise; 
      end; 
     end; 
     ShowMessage(IntToStr(Var1)); // Compiler warning on this line 
    end; 
end; 

내가 델파이 2010 년에이를 컴파일 할 때 내가 얻을 :

[DCC 경고] OnlineClaimManagerMainU.pas (554) : W1036 변수 'Var1' 은 초기화되지 않았을 수 있습니다.

'계속'에 대한 호출을 제거하면 경고 메시지가 사라집니다.

또한 try/except 절을 제거하고 계속 진행하면 경고가 사라집니다.

Var1을 초기화하지 않고 문제가되는 행에 어떻게 실행됩니까?

+1

컴파일러의 분석은 자신의 분석만큼 깊지 않습니다. Var1이 초기화되었는지 확신 할 수 없습니다. Var1은 항상 초기화되지만 컴파일러에는 분석적 재능이 없다는 것을 알고 있습니다. –

+1

제발 ... 나는 빨개어지고 있습니다 :-) – awmross

+0

그래서 ... 왜 계속해서 고쳐야합니까? 같은 문제가 적용됩니다. 아니면 컴파일러의 마음을 날려 버리는 두 가지 조합의 단순한 복잡성입니까? – awmross

답변

4

Var1은 항상 사용 전에 초기화됩니다. 컴파일러는 try - except 처리에 혼란스러워합니다. 코드가 너무 복잡하여 실제로 Var1이 항상 초기화된다는 것을 컴파일러가 판단 할 수 없습니다. Var1:=6; 전에 처리 된 예외가있을 수 있으므로 Var1은 초기화되지 않지만 예외는 항상 다시 발생한다는 것을 알 수 없습니다.

+0

로컬 관리 변수가 자동 초기화되지 않습니다. –

+0

@Cesar hvd는 항상 사용 전에 초기화됩니다. –

+0

정말로 감사합니다. – hvd

0

시도 제외 블록에 ShowMessage(IntToStr(Var1));을 사용해야합니다. 그런 다음 컴파일러에 분명해야하며 Var1은 초기화되어 있으며 깨끗한 코드로 더 많이 보인다.

+1

이렇게하면'ShowMessage'가 예외를 일으키면 (예, 그걸 할 수 있고 게다가'ShowMessage'를 호출하는 것 이상의 기능을하는 코드에서 단순화되었다고 가정 할 때) 예외 핸들러가 실행됩니다. 문제의 코드에는 포함되지 않습니다. – hvd

0

좋은 경고입니다. 코드에서 다른 곳에서 사용될 수있는 변수에 값을 할당하지 않는다고 알려줍니다. 경고는 또한 그것이 사용 된 경우 할당 된 값이 예상 한 것과 다를 수 있음을 알립니다.

+1

나는 그 질문을 이해하지 못했다고 생각합니다. –

+0

@ Rob Kennedy 내 대답을 오해 한 것 같아. Var1 값이 경로에 지정되어 있지 않습니다. 그러므로 경고. 동의하지 않으면 의견에 약간의 가치를 추가하십시오. – Rob

+1

아주 좋아요. 이 질문은 경고의 의미를 묻지 않았다. 특히 이와 관련없는 변경이 경고의 모양에 영향을 미치기 때문에 경고가이 문맥에서 제공된 이유는 무엇입니까? Var1 *은 경고가 나타내는 시점에 할당된다는 것은 사람에게 분명하지만 컴파일러는이를 알지 못합니다.당신의 대답은 당신이 경고가 옳다고 생각한다고 제안합니다; 방법을 보여주십시오. –

관련 문제