要素数0の配列を判定するには?

解決


黒ベエ  2006-03-30 04:10:24  No: 130847

VB6で、

Dim  v()  As Variant

と宣言した変数vに対し、現在の長さをUbound()-LBound()で求め、
そこに+1してredim preserveステートメントを使い、順次要素を増やして処理を行いたいと思っています。
しかし、TypeName関数では型の名前が"Variant()"となってしまい、要素数0の判定ができません。
LBound、Uboundで要素の長さを得ようとしても要素がないので実行時エラーになります。
要素数0の配列を見分ける方法があれば教えてください。


魔界の仮面弁士  2006-03-30 06:12:22  No: 130848

そのままでは、エラートラップするか、APIで判定するしかありません。

こういう場合は、あらかじめ
  v = Array()
のようにして、空の配列を作成しておく事をお奨めします。
このようにして作った配列ならば、LBound/UBoundしてもエラーになりません。


K.J.K.  2006-03-30 20:49:15  No: 130849

要素数0の配列(空の配列)、と、
初期化されてない配列型の変数、
とは異なるので区別しましょう。

似たような文字列で対応するものを探すのならば、
前者は""
後者はvbNullString
となります。


黒ベエ  2006-03-31 06:22:23  No: 130850

v = Array()とするのですか。
よくわかりました。
UBoundで-1が返るのは多少違和感を感じますが、
これなら要素0を特別扱いすることなく処理できそうです。
ありがとうございました。

vbNullStringはCで言うところのNULLポインタだそうですね。
""はvbNullCharとも書けるようです。
今までこの二つは同一だと思い込んでいました。
思い込みとは怖いものです。


黒ベエ  2006-03-31 06:25:28  No: 130851

解決しました。


魔界の仮面弁士  2006-03-31 06:47:57  No: 130852

> UBoundで-1が返るのは多少違和感を感じますが、
この時、LBound は 0 を返します。(Option Base 0 の場合)

結果として、空の配列においても、要素数を求めるために
  要素数 = UBound値 - LBound値
という数式が、そのまま使えるようになっているわけですね。

> ""はvbNullCharとも書けるようです。
書ける場合もありますが、それぞれは別物です。

確かに API などに渡す時には、それらが同一視される事もありますが、
VB側として見れば、
  If "" = vbNullChar Then
は、False を返しますからね。


魔界の仮面弁士  2006-03-31 06:54:28  No: 130853

おっと間違い。要素数の求め方は、
  要素数 = UBound値 - LBound値 + 1
ですね。(^^;

Dim V() As Variant

V = Array()  '要素数ゼロ
Debug.Print UBound(V) - LBound(V) + 1

ReDim V(3)  '要素数4
Debug.Print UBound(V) - LBound(V) + 1

ReDim V(1 To 3)  '要素数3
Debug.Print UBound(V) - LBound(V) + 1


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

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






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