ご推察の通り、変数コピーの仕方はそれであっています。
余計なツッコミかなと思いつつ、毎回一時変数Zを介しているのはメンバー変数の型を特定したくないからだと思っていますが、
型が特定できるなら#modcfuncと#modfuncはただの関数定義と同じなので、引数を定義した方がコード短くなるし綺麗かなとは思います。
#modfunc putA int _p1
a=_p1:return
#deffunc cpyAll var _p1,var _p2
putA _p1,getA(_p2)
// 以下略
あと、ご存知な気がしますが以下2点ほど。
1. #modfunc及び"#modcfunc中ではthismodで自分を表せる
cpyAllは下記のように書き直せます。
#modfunc cpyAll var _p2
Z=getA(_p2)
putA(thismod)
Z=getB(_p2)
putB(thismod)
Z=getC(_p2)
putC(thismod)
return
まあ、この場合だとほとんど意味なかったりしますが。
せめて Notes(1).cpyAll Notes(0)みたく書けないと意味ある感じにはならないですね。
(この順で場合、メソッド名はcopyFromとかにできるので、どっちからどっちにコピーするか明示できたりしてちょっと格好よく見えたりします)
2. モジュール変数の配列は挿入順を制御できない
空いている(delmodした)要素があったらそこにnewmodした値が入ります。
newmod Notes,_Notes,1,2,3
newmod Notes,_Notes,0,0,0
cpyAll Notes(1),Notes(0)
delmod Notes(0)
color:mes ""+getA(Notes(1))+","+getB(Notes(1))+","+getC(Notes(1))
newmod Notes,_Notes,4,5,6// Notes(0)がdelmodされ空いているので0に入る
newmod Notes,_Notes,7,8,9// Notes(0)とNotes(1)が埋まっているので2として追加
// 全要素を表示
foreach Notes
mes strf("Notes(%d)=%d,%d,%d",cnt,getA(Notes(cnt)),getB(Notes(cnt)),getC(Notes(cnt)))
loop
つまりモジュール変数の配列は「並び順を気にしない値列」として扱う事を想定していると考えられる仕様なので、
モジュール変数の要素をコピー云々して可変長配列のように扱ったりするのは個人的にはあまりお勧めしません。
HSPで可変長配列を扱うならスマートではないですが、固定長配列+いくつ入っているか管理する変数がベターかなと思ってます。
また、複数メンバー値を持つ値を可変長配列として扱いたい場合は、全然スマートに見えませんがメンバーの数だけ別の配列変数用意して、
それぞれのメンバーへのアクセスはそれぞれの配列変数へのアクセスととった方が総じてやりやすいというのが体感です。
メンバーの数だけスクリプトで書き分けが必要ですが、それはモジュール変数の時と同じですし、memcpyとか使えるようになるメリットが増えると考えればお得かな、と。