ローカル変数(局所変数)を宣言します。
- 構文
- DIM 変数名
DIM 変数名 = 値
- 引数
- 戻り値
変数
変数とは、数値や文字を格納しておくための箱のことです。
変数はデータを一定期間記憶し、必要なときに呼び出したり書き換えたりすることができます。
プログラム内で複数回使う値は宣言すると良いです。値に変更があったときに変数を使っていればその値を変更するだけで済みます。
他の言語では変数の宣言時に型の指定ができますが、UWSCでは変数名を宣言するだけです。
ローカル変数
UWSCでローカル変数を宣言するときにはDIMを使います。DIMはDimensionの略で次元を意味します。変数の宣言時に型の指定はなく、大文字小文字の区別もありません。
ローカル変数の宣言は省略可能ですが、OPTION指定で宣言を強制することができます。
宣言時に値を代入しなかった場合はEmpty型、数値を代入した場合は倍精度浮動小数点値型、文字列を代入した場合はUNICODE文字列型になります。
DIM a // Empty
PRINT VARTYPE(a)
- 結果
0
DIM a = 12 // Double
PRINT VARTYPE(a)
- 結果
5
DIM a = 12.345 // Double
PRINT VARTYPE(a)
DIM a = "abc" // UString
PRINT VARTYPE(a)
- 結果
258
大文字・小文字の区別がないので、以下のように書いてもあいうえおと出力されます。
DIM str = "あいうえお"
PRINT STR
カンマで区切ることで、複数の変数を1度に宣言することができます。
変数a,b, cを宣言します。初期値はすべてEmptyです。
DIM a, b, c
一部だけ初期値を代入することもできます。
DIM a = 1, b, c
グローバル変数を宣言するにはPUBLIC、定数を定義するには定数定義を使います。
配列
変数は一つの数値しか記録することができませんが、配列は複数のメモリ領域を一つの変数と対応させます。まずは一次元配列について解説していきます。
配列の宣言
配列は以下のように宣言します。変数と違い配列は宣言が必須です。
DIM 変数名[配列のサイズ]
配列は複数の要素を持つので、変数名は複数形にすると配列とわかりやすくなります。
DIM items // itemの複数形
DIM users // userの複数形
DIM values // valueの複数形
変数名は通常の変数と同じようにつけることができます。変数名の直後の[ ]に配列の上限値を指定します。例えば以下はarrayという名前で添字が0から7の8つの要素を持つ配列となります。
DIM array[7]
SAFEARRAY関数 (スクリプト関数)を使って宣言することもできます。以下はDIM array[7]と書くのと同じです。
DIM array = SAFEARRAY(0, 7)
DIM array[数値]では下限値が0から始まる配列のみ宣言でき、下限値を0以外の値にする場合は、SAFEARRAY関数 (スクリプト関数)を使います。
第一引数が下限値を表していて、ここに0以外の数値を入れると下限値を変えることができます。以下は下限値が3、上限値が5の配列でarray[3]、array[4]、array[5]の要素にアクセスすることができます。
DIM array = SAFEARRAY(3, 5)
配列要素へのアクセス
通常の変数では、変数名を通してその要素に対して読み書きを行いました。配列の各要素に対してデータの読み書きを行うためには以下のように[ ]で囲った添字を指定します。添字とはインデックスとも呼ばれ、配列の要素を識別するための通し番号のことです。
変数名[添字]
宣言のときに例に出したarray[7]の場合、添字は0から7の整数値ということになります。
以下はarrayという配列の添字が3の要素にアクセスできます。
PRINT array[3]
配列の初期化
変数と同様に、配列も宣言した直後は各要素Emptyで埋められます。宣言と同時に各要素の初期化を行うことができます。
DIM 変数名[定数i] = 要素0, 要素1, …, 要素i-1
宣言したサイズ未満で初期化した場合、残りの要素はEmptyが代入されます。
以下は要素0から要素2には値を代入して、要素3から要素5はEmptyが代入されます。
DIM array[5] = 0, 1, 2
値を代入しない場合はカンマで飛ばすこともできます。以下は要素3から要素5には値を代入して、要素0から要素2はEmptyが代入されます。
DIM array[5] = ,,, 3, 4, 5
配列は初期化を行う場合にのみ、配列のサイズを省略することができます。
DIM array[] = 0, 1, 2, 3, 4, 5
配列のサイズを省略した場合、指定した要素の数に応じて自動的に確保されます。上の例では要素数が6つなので、以下のように配列のサイズを6で初期化したのと同様になります。
DIM array[6] = 0, 1, 2, 3, 4, 5
要素数を数える手間がなくなるうえ数え間違いもなくなるので、初期化する場合配列のサイズを省略することをおすすめします。
以下のようにして下限値と上限値を調べることができます。
DIM array[] = 15, 34, 16, 47, 56, 91
PRINT "下限値<#TAB>" + (RESIZE(array) - LENGTH(array) + 1)
PRINT "上限値<#TAB>" + RESIZE(array)
- 結果
下限値 0 上限値 5
空の配列を宣言するには以下のように要素数を-1にします。
DIM array[-1]
配列の添え字(要素番号)には\(-1<x<上限値\)の範囲の値を指定できます。小数の値を指定した場合は切り捨てられ整数として扱われます。
DIM array[-1]
PRINT "下限値<#TAB>" + (RESIZE(array) - LENGTH(array) + 1)
PRINT "上限値<#TAB>" + RESIZE(array)
- 結果
下限値 0 上限値 -1
添字が\(-1<x<1\)の範囲は添字0を指定したものと同様の扱いになります。
DIM array[] = 12, 34, 56, 78
PRINT array[-0.9]
PRINT array[0]
PRINT array[0.1]
PRINT array[0.6]
PRINT array[0.9]
- 結果
12 12 12 12 12
また添字に-1未満の値を指定した場合は、エラーが発生します。
Analysis: Range check error
多次元配列
多次元配列とは、二次元配列以上の配列のことを言います。
一次元配列のとき変数名の直後に[ ]を書くと配列になりましたが、この[ ]の数が配列の次元を表します。2つであれば二次元配列、3つであれば三次元配列となります。必要な次元だけ[ ]を続けて記述していきます。
DIM array[一次元目のサイズ][二次元目のサイズ][三次元目のサイズ][…]
\(n\)次元目の配列のサイズを\(i_{n}\)で表すと、\(n\)次元配列は以下のように表すことができます。
\[array[i_{1}][i_{2}]・・・[i_{n}]\]初期化するときは\(i_{1}\)のみ上限値を省略することができますが、\(i_{2}\)以降は指定する必要があります。
DIM array1[6] // OK
DIM array2[] = EMPTY // ○OK
DIM array3[1][2] // ○OK
DIM array4[][3] = EMPTY // ○OK
DIM array5[1][4][3] // ○OK
DIM array6[][5][2] = EMPTY // ○OK
DIM array7[6][] // ✕NG
DIM array8[2][6][] // ✕NG
また格納できる要素数は以下のように求めることができます。
\[要素数=(i_{1}+1)\times(i_{2}+1)\times・・・\times(i_{n}+1)\]DIM array[2][3] = 14, 25, 76, 42, _
91, 46, 16, 76, _
44, 56, 14, 75
PRINT "一次元目:" + RESIZE(array)
PRINT "二次元目:" + RESIZE(array[0])
PRINT "要素数:" + ((RESIZE(array) + 1) * (RESIZE(array[0]) + 1))
- 結果
一次元目:2 二次元目:3 要素数:12
二次元配列
以下の例は、二次元配列の値の代入・出力の方法を示したものです。
DIM array[][3] = 0, 1, 2, 3, _
4, 5, 6, 7, _
8, 9, 10, 11, _
12, 13
FOR i1 = 0 TO RESIZE(array)
FOR i2 = 0 TO RESIZE(array[0])
PRINT i1 + ", " + i2 + "<#TAB>" + array[i1][i2]
NEXT
NEXT