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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0621
ひらまるdup命令は値の変更によって無効になるのか。7解決


ひらまる

リンク

2011/6/21(Tue) 18:56:54|NO.39786

dup命令の説明に、
>クローンが有効なのはクローン元の変数に代入が行なわれるまでの間だという点に注意してください。
とありますが、以下を書いて実行したところ、代入が行われてもクローンが有効なようです。

a = 0 dup b,a mes "bを加算してaを表示" repeat 10 mes a b ++ loop mes "aを加算してbを表示" repeat 10 mes b a ++ loop
また、dup命令の説明には
>クローン元の型が変更されたり、配列の拡張、または文字列バッファの拡張が行なわれた場合には、クローンとしての動作は行なわれなくなります。
とも書かれており、ここには、値の代入とは書かれていません。

ポインタやアドレスなどはよくわかりませんが、
dup命令は元の変数のアドレスと同じアドレスを持った変数を作る命令? とのことなので、
配列のサイズを増減したり、確保したバッファ以上の文字列を代入することによって、
元のアドレスの位置や保持していた配列の長さが変わってしまった場合、クローンとしての機能を失うということでしょうか。

上のスクリプトの場合は、変数aがint型で定義されており、始めから4バイト(だっけ?)のメモリアドレスが確保されているので、
dup命令によって作られたクローン変数bは、値の変更によってクローンとしての働きがなくなるということはないということでしょうか。

今まで、
>クローンが有効なのはクローン元の変数に代入が行なわれるまでの間だという点に注意してください。
という表記によって使うのをためらっていたdup命令ですが、
値の変更をしても使えるのならば、かなり便利な命令だと思います。(モジュール内から別モジュールへの配列の高速な参照などに使えるかと)

dup命令についてこのような認識で良いのかどうか。
詳しい方がいらしたら教えていただけないでしょうか。



この記事に返信する


ORZ

リンク

2011/6/21(Tue) 19:46:33|NO.39787


sdim moji,5 moji="test" dup moja,moji mes moji mes moja moji=6 mes moji mes moja
あらかじめ確保した文字の長さを超えて配列に代入しようとしたり、異なる型を代入すると
メモリ上の場所が変わりうるので、代入後の動作は自己責任、という理解なんですが。
間違ってたら誰かぼくのおしりをたたいてください。



晩御飯

リンク

2011/6/21(Tue) 21:11:16|NO.39792

元の変数に代入するとクローンの値も変わるよってことだとずっと思ってた。
sdim moji,5
moji="test" dup moja,moji mes varptr( moji ) mes varptr( moja ) moji=6 mes varptr( moji ) mes varptr( moja ) mes moji mes moja //何かmojiと違う型になってる? moji="6" mes varptr( moji ) mes varptr( moja ) mes moji mes moja
バシーン



晩御飯

リンク

2011/6/21(Tue) 21:15:20|NO.39793

分かった、アドレスは一緒だけど型が一致する保証はないから何とかかんとかか。



Cookies

リンク

2011/6/21(Tue) 21:53:15|NO.39795


#define ctype ptr(%1) strf("%%X",varptr(%1)) ;自分は、十六進表記でないと落ち着かない… sdim moji, 65 ;64 + NULL分。 memset moji, 'A', 64 ;特に理由はないが"A"で埋めた。 dup moja, moji mes ptr(moji) mes ptr(moja) mes "------" moji=6 mes ptr(moji) mes ptr(moja)
アドレスも変わりますよ。
sdimで確保するとき64より小さい値を第二引数に渡しても、64byte確保されます。
(単に文字を代入するときも。)
で、64より大きいサイズ(上の例では65)確保すると、あとで数値を代入したときに
別のアドレスに再確保されるようです。



晩御飯

リンク

2011/6/21(Tue) 22:34:11|NO.39797

なるほど、std::vectorとかと同じなんですね。



ひらまる

リンク

2011/6/21(Tue) 23:54:15|NO.39801

にゃるほどにゃるほど……詳しい説明ありがとうございます。
http://hsp.tv/play/pforum.php?mode=all&num=39714
の記事でさっそく使ってみましたが、これはとても便利な命令ですね。
別モジュールから巨大な配列を参照する場合など特に……
http://hsp.tv/play/pforum.php?mode=all&num=39750
の記事で紹介されていたmemcpyとあわせて、
扱いづらいHSPの配列の扱いがかなり柔軟になりそうです。

みなさん詳しく教えていただき、本当にありがとうございました!



ひらまる

リンク

2011/6/21(Tue) 23:54:56|NO.39802

Σうにゃっ!
わしとしたことが解決チェックを忘れるとは…
すみません(TωT;



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