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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
1027
アキアキノヒロロエディタのバージョン違いを知らせるメッセージの表示は?25解決


アキアキノヒロロ

リンク

2019/10/27(Sun) 22:14:15|NO.88717

 スクリプトファイルをダブルクリックしてエディタを開いて実行した場合のことです。
想定していないバージョンのエディタであった場合、それを知らせる警告メッセージを
出す方法が知りたいです。
 具体的には、今回のコンテストに応募した、「HSP 3.6β1」のエディタで作ったもの
についてです。「HSP 3.5」のエディタが開いた場合の実行では、「getangr」命令の
ところでエラーになって実行されません。そのエラーメッセージの代りに、「HSP 3.6β1」
のエディタで開いて実行するよう促すメッセージを表示するプログラムを、そのスクリプト内
に組込みたいです。
 最初に断りを「Read_Me」等に書いてそれを読んでもらえばいい、と言えばそれまで
ですが、このようなプログラムは可能でしょうか?



この記事に返信する


よっぴー

リンク

2019/10/27(Sun) 23:14:33|NO.88718

エラーメッセージを出す方法は知りませんが、コメントを使えばいいのでは

↓こんな感じ
https://imgur.com/a/AsUy5N5



MillkeyStars

リンク

2019/10/27(Sun) 23:40:02|NO.88720

__hspver__ でチェックして想定バージョン未満だったら普通にメッセージを出して実行を止めればいいんじゃないですかね。
スクリプトの最上位の地点でチェック機構作れば、単純にその時点でスクリプトの実行を中止できるわけで。


#if __hspver__ < 13825 dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" stop #endif



アキアキノヒロロ

リンク

2019/10/28(Mon) 07:42:09|NO.88722

 よっぴー さん、MillkeyStars さん、ご返答ありがとうございます。

 よっぴー さん、その通りですね。スクリプトは少なくとも、その頭の部分は目にしている
はずなんだから、そこに目立つようにコメントを入れておけばいいはずですよね。

 MillkeyStars さん、こう言う方法を探していたんです。「__hspver__ 」なんていうものが
あるのを初めて知りました。しかしながら、うまくいきません。
 先頭に組込んでそのスクリプトを保存。そのスクリプトファイルをダブルクリック。
「HSP 3.5」のエディタが開く。実行。以前と同じエラーメッセージ。となって、望んでいる
ダイアログが出ません。「HSP 3.6β1」のエディタを開いておいてから、スクリプトファイル
をダブルクリック。こうすれば、当然、エラーメッセージもダイアログも出ずに実行されます。
 どうも、これは、その時使っているバージョンを取得するには、正常に実行できる場合に限る
ように思います。本元の部分が正常に実行できない状況にある場合は、このダイアログの
スクリプト部分は無視され、エラーメッセージが出されてしまうようです。
これは、どうにもならないのでしょうか。
 



MillkeyStars

リンク

2019/10/28(Mon) 12:47:55|NO.88724

アキアキノヒロロ さんの実行環境は、Windows 10 ですか? (Windows 10 ではない場合、無視してください)

Windows 10 の場合、ファイル関連付けにバグがあり、ファイルをダブルクリックでのエディタ関連付け起動が正常に動作いたしません。
関連付けが一番最初に 3.6β1 で登録された場合、後から 3.5 に変更してもエディタは 3.6β1 で起動します。

多少面倒でも、タスクマネージャの詳細タブから hsed3.exe の実行ファイルのパスを確認してください。



暇人

リンク

2019/10/28(Mon) 18:45:39|NO.88728

目的がバージョンを知ることじゃなく
特定の命令が使えるかどうかなら

#include "hgimg4.as" #ifndef getangr dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #endif



アキアキノヒロロ

リンク

2019/10/28(Mon) 19:19:10|NO.88729

 私のは、確かに「Windows 10 home」 です。ただ、MillkeyStars さんは、舌っ足らずな私の
言おうとしたことをおもんばかって、答えて下さったようで、しかし、私が言っているのは、
ダブルクリックでのエディタ関連付け起動のことではなくて、どんなバージョンのエディタが
関連付けされていたとしても、それは人それぞれでいいですが、もし、ダブルクリックした時、
それが「HSP 3.6β1」のエディタでなかった場合、「=HSP 3.6β1 のエディタ= を起動して
それで開いてほしい」という旨のメッセージを出したいということです。
 言葉が不十分だったようで、すいません。もっと砕いて言えば、「HSP 3.6β1」は導入して
