<199910081625.BAA50369@xxxxxxxxxxxxxx> の、 "[H8-ML(367)] Re: 秋月Cコン広域変数の件" において、 "Junsuke Kunugiza <jk@xxxxxxx>"さんは書きました: jk> わたしは、基本的にスタートアップルーチン内でROMからRAMに jk> 広域変数の初期値をコピーし、あるいはゼロ化することにして jk> いるのですが、プログラムで明示的に初期化した方が好ましい jk> 理由があるのでしょうか(興味本位です)。 1)初期化ルーチンを作らなくて良い。^-^; 2)デバッグが楽。初期化ルーチンと違ってBreak pointが分かりやすい。 3)コンパイラのセグメント割付の制約を受けない。 などいろいろありますが、 4)部分初期化が可能。 たとえばgarmin'meでは初期センテンスを固定で持っていて初期化時に RAMにコピーし以後、更新していきます。ここでH8のgear機能を使った時 など設定変更が多岐にわたっているとき、Wathdogでリセットをかけ、再 起動しています。ここでフラグを見ればコールドスタートかどうか分かる のでホットスタートの時は初期化しません。折角持っている最新の位置情 報を失わなくて済む訳です。この時、初期値を持たない変数もゼロにされ ては困りますので結局、ホットスタートの初期化はコードで明に行う、と なるとコールドスタートの時にスタートアップでやってもらっても嬉しく ないどころか邪魔でさえあります。 5)誤動作に強くなる。 例えば、そのルーチンに必要な変数をそのルーチン内で初期化しておけ ば、ハードの誤作動やあるまじきことですがソフトのバグで変数が破壊さ れていても誤動作しません。 6)領域を重ねて使える。 メモリを節約するためAとBという二つのルーチン群で異なる初期化をし て同じ領域を共用する。 ということで明示的に設定するメリットは多く、明示的に設定するしかない 場合もあるということで暗黙でやって貰ってもあまり嬉しくないというのが 理由ですね。確かに初期化ルーチンによる暗黙の初期化で十分な時も多いの ですがあとで明示的な初期化に直すのは大変なので最初から明示的に書く癖 をつけた方が楽です。 #余談ですがメインループをsetjump/longjumpで構成してスタックポインタま #で明示的に初期化してスタック溢れを防ぐなんて荒業を使う人も居ます。