2017-07-25 6 views
-3

Je suis en train de définir un identifiant unique en utilisant GetTickCountDelphi GetTickCount n'est pas un entier valide

que je fais ce qui suit

var 
UniqueID : DWORD; 
LastUniqueID : DWORD; 
uniqueString : string; 
begin 

UniqueID := GetTickCount; 
LastUniqueID := GetTickCount + 1000; 

uniqueString := intTostr(LastUniqueID);//or UniqueID 

end; 

Je suis valeur entière non valide sur uniqueString := intTostr(LastUniqueID);

projet project1.exe a levé la classe d'exception EConvertError avec le message '' 2312357250 'n'est pas une valeur entière valide'.

Qu'est-ce que je fais mal?

+4

Je vous invite à l'avenir à vous assurer que le code que vous postez correspond à l'erreur que vous signalez. Vous n'avez pas réussi à faire ça ici. Prenez l'habitude de poster un [mcve] que vous avez vérifié. Le fait que le code que vous avez posté ne correspond pas au message d'erreur suggère un manque de clarté de pensée qui est un blocage fondamental de votre progression et de votre développement. Ralentissez et réfléchissez plus fort lorsque vous faites face à des problèmes. Obtenez vos faits clairs avant de sauter aux conclusions. Améliorer vos schémas de pensée sera payante. –

+2

Si vous avez besoin d'un identifiant unique, pourquoi ne pas utiliser ['CreatGUID'] (http://docwiki.embarcadero.com/Libraries/fr/System.SysUtils.CreateGUID)? –

+0

@DavidHeffernan l'électricité a été coupée. J'oublie d'ajouter que je convertis à nouveau en singles entiers. votre réponse claire d'utiliser int64 m'aide à vous remercier. –

Répondre

11

Malheureusement, vous avez affiché du code qui ne correspond pas au message d'erreur que vous signalez. Votre code actuel appelle StrToInt plutôt que IntToStr. Je sais ceci parce que ce message d'erreur est produit par des appels à StrToInt plutôt que IntToStr.

Votre code ressemble plus à ceci:

UniqueID := StrToInt('2312357250'); 

Notez que StrToInt renvoie un type entier signé 32 bits. Les valeurs valides sont comprises entre -2 147 483 648 et 2 147 483 647. Votre valeur est en dehors de la plage valide pour Integer, d'où l'erreur.

Si vous voulez un moyen simple de marchepieds toutes ces questions de portée, puis utilisez Int64 au lieu de DWORD ou Integer, et appelez StrToInt64.

De plus, ces lignes sont gênants:

UniqueID := GetTickCount; 
LastUniqueID := GetTickCount + 1000; 

Vous faites deux appels distincts à GetTickCount. Ces deux appels peuvent donner des valeurs différentes. En effet, si GetTickCount survole, le second appel peut renvoyer une valeur inférieure à la première.

Encore plus de problèmes entourent GetTickCount + 1000. Si GetTickCount renvoie une valeur proche de la limite supérieure, vous rencontrerez un dépassement d'entier, ce qui peut avoir des résultats inattendus. Utilisez GetTickCount64 pour éviter ce piège.

Cependant, je reste à être convaincu que le nombre de ticks du système peut être un bon moyen de générer un identifiant unique. En fonction de vos besoins, cela peut constituer une mauvaise solution à votre problème, quel qu'il soit. À première vue, votre code semble interdire de demander un identifiant unique moins d'une seconde plus tard que la fois précédente. Bien sûr, sans connaître vos exigences, il est difficile de recommander une alternative.

+0

Je ne suis pas sûr si c'est la cause de l'erreur, surtout parce que je ne peux pas le reproduire ici. L'appel à IntToStr utilise la surcharge Int64 et ne devrait donc pas échouer avec un EConvertError lorsqu'il est fourni avec une valeur DWord. –

+0

@Uwe Vous avez raison. En fait, j'ai été trompé par le fait que le demandeur a fourni du code qui ne correspond pas au message d'erreur. Ils appellent en fait 'StrToInt'. Je vous remercie. –

+0

Le problème de débordement peut être évité en utilisant ['GetTickCount64()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724411.aspx) avec 'UInt64'. –

1

Le problème est que 2312357250 est trop grand. Bien qu'il soit valide en tant que DWORD, la représentation hexadécimale 89D3C582 est équivalente à un nombre négatif, qu'un DWORD ne peut pas représenter, d'où le message.

+2

valide comme un DWORD mais un DWORD ne peut pas représenter? Ces réponses ne sont pas correctes. – Fritzw

+1

Il n'y a pas de DWORDs négatifs, la représentation hexadécimale peut être négative pour un entier, pas pour un DWORD. –