2010-02-13 4 views
2

Dans une routine de tri dans Delphi 2007 J'utilise le code comme ceci:Delphi, comment éviter un message d'avertissement unicode D2009, 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; 

où txt est une chaîne. Cela fonctionne bien dans D2007 mais donnera des avertissements dans D2009 et D2010 Je ne sais pas pourquoi mais est-il possible de le faire fonctionner sans avertissements dans D2009 et D2010?

Roy M Klever

Répondre

10

Obtenez-vous le "WideChar réduit à octet Char dans les expressions ensemble. Pensez à utiliser la fonction 'CharInSet' dans l'unité 'SysUtils de" message?

Voici le problème. Dans D2009, le type de chaîne par défaut a été modifié de AnsiString à UnicodeString. Un AnsiString utilise un seul octet pour chaque caractère, ce qui vous donne 256 caractères possibles. Un UnicodeString utilise 2 octets par caractère, ce qui donne jusqu'à 64K caractères. Mais un ensemble Pascal ne peut contenir que 256 éléments. Il ne peut donc pas créer un "ensemble de WideChar" car il y a trop d'éléments possibles.

L'avertissement est un avertissement que vous tentez de comparer à txt [n], qui est un WideChar d'une chaîne Unicode, par rapport à un ensemble de caractères. Il ne peut pas créer un ensemble de WideChars, il a donc dû les réduire en AnsiChars pour les insérer dans un ensemble Pascal, et votre txt [n] pourrait être complètement en dehors des limites Ansi.

Vous pouvez le réparer en utilisant CharInSet, ou en faisant txt un AnsiString, si vous êtes sûr que vous n'aurez pas besoin de caractères Unicode pour cela. Ou si cela ne fonctionne pas bien, vous pouvez désactiver l'avertissement, mais je considérerais cela comme un dernier recours.

+0

Merci pour une bonne explication, je l'obtiens maintenant et a pu éviter les avertissements en utilisant (txt [n]> = '0') et (txt [n] <= '9') Roy M Klever –

+0

Je désactive toujours l'avertissement car le compilateur génère un code parfaitement valide pour "WideChar dans AnsiCharSet". Et parce que je sais que tous mes caractères sont des caractères ASCII <# 128, je ne vois pas la nécessité de ralentir une boucle serrée avec la fonction "inline" CharInSet(). Cela peut avoir à voir avec le fait que j'aime le code rapide et facile à utiliser. –

9

utilisation CharInSet ou une meilleure utilisation Character.IsDigit

Questions connexes