- 締切済み
値が代入されてない時
あるint型の変数iがあったとします。 このときiに値が代入されてない(初期化されていない)ときのみにある動作をさせたいのですが、うまくやる方法がわかりません。 どなたか、アドバイスお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
> 変数はコードで初期化しなくても暗黙の初期化がされます。(数値ならゼロ。文字列なら、長さゼロの文字列) Variant型はNullという特殊な値で初期化されます。 Object変数はNothing(C言語で言うところのNULLポインタ)で初期化されます。 以上、訂正。
他言語の場合の話を参考(になるかわかりませんが)までに・・・。 VBの場合、変数はコードで初期化しなくても暗黙の初期化がされます。(数値ならゼロ。文字列なら、長さゼロの文字列) ですので、通常VBでは「初期化されていない」判定が必要になることはない(というより、VB6.0では、文法上、変数宣言時の初期化はできない)のですが、唯一の例外が省略可能な(Optional)引数であり、VB6.0以前の文法でも、この場合のみ、仮引数の宣言時に初期値の定義が可能となっています。 そして、省略可能である以上、処理内容により、実引数が渡されているか、否かを判定して処理を分岐する必要性が生じる場合があります。 前置きが長くなりましたが、このようなケースで引数の使用有無をどう判定するかというと、やはりNo.3さんのご指摘のように > iが0以上の値を取るなら > int i = -1 ; > とでもしておけば > if ( i == -1) { > // 未代入 > }else { > // 代入済み > } > と切り分けできます。 とするのが一般的です。 (Optional引数の存在有無を判定するのに、IsMissing関数というのも用意されていますが、個人的には好きではありません) 長くなりましたが、実装言語に依存せずに使用できる手法という観点から、No.3さんご提示の方法が無難と思われます。
- 111fight222
- ベストアンサー率50% (19/38)
状態変数(初期化されている or 初期化されていない)が必要です。 /* sample.c */ /* Int 構造体 */ typedef struct Int { BOOL bInit; /* 初期化状態 */ int iInit; /* 初期化値 */ }; /* Int : 未初期化状態に設定 */ void Int_Clear(Int* me) { me->bInit = FALSE; me->iInit = 0; } /* Int : 初期化 */ void Int_Init(Int* me, int iInit) { me->bInit = TRUE; me->iInit = iInit; } /* Int : 初期化状態の取得 */ BOOL Int_IsInit(Int* me) { return me->bInit; } /* Int : 初期化値の取得 */ int Int_GetInit(Int* me) { return me->iInit; } /* サンプル */ int main(int argc, char** argv) { Int i; /* 変数 i を未初期化状態に設定 */ Int_Clear(&i); if (!Int_IsInit(&i)) { /* 初期化されていない場合 */ printf("ここは実行されます。\n"); } /* 変数 i を 1 で初期化 */ Int_Init(&i, 1); if (!Int_IsInit(&i)) { /* 初期化されていない場合 */ printf("ここは実行されません。\n"); } } /* eof */ ここまでやる必要があるか解りませんが、参考になるといいですね。
- toysmith
- ベストアンサー率37% (570/1525)
iが取りうる値の範囲が決まっているなら、初期化で感以外の値を入れておく。 iが0以上の値を取るなら int i = -1 ; とでもしておけば if ( i == -1) { // 未代入 }else { // 代入済み } と切り分けできます。 iの取りうる値の範囲が決まっていないなら、別の変数を用意して int i , j = 0 ; if (j == 0) { // 未代入 j = 1 ; }else { // 代入済み } と切り分けます。
- furyfox
- ベストアンサー率56% (58/103)
>このときiに値が代入されてない(初期化されていない)ときのみにある動作をさせたいのですが、うまくやる方法がわかりません。 無理です。 一般的に初期化されていない領域には何がはいっているかわかりません。 前に動いてたプログラムのゴミが入っているかもしれません。 値を参照する場合、初期化は必須です。 初期化しているかどうか確認するマクロを作る事は可能かもしれませんが ナンセンスです。 最初に呼び出された時のみ初期化するstaticなどを使って工夫してください。 staticで明示的に指定しない場合0が入ります。 static int i;
- seiuchi4
- ベストアンサー率37% (71/189)
変数の初期値はコンパイル時のオプションによっても異なります。 オプションにより、 (1)0にする (2)指定した値にする (3)初期化しない となりますが、 (3)の場合は、なりゆきの値になります。 (確保した変数領域を前回使っていた最終値) ですので、「初期化してある/してない」の判断は、単純には出来ませんね。 ご自身のコンパイルオプションをご確認の上、再検討してみてくださいね。