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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1006
ぐちrefstrの定義について9解決


ぐち

リンク

2012/10/6(Sat) 01:48:10|NO.49796

以下を実行した場合、"aa"が表示されるのですがそういうもんですか?
deffunc bb内で代入した"bb"が表示されそうな気がするのですが。

#module
#deffunc aa
mref ret1,65
ret1="aa"
return
#global
#module
#deffunc bb
mref ret2,65
ret2="bb"
aa
return
#global
bb
mes refstr



この記事に返信する


てん

リンク

2012/10/6(Sat) 02:14:34|NO.49797

モジュール外でbbを呼び出す

(bb内)ret2にrefstrを割り当て、"bb"を代入

(bb内)aaを呼び出す

(aa内)ret1にrefstrを割り当て、"aa"を代入 ★

(aa内)returnで戻る

(bb内)returnで戻る

mes命令でrefstrを描画

結局、★のところの代入が最後なので、"aa"が表示されます。



ぐち

リンク

2012/10/6(Sat) 14:29:13|NO.49804

てんさん、ありがとうございます。
説明してもらったようにrefstrの変数エリアが同じだと言うことと改善策もわかっています。

しかし、bb内で直接セットしている内容がそのあとに呼び出された関数により変わってしまう
と言うことに違和感を感じるのですが。

リターン値は別変数で取っておいてリターンする直前にセットするのがいいんでしょうね。
#module
#deffunc aa
mref ret1,65
ret1="aa"
return
#global
#module
#deffunc bb
mref ret2,65
ret="bb"//
aa
ret2=ret//
return
#global
bb
mes refstr



暇人

リンク

2012/10/6(Sat) 14:37:39|NO.49805

>しかし、bb内で直接セットしている内容がそのあとに呼び出された関数により変わってしまう
> と言うことに違和感を感じるのですが。
直接セットしようが関係無いでしょ

#module #deffunc aa dup ret3,ret@ ret3="aa" return #global #module #deffunc bb dup ret2,ret@ ret2="bb" aa return #global ret="" bb mes ret
やってる事はこれと同じなんだから



荒河

リンク

2012/10/6(Sat) 14:57:28|NO.49807

>しかし、bb内で直接セットしている内容がそのあとに呼び出された関数により変わってしまう
と言うことに違和感を感じるのですが。

通常は処理をしてからrefstrに値を代入します、しかしぐちさんの提示したスクリプトではrefstrに値を代入してからaaを呼び出していて通常とは逆の順番です。

処理途中のデータはrefstr等に保管せずローカル変数等に入れておくことをお勧めします。



ぐち

リンク

2012/10/6(Sat) 17:00:35|NO.49813

暇人さん、荒河さん、ありがとうございます。

C#、VB等、いくつか言語を知っていますが「mref ret,65」のようなのはhsp独自だと思います。
ちょっと気をつけて使いたいと思います。

意見を聞けて気がすんだので解決とさせて頂きます。



荒河

リンク

2012/10/6(Sat) 17:24:19|NO.49815

えぇと、もしかしてmrefじゃないとrefstrに代入できないと思っていませんか?
#deffunc hogehoge
return "hogehoge"
でもrefstrに代入することが出来ます
returnの引数が整数ならstat、文字列ならrefstrといった感じになります。
mrefでrefstr等を扱う必要があるとすれば、ファイル名とサイズを返すような二つの値を扱う場合くらいだと思います。



ぐち

リンク

2012/10/6(Sat) 21:16:29|NO.49824

mref宣言しないでもreturnに書けばいいことは知っていますよ。
あと、引数の一つをポインタとして返してもいいですよね。



ANTARES

リンク

2012/10/7(Sun) 11:14:01|NO.49826

>しかし、bb内で直接セットしている内容がそのあとに呼び出された関数により
>変わってしまうと言うことに違和感を感じるのですが。
 おそらく、「ret1とret2は異なる変数なのだから、ret1への代入がret2に
影響するのはおかしい」と感じるのだと思います。
しかし、mref命令によってret1もret2もrefstrという同じシステム変数に
結びつけられているのですから、ret1への代入もret2への代入も
同じようにrefstrへの代入として有効でなければなりません。
bbにおけるそれが有効であるためには、aaにおけるそれも有効でなければなりませんし、
aaにおけるそれが無効であるためには、bbにおけるそれも無効でなければなりません。
両者は便宜的に使った変数名が異なるだけで、全く同じことをやっているのですから、
一方は有効で他方は無効ということはありえません。



ぐち

リンク

2012/10/8(Mon) 21:12:40|NO.49882

そうなんですよね、aaとbbは別モジュールとして処理してるので影響を受けないように
思うのですよ。
ANTARESさん、意見ありがとうございます。



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