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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0909
名無し名無し3解決


名無し

リンク

2017/9/9(Sat) 17:04:27|NO.81283

こちら
http://hsp.tv/play/pforum.php?mode=all&num=81126
で質問したものです


#module mod x, y z #global newmod m1, mod m2 = m1 m3 = m2

このようなときに、m1, m2, m3が同じ参照をさしているかを取得する方法はありますか。
pvalへのポインタもvarptrで取得したポインタも異なっているようです。


#module #defcfunc ppvalof var var, local ctx, local ppval mref ctx, 68 dupptr ppval, ctx(207), 4, vartype("int") return ppval #global mes ppvalof(m1) mes ppvalof(m2) mes ppvalof(m3) mes mes varptr(m1) mes varptr(m2) mes varptr(m3)

もちろん、モジュール型変数に一意なIDを割り当てれば解決するのですが、ほかに方法はないでしょうか。



この記事に返信する


名無し

リンク

2017/9/9(Sat) 17:05:35|NO.81284

題名を間違えました。
本当にすみません。



掘木

リンク

2017/9/9(Sat) 19:28:07|NO.81288


#module mod x, y z #global #module nullmodule prm1 #modcfunc ppvalof return varptr(prm1) #defcfunc IsEqualModule var p1,var p2 return ppvalof(p1) == ppvalof(p2) #global newmod m1, mod newmod m4, mod m2 = m1 m3 = m2 mes ppvalof(m1) mes ppvalof(m2) mes ppvalof(m3) mes ppvalof(m4) mes mes varptr(m1) mes varptr(m2) mes varptr(m3) mes varptr(m4) mes mes "1〜2 : " + IsEqualModule(m1,m2) mes "3〜2 : " + IsEqualModule(m3,m2) mes "3〜4 : " + IsEqualModule(m3,m4)
モジュール変数を定義するのに、一つ以上の変数を内部に持たなければなりません。
mod系関数は、本来のmodule内部でない関数で呼ばれた場合、変数の宣言順で同一視するように動くようです。
なので存在の保証された1番目に宣言された変数のアドレスを取得することで一応可能。

ただ、これ、どこまでが言語として保証している機能なのか全くわからないので、
ある日突然動かなくなる可能性も。

一致を調べる関数くらいにラッピングしておくことをおススメします。
言語レベルで"=="演算で調べられるようになれば#defineで置き換えも効きますし。



名無し

リンク

2017/9/10(Sun) 14:15:35|NO.81313

ありがとうございます。
堀木さん、お詳しいですね。
私ももっと内部仕様を見ようと思います。

しかし、モジュール型変数周りを触れていると、ときどき素直にCを使った方がいいのかもしれないと思うことが多いですね…



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