> 要素数を増やしたり減らしたりできますか?
要素数を増やすことは、仰ったように代入されたところまで自動拡張されるので簡単にできます。
要素数を減らす時が少し面倒で、一度配列を丸ごとコピーして、変更後の要素数で配列を初期化したのち、
コピーしておいたものから必要な分だけ取り出す必要があります。
もしかするともっとスマートなやり方もあるのかもしれないのですが、
私はこのやり方しか分かりません。
増減のどちらにも対応したモジュールを作成してみました。
既に問題は解決はされているようで恐縮ですが、よろしければお使い下さい。
// 配列の要素数を任意の数に変更する命令モジュール
// label, int, str, double, struct 型の 1 次元配列のみに対応
#module _ChangeArrayLength_
#deffunc ChangeArrayLength array _array, int _newlength
// 配列の要素数を取得
ArrayLength = length(_array)
// 要素数を変更する必要がなければ何もしない
if( ArrayLength == _newlength ) {
return
}
// 配列の型を取得
ArrayType = vartype(_array)
// 配列を拡張する場合は自動拡張機能を使う
if( ArrayLength < _newlength ) {
// (要素数-1)番に型に応じた初期値を代入する
switch ArrayType
case vartype("label")
ldim DefaultValue, 1
swbreak
case vartype("int")
dim DefaultValue, 1
swbreak
case vartype("str")
sdim DefaultValue, 1
swbreak
case vartype("double")
ddim DefaultValue, 1
swbreak
case vartype("struct")
dimtype DefaultValue, vartype("struct"), 1
swbreak
swend
_array(_newlength-1) = DefaultValue
// 配列を縮小する場合は配列をコピーしてから必要な部分だけ取り出す
} else {
// 配列をコピー
dimtype CopiedArray, vartype(_array), length(_array)
foreach CopiedArray
CopiedArray(cnt) = _array(cnt)
loop
// 要素数を _newlength として初期化
switch ArrayType
case vartype("label")
ldim _array, _newlength
swbreak
case vartype("int")
dim _array, _newlength
swbreak
case vartype("str")
sdim _array, _newlength
swbreak
case vartype("double")
ddim _array, _newlength
swbreak
case vartype("struct")
dimtype _array, vartype("struct"), _newlength
swbreak
swend
// 必要な部分だけコピー
foreach _array
_array(cnt) = CopiedArray(cnt)
loop
}
return
#global
#if 1
//---------- 以下動作確認 ----------//
// とりあえず int のみです。コードが無駄に長くなるので他の型はご自身で試してみてください。
dim Array, 8
foreach Array
Array(cnt) = rnd(100)
loop
dialog "Array 配列を初期化して適当な値を代入しました。"
ChangeArrayLength Array, 16
dialog "Array 配列を拡張しました。"
ChangeArrayLength Array, 4
dialog "Array 配列を縮小しました。"
// 各動作結果はデバッグウィンドウで確認してください。
// 配列変数名をクリックしなおさないと情報が更新されないことにご注意ください。
#endif