2016-06-27 9 views
1

私はドイツのサイトdelphi-treffでdelphiを学んでいます。ランダムな文字列の生成でフリーズするプログラム

これらは、ランダムな文字列を生成する関数を提供します。

function RandomString(strlength: integer): string; 
var 
    temp : integer; 
begin 
    randomize; 
    repeat 
    temp := random(122); //ggf. erhöhen 
    if temp in [48..57{0-1}, 65..90{A-Z}, 97..122{a-z}] then 
    //Kann um beliebige ASCII-Zeichen erweitert werden, 
    //ggf. den Wert in Random hochsetzen 
     result := result + Chr(temp); 
    until length(result) = strlength; 
end; 

あなたがここに見ることができるよう

https://www.delphi-treff.de/tipps-tricks/object-pascal/strings/zufallstring-generieren/:彼らは唯一の0-1を置く

if temp in [48..57{0-1}, 65..90{A-Z}, 97..122{a-z}] then 

、-Zや文字など-Z。

しかし、私はこの機能のために私のプログラムがクラッシュしたと思っていました。

私は変更されました:until length(result)= strlength;

to:length(result)> = strlength;

実際には> strlengthです。

なぜそれが大きいのか説明できますか?

一度に1文字しか追加しないので、それほど大きいはずはありませんか?

+0

ループの前に「結果」が初期化されていないため、長さがオーバーフローします。 'Randomize'はプログラムの開始時に一度だけ初期化されるべきです。 –

+0

@ LURDしたがって、結果はstrlengthよりも長いランダム値で初期化されるため、基準を満たしませんか? – Thomas

+0

[Delphiの 'Result'のデフォルト値は何ですか?](http://stackoverflow.com/questions/5336863/what-is-the-default-value-of-result-in-delphi)を参照してください。感謝@LURD。 –

答えて

4

Resultは暗黙的なvarパラメータとして扱われ、使用前に初期化する必要があります。 What is the default value of 'Result' in Delphi?を参照してください。

この場合、初期化されていないResultパラメータの長さオーバーフローが発生します。

別の問題Randomizeは、プログラムの開始時に一度だけ呼び出す必要があります。

+1

結果は* never *初期化されませんが、空である必要はありません。 –

関連する問題