〜 スクリプト 〜
中身を保持したまま配列変数サイズを縮小

HSP3から追加された配列変数自動拡張機能によって、
誤って定義済み要素外の要素に値を格納しても自動的に配列変数サイズが拡張されるので、
予期せぬエラーを出すことなく安全に処理できるようになりました。
配列変数を拡張した後に縮めたいと思ってdim命令で再定義すると、
確かにサイズを縮小することは出来ますが中身が初期化されてしまいますので、
このやり方では自動拡張とは逆に、必要な情報を保持したままサイズを縮めることはできません。
そこでmemcpy命令を使ってモジュールにした方法を紹介します。
尚、HSP2だと「モジュール内で再定義するとグローバルとは別の変数として扱われる」為、
モジュール内部で配列変数を再定義しているこの方法はHSP3専用としています。
	

memreset 配列変数, 要素数
配列変数中身を保持したまま再定義する数値型配列変数を指定する。
要素数再定義する要素数を指定する。
尚、縮小する際に溢れたデータは消滅し、拡大する際に確保された領域は0がセットされる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#module
#deffunc memreset array v, int num, local i
	dim i, num
	memcpy i, v, (num < length(v)) * num * 4 + (num >= length(v)) * length(v) * 4
	dim v, num
	memcpy v, i, num * 4
	return
#global

	data = 1, 2, 3, 4, 5
	memreset data, 3 // 要素数を3に縮める(要素3以降はデータごと消滅する)
	foreach data
		mes strf("data.%d = %d", cnt, data.cnt)
	loop