初期化のことなんですが

解決


湘南乃海  2007-03-12 19:04:31  No: 25279

(Turbo Delphi2006)
ボタンを押すといろいろと処理をするコードを書いています。その最初のコードに、変数(整数型)を初期化するため、0を代入しています。が、その変数をローカル変数として記述していたところ(ローカルにしか使わないため)、0が代入されていない変数があります。というのも、8つほど変数を定義しているのですが、そのうちの6つが、0が代入されていない状態になります。なぜ代入されていないと言えるのか、といいますと、デバッグ作業の最後に、「変数○○○に代入された値は使われていません」とでます。ブレークポイントを置いてコードを見ながらやってみると、その6つの変数に0を代入するところだけ飛ばされていました。
それで、その6つの変数だけグローバル変数に変えてみましたところ、0が代入されていました。(なぜ・・・?)  それで何日かたって、もう一度その6つの変数を、ローカル変数へと戻してみたところ、0が代入されていました。もちろん過ぎた日にちの間でコードはいろいろと変えましたが、その6つの変数は相変わらずローカルにしか使っていません。で、またしばらく日にちがたって、実行してみると、「変数○○○に代入された値は使われていません」  ブレークポイントを設置してみて確認すると、やはりその6つだけ0が代入されず、飛ばされていました。で、グローバル変数に変更してみると、代入されました。
結局何が聞きたいのかといいますと、ローカルにしか使わない変数を、グローバル変数として定義しなければならない理由として、どういったことが挙げられるでしょうか、ということです。


deldel  2007-03-12 19:29:52  No: 25280

値が不定なのは、実行時において一度も使用されないためです。
「ローカルにしか使わない変数を、グローバル変数として定義
しなければならない理由」は、無いと思います。

初期化するだけで使用しない変数は削除するといいと思います。


HOta  2007-03-12 19:31:25  No: 25281

これは、コンパイラがローカルでどこにも使っていない変数は使わないようにするためです。使えば初期化します。


湘南乃海  2007-03-12 19:44:32  No: 25282

すいません。エラーメッセージが違っていました。(確認せずに送信してしまいました)
「変数○○○に代入された値は使われていません」
                    ↓↓  
正しくはこっち
「変数 '○○○' が宣言されていますが 'TForm1.Button1Click' の中では使われていません」
これが6行。この場合も
'TForm1.Button1Clickの中で変数○○○なんて使ってねぇよ'っていうことですよね(書き直しただけにしか見えない・・)
でも、ものすごく?使ってます。結果的に使わなかたりする、というようなこともないです。Button1を押したら必ず使います。


deldel  2007-03-12 20:18:17  No: 25283

例えば以下のような場合、ib1は下のほうで使用されていても、
1行目は無視されますよね。

  ib1 := 1; //この行は無視される
  ib2 := 2;
  ib3 := 3;

  ib1 := ib2 + ib3;
  showmessage(inttostr(ib1));


湘南乃海  2007-03-12 22:04:02  No: 25284

deldelさんの例で言うと、
ib1に代入された1は、結果的に使ってないから(使っていないのと同じだから)無視される、ということですよね。
私が書いているコードはそういったことにはなっていないようです。
例えば
ha:=0;
として、haに値が何も代入されないまま終わる場合はあります。が、0は0として最後に表示させるため、(前にhaに代入されていた値がそのまま表示されないよう)初期化ということでやってます。


コード  2007-03-12 22:38:38  No: 25285

再現できるソースを貼り付けてください


湘南乃海  2007-03-13 04:06:42  No: 25286

あのー・・・コードを貼り付けようと思って、できるだけまとめようとしてたら、ありました・・・deldelさんの

”例えば以下のような場合、ib1は下のほうで使用されていても、
1行目は無視されますよね。

  ib1 := 1; //この行は無視される
  ib2 := 2;
  ib3 := 3;

  ib1 := ib2 + ib3;
  showmessage(inttostr(ib1));  ”

というような場所が。
一度全部0にしてから改めて、とやったほうがわかりやすいかなぁと思ってたんですが、無駄みたいですね。  申し訳ない。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加