2012-01-27 56 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

相關問題