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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0827
名無しモジュール型変数 参照コピー6解決


名無し

リンク

2017/8/27(Sun) 11:49:44|NO.81126

同じ実態をさしているモジュール型変数を作りたいとき、
m1 = m2

dup m1, m2
のどちらの方がいいのでしょうか。



この記事に返信する


科学太郎

リンク

2017/8/27(Sun) 12:29:19|NO.81128

> m1 = m2
これは実体をコピーして2つにしてます。

> dup m1, m2
こちらは実体は1つで「m1」が「m2」を参照してます。

> 同じ実態をさしているモジュール型変数を作りたいとき、
同じ実態を指し示すという事ならばdup命令でしょうね。



GENKI

リンク

2017/8/27(Sun) 13:06:41|NO.81129

> m1 = m2
> と
> dup m1, m2

どちらもダメです。
m1を新しくnewmodして、m2と同じ内容を一つ一つ入れて上げる必要があります。


詳しくはこちらを読んでみてください。
簡単にできる解決方法も書いてあります。

モジュール変数をディープコピーする際の注意点
http://qiita.com/astrie_chorus/items/6c8737df0be1de1cae46

Googleで「モジュール変数 コピー」で検索すると簡単に見つかりました。



名無し

リンク

2017/8/27(Sun) 13:48:28|NO.81131

どちらの場合でも参照をコピーしているように見えるのですが…

#module m text_ #modfunc setText str _text text_ = _text return #modcfunc getText return text_ #global newmod m2, m #if 0 m1 = m2 #else dup m1, m2 #endif setText m2, "hello" mes getText(m1)



名無し

リンク

2017/8/27(Sun) 13:57:41|NO.81132

どちらも同じようにクローンを作成するのかと思ったけど

#module m text_ #modfunc setText str _text text_ = _text return #modcfunc getText return text_ #global newmod v, m m1 = v dup m2, v mes vartype(m1) mes varuse(m1) mes vartype(m2) mes varuse(m2) //エラー
そもそもdupしたモジュール型変数にはvaruseが使えない(vartypeはstructなのに)
dupでできた「クローン」と代入演算子使ってできたモジュール型変数「クローン」は違うということ?



掘木

リンク

2017/8/27(Sun) 22:15:09|NO.81155

>NO.81132
varuseは変数の参照(dupによる初期化変数)には使えません。

dupで作るのはHSP変数への参照です。
module変数の代入で作るのはモジュール型変数への参照です。

変数としての扱いが違うので仕方ない。


・・・という話で終わればいいんだがね。

struct型の変数相手のdupの動作が不安定で、なぜか正しい配列参照ができません。

dimtype v,vartype("struct"),9 dup p1,v mes length(p1) // ←0になる。why? mes length(v) // ←この結果は9 // そしてvにnewmodをするとp1(0)でアクセスできない。
そんなこんなで、"="演算のほうがいいとおもう。



名無し

リンク

2017/8/28(Mon) 20:58:19|NO.81169

なるほど、ありがとうございます。

モジュール型変数周りの仕様はもう少しはっきりならないかなあと思います。



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