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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0715
レイナモジュール変数の考え方4未解決


レイナ

リンク

2021/7/15(Thu) 17:47:03|NO.93225

下記のスクリプトがエラーになるのは何故でしょうか。
これを解消しようと3時間くらい格闘しております。
だれかたすけてください・・・



test init #module #deffunc test newmod dmg,_dmg,0//#Error 35 in line6(???) モジュール変数が指定されていません。 #global #module _dmg a cmp=0 #modinit int p1 a=p1 mes "a" return #modfunc init //最適化によるモジュール削除を防止する為の命令 return #global



この記事に返信する


とあるプログラマ

リンク

2021/7/15(Thu) 18:14:58|NO.93226

#deffunc testの段階ではまだ _dmg が作られてないためです。
使うものは先に定義しましょう。

それと最適化対策で #modfunc init をしていますが、必要でしょうか…?
自分は今のところ最適化でモジュール型変数が削除されたことは無いので気になりました。

また、もし行う場合 #mod(c)func は第1引数にモジュール型変数を指定する必要があるので、 init ではなく init dmg@m0 でないといけませんが。


//test //個人的にですが、これもここではなく #module~#globalの後に書くのが望ましい //init // 使うものは先に定義 #module _dmg a cmp = 0 #modinit int p1 a = p1 mes "a" return /* #modfunc init //最適化によるモジュール削除を防止する為の命令 return */ #global #module // ここを先に書いてしまうと、この時点で _dmg が作成されていないのでエラーになる #deffunc test newmod dmg, _dmg, 0 return //← return 書き忘れ? #global // 定義より後に書くのが望ましい test



レイナ

リンク

2021/7/15(Thu) 18:51:15|NO.93227

試してみたら改善されました。
初歩的な事で申し訳ありません。本当にありがとうございます。


それと最適化対策で #modfunc init をしていますが、必要でしょうか…? 自分は今のところ最適化でモジュール型変数が削除されたことは無いので気になりました。

こちらの件ですが、以前最適化でモジュールが削除され、調べたところあまり情報がなかったので
http://hsp.tv/play/pforum.php?mode=pastwch&num=779

HSP3.1b2以降ではコンパイル時の最適化処理により その内部で定義されている命令・関数が 一度も呼び出されることの無いモジュールは コンパイルされなくなったようです。

上記の掲載を信じ、エラーが出た場合は命令を一度は呼び出す様にしております。
もしかして私騙されていたんでしょうか。
プログラミングマニュアル等も探したのですが、最適化の仕様について記載がないので
本当に困っていたりしています。

また、上記の通りモジュールはコンバイル時に定義される仕様だと理解しているので
#deffunc命令と同じようにモジュールの記載位置は問わずコンパイル(プログラム実行時に定義)されるものだと思うのですが、
何故こういったエラーが出るのかと困惑している次第であります。。。

もし、宜しければこの点の仕様が記載されているサイトやマニュアル等ご存知でしたらお教えいただけないでしょうか。
重ね重ね申し訳ありません。



とあるプログラマ

リンク

2021/7/17(Sat) 13:15:18|NO.93241

最適化について書いてあるサイトなどは

ここ (http://hsp.tv/play/pforum.php?mode=all&num=91811)
や、ここ(https://blog.goo.ne.jp/hiro239415/e/124c9f194012df1b98e25670943c2703)

あたりですかね。それでも詳しく書いていないので、私の予測ですが解説してみたいと思います。


レイナさんが仰られた記事から引用して解説しますと、まずこのコードは多く分けて3つに分けられます。


.皀献紂璽 "test1" 空間

#module "test1" ; エラー対策? #deffunc b return *test mes "test@test1" return #global

▲皀献紂璽 "test2" 空間

#module "test2" #deffunc a gosub *test@test1 return #global

Root空間 (正式名わかりません…)

a b ; なぜか呼び出さないとエラーになる stop

の3つです。


このコードでの b を削除するとコンパイル時に「ラベルの定義が存在しません」になると思います。

それはなぜかというと、bを削除した時点でモジュール "test1" 内で定義された命令は、どこでも一切呼び出されていないことになります。
「どこでも一切呼び出されていない」というのは、つまり「全く使われていない」ということです。

なのでコンパイラは "test1" は未使用と判断して、最適化のために "test1" のモジュール空間を丸ごと削除します。

すると、その後の △"test2" 内でジャンプしようとしている宛先の *test@test1 すらも削除されているので、「ラベルの定義が存在しません」になるわけです。

コンパイラはモジュール空間内で定義された命令の使用の有無はチェックしますが、モジュール空間内のラベルがジャンプ先に指定されているかはチェックしないので、このようなコンパイルエラーが起こるわけです。


そもそも、モジュール空間外からそのモジュール空間内のラベルにジャンプする必要はありません。ジャンプじゃなくて #def(c)func を使えばいいからです。
なので最適化ではジャンプはチェックされないのだと思います。(これは個人的な予測ですが)



とあるプログラマ

リンク

2021/7/17(Sat) 13:44:03|NO.93242

>> また、上記の通りモジュールはコンバイル時に定義される仕様だと理解しているので
>> #deffunc命令と同じようにモジュールの記載位置は問わずコンパイル(プログラム実行時に定義)されるものだと思うのですが、
>> 何故こういったエラーが出るのかと困惑している次第であります。。。

仰る通り、#○○系のプリプロセッサはコンパイル時点で実行されるはずなので、

例えば

mesHello stop #module #deffunc mesHello mes "Hello" return #global

これは問題なく実行できます。


しかし

newmod dmg,_dmg,0//#Error 35 in line6(???) モジュール変数が指定されていません。 stop #module _dmg a cmp=0 #modinit int p1 a=p1 mes "a" return #global

これだとエラーが発生してしまいます。


恐らくの予想ですが、普通のモジュールとモジュール型変数で実行やコンパイルの手順が違うのでしょう。
残念ながら、私にはこれがバグなのか仕様なのかは分かりません… 申し訳ありません。

どうしても気になるようでしたら、このことを別の新規 "報告" スレッドやなどでおにたまさんに聞いてみてはいかがでしょうか。



記事削除

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

NO.93225への返信

マスコット

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

名前

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

削除用パスワード

解決したら質問者本人がここをチェックしてください。

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

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