none
配列がREDIM されているかの判断方法 RRS feed

  • 質問

  • お世話になります。

    VB.NETで、配列がREDIMされているか判断するにはどのようにすれば良いでしょうか?

    '========================================
    '   配列が Redim されているか判定
    '========================================
    Public Declare Function SafeArrayGetDim Lib "oleaut32" _
       (ByRef psa() As Any) As Long

    VB6では、SafeArrayGetDim(strData) <> 0 といったロジックでやっていました。

    VB.NETでも同じようにAPIを使用するのでしょうか?

     

    2006年4月19日 8:18

すべての返信

  • 配列の仕組みが全然違うわけですが、
    そもそも、何故そんな判断が必要なのでしょうか?

    2006年4月19日 8:20
  • 完全に想像ですが、こういうことでは

    配列の次元はRankで取得します。

    例:

             Dim P As Integer()

            Debug.WriteLine(IsNothing(P))
            'Debug.WriteLine(P.Rank) :例外発生

            ReDim P(10)

            Debug.WriteLine(IsNothing(P))
            Debug.WriteLine(P.Rank) ':1

    2006年4月20日 10:19
  • お世話になります。解決しました。

    じゃんぬさん、セットされているかどうしてみるかなのですが、

    DLLの中で、セットされていれば、そのデータを使うといったロジックになっており、

    Nothingの場合、エラーになってしまうからです。

    oyamaさん、IsNothingを使用して判断出来ました。Rankで配列の次元をみればよいのですね。勉強になりました。

    ありがとうございます。

    2006年4月21日 2:19
  • そういう意味でしたか... orz
    全然読み取れてませんでした。

    個人的には、IsNothing ではなく、If obj Is Nothing Then を使いますね。

    このあたり、@IT に統一スレッドがあった記憶があります。

    2006年4月21日 3:29
  • ちなみに、配列の有無はじゃんぬさんやoyamaさんが仰せの通りで判定しますが、配列の長さや各次元単位の上限下限は

            Dim p As Integer()
            ReDim p(10)
            Console.WriteLine("{0}", p.Length())            ' 配列の長さ(Result = 11)
            Console.WriteLine("{0}", p.GetUpperBound(0))    ' 配列1次元の上限(Result = 10)
            Console.WriteLine("{0}", p.GetLowerBound(0))    ' 配列1次元の下限(Result = 0)

    てな具合に参照できます。

    外してたらすみません(^^;

    2006年4月25日 13:40