Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

配列

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
FeedbackOpens in a new tab