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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0410
挑戦者 (投稿者削除)6未解決


挑戦者

リンク

2018/4/10(Tue) 20:18:14|NO.83980

この記事は投稿者により削除されました。
2018/4/11(Wed) 00:27:47



この記事に返信する


沢渡

リンク

2018/4/10(Tue) 20:47:04|NO.83982

そのソースコードだとエラーになって動かないのですが、どのようなタイミングでaが0になるのでしょうか?
以下推測して書きますが、たとえば次のようなコードだと、
モジュール"内"のaの中身は最初だけ0で、以降は50になっているのがわかります。

*l Test 50 wait 10 goto *l #module #deffunc Test int x if (b == 0) { a=0 b = 1 } else { a=x } mes a return #global
ところが次のようなコードだと、モジュール"外"のaの中身はずっと0であるのがわかります。

*l Test 50 mes a wait 10 goto *l #module #deffunc Test int x if (b == 0) { a=0 b = 1 } else { a=x } return #global
このように同じ変数名でも、モジュール外とモジュール内では別の変数として扱われます。
困っている理由はそこが原因だと推測しましたが、いかがでしょうか?



Velgail

リンク

2018/4/10(Tue) 21:48:27|NO.83987

補足すると、グローバル変数は空間名""を持っているので、今回のプログラム(沢渡さん2つ目)の場合、
a@m0とa@の2つの「コード表記上はa」となる変数が存在し、

挑戦者さんのコードの場合(エラーになるのですけど、意図を類推すると
a@Programming, a@の2つの変数aが存在するんですね。

//オフトピながら、実は「モジュールを使わなくても空間名が指定できたり(変数名として突然a@hoge とか)」「外のモジュールからでも容赦なくアクセスできたり(Module bからModule aの変数を書き換える)」けっこう制御がアレです。



挑戦者

リンク

2018/4/10(Tue) 23:04:47|NO.83991

スマホで打ってて すみません、Velgailさん。お名前に誤字がありました。申し訳ないです。

補足です。

モジュール部は別ファイルに記述してまして、先にincludeしてます。



kanahiron

リンク

2018/4/10(Tue) 23:33:11|NO.83993

最初に貼っていただいたソースが不完全であるため、状況がうまくつかめません。
「コピペするだけで動作する」ソースを挑戦者さん自身に貼って頂けないでしょうか。
・変数名と命令名の衝突
・モジュールの閉じ(#global)が無い
・命令の綴じ(return)が無い
以上を修正して下さい。
また、「XXの時YYになる」の場合はlogmesなどを使い回答者側にも配慮をすると回答が付きやすくなると思います。

以下は例です

#module Programming a = 0 b = 0 #deffunc Test int p1 a = p1 logmes "Testが呼ばれた" logmes " a :"+a logmes " b :"+b if (b == 0) { logmes " b==0" logmes " a :"+a b = 1 } else { // なぜかa=0になってしまう ※この例ではならない logmes " b!=0" logmes " a :"+a } logmes return #global *l Test 50 wait 100 goto *l



Velgail

リンク

2018/4/11(Wed) 22:24:04|NO.84002

>モジュール部は別ファイルに記述してまして、先にincludeしてます。

これは私の回答上では全く関係のない事項となります。はい。
名前空間がどのように切られているのか、そして変数のフルネームは一体何か。
それだけのお話ですので。



nmd

リンク

2018/4/12(Thu) 21:05:12|NO.84021

ナゾ



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