HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0728
Awosome配列の要素数を動的に変える方法2解決


Awosome

リンク

2017/7/28(Fri) 21:04:11|NO.80723

例えば

sdim strarray,15
としてその後要素数を増やしたり減らしたりできますか?



この記事に返信する


Awosome

リンク

2017/7/28(Fri) 21:08:21|NO.80724

おっとしつれい、リファレンスを見たら
>代入されたところまで自動拡張
とありました



HIJIKIsw

リンク

2017/7/29(Sat) 09:34:05|NO.80728

> 要素数を増やしたり減らしたりできますか?
要素数を増やすことは、仰ったように代入されたところまで自動拡張されるので簡単にできます。
要素数を減らす時が少し面倒で、一度配列を丸ごとコピーして、変更後の要素数で配列を初期化したのち、
コピーしておいたものから必要な分だけ取り出す必要があります。

もしかするともっとスマートなやり方もあるのかもしれないのですが、
私はこのやり方しか分かりません。

増減のどちらにも対応したモジュールを作成してみました。
既に問題は解決はされているようで恐縮ですが、よろしければお使い下さい。


// 配列の要素数を任意の数に変更する命令モジュール // 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



ONION software Copyright 1997-2023(c) All rights reserved.