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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1213
モジュール型変数について3解決


リンク

2016/12/13(Tue) 22:25:37|NO.77570

モジュール型変数を今頃になって勉強始めたのですが、変数の内容をコピーする場合は
次のようなコードになりますか?

#module _Notes a,b,c #modinit int _a,int _b,int _c a=_a:b=_b:c=_c return #modcfunc getA return a #modcfunc getB return b #modcfunc getC return c #modfunc putA a=Z:return #modfunc putB b=Z:return #modfunc putC c=Z:return #deffunc cpyAll var _p1,var _p2 Z=getA(_p2) putA(_p1) Z=getB(_p2) putB(_p1) Z=getC(_p2) putC(_p1) return #global 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)) stop
また、上記のような手順が必要であるとすると、モジュール型変数は
要素の増減や中途挿入が頻繁にある場合には相当面倒って事でしょうか。



この記事に返信する


3k

リンク

2016/12/13(Tue) 23:57:16|NO.77571

ご推察の通り、変数コピーの仕方はそれであっています。

余計なツッコミかなと思いつつ、毎回一時変数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とか使えるようになるメリットが増えると考えればお得かな、と。



リンク

2016/12/14(Wed) 21:30:30|NO.77577

ご丁寧な回答ありがとうございました。大変勉強になりました。
コピー、削除、追加やソート等には不向きな仕様なのですね。
いろいろ考えた結果、ヘッダを管理する配列とデータ用可変長配列を使う方法で
整理が付きそうなのでそのようにしたいと思います。



リンク

2016/12/14(Wed) 21:31:11|NO.77578

失礼しました、解決です。



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