いない人も多いでしょうから、私のこのスクリプトファイルを手にした人がダブルクリックした
場合、「HSP 3.5」のエディタが開くことのほうが自然です。そういう場合、実行しても、
エラーメッセージが出て終了してしまいます。すると、スクリプト(プログラム)が間違っている
ということで、片付けられてしまうかもしれないので、そうではなくて、このスクリプトは、
「HSP 3.6β1」のエディタで作成したので、「HSP 3.6β1」のエディタで開いてほしい、と伝え
られないか、ということです。そういうことをそのスクリプト自体に組込めないか、ということ
なんです。

 「HSP 3.5」のエディタで正常に実行できるスクリプトの先頭に、MillkeyStars さんのスクリプト
を組込んで、関連付け起動の「HSP 3.5」のエディタで実行すると、その通りにダイアログが出て
「stop」がかかります。しかし、「HSP 3.6β1」のエディタで正常に実行できるスクリプトの先頭に
MillkeyStars さんのスクリプトを組込んで、関連付け起動の「HSP 3.5」( 3.5 です )のエディタで
実行すると、ダイアログは出ず、エラーメッセージが出てしまいます。

 どちらのケースも、バージョンを取得することは出来ているようでも、後者のケースでは、
エラーメッセージが優先されるような気がします。

 どうもこういう説明は苦手で、まわりくどい言い方になってしまいましたこと、お許し願います。



アキアキノヒロロ

リンク

2019/10/28(Mon) 19:32:16|NO.88730

 暇人 さん、ご返答ありがとうございます。
どうも、スレが行き違ったように、順番が前後してしまって、申し訳ありません。
自分の本意は、直前のスレの通りですので、よろしくお願いします。



MillkeyStars

リンク

2019/10/28(Mon) 20:44:31|NO.88731

現象確認中にスクリプトが 3.6β1 で起動されてしまうバグに遭遇したもので一応ね。
(3.5 に関連付けにし直しても、3.6β1 で起動してしまった。)

一応は、関連付けバグを除けば、正常にダイアログが表示される事は確認できました。

>>しかし、「HSP 3.6β1」のエディタで正常に実行できるスクリプトの先頭に
>>MillkeyStars さんのスクリプトを組込んで、関連付け起動の「HSP 3.5」( 3.5 です )の
>>エディタで実行すると、ダイアログは出ず、エラーメッセージが出てしまいます。

エラーメッセージと警告スクリプトに関しては関連はないと思うよ。
#if __hspver__ < 13825
//なんらかのスクリプト
#endif
の場合、__hspver__ が 13825 未満の場合に以下のスクリプトを含めなさいというプリプロセッサ命令なので
#if 空間の終わりの #endif と一緒に使っていればエラーメッセージは出ないはずなんですけどね。

なるべくなら、エラーの内容を書いていただけるとありがたい。



アキアキノヒロロ

リンク

2019/10/28(Mon) 21:13:19|NO.88733

 問題の自分のスクリプトファイルは、「hgimg4.as」で「getangr」を含んでいます。
これは、「HSP 3.5」のエディタでヘルプを見ると、「hgimg3」の命令となっている
ものです。ところが、「HSP 3.6β1」のエディタでヘルプを見ると、「hgimg4」の命令
です。この「HSP 3.6β1」のエディタで作成した「hgimg4.as」のスクリプトファイル
なので、当然、この「getangr」は「hgimg4.as」としての「getangr」であって、
「hgimg3.as」としての「getangr」ではありません。ですから、「HSP 3.6β1」の
エディタで開かないとエラーになります。「HSP 3.5」のエディタでは、「hgimg4」に
そのような命令はなく、「HSP 3.6β1」のエディタでのみ存在する命令だからです。
ですから、問題の自分のスクリプトファイルは、

 「HSP 3.6β1」のエディタで正常に実行できるスクリプト

なのですが、その

 先頭に MillkeyStars さんのスクリプトを組込んで、関連付け起動の「HSP 3.5」
( 3.5 です )のエディタで実行すると、ダイアログは出ず、エラーメッセージが出て
しまいます。

 ということです。



暇人

リンク

2019/10/28(Mon) 21:19:41|NO.88734

おっと、文法エラーが出てる環境なんだから
NO.88728のじゃ意味無かった・・・

#include "hgimg4.as" #ifndef getangr #define getangr(%1=a@tmp,%2=a@tmp,%3=a@tmp,%4=a@tmp) // #define getang(%1=a@tmp,%2=a@tmp,%3=a@tmp,%4=a@tmp) // dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #endif getangr id,x,y,z //3.5で文法が間違っていますエラーが出るように
3.5でエラーが出る命令を#defineで登録する必要あるけど・・・



暇人

