2017-07-25 16 views
-3

私はGetTickCountデルファイのGetTickCountは有効な整数

を使用して一意のIDを設定しようとしています、私はやっていない私はuniqueString := intTostr(LastUniqueID);

プロジェクトに無効な整数値を得た

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

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

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

end; 
project1.exeは例外クラスEConvertErrorをメッセージ '' 2312357250 'は有効な整数値ではありません。'

何が間違っていますか?

+4

あなたが投稿したコードがあなたが報告したエラーと一致することを確認することをお勧めします。あなたはここでそれをすることはできませんでした。あなたが確認した[mcve]を投稿する習慣に入ってください。投稿したコードがエラーメッセージと一致しないという事実は、あなたの進歩と発展の基本的なブロックである、思考の明確さの欠如を示唆しています。あなたが問題に直面したら、ゆっくりと考えてください。結論に飛ぶ前にあなたの事実を明確にしてください。あなたの思考パターンを改善することは配当金を支払うでしょう。 –

+2

一意のIDが必要な場合は、['CreatGUID'](http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.CreateGUID)を使用してみませんか? –

+0

@DavidHeffernan電気が遮断されました。私は整数に戻ってuniquestringをもう一度変換することを追加することを忘れないでください。あなたの答えは、int64を使っていることからはわかりません。 –

答えて

11

残念ながら、報告したエラーメッセージと一致しないコードが表示されています。あなたの実際のコードは、IntToStrではなくStrToIntを呼び出します。私はこのエラーメッセージがではなくStrToIntへの呼び出しによって生成されるため、これを知っています。 StrToIntは、符号付き32ビット整数型を返す

UniqueID := StrToInt('2312357250'); 

注こと:

あなたのコードでは、より多くのこのようになります。有効な値は、-2,147,483,648〜2,147,483,647の範囲です。あなたの値はIntegerの有効な範囲外です。したがって、エラーです。

これらすべての範囲の問題を簡単に解決するには、DWORDまたはIntegerの代わりにInt64を使用し、StrToInt64に電話してください。

はさらに、これらの線は面倒です:

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

あなたはGetTickCountに二つの別個の呼び出しを行います。これらの2つの呼び出しは、異なる値を生成することがあります。実際にGetTickCountがロールオーバーすると、2番目の呼び出しは最初の呼び出しよりも小さい値を返します。

さらに多くの問題は、GetTickCount + 1000を囲んでいます。 GetTickCountが上限に近い値を返すと、整数オーバーフローが発生し、結果が期待しない結果になることがあります。その落とし穴を避けるためにGetTickCount64を使用してください。

しかし、私は、システムのティックカウントがユニークなIDを生成する良い方法であると確信しています。要件に応じて、これは問題が解決しない場合もあります。それに直面すると、あなたのコードは、前回要求したよりも1秒未満の一意のIDの要求を排除するように見えます。もちろん、お客様の要件を知らなくても、代替案を推奨することは困難です。

+0

これがエラーの原因であるかどうかはわかりません。特に、ここで再現できないためです。 IntToStrの呼び出しはInt64のオーバーロードを使用するため、DWord値が指定されている場合はEConvertErrorで失敗しません。 –

+0

@あなた正しいです。実際、私は、質問者がエラーメッセージと一致しないコードを提供したという事実に惑わされました。彼らは実際に 'StrToInt'を呼び出しています。ありがとうございました。 –

+0

オーバーフローの問題は、['GetTickCount64()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724411.aspx)と 'UInt64'を使用することで回避できます。 –

1

問題は2312357250が大きすぎます。 DWORDとしては有効ですが、89D3C582の16進表現は、DWORDが表すことのできない負数、つまりメッセージに相当します。

+2

はDWORDとして有効ですが、DWORDは表現できません。これらの答えは正しくないと感じます。 – Fritzw

+1

負のDWORDはありません。16進数表現は、DWORDではなく整数に対して負の値を持つ可能性があります。 –

関連する問題