
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
> 変数はコードで初期化しなくても暗黙の初期化がされます。
(数値ならゼロ。文字列なら、長さゼロの文字列)Variant型はNullという特殊な値で初期化されます。
Object変数はNothing(C言語で言うところのNULLポインタ)で初期化されます。
以上、訂正。
No.5
- 回答日時:
他言語の場合の話を参考(になるかわかりませんが)までに・・・。
VBの場合、変数はコードで初期化しなくても暗黙の初期化がされます。(数値ならゼロ。文字列なら、長さゼロの文字列)
ですので、通常VBでは「初期化されていない」判定が必要になることはない(というより、VB6.0では、文法上、変数宣言時の初期化はできない)のですが、唯一の例外が省略可能な(Optional)引数であり、VB6.0以前の文法でも、この場合のみ、仮引数の宣言時に初期値の定義が可能となっています。
そして、省略可能である以上、処理内容により、実引数が渡されているか、否かを判定して処理を分岐する必要性が生じる場合があります。
前置きが長くなりましたが、このようなケースで引数の使用有無をどう判定するかというと、やはりNo.3さんのご指摘のように
> iが0以上の値を取るなら
> int i = -1 ;
> とでもしておけば
> if ( i == -1) {
> // 未代入
> }else {
> // 代入済み
> }
> と切り分けできます。
とするのが一般的です。
(Optional引数の存在有無を判定するのに、IsMissing関数というのも用意されていますが、個人的には好きではありません)
長くなりましたが、実装言語に依存せずに使用できる手法という観点から、No.3さんご提示の方法が無難と思われます。
No.4
- 回答日時:
状態変数(初期化されている 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 */
ここまでやる必要があるか解りませんが、参考になるといいですね。
No.3
- 回答日時:
iが取りうる値の範囲が決まっているなら、初期化で感以外の値を入れておく。
iが0以上の値を取るなら
int i = -1 ;
とでもしておけば
if ( i == -1) {
// 未代入
}else {
// 代入済み
}
と切り分けできます。
iの取りうる値の範囲が決まっていないなら、別の変数を用意して
int i , j = 0 ;
if (j == 0) {
// 未代入
j = 1 ;
}else {
// 代入済み
}
と切り分けます。
No.2
- 回答日時:
>このときiに値が代入されてない(初期化されていない)ときのみにある動作をさせたいのですが、うまくやる方法がわかりません。
無理です。
一般的に初期化されていない領域には何がはいっているかわかりません。
前に動いてたプログラムのゴミが入っているかもしれません。
値を参照する場合、初期化は必須です。
初期化しているかどうか確認するマクロを作る事は可能かもしれませんが
ナンセンスです。
最初に呼び出された時のみ初期化するstaticなどを使って工夫してください。
staticで明示的に指定しない場合0が入ります。
static int i;
No.1
- 回答日時:
変数の初期値はコンパイル時のオプションによっても異なります。
オプションにより、
(1)0にする
(2)指定した値にする
(3)初期化しない
となりますが、
(3)の場合は、なりゆきの値になります。
(確保した変数領域を前回使っていた最終値)
ですので、「初期化してある/してない」の判断は、単純には出来ませんね。
ご自身のコンパイルオプションをご確認の上、再検討してみてくださいね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
異なる構造体のデータのコピー
-
構造体のデータを丸ごとコピー...
-
VBAの変数のデータ型を変更する...
-
Integer変数をカラにしたいので...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
CStringからchar*への型変換に...
-
C# DataGridView のヘッダーセ...
-
DWORDとcharの変換
-
入力された文字列の中の数字を...
-
【C言語】配列の中に配列を入れ...
-
C言語の配列:「*(w+a)=・・・...
-
%dなどの違い
-
datagridviewの並べ替え
-
sinのマクローリン展開
-
C言語 配列の再初期化
-
TCL言語で文字列検索方法を教え...
-
char型にint型の数値を代入する。
-
C言語でのconstを返す関数
-
アルファベットをカウント、
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAの変数のデータ型を変更する...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
整数から16進数への変換 現在c...
-
変数の初期化について
-
long型のデータをバイト型の配...
-
1バイトデータの読み出しについて
-
命名規則 VB 構造体
-
異なる構造体のデータのコピー
-
VBAで符号無し整数
-
C言語 構造体の中に共用体を定...
-
日付チェック関数について
-
構造体のポインタにNULLが入らない
-
ビット演算について
-
VBAで変数定義を変更する方法
おすすめ情報