hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
hsp3.0から変数の領域は必要とするサイズが自動確保されるようになったが全く制限なしというわけではないようなのでここでレポート。
配列変数を作る命令はdim(数値)やsdim(文字列)などがあります。例に整数型配列変数を作るdim命令の書式を挙げると
dim 配列変数名, 1次要素数, 2次要素数, 3次要素数, 4次要素数
のようになっています。
1次元配列変数はn個の変数が連続する配列のことで、配列変数において1つ1つの変数を要素と呼びます。
2次元以上の配列変数をイメージするときは少し頭を使います。
例えば、
dim a, 2, 3
の配列変数aは「要素が2個の塊が3個連続する配列変数」と読みます。
同様に、
dim d, 2, 3, 4
の配列変数dは「要素が2個の塊が3個の塊が4個連続する配列変数」と読みます。
配列変数の要素は1次元目→2次元目→3次元目→4次元目の順番で指定します。
次の項のメモリ上のイメージを見ると分かりますが要素を指定するとき、もっとも小さい次元(区分)から指定していきます。
図を見る限り要素の位置を示す上では「4次元目→3次元目→2次元目→1次元目」のように、大区分から小区分へと向かって指定していく方が自然と言えます。
このことはあなた方の住まいが「太陽系惑星→地球→日本→関東→東京→??区→」のように大から小へと限定されていくことを想像すれば分かりますね?
HSP以外の言語(C言語から派生する言語)などはこの方法をとっており、
HSP・・・・dim a,2,3,4 C言語・・・int a[4][3][2];
の2つはそれぞれ等価な配列変数を表します。
それぞれの指定方法には一長一短があり、HSPではメモリ上の先頭要素と表記上の先頭要素が一致する方法を採用しています。(BASICから派生)
上の図は数値型(整数型・実数型)多次元配列のイメージですが文字列型配列以外の配列変数の要素はメモリに連続して割り当てられます。
変数にはデータを格納する領域がメモリに確保されています。
通常の変数はデータ(要素)を1つ保持できます。
その変数が現在保持できる要素数を超えてデータを格納しようとした時、HSPは変数に必要なメモリ領域を新たに再確保します。
再確保によって以前のメモリ領域よりも大きな領域が割り当てられます。
これを変数領域の自動確保と呼びます。
自動確保は通常は代入時に行われます。
また命令や関数などに配列の要素として添え字をつけて指定した場合にも必要なら自動確保が行われます。
+ | 自動確保が行われる例 |
|
ただしmes(他は不明)や式などの要素の参照として使われる場合や、多次元配列において要素のオフセットが変わるような場合は自動確保が行われません。
※スクリプトの実行を進める場合はNGの列をコメントアウトしていってください。
+ | 自動確保が行われない例 |
|
デフォルトの変数領域は64byte確保されているので全体の要素数が整数型で16こ、実数型であれば8こ使えることになります。
これ以上の要素をメモリ上に記憶しようとするとき、領域の自動確保が発生します。
半分正解、半分勘違い。自動確保というより新しい要素を追加しようとするとき常に再割り当ては起きている。
ただし頻繁に割り当て(メモリブロックのコピーなど)が行われるため効率が悪くなる。
配列変数として使用する場合は先にdim宣言をすることにより不必要なデータのコピーをなくすことができる。