2010-02-13 83 views
2

在2007年德爾福排序例行我使用這樣的代碼:德爾福,如何避免D2009 unicode的警告信息,D2010

(txt[n] in ['0'..'9']) 

function ExtractNr(n: Integer; var txt: String): Int64; 
begin 
    while (n <= Length(txt)) and (txt[n] in ['0'..'9']) do n:= n + 1; 
    Result:= StrToInt64Def(Copy(txt, 1, (n - 1)), 0); 
    Delete(txt, 1, (n - 1)); 
end; 

其中TXT是一個字符串。這在D2007中可以正常工作,但會在D2009和D2010中發出警告我不知道爲什麼,但有沒有什麼方法可以使它在D2009和D2010中不發出警告?

羅伊中號Klever

回答

10

您是否獲得了「WideChar減少集表達式字節字符。考慮使用‘sysutils的’單位‘CharInSet’功能」的消息?

這是問題所在。在D2009中,默認字符串類型已從AnsiString更改爲UnicodeString。一個AnsiString爲每個字符使用一個字節,給你256個可能的字符。 UnicodeString每個字符使用2個字節,最多可以輸出64K個字符。但是一個Pascal集合最多隻能包含256個元素。所以它不能創建一組「WideChar」,因爲有太多可能的元素。

該警告是一個警告,您試圖將一個來自Unicode字符串的WideChar的txt [n]與一組字符進行比較。它不能製作一組WideChars,所以它不得不將它們減少到AnsiChars以使它們適合Pascal集合,並且你的txt [n]可能完全在Ansi邊界之外。

如果您確定不需要任何Unicode字符,則可以使用CharInSet或將txt作爲AnsiString來解決此問題。或者如果這樣做效果不好,可以禁用該警告,但我認爲這是最後的手段。

+0

謝謝你的很好的解釋,我現在明白了,並且能夠通過使用(txt [n]> ='0')和(txt [n]> ='9')來避免警告 Roy M Klever – 2010-02-13 02:30:49

+0

我總是禁用警告,因爲編譯器爲「WideChar in AnsiCharSet」生成完全有效的代碼。因爲我知道我的所有字符都是ASCII字符<#128,所以我沒有必要用「內聯」的CharInSet()函數來減緩緊密的循環。這可能與我喜歡快速和資源友好的代碼有關。 – 2010-02-13 13:13:46

9

使用CharInSet或更好地利用Character.IsDigit