2011-07-23 23 views
6

今日1は、コードの下について私に尋ねる:結果、私の友人の

var 
    a: Integer; 
begin 
    ShowMessage(IntToStr(a)); 
end; 

これはローカル変数で、[OK]を、初期化されていませんか?

入れボタンコンポーネントのOnClickイベントのコード、その後、次の3つの切り抜いた方法でコードを実行します。ボタンの

  1. クリックして結果を参照してください、結果= 1635841
  2. Enterキーを押すと、結果を参照してください、 = 1つの
  3. スペースキーを押した結果と結果を参照してください、reuslt = 1636097

私は、同じ結果を参照してください2台の切り抜いたコンピュータ&にトンについての考えをコードをテスト彼の?

+0

私のマシンでは、別の結果が得られます。プログラムを実行するたびに異なる結果が得られます。 (ただし、ボタンのクリック方法によって違いはありません) –

+0

PC上で取得できるのは5734816です(EBXレジスタに値が格納されています)) –

+8

これは明らかにDelphiを学ぶ新しい人です。なぜdownvotesがわからないのですか? SO、Geekへようこそ。 –

答えて

10

変数は初期化されていないため、値は何でもかまいません。あなたの結果は「何か」なので、ここでは珍しいことはありません。

+1

+1面白いことは、時には文字列に行くことです。http://stackoverflow.com/questions/3250827/initialise-string-function-result –

+0

いいえ、@Boris、文字列結果の問題は別の問題です。文字列の結果は実際に呼び出された関数ではなく、呼び出された関数で初期化されているため、値が保持されているようです。 –

+1

@Cosmin文字列の結果はインスタンス化され、呼び出し元関数によって初期化されません。関数内で割り当てられていない結果文字列を複数回呼び出すと、2つの呼び出し間で内容を変更すると、内容はそのまま残ります。文字列インスタンスはインスタンス化され、最初に ''で埋められますが、各関数呼び出しに対して ''にリセットします。 'out aText:string;'パラメータだけが各呼び出しの前に文字列をクリアします。 –

1

この類似点を参照してください。Stackoverflow question

Delphiのローカル変数は、デフォルトでは初期化されていません。プログラマはそれを担当しており、読み込む前に常に値を設定する必要があります。ユニット化された変数の値は、その変数に使用された実際に割り当てられたメモリセルの内容に依存します。だから、ここではどんな値も可能です。私のマシンで

+0

私はこれを知っています! と私は最初の投稿で@ "これはローカル変数であり、初期化されていません"と言っています! –

+1

ここで何が問題なのですか? Delphi言語レベルでは、初期化されていない変数の値が未定義であることを知っておく必要があります。正確に何が起こっているのかを実際に知りたい場合は、マシンコードレベルを調べる必要があります。しかし、生成されるコードは、コンパイラのバージョンとコンパイラのフラグ(デバッグモード、最適化レベルなど)に大きく依存します。通常、ローカル変数のメモリはスタックから割り当てられます。スタックはプログラムの実行中に永続的に成長し縮小するため、新鮮なローカル変数には以前の使用されたリターンアドレスなどの任意の値を含めることができますが、誰が気にしますか? – vanje

2
procedure TForm1.Button1Click(Sender: TObject); 
var 
    a: Integer; 
begin 
    ShowMessage(IntToStr(Integer(a))); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
ShowMessage(IntToStr(Integer(Pointer(TButtonControl(Button1))))); 
end; 

このコードはEAXがされるようTButtonControl.WndProcは自己へのポインタ格納するEBXを使用しながら、コンパイラは、変数のEBXレジスタを使用して同じメッセージを(生成実際のハンドラを呼び出す前にbutton1のWinAPI関数呼び出し後に上書きされます)Button1Click。だから、うわー、Delphi 2007のメッセージテキストではあまりにも予測可能です。

[編集済み] あなたは、あなたのプロジェクトのコンパイラオプションCompiler->デバッグ:>使用デバッグDCUを使用デバッグDCUをオプションをオンにした場合、デバッグしながら、VCL内で何が起こっているかを見ることができます。

+2

コンパイラ検索パスにDelphiソースディレクトリを追加しないでください。 Delphiがこれらのユニットを再コンパイルする危険性があります。 VCLユニットを介してデバッグするには、デバッグDCUフォルダを検索パスに追加する "debug DCUs"オプションをオンにします。そのフォルダにはソースコードが含まれていません。 –

+0

@Rob修正のためにありがとう –

+0

固定されています - 今度は同じレーキに乗っているようです –

関連する問題