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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0921
tangentrunをgotoとするところのgosub14解決


tangent

リンク

2007/9/21(Fri) 20:15:16|NO.11142

runはaxファイルに制御を移す命令ですが、
runのように制御を移し、対になる命令で
呼び出した側に制御を戻すgosub-return
のような命令を実装してほしいのですが。
もしそのようなことができるのならば、教えてください。



この記事に返信する


ANTARES

リンク

2007/9/21(Fri) 21:28:29|NO.11145

#includeじゃダメですか?
gosub-returnのように制御を移すわけじゃないけど……
呼び出したいところで#includeすれば、結果的には同じです。

または、呼び出したいスクリプトの最後にreturnを書いて
呼び出し元スクリプトの最後に#includeしてgosubで呼ぶという手もありますが……。

あるいは、呼び出し元に戻るとき、頭から実行でよければ、run "start.ax"という手も……。

もう少し、なぜ、そんなことをしたいのかを書かないと、あまりいい回答はもらえないかも。



f

リンク

2007/9/21(Fri) 23:29:58|NO.11151

「呼び出す元」 => 自分の状態をファイルに書き出してサブ処理をrun
「呼び出し先」 => 必要な処理を行った後、「復帰」である事を通知するコマンドライン引数を
         付けて呼び出し元をrun
「呼び出し元」 => 「復帰」起動のコマンドライン引数があったら、自分が書き出しておいたで
         あろうファイルを読み込んで、作業再開

で良いんでね。



tangent

リンク

2007/9/22(Sat) 09:59:11|NO.11152

>#includeじゃダメですか?
#includeはプリプロセッサですから、
コンパイル時のみ有効なのでだめです。
fさんの言った方法がいいのかもしれません。

この命令が実装されると、
後からどんどん機能が追加できるので、
実装してほしいと思ったのです。



ANTARES

リンク

2007/9/22(Sat) 18:32:10|NO.11158

>fさんの言った方法がいいのかもしれません。
 fさんの言った方法ではダメな理由を挙げないと却下されるということは
わかっていますか?



tangent

リンク

2007/9/22(Sat) 22:50:29|NO.11159

>fさんの言った方法ではダメな理由
自分の状態をファイルに書き込んでおいたとしても、
longjmp関数のようなものがないので、ラベル型の変数
で実装するとしたら、あまりに非効率。
HSPはインタプリンタだから、仮想マシンのほうで
調節したほうが効率的。
もし、打開策があるならば教えてください。



f

リンク

2007/9/23(Sun) 04:49:20|NO.11163

ところで、俺の感覚では、

>この命令が実装されると、
>後からどんどん機能が追加できるので、
>実装してほしいと思ったのです。

と言われても、

「・・・それじゃ結局「呼び出し元」を修正する度、実行ファイル作り直す事になるんでね?
 それなら(ファイルだけ分けとくとかするとしても)普通にgosub〜returnで良いんでね?」

という感覚のほうが先に立つんだが・・・・。

実際俺はこんな事良くやるしな。
	gosub *init
gosub *main gosub *term end //...... #include "(画面表示関係)" #include "(計算関係)" #include "(他)"



ANTARES

リンク

2007/9/23(Sun) 16:13:15|NO.11171

>longjmp関数のようなものがないので、ラベル型の変数
>で実装するとしたら、あまりに非効率。
>HSPはインタプリンタだから、仮想マシンのほうで
>調節したほうが効率的。
 となると、run命令の動作も変更する必要がありますね。
runに対応するreturnFromRun命令を作るだけでは対応不可能です。

>「・・・それじゃ結局「呼び出し元」を修正する度、実行ファイル作り直す事になるんでね?
 「呼び出し元」は「呼び出される側」ですよね?
 それは私も思ったんですが、外部DPMに呼び出される側のaxファイルを置けば、
呼び出される側のみの修正ならDPMファイルのみの再配布ですみます。
もっとも、画像ファイルがいっぱいあるようなソフトだと、DPMファイルのみの再配布より
exeファイルのみの再配布の方が歓迎されそうですが。

>この命令が実装されると、
>後からどんどん機能が追加できるので、
 仮に実装されたとしても、誰も使わない気がします。
実際、プラグインが作れるようなソフトはあまり多くありません。
理由は、
1 そもそもプラグインの需要があるようなソフトのジャンル自体が少ない
 パズルゲームの追加ステージなど、プラグイン機能がなくても機能追加可能なジャンルが多い
2 プラグイン機能付きソフトの設計が難しい
3 元のソフト自体に人気がなければ誰もプラグインを作ってくれないので、
 無駄に終わる可能性が高い

 自分で機能追加することを考えているのだとしても、本体を修正せずに
