UWSC Safearrayの下限と上限を得る

メモ

function lbound(sa)
    result = ubound(sa) - length(sa) + 1
fend

function ubound(sa)
    result = resize(sa)
fend

引数省略したsafearray()の下限が1で上限が0って確かに嫌だね

sa = safearray(3, 8)
print "safearray(" + lbound(sa) + ", " + ubound(sa) + ")"

sa = safearray(0, 10)
print "safearray(" + lbound(sa) + ", " + ubound(sa) + ")"

sa = safearray(0, -1)
print "safearray(" + lbound(sa) + ", " + ubound(sa) + ")"

sa = safearray()
print "safearray(" + lbound(sa) + ", " + ubound(sa) + ")" // safearray(1, 0)

サイズ0はsafearray(0, -1)で作る

ヘルプ見たら

// SAFEARRAY型の作成
戻値 = SAFEARRAY( 下限, 上限, [二次元下限, 二次元上限] )

第1、第2引数は省略出来ないような感じになってるのな今 (出来るんだけど
つか、そうか二次元か…いつだったか出来るようになったんよね
二次元SAFEARRAYとか作らんのであれだけど
それぞれの下限・上限も取れたほうが良さそうだね
あとで考える

☆ ☆ ☆
考えた
以前掲示板でumiumiさんがSafeArrayGetUBoundとか使えばいいよて言ってたの思い出した

function UBound(sa, d = 1)
    result = EMPTY
    select d
        case 1
            result = resize(sa)
        case 2
            if SafeArrayGetUBound( sa, d, result) then result = EMPTY
    selend
fend

function LBound(sa, d = 1)
    result = EMPTY
    select d
        case 1
            result = UBound(sa) - length(sa) + 1
        case 2
            if SafeArrayGetLBound( sa, d, result) then result = EMPTY
    selend
fend

def_dll SafeArrayGetLBound(safearray, uint, var long):long:OleAut32.dll
def_dll SafeArrayGetUBound(safearray, uint, var long):long:OleAut32.dll

二次元は LBound(sa, 2) 、 UBound(sa, 2) ってする
エラーだったらempty返る

UWSC Safearrayの下限と上限を得る」への3件のフィードバック

  1. あのぅ、、、SafeArrayGet?Boundを使うならselectのcase 1はいらないんじゃ、というのは触れてはいけない話題でしょうか。
    if文だけでいけそうですが、saに数値がくることを想定して、Try-ExceptかVARTYPEしても良いかもしれません。

    下限1・上限0、、、おかげでSPLIT(EMPTY)をRESIZEするとおかしくなる理由がわかりました!
    SafeArrayRedimすれば良いんですね!(何でもDEF_DLLで解決するのは悪い癖)
    ありがとうございます。

  2. >case 1
    二次元のsafearrayで一次元目の上限下限を取得する為なんですよ…
    1を渡した時に欲しい値が返ってこないんですよあれ…

    SafeArrayRedimを使った関数も書いてたんですが、これも二次元safearrayに対してやると望まぬ結果になってしまったので載せるの止めました

    #個人的にはsafearrayを二次元で使うことないんですけどね…!
    #多次元配列はコワイし…!

  3. 二次元SafeArray、、、ノーマークでした。失礼しますた。
    SafeArrayRedimは微妙に評判良くないですよね。
    SafeArrayって昔っから得体が知れないと敬遠してましたが、やはり得体が知れない、、、。
    何がSafeなんだか、、、。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中