配列
Caché Basic は、他の Basic のバージョンと比べ、配列に対してより強力なサポートを提供しています。Caché Basic では、以下のことが可能です。
-
スパースの多次元配列を作成します。
-
整数、文字列の結合を使用します。また、数値は配列添え字です。このような配列は添え字値で自動的にソートされます (ソート関数を呼び出す必要はありません)。
-
サイズとディメンジョンを宣言する必要なしに、配列を使用します。Caché Basic では、Dim、または Redim 配列を使用する必要はありません。
-
配列の操作、および検索に対する内部コマンドを使用します。
また、データベースに自動的に保存される永続多次元配列 (グローバル) を作成し、使用することができます。詳細は、"Caché グローバルの使用法" を参照してください。
配列の定義
配列変数を宣言する必要はありません。配列を作成するには、値を配列の内部に配置するだけです。
' Create an array
arr(1) = "First element"
arr(2) = "Second element"
arr(3) = "Third element"
' Display the contents of the array
For i = 1 To 3
PrintLn i & ": " & arr(i)
Next
各配列要素 (ノード) は 32K のデータまで含むことができます。
使用する添え字の数を増やすだけで、多次元配列を作成できます。
' Create a multidimensional array
arr(1,1) = "X" : arr(1,2) = "O" : arr(1,3) = "X"
arr(2,1) = "X" : arr(2,2) = "X" : arr(2,3) = "O"
arr(3,1) = "O" : arr(3,2) = "O" : arr(3,3) = "X"
' Display the contents of the array
For row = 1 To 3
For col = 1 To 3
Print arr(row,col) & " "
Next col
PrintLn
Next row
配列添え字として文字列を使用することができます。
' Create an associative array
notes("Jack") = "Fell down; Broke crown"
notes("Jill") = "Tumbled after"
' Display the contents of the array
PrintLn "Jack: " & notes("Jack")
PrintLn "Jill: " & notes("Jill")
存在の有無のテスト
Exists 関数を使用して、配列ノード (または変数) が定義されているか (値を持っているか)、またはサブ・ノードを持っているかをテストすることができます。Exists 関数は、以下の値の 1 つを返します。
定数 | 値 | 意味 |
---|---|---|
vbUndefined | 0 | 変数が未定義 |
vbHasValue | 1 | 変数は値を持つ |
vbHasArray | 2 | 変数は未定義で、サブ・ノードを持つ |
vbHasValue AND vbHasArray | 3 | 変数は定義済みで、かつ サブ・ノードを持つ |
次に例を示します。
' Initialize
var = "Variable"
arr(1) = "Array node with subnode"
arr(1,1) = "Array node"
' Test for existence
PrintLn "Exists(a) " & Exists(a)
PrintLn "Exists(var) " & Exists(var)
PrintLn "Exists(arr) " & Exists(arr)
PrintLn "Exists(arr(1)) " & Exists(arr(1))
PrintLn "Exists(arr(1,1)) " & Exists(arr(1,1))
配列の削除
Erase コマンドを使用して、配列 (その添え字と値) を削除することができます。
array = "root node"
array("subnode") = "subnode"
array("subnode", "subnode") = "subnode, subnode"
Println Exists(array) 'returns 3; variable defined and has array elements
Erase array
Println Exists(array) 'returns 0
配列の探索
配列を探索して、その配列が持つ添え字や値を検索することができます。
For...Next Loop での探索
整数値によって配列に添え字が付けられ、その配列が持つ要素数がわかっている場合、単純な For...Next ループを使用してその内容をリストにすることができます。
' Create an array
For i = 1 To 10
arr(i) = "Item " & i
Next i
' Display the contents of the array
For i = 1 To 10
PrintLn i & ": " & arr(i)
Next
For Each...Next Loop での探索
For Each...Next ループを使用して、配列に対するすべての添え字をリストにすることができます。
' Create an array
food("Apple") = "Fruit"
food("Banana") = "Fruit"
food("Asparagus") = "Vegetable"
food("Broccoli") = "Vegetable"
' Display the array subscripts
For Each key In food
PrintLn key
Next
Traverse 関数
Traverse 関数を使用すると、配列の中の任意の位置で、その次 (またはその前) の添え字を検索ことができます (Traverse は、ObjectScript の $ORDER に相当する、Basic の関数です)。
Traverse 関数は配列参照を取り、指定された添え字レベルで、次の添え字、または前の添え字を返します。指定された添え字レベルは、配列参照にリストされた最後の添え字です。次に例を示します。
' Define an array
arr("a",1) = "a1"
arr("a",2) = "a2"
arr("b",1) = "b1"
arr("b",2) = "b2"
PrintLn Traverse(arr(""))
PrintLn Traverse(arr("a"))
PrintLn Traverse(arr("b"))
PrintLn Traverse(arr("a",""))
PrintLn Traverse(arr("a",1))
While ループ内で Traverse を使用して、前のセクションから food 配列のすべての添え字を検索します。
' Create an array
food("Apple") = "Fruit"
food("Banana") = "Fruit"
food("Asparagus") = "Vegetable"
food("Broccoli") = "Vegetable"
' Display the array subscripts
key = Traverse(food("")) ' find first subscript
While (key <> "")
PrintLn key
key = Traverse(food(key)) ' find next subscript
Wend
Traverse を使用して前のノードを検索するには、オプションの指示フラグを第 2 引数として使用します。
' Create an array
food("Apple") = "Fruit"
food("Banana") = "Fruit"
food("Asparagus") = "Vegetable"
food("Broccoli") = "Vegetable"
' Display the array subscripts backwards
key = Traverse(food(""),-1) ' find last subscript
While (key <> "")
PrintLn key
key = Traverse(food(key),-1) ' find previous subscript
Wend