API Basic Arrays ja - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

DIM / REDIM / PRESERVE

ClassicUO • Basic

DIM は動的配列を作り、REDIM はその格納領域を置き換えます。PRESERVE は重なる添字の値をコピーします。各次元は要素数ではなく、含まれる上限を指定します。読む前に要素を初期化してください。

正確な構文

DIM name[upper]
DIM name(upper) AS type
DIM grid[xUpper][yUpper]
DIM grid(xUpper, yUpper)
REDIM name[upper]
REDIM PRESERVE name[upper]
name[index] = value
GetArrayLength(name)

パラメーター

  • name — name:配列変数。DIM は宣言し、REDIM は既存変数の格納先を置き換えます。要素の読み書きには items[i]、grid[x][y] を使います。
  • upper — upper:Integer に変換する式。左から右へ各一回評価します。DIM items[2] は 0..2 の三要素を作ります。-1 は空の次元です。それ未満や長さのオーバーフローはエラーです。実用上の大きさはメモリにも制限されます。
  • PRESERVE — PRESERVE:REDIM の省略可能な指定。重なる添字を再帰的にコピーし、縮小時には新しい範囲外の値を失います。省略すると要素は未初期化です。
  • AS type — AS type:DIM 配列宣言で受け付ける注記ですが、要素の型指定・初期化・変換は行いません。異なる種類の値を格納できます。

戻り値

DIM と REDIM は値を返しません(Unit)。items[i] は格納値を実際の種類 Integer、Decimal、String、Array、Object で返します。未初期化要素の読み取りはエラーになり、0 や FALSE にはなりません。GetArrayLength(array) は外側の長さを Integer で返し、配列以外なら 0 です。

動作

  • DIM grid(1, 2) は grid[1][2]、つまり二行・各三要素です。境界内の関数呼び出しは維持されます。アクセスは grid[1][2] のままです。式内の丸括弧は関数呼び出しを意味します。
  • 代入と ByVal 渡しは要素ではなく参照をコピーします。別名から共通要素の変更が見えます。REDIM は新配列に結び直し、別名は古い配列を保持します。PRESERVE は入れ子の配列の重なる座標をコピーし、任意のオブジェクトを完全に複製するものではありません。
  • 添字はゼロ始まりのみです。DIM items[2]=5 などの DIM/REDIM 初期化式は SC014 で拒否されるため、各要素を別の行で設定します。不正な添字、存在しない要素、未初期化の読み取りは捕捉可能なエラーです。
  • この Basic 方言の動的な要素種類と多次元 PRESERVE は VB.NET の型付き配列とは異なります。格納した真偽値は 1/0 ですが、一般の数値や配列長は成功フラグではありません。
  • RETURN array は配列の参照を返し、作成した関数の終了後もデータは有効です。別の変数への代入は要素をコピーしません。共通関数で Module フィールド用の配列を作れます。独立した実行では DIM を実行するたびに新しい配列を作ります。

使用例

1. 初期化した要素の合計

# Abs(-2) は上限 2 を返し、Main は三要素に 2、4、6 を設定します。Sum は参照を ByVal で受け、0..GetArrayLength(items)-1 を巡回して 12 を返します。補助関数は全文記載で、要素を変更せず空配列にも対応します。
Option Explicit On
FUNCTION Sum(ByVal items)
    VAR total = 0
    VAR i = 0
    FOR i = 0 TO GetArrayLength(items) - 1
        total += items[i]
    NEXT
    RETURN total
END FUNCTION
SUB Main()
    DIM items(Abs(-2))
    items[0] = 2
    items[1] = 4
    items[2] = 6
    RETURN Sum(items)
END SUB

パラメーターと実行の説明:

Abs(-2) は上限 2 を返し、Main は三要素に 2、4、6 を設定します。Sum は参照を ByVal で受け、0..GetArrayLength(items)-1 を巡回して 12 を返します。補助関数は全文記載で、要素を変更せず空配列にも対応します。

2. 値を保って拡張

# values は 7 と 8 を保持します。REDIM PRESERVE values(2) は三要素を作り、添字 0、1 をコピーします。新要素 2 は 9 に初期化します。Main は 7*100+8*10+9=789 を返します。
Option Explicit On
SUB Main()
    DIM values[1]
    values[0] = 7
    values[1] = 8
    REDIM PRESERVE values(2)
    values[2] = 9
    RETURN values[0] * 100 + values[1] * 10 + values[2]
END SUB

パラメーターと実行の説明:

values は 7 と 8 を保持します。REDIM PRESERVE values(2) は三要素を作り、添字 0、1 をコピーします。新要素 2 は 9 に初期化します。Main は 7100+810+9=789 を返します。

3. 別名と新領域を確認

# grid は二行・各二要素です。alias は同じ配列なので alias[0][1]=9 は grid も変更します。PRESERVE は grid を三行に拡張し 9 を保持しますが、alias は二行のままです。"9:3:2" は保持値、新しい外側の長さ、古い別名の長さです。
Option Explicit On
SUB Main()
    DIM grid[1][1]
    grid[0][1] = 4
    VAR alias = grid
    alias[0][1] = 9
    REDIM PRESERVE grid[2][1]
    RETURN CStr(grid[0][1]) + ":" + CStr(GetArrayLength(grid)) + ":" + CStr(GetArrayLength(alias))
END SUB

パラメーターと実行の説明:

grid は二行・各二要素です。alias は同じ配列なので alias[0][1]=9 は grid も変更します。PRESERVE は grid を三行に拡張し 9 を保持しますが、alias は二行のままです。"9:3:2" は保持値、新しい外側の長さ、古い別名の長さです。


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic