VBScript / 配列


VBScript

Dim Arr()       ' プログラム中で配列のサイズを変えたい場合には添え字を () にする
ReDim Arr(1024)    ' ReDim しないと使えない

Arr(1) = "A-1"
Arr(2) = "A-2"
Arr(3) = "A-3"

' Arr の配列の要素数を表示
WScript.Echo UBound(Arr) - Lbound(Arr) + 1

ReDim Arr(4)
' 配列に配列を代入する
Arr(1) = Array("A-4-0","A-4-1","A-4-2","A-4-3","A-4-4")

WScript.Echo Arr(4)(1)
' Arr(4) に入っている配列の要素数を出す
WScript.Echo UBound(Arr(4)) - Lbound(Arr(4)) + 1

実行結果は、

> Array.vbs
1025   ← ReDim Arr(1024) としたため 3 ではなく 0 〜 1024 の 1025個
A-4-1   ← Arr(4)(1) の出力結果
5     ← Arr(4) に入っている配列の要素数 (0 〜 4)

となる。 Arr(1)(1) は、意味としては (Arr(1))(1) だと思うが、こう書くと「実行時エラー: 型が一致しません。」となる。 もう少し技巧に走ると

Dim Arr
Arr = Array("","","")
Arr(1) = Array(1,2,3)
WScript.Echo Arr(1)(1)

というのも可能(「2」が表示される)。これぞ可変配列か? でも、上と同じく(Arr(1))(1)はエラーになる。 以下のように書けば、Arr 配列の最後に Var を追加する array_push や、array_pop 関数ができあがる(PHP もどき)。

Dim Chr0      ' グローバル変数を宣言
Chr0 = Chr(0) ' Chr(0) を ^@ にする。(普通のテキストには含まれることがないので)
Function array_push(ByRef Arr, ByVal Var)
  Arr = Split(Join(Arr, Chr0) & Chr0 & Var, Chr0)
  array_push = UBound(Arr) - LBound(Arr) + 1
End Function

Function array_pop(ByRef Arr)
  Dim strTmp, n
  strTmp = Join(Arr, Chr0)
  n = InStrRev(strTmp, Chr0)
  array_pop = Mid(strTmp, n + 1)
  Arr = Split(Left(strTmp, n - 1), Chr0)
End Function

Dim Array_A, i
Array_A = Array(0,1,2,3,4,5)
WScript.Echo "===== 初期値 ====="
WScript.Echo "UBound Array_A: " & UBound(Array_A)
WScript.Echo "Array_A: " & Join(Array_A)

array_push Array_A, 6 ' Array の最後に 6 を追加
WScript.Echo "===== array_push の結果"
WScript.Echo "UBound Array_A: " & UBound(Array_A)
WScript.Echo "Array_A: " & Join(Array_A)

i = array_pop (Array_A) ' Array の最後から削除
WScript.Echo "===== array_pop の結果"
WScript.Echo "返値: " & i
WScript.Echo "UBound Array_A: " & UBound(Array_A)
WScript.Echo "Array_A: " & Join(Array_A)

やはり、可変変数っぽい(^^;