2012-01-27 54 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。 – 2012-01-27 02:18:22

+0

啊,谢谢阿列克谢。这可能是最有用的知识。 – 2012-01-27 02:36:43

回答

1

按位&运算符是你应该用什么,就像这样: const int的MASK_SYNTAX_ERR = -2146827000; 如果(MASK_SYNTAX_ERR & SCODE!= 0) scriptError.GetSourceLineText(出源极线);

更多关于发生了什么事情。

MASK_SYNTAX_ERR的二进制表示

1000 0000 0000 1010 0000 0101 0000 1000

这比较适用于任何数量的有1点在相同的位置返回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 

它也适用于这里,它不应该。这似乎也许你的演绎面具可能是错误的,因为它太复杂了。在你的代码的语法和逻辑代码一起看:

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 

它看起来像从左侧起的第13位是逻辑错误和语法错误之间的关键区别。所以你可以这样做:

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

谢谢你。我会收集他们所有,并将它们放在下一次,而不是试图在我的脑海:) – 2012-01-27 02:23:32

+1

我认为它应该是“如果(scode&SYNTAX_MASK == 0)//这是一个语法错误 – 2012-01-27 02:36:00

+0

是的,这是正确的,我有一点混合起来,这是哪里。:) – 2012-01-27 02:41:51

3

对于掩码操作,您通常使用二进制和运算符(&)。我还建议使用十六进制符号来更清楚地说明面罩的工作原理。

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

这是按位与运算符'&',从AND运算符'为不同&&'。 – MRAB 2012-01-27 01:44:08

+0

此外,这假定您的错误代码包含一堆位标志,然后单独读取。您必须逐位然后移位以提取多位信息,例如错误代码中的小4位错误编号(也许28位的其余部分可能包含错误编号特定信息或其他内容)。 – GGulati 2012-01-27 01:46:32

+0

谢谢。既然你已经得到了所有即时的赞誉,并且由于redneckjedi的扩展解释,我接受了他的答案。所有的答案和评论都很棒,所以非常感谢。 – 2012-01-27 02:21:13

相关问题