2012-01-27 3 views
0

다음은 int 오류 코드 (scode)를 취해 특정 패턴에 적합한 지 확인하려고하는 코드입니다. 이 일을하기 위해 모듈로 나누기 연산자를 사용해야합니까?이 int 패턴 검사를보다 효율적으로 수행하려면 어떻게해야합니까?

const int MASK_SYNTAX_ERR = -2146827000; 
if ((MASK_SYNTAX_ERR % scode) == MASK_SYNTAX_ERR) 
    scriptError.GetSourceLineText(out sourceLine); 

배경 : 나는 관찰을 통해 MASK_SYNTAX_ERR의 값을 추론했다. 여기

// -Int Value (Formatted Value "0x{0:X8}") 
-2146827281 (0x800A03EF) 
-2146827279 (0x800A03F1) 
-2146827280 (0x800A03F0) 
-2146827283 (0x800A03ED) 
-2146827284 (0x800A03EC) 

비교를 위해 논리 오류 코드의 커플 :

-2146823281 (0x800A138F) 
-2146823279 (0x800A1391) 

(하찮은 : 여기가 관찰되는 다양한 구문 오류 코드 자체가 IActiveScriptError.GetSourceLineText를 호출하는 코드는,이입니다 IActiveScriptSite.OnScriptError 구현에서.

+1

다음은 COM 오류 코드가 어떻게 구성되는지 설명합니다 - http://msdn.microsoft.com/en-us/library/bb401631.aspx. –

+0

아, 감사합니다. 알렉세이. 그것은 아마도 가장 유용한 것입니다. –

답변

1

비트 단위 & 연산자를 사용하면 다음과 같이 사용해야하는 것입니다 : CONST INT MASK_SYNTAX_ERR = -2146827000; if (MASK_SYNTAX_ERR & scode! = 0) scriptError.GetSourceLineText (out sourceLine);

무슨 일인지 자세히 알아보십시오.

MASK_SYNTAX_ERR의 이진 표현은

1000 0000 0000 1010 0000 0101 0000 1000

이 비교는 동일한 위치에 하나의있는 모든 숫자에 대해 true를 반환 것입니다. 첫 번째 구문 오류 코드는 다음과 같습니다.

MASK 1000 0000 0000 1010 0000 0101 0000 1000 
CODE 1000 0000 0000 1010 0000 0011 1110 1111 
    & 1000 0000 0000 1010 0000 0001 0000 1000 != 0 

그래서 여기에서 마스크가 작동합니다. 이제 논리 오류 코드를 비교해보십시오 :

MASK 1000 0000 0000 1010 0000 0101 0000 1000 
CODE 1000 0000 0000 1010 0001 0011 1000 1111 
    & 1000 0000 0000 1010 0000 0001 0000 1000 != 0 

또한 여기서는 작동하지 않습니다. 너무 복잡하기 때문에 추측 한 마스크가 잘못되었을 수도 있습니다. 함께 귀하의 구문 코드와 로직 코드를 보면 : 왼쪽에서 13 비트 논리 오류 및 구문 오류 사이의 키 차이가 같은

SYNTAX 1000 0000 0000 1010 0000 0011 1110 1111 
     1000 0000 0000 1010 0000 0011 1111 0001 
     1000 0000 0000 1010 0000 0011 1111 0000 
     1000 0000 0000 1010 0000 0011 1110 1101 
     1000 0000 0000 1010 0000 0011 1110 1100 
LOGIC 1000 0000 0000 1010 0001 0011 1000 1111 
     1000 0000 0000 1010 0001 0011 1001 0001 

것 같습니다. 그래서 다음과 같이 할 수 있습니다 :

const int SYNTAX_MASK = 1 << 12; 
if (scode & SYNTAX_MASK != 0) 
{ 
    //It's a syntax error 
    scriptError.GetSourceLine(out sourceLine); 
} 
else 
{ 
    //It's a logic error 
} 

다른 분석을 위해 유사한 분석을 사용할 수 있습니다. 많은 경우, 마스크는 int에서 하나의 비트를 잡는 데 사용됩니다. 코드의 0x800A 부분은 특정 종류의 오류를 의미하고 마지막 부분은 오류에 대한 정보를 제공 할 수 있습니다. 당신은 스스로 약간의 실험을해야 할 것이지만, 희망적으로 이것이 비트 마스크를하는 올바른 길로 나아갈 것입니다.

+0

고마워요. 나는 그들을 모두 모아서 내 머리 속에서 그것을하려고하는 대신에 다음 번에 놓을 것입니다. –

+1

"if (scode & SYNTAX_MASK == 0) // 구문 오류입니다. –

+0

그래, 맞다. 나는 거기에있는 약간이 섞여 져 버렸다. :) –

3

마스킹 작업의 경우 일반적으로 이진 및 연산자 (&)를 사용합니다. 또한 마스크가 어떻게 작동하는지 명확하게하기 위해 16 진수 표기법을 권장합니다.

if (data & MASK == MASK) 
{ 
    DoStuff(); 
} 
+0

이것은 비트 AND 연산자 '&'입니다. 부울 AND 연산자'&& '와 다릅니다. – MRAB

+0

또한 여기서는 오류 코드에 일련의 비트 플래그가 들어 있으며 개별적으로 읽히는 것으로 가정합니다. 당신은 bitwise-bit-shift를해야만 에러 코드에서 작은 4-bit 에러 번호와 같은 정보 비트를 추출 할 수 있습니다. (아마도 28 비트의 나머지 부분은 에러 번호 특정 정보를 포함 할 수 있습니다. – GGulati

+0

감사합니다. 당신은 이미 모든 즉각적인 상향 음조를 이미 가지고 있고 redneckjedi의 확장 된 설명 때문에, 나는 그의 대답을 받아 들였다. 여기에있는 모든 답변과 의견은 훌륭하기 때문에 대단히 감사합니다. –

관련 문제