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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0716
siki__変数のスコープで戸惑い3解決


siki__

リンク

2020/7/16(Thu) 23:30:35|NO.91007

ちょっとしたことなのですが

#module hoge #deffunc foo mes hoge return #deffunc bar mes hoge return #global
上記の設定でfooとかbarとか呼んでもhogeが表示出来ないけれど、hogeをどちらかの#deffuncの中に入れるとfooでもbarでも表示出来るのは仕様なのでしょうか。



この記事に返信する


あらや

リンク

2020/7/17(Fri) 22:14:52|NO.91015

HSPは根本的に1行ずつ順番に解釈するインタプリタなので
#deffuncの外で定義された変数は文法的に問題が無くても
単純にその行を通っていないだけだと思います。

更に言うと個人的には#deffuncなどは
『引数や戻り値を設定できるラベルの変形』だと思っています。

つまり

#module hoge = 10 #deffunc foo mes hoge return #global foo
これと


goto *l_2 *l_1 // モジュールの開始 hoge = 10 *foo mes hoge return // モジュール終了 *l_2 gosub *foo
これは同じような意味になるではないかと。

後者のソースをたどっていくとわかると思いますが
モジュールの中でhogeに数値を入れていても
fooの外なので流れ的に hoge=10 の行は通らずに
ゼロが表示されるだけになってしまいます。

モジュール内で使った変数にモジュール外からアクセスすることも出来ますし、
Cなど他言語の書き方を疑似的に再現しているだけであって
『関数や命令の外に書いた変数はグローバル変数、中で書けばローカル変数』
ではなく
『どこに書いても全てがグローバル変数』
と考えるべきなのではないかなと思いました。



siki__

リンク

2020/7/27(Mon) 17:56:04|NO.91078

なるほど、モジュールはgotoでスキップしていなくても内部ではスキップしているということですか。
ありがとうございます。謎が解けました。

あと気になっている点として、noteload でファイルが読めないということがあります。
モジュールの中のユーザー定義命令の中に記述すると発生します。hsp3utf.asをincludeしています。ファイル名は直接指定なのでスコープは関係無いかもしれません。また、ダイアログの戻りrefstrを使うと正常に読めることから文字コードのせいかと思っています。
これ以上はスレ違いかな。



siki__

リンク

2020/7/27(Mon) 21:40:00|NO.91081

すみません、自己解決しました。
GUIへの反映を忘れていました。
あと、ダイアログ後のstat値をnoteloadが返すstatだと勘違いしていました。noteloadはstat返さないんですね。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.91007への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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