その他

Variant型の動的配列で初期化済みかどうかを判定する方法

掲題通りになりますが、VB6でvariant型の動的配列が初期化済みかを判定する方法です。コンピュータの特性を利用した判定方法で初期化済なのか未初期化の状態なのかを判定します。

variant型の同列配列か判定するサンプル

まずは以下のようなvariant型の同列配列が初期化済みか判定するプログラムを用意します。

Private Sub Command1_Click()
    Dim var() As Variant
    ReDim var(1)
        
    If Not Not var Then
        MsgBox "varは初期化済"
    Else
        MsgBox "varは未初期化"
    End If
End Sub

このときの実行結果は、”varは初期化済”とメッセージボックスが表示されます。

次にReDimを行わなかった場合はどうなるか確認してみます。

Private Sub Command1_Click()
    Dim var() As Variant
    //ReDim var(1)
        
    If Not Not var Then
        MsgBox "varは初期化済"
    Else
        MsgBox "varは未初期化"
    End If
End Sub

このときの実行結果は、”varは未初期化”とメッセージボックスが表示され正しく判定できていることが分かります。

if not not

さて、ここで判定で使用している条件で「if not not」という条件を指定していますが、これはどういった意味でしょうか?順を追って確認していきます。

まず、変数varですが、宣言直後にTypeNameで確認するとVariant型の配列であることが確認できますが、これがNot演算子を利用すると型はLONG型に変換されるという動作をとります。

次に初期化が行われていない場合、この「not var」は-1という値を返します。

初期化が行わている場合の「not var」は「-1891265」などの値が入ることになります。

ここまでのポイントをまとめると

①NOT演算子を利用した場合、Variant型の配列はLONG型になる
②初期化していない場合のnot varは「-1」を返す。
③初期化済の場合は「マイナスの値」を返す(ここでは-1929137)

初期化済か判定を行う

NOT演算子は変数に対してビット単位の反転も行うので、上記ポイント②の「-1」は「not not var」と書くことにより「0」となります。

この「0」はvbFalseの値(0)と同じ値のため、if not not var の判定結果はelseに進むことになるのです。

※↓未初期化時のイメージ

ifnotnot

初期化が行わている場合の動作

初期化が行わている場合は、上記ポイント③のように値が入ります。今回では「not var」時に「-1929137」が返ってきますので、「not not var」というように反転した場合は、「1929136」となり「0」(vbFalse)ではない、つまり「varは初期化済」になります。

if not not not not

Variant型の動的配列で初期化済みかの判定プログラムですが、「if not not」という判定方法についてピックアップしてみました。ちなみに同じ理屈で未初期化の場合、「if not not not not var」という書き方でも同様に判定OKです。

裏の裏の裏の裏の裏は表とか何とかいうややこしい話でした。

タイトルとURLをコピーしました