リンク

2019/10/28(Mon) 21:43:25|NO.88735

パラメータの省略が出来ない命令なら

#include "hgimg4.as" #ifndef getangr #define getangr a@tmp= #define getang a@tmp= dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #endif getangr id,x,y,z //3.5で文法が間違っていますエラーが出るように
これでも良いかも



アキアキノヒロロ

リンク

2019/10/28(Mon) 23:05:28|NO.88738

 暇人 さん、たびたび、ありがとうございます。
これを組込むことで、思っている通りのことが、実装できました。

 ただ、私のような、初歩的なこともしっかりした知識を持っていない者には、
「プリプロセッサ命令」「コンパイル制御」とか「マクロ定義」「新規マクロ登録」
とかいうものの意味を理解するまでに至っていません。ヘルプ等を参照して、
ない頭を捻るばかりです。 MillkeyStars さんのご説明でなんとなく、感じがつかめた
かな、というぐらいです。これから、少しずつ勉強です。お二人に感謝いたします。

 追記)
 #define getangr(%1=a@tmp,%2=a@tmp,%3=a@tmp,%4=a@tmp)
というのは、
 #define getangr(%1=a,%2=x,%3=y,%4=z)
というのでは、ダメなのでしょうか? 「a@tmp」というのが分かりません。



MillkeyStars

リンク

2019/10/28(Mon) 23:10:36|NO.88739

暇人さんので理解できた。これ全く別問題だわな。
現状は、No.88734 の方法しかないと思う。

個人的には、プリプロセッサ命令時点でコンパイル停止させてメッセージを表示させる機構が欲しいところだけどね。



暇人

リンク

2019/10/28(Mon) 23:30:41|NO.88740

> #define getangr(%1=a,%2=x,%3=y,%4=z)
> というのでは、ダメなのでしょうか? 「a@tmp」というのが分かりません。
ダメでは無いです。
他の命令等で定義されてない文字列ならなんでも良い

@tmpの@の後に続く文字列は通常はモジュール名になってます。
で、tmpはテンポラリって意味で付けてるだけで
モジュール"tmp"は存在しないだろうから
命令として、まず存在しない「a@tmp」を使用しただけ。



暇人

リンク

2019/10/28(Mon) 23:40:31|NO.88742

あ・・・
良く考えたら
>#define getangr(%1=a@tmp,%2=a@tmp,%3=a@tmp,%4=a@tmp) //


#define getangr(%1=0,%2=0,%3=0,%4=0) //
でも問題なかった・・・(//に置き換えさえ出来れば良いんだから)
てか、パラメータ省略できないget系命令なら

#define getangr(%1,%2,%3,%4) //
でもOK



アキアキノヒロロ

リンク

2019/10/29(Tue) 07:17:25|NO.88743

 MillkeyStars さん、ありがとうございます。おっしゃる通り「全く別問題」だった
ようで、そのところをきちんとしっかり説明できなかった私が、混乱の原因を作って
いた訳です。すいませんでした。
 今現在の「エディタ環境」が、「hgimg4.as」の「getangr」が使える環境かどうか、
ということ、これが仕分けの物差しのようでした。

 暇人 さん、もう一つお聞きしたいです。

 getangr id,x,y,z //3.5で文法が間違っていますエラーが出るように

これは、私自身の元々のスクリプトにある訳ですから、組込みには、含めなくていい
のですよね。実際これは、省いて組込んで成功しています。しかし、一番上の

 #include "hgimg4.as"

これは、私自身の元々のスクリプトにあっても、省略は効かないようです。なんとなく、
その働きが違うだろうことは想像できますが、これをご説明いただけると、ありがたい
です。



暇人

リンク

2019/10/29(Tue) 23:01:56|NO.88748

>これは、私自身の元々のスクリプトにある訳ですから、組込みには、含めなくていい
コピペするだけでテスト出来るように書いてるだけなので
実際のスクリプトに使う場合は必要ないですよ。

>これは、私自身の元々のスクリプトにあっても、省略は効かない
hgimg4.as内にgetangrが定義されてるかどうかで
処理が別れます。

#ifndef getangr getangrが登録されてないと、ここを通る 登録されてない命令を使用するとコンパイル時にエラーが出るので #define getangr(%1=0,%2=0,%3=0,%4=0) // ↑ダミーの命令名を登録して、//と置き換える #endif getangrが登録されてるならここに飛ぶ
で、先にhgimg4.asがincludeされてないと
3.6でもgetangrが登録されてない事になってしまって
ダミーの命令が登録されて、hgimg4.asがincludeされる事で
二重にgetangrを登録しようとしてエラーが出る



アキアキノヒロロ

リンク

2019/10/29(Tue) 23:50:07|NO.88750

 暇人 さん、ご説明いただき、ありがとうございます。
 「#ifndef」のヘルプと 暇人 さんのご説明とを何度も突き合わせ、
読み合わせして、やっとどうにか、理解できたように思います。まだ、
はっきりとは断定できませんが。

 で、最初に、「#include "hgimg4.as"」を置くことになるので、
「getangr」とは逆に、今度は、私自身の元々のスクリプトにある
「#include "hgimg4.as"」のほうは、ダブってしまうので、これは
スクリプトから外したほうがいいのでしょうね。


  暇人 さん、誠にぶしつけかとは思いますが、今回のコンテスト
に応募のものに、この仕組みを使わせていただけないでしょうか。
お願いいたします。



暇人

リンク

2019/10/30(Wed) 06:17:55|NO.88752

>「#include "hgimg4.as"」のほうは、ダブってしまうので、これは
> スクリプトから外したほうがいいのでしょうね。
hgimg4.as自体は二重includeされないようになってるから
そのままでも大丈夫ですが、見た目的にあれかもね・・・

自分なら↓これをhgimg4_test361.asとかのファイルにして

#ifndef getangr //HSP3.5のhgimg4.asに無い命令を登録 #define getangr(%1,%2,%3,%4) // #define getang(%1,%2,%3,%4) // //HSP3.5に有るけどパラメータが3.6β1で増えてるので名前を一旦削除して再登録 #undef gpcamera #define gpcamera(%1=0,%2=0,%3=0,%4=0,%5=0,%6=0) // dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #endif
スクリプトと同じフォルダに置いて
スクリプト内は

#include "hgimg4.as" #include "hgimg4_test361.as"
って、するかな

>に応募のものに、この仕組みを使わせていただけないでしょうか。
問題ないですよ
使ってください



アキアキノヒロロ

リンク

2019/10/30(Wed) 06:36:04|NO.88753

 暇人 さん、せかせたようになって、申し訳ありません。
色々と、ありがとうございました。

 よっぴー さん、MillkeyStars さん、お二人にも感謝いたします。
勉強することがまた増えてしまいました。


 以上、解決と致します。



K-s

リンク

2019/10/30(Wed) 08:23:50|NO.88754

解決済みですが

#if __hspver__ < $3601 dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #else ; 3.6β1 以降が必要なスクリプト ; .... ; .... #endif
でいけませんか



アキアキノヒロロ

リンク

2019/10/30(Wed) 12:02:14|NO.88758

 K-s さん、ありがとうございます。

 「#else」という命令もあるんですね。
 「13825 = $3601」ということでもあるんですね。「$」の使い方に慣れていないので、
「__hspver__」で求めた数値で考えていましたが、「hspver」のヘルプの次の箇所、

 バージョンコード + マイナーバージョンコードの値になります。(3.0 は $3??? になる)

は、気になっていました。

 「#else」を使うのは、とてもすっきりしていて、分かりやすいですね。実際にこれで
やってみたところ、暇人 さんのもの同様、望んだ通りに働いてくれました。
 ただ、私の問題のスクリプトは、5000行を超えているので、最後に「#else」を置くのは、
逆に分かりにくくなってしまいます。で、

#if __hspver__ < $3601 dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #else gosub *head ; 3.6β1 以降が必要なスクリプト #endif *head ; 3.6β1 以降が必要なスクリプト
と、やってみたところ、みごとに失敗でして、今また、格闘しているところです。
 「*head」以降のところに、「gosub」したら、どうやって「#endif」のところへ
戻ってくるのか、「return」はどう入れるのか、(あるいは、どうやって「#endif」
を認識させるのか)が、分かりません。「goto」でもダメでした。

 どうも、コンテスト締切に間に合いそうにありません。申し訳ありませんが、
引き続き勉強していくこととし、今回は、暇人 さんのものを使わせて頂くことに
いたします。



アキアキノヒロロ

リンク

2019/11/3(Sun) 22:01:55|NO.88797

 解決済みとしましたが、コンテストが一区切りついて、改めて考えてみています。


 K-s さんへ

 コンパイルということを少しでもかじっていたら、前にあげたスクリプトのような書き方は
ありえないだろうと分かって、冷や汗ものです。
 みなさんに、無知のほどを笑われているようで、恥ずかしいです。

 「.......... 最後に「#else」を置くのは、逆に分かりにくくなってしまいます。」

の「#else」は、「#else」の締めの「#endif」の勘違いですし、こんなスクリプトなどは、考えも
しなかったでしょう。ただ、うすうすこんな書き方はしないだろうと感じていたので、「みごと
に失敗」だった訳です。それでも、やはり「#else」から5000行を隔てて、最後に「#endif」が
あるというのは、ちょっと考えものです。コンパイル後の範囲指定(プリプロセッサ命令)であって、
一般的な命令云々以前のことだから、それはそれでいいのだ、そういうものだ、と言われれば、
それまでですが、スクリプト上、「#endif」を「#else」からそう離れていないところに記述する
ように、できないものでしょうか。


 MillkeyStars さんへ

 「プリプロセッサ命令時点でコンパイル停止させてメッセージを表示させる機構が欲しい」

 この意味がやっと分かった気がします。
 コンパイルされた後の、プログラムの実行範囲を、プリプロセッサ命令で指定をすれば、
指定をはずした部分は、スクリプトの実行は無視されるはずだが、「文法エラー」があると、
コンパイルの時点でコンパイル不可能になり、プリプロセッサ命令が意味をなさなくなって
しまう。プリプロセッサ命令で指定をはずした部分は、コンパイル自体しないようになって
いれば、その部分に「文法エラー」があろうとなかろうと、関係なくなるのに...。と、こう
いう理解の仕方でいいでしょうか。


 それで、さらに改めて、ダイアログ全文を
『このスクリプトは、「HSP バージョン 3.6β1」版用です。
「HSP 3.5」でも、動作可能にしていますが、
「HSP ver.3.6β1」による実行をお勧めします。』
として、

if hspver <= 13575 { dialog "このスクリプトは、「HSP バージョン 3.6β1」版用です。....." } #include "hgimg4.as" #ifndef getangr #define getangr(%1,%2,%3,%4) ; #define getang(%1,%2,%3,%4) ; #endif ; 本来「3.6β1」で実行するスクリプト
と、やってみました。「getangr」が定義されていない場合、これを無しにしたかたちにして、
「#endif」以下の、本来「3.6β1」で実行するべきスクリプトを実行するようにする。これだと、
警告メッセージをだした上で、かつ「HSP 3.5」でも、「#endif」以下を実行できるはずで、実際、
その通り成功しています。もちろん、これを「3.6β1」で実行すれば、本来通りに動きます。
 頭が少し混乱しているので、本当にこれでいいのか、それとも、たまたまうまくいっている
だけなのか、分かりませんが。



K-s

リンク

2019/11/4(Mon) 03:27:38|NO.88798

以下のようなスクリプトを start.hsp (名前は何でも)として同じフォルダーに作るのはどうでしょうか。
#if __hspver__ < $3601
dialog "このスクリプトは、HSP バージョン 3.6β1 以降が必要です。" end #else #include "hgimg4.as" #include "main.hsp" ; ←今まで書いていたスクリプト #endif
実行は start.hsp からになるので一手間かかりますし、main.hsp から実行されたら結局同じですが…
個人的にはスクリプトの先頭にコメントで書いておけば十分伝わると思います…

あと Treasure Hunt のスクリプト少し拝見しました。
hsp3dish は hgimg4 の中に含まれているのでインクルードするのは hgimg4.as だけで大丈夫です。



アキアキノヒロロ

リンク

2019/11/4(Mon) 09:11:28|NO.88799

 「#endif」を「#else」と行を置かずに記述するかたちにするためには、暇人 さんが[NO.88752]で
やっているように、別ファイルにして、それを取込むかたちにすれば、なんとかなりそうだとは、
見当をつけていました。やはり一つのスクリプトでの実現は無理で、そうするしかないんですね。

 「個人的にはスクリプトの先頭にコメントで書いておけば十分伝わると思います…」

その通りですが、勉強も兼ねて、やってみようと思ってのことです。無理にお付き合いさせたようで、
申し訳ありません。

 「hsp3dish」のインクルードは、「hsp3dish」への思い入れで、あえてのことです。スマホに移植
できたらいいな、という希望を記しておこうと、勝手にいれています。

 「プリプロセッサ命令」「コンパイル制御」とか「マクロ定義」「新規マクロ登録」等、まだ
しっかりした知識に至っていません。これらの意味、関係については、直前のスレで、
「MillkeyStars さんへ」の部分で書いたような、微妙なところがあるように思いますが、こんな
感じでとらえておいて、間違いないでしょうか。K-s さんにも、お聞きしたいところです。

 あと、今回の[NO.88797]でやってみた方法(警告メッセージ付きで「HSP 3.5」でも実行可能)は、
うまくいっているものの、これで正しいのでしょうか。



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