できる機能追加なんて非常に限られてしまうか、あるいは本体を修正しない
ということが足かせになって、非常に面倒な処理を余儀なくされます。

 要約すると、対応が大変な上、ランタイムをでかくする要因になりかねない割に
ユーザーのメリットが小さすぎると思います。



ANTARES

リンク

2007/9/23(Sun) 17:47:08|NO.11174

>longjmp関数のようなものがないので、ラベル型の変数
>で実装するとしたら、あまりに非効率。
 ようやくHSP3のドキュメントを読み始めたのですが、
vload,vsaveなんていう、うってつけの命令があるじゃないですか。
もっとも、厳密なテストは難しそうなのでバグがありそうですが。



tangent

リンク

2007/9/23(Sun) 21:49:27|NO.11176

>「・・・それじゃ結局「呼び出し元」を修正する度、実行ファイル作り直す事になるんでね?
> それなら(ファイルだけ分けとくとかするとしても)普通にgosub〜returnで良いんでね?」
そうじゃなくて、実行ファイルをそのままに、指定フォルダにaxファイルを
追加することで、機能を追加していくようなことがやりたいわけです。

> となると、run命令の動作も変更する必要がありますね。
>runに対応するreturnFromRun命令を作るだけでは対応不可能です。
runで対応するのではなく、別の命令に割り当てればいいじゃありませんか。

> 要約すると、対応が大変な上、ランタイムをでかくする要因になりかねない割に
>ユーザーのメリットが小さすぎると思います。
プラグインで実装すればいいじゃありませんか。
> 要約すると、対応が大変な上、ランタイムをでかくする要因になりかねない割に
>ユーザーのメリットが小さすぎると思います。
じゃあ、あきらめましょうか。



f

リンク

2007/9/24(Mon) 01:25:26|NO.11177

>そうじゃなくて、実行ファイルをそのままに、指定フォルダにaxファイルを
>追加することで、機能を追加していくようなことがやりたいわけです。

なるほど。

ようするに「HSP」自身で「プラグイン」が作りたいと。

>プラグインで実装すればいいじゃありませんか。

そんな簡単に言うくらいなら、むしろチャレンジして欲しい・・・。


思うに、同時に進行していいのなら

exec "hsp3 xxx.ax"

見たいな感じでもう1つHSP立ち上げて実行したいaxファイル指定したらいいんでね?

axファイルのほうは起動時に自分が起動している事を知らせるファイルを書き出すとか
すれば大元側からも外部のコード作業中と判断できるかもしれないし、

それこそ「現在幾つのプログラムが自分自身を呼び出しているか」をカウントするDLL
を用意してそれを参照すると言うのもありかもしれない。


ただ、外部のaxファイルを実行するだけでは、呼び出し元から情報が受け取れ無いし
ax側から値も返せないので、あんまり意味が無い気もしてきたが。

ファイルに書いてデータの受け渡し?



f

リンク

2007/9/24(Mon) 01:34:15|NO.11178

まー、最終的にはおにたまがどう思うかなんでね?

俺らがHSP作ってるわけでないし、HSPの機能の取捨について勝手に却下できる立場ではないしな。

現行機能で代換手段考えるくらいの物か。



tangent

リンク

2007/9/24(Mon) 12:21:34|NO.11183

やっぱり、マクロで実装したほうが早かった...
ご迷惑してすみません。



ANTARES

リンク

2007/9/24(Mon) 12:45:40|NO.11184

>やっぱり、マクロで実装したほうが早かった...
 せっかく作ったのに〜。いけずぅ〜。
でも、投稿しちゃお。


#include "hspda.as" #define FILE "runGosubtmp.dat" if dir_cmdline=="return" { vload FILE goto lblRet } mes "起動したで" *l_main button "発進", *l_go button "別機能",*l_go2 stop *l_go lblRet=*l_ret vsave FILE run "runret.ax","1" *l_go2 lblRet=*l_ret2 vsave FILE run "runret.ax","2" *l_ret mes "戻ってきましたがな" goto *l_main *l_ret2 mes "戻ってきましたがな 2 やで" goto *l_main -------------------- 以下、runret.hsp -------------------- mes "dir_cmdline=["+dir_cmdline+"]" mes "およびどすか?" button "return",*l_ret stop *l_ret run "start.ax", "return"



n

リンク

2007/10/2(Tue) 16:55:11|NO.11341

後から機能追加っていうかそんなこと可能になったら外部の人間が用意した悪意あるオブジェクトファイルを知らず知らずに実行してしまうってことも可能なんだよ。



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