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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0203
HSP初心者モジュール型変数の配列での管理方法1未解決


HSP初心者

リンク

2015/2/3(Tue) 21:46:41|NO.67250

初めて投稿いたします。よろしくお願いします

配列でデータ管理して、途中の要素を消して前に詰めたり、要素の最後に追加することは簡単にできるのですが
モジュール型変数の配列を操作する場合、途中の要素を消したり追加することができずにいます

#module hoge n1,n2,n3 #modinit int prm1 n1 = prm1 n2 = prm1*2 n3 = prm1*3 return #modcfunc get_n1 return n1 #modcfunc get_n2 return n2 #modcfunc get_n3 return n3 #global repeat 5 newmod temp, hoge, cnt loop repeat 5 mes get_n2(temp(cnt)) loop
ここまで問題なくできたのですが、temp変数の2番目の配列の要素が不要になり前に詰めようと下のソースを追加すると「#Error 1 in line 12 (???)-->システムエラーが発生しました」とエラーとなります

repeat 3,1 temp(cnt) = temp(cnt+1) loop delmod temp(4) repeat 4 mes get_n2(temp(cnt)) loop
delmodをしなければエラーはでなくなりましたが、新しい要素の追加が期待通りにできずにいます
最初のソースに下のソースを追加すると「#Error 25 in line 31 (???)-->配列の要素書式が間違っています」となります(そもそもnewmodの第一引数で配列変数は不可に思えました)

repeat 3,1 temp(cnt) = temp(cnt+1) loop //delmod temp(4) newmod temp(4), hoge, 10


モジュール型変数の配列の操作方法を教えていただけないでしょうか



この記事に返信する


Flat

リンク

2015/2/3(Tue) 22:32:49|NO.67251

おそらくHSP的には添字など気にしないで欲しいのではないでしょうか。
ここでの添字をモジュール変数にするなどして、配列を操作しなくて済むようにしたほうがいいと思います。
というのも、配列を操作することにはメモリリークの危険が伴うからです。
どうしても、という場合は以下の内容をお読みください。



まず最初にHSPの仕様を。
モジュール変数を=で代入した場合、実際のデータはコピーされません。
(それぞれの変数が同期しているようなものです。dup命令で作ったクローン変数のような。)

delmod temp(4)を行った場合にエラーが発生したのは、temp(3)=temp(4)となっており
temp(3)が使えなくなってしまったためです。(いつエラーが発生したのか追ってみればわかります。)

ただし、delmodはメモリ解放を行うため、使わないとメモリリークの原因となります。
使わなくなった変数(この場合はtemp(1))はdelmodで削除するべきです。
(削除すべき変数かそうでないかの判断はややこしいので注意してください。)


さて、新たな要素の追加ですが、一旦別の変数を経由すればできなくはないです。

newmod temp_mod, hoge, 10 temp(4) = temp_mod
が、先程も述べたとおりtemp_modを削除するとtemp(4)も使用できなくなります。
また、同じtemp_modをそのまま使いまわすと添字が変わってしまいます(temp_mod(1)などになる)。

…というわけで、できなくはないですがかなりヤな感じのコードになることは避けられないかと思います。


一応要素追加のコードを書いてみましたが、やはりあまり綺麗には書けませんでした。

newmod temp_dummy, hoge, 0 // ダミー変数を用意する(モジュール変数なら何でも可) newmod temp_mod, hoge, 10 // 目的のものを一時用変数に入れておく temp(4) = temp_mod // 目的の変数に複製する temp_mod = temp_dummy // 一時用変数をダミー変数で上書きする(これで一時用変数がdelmodされないようにする) dim temp_dummy // ダミー変数を削除する(必ずdelmodではなくdimを用いる) dim temp_mod // 一時用変数を削除する(必ずdelmodではなくdimを用いる)
このコードではダミー変数を用意して目的の変数が削除されないようにしていますが、あまり良い方法とは言い難いです。
(他にも自力で初期化したり添字を取得したりなど方法はありますが、これよりも良くない方法となります。)
もし何かもっと上手いやり方があれば是非とも知りたいです(自分が)。


…delmodせずに参照を解除できればいいんですけど、そうするとメモリリークが発生しやすくなるのでしょう。
この方法も少し間違えるとメモリリークが発生します。十分注意してください。



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