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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0526
オコリダケスタックについて8解決


オコリダケ

リンク

2007/5/26(Sat) 17:52:36|NO.8499

#defineマクロで値をスタックに積む事が出来ます。
ヘルプには「

1つのソーススクリプトファイル内ですべてのスタックが取り出されて いなかったマクロ(タグ名)は、コンパイル時にエラーが報告されます。 かならず、すべてのスタックが取り出されて終わるようなマクロ命令の構成にしておいてください
」 とありますが、例えば、下記の方法だとエラーはなく実行できます。

#define _push(%1) %tp %s1 #define _pop %tp %o repeat title "スタック数? " + cnt _push "積みまくり・・・?" wait 1 loop mes _pop ; 数合わせに書いておく(エラー防止)
イメージとして無限に積んでいっているスクリプトのように感じます。
エラーもなく普通に動きますが、実際に何らかの影響はありますか?
どこかに保持させている以上、気になるのですがどうなるのでしょう?
また、スタックサイズの上限はどうなっているのでしょうか?



この記事に返信する


不如帰

リンク

2007/5/26(Sat) 20:45:48|NO.8519

調べてみた所、
スタックからデータを取り出す文(これなら最後の行)
が無い場合、コンパイルエラーになるそうです。
どこかにスタックからデータを取り出す文があれば、エラーは起きないらしいです。



pizza

リンク

2007/5/27(Sun) 01:27:15|NO.8535

プリプロセッサ(#で始まる命令)はコンパイル時に実行されるので、
repeat〜loopでは繰り返されないと思います。
(プログラミングマニュアルの「プリプロセッサ命令 」参照)



pizza

リンク

2007/5/27(Sun) 01:53:37|NO.8537

ん?実行中にスタックを利用したいってことですか?

だとしたら、配列等を使って自分で実装した方が
良いと思います。
#defineで使えるものはマクロ専用だと思うので。



オコリダケ

リンク

2007/5/27(Sun) 10:22:50|NO.8545

いや、ブリブロセッサだとコンパイル前に実行されるのは知ってるのですが、それは枠組みの話ですよね?
サンプルの_pushマクロを使うと、実行時の引数をスタック(どこかの保持)されるわけですよね?
それはどこに保持されて、どれくらい保持可能で、
サンプルのような一方的に貯めていくイメージのあるものだと最終的にどうなるのかが気になるのです。
どこかに記述されているのならそれを教えていただきたいし、
どこかで聞いたことあるならそれを聞いてみたいわけです。



KIMU

リンク

2007/5/27(Sun) 16:27:09|NO.8557

何か勘違いしてません?

> _push "積みまくり・・・?"
スクリプトが実行される時には、その行は存在しません
だからリピートも関係なくなります。

>サンプルの_pushマクロを使うと、実行時の引数をスタック(どこかの保持)されるわけですよね?
実行時じゃなくてプリプロセッサで先に全て置き換えられるので、実行時には保持されてません(保持されてたらエラーになる)
なので、実際のスクリプトの流れは置き換え時には関係ありません。

#define _push(%1) %tp %s1 #define _pop %tp %o goto *A _push "スタックテスト" stop *A mes _pop
これは実際に動く時に(_pushは実行されずにgotoするように見えるど)

goto *A stop *A mes "スタックテスト"
に置き換わっています。


#define _push(%1) %tp %s1 #define _pop %tp %o _push "スタック[1]" _push "スタック[2]" gosub *A gosub *B stop *A:mes _pop:return *B:mes _pop:return
これと

#define _push(%1) %tp %s1 #define _pop %tp %o _push "スタック[1]" _push "スタック[2]" gosub *A gosub *B stop *B:mes _pop:return *A:mes _pop:return
これとでは実行結果が違います。



オコリダケ

リンク

2007/5/27(Sun) 17:11:33|NO.8559

つまりは、スタックと言う書き方がされてるものの、
それはコンパイルから実行までの間だけの話であって、
実行時には既に全て置き換えられていて、スタック自体が存在しないということですか。

なるほど、納得。

最後の

> #define _push(%1) %tp %s1 > #define _pop %tp %o > _push "スタック[1]" > _push "スタック[2]" > gosub *A > gosub *B > stop > *A:mes _pop:return > *B:mes _pop:return
> これと

> #define _push(%1) %tp %s1 > #define _pop %tp %o > _push "スタック[1]" > _push "スタック[2]" > gosub *A > gosub *B > stop > *B:mes _pop:return > *A:mes _pop:return これとでは実行結果が違います。
というのが何を言わんとしているかが分かりませんが、解決。



リンク

2007/5/29(Tue) 02:30:42|NO.8617

>というのが何を言わんとしているかが分かりませんが、
お前は喧嘩を売っているのか?(俺は喧嘩を売ってるけどな)

プリプロセッサは
HSPのrepeatだとかgoto/gosub命令などの分岐命令に影響するのではなく、(repeatだとかgoto/gosubが実行されるのは実行時)
実行時前の処理だということだよボケ。
実行時前がどういう処理か考えてコメント振ってみろあふぉ。
プリプロセッサはスクリプトの最初から末尾に向かって一方通行の処理しかしないんだよ。

#define _pop %tp %o _push "スタック[1]" _push "スタック[2]" gosub *A gosub *B stop *B:mes _pop:return // スタック2 *A:mes _pop:return // スタック1
だからKIMUさんは、
repeat、loopでマクロを挟み込んだからプリプロセッサ用スタックに何回もプッシュしまくると思っていた
お前の思い込みを払拭するために、
プリプロセッサでgosubが実行されるかどうかを示したんだろぼけ。

言わんとしていることが理解できなくて何が解決だよウスラトンカチが。



d

リンク

2007/5/29(Tue) 17:56:46|NO.8624

オコリダケ以外に何も分かっちゃいないやつが一人紛れているな。
「僕は何も分かっちゃいませんでした。知ったかぶっていました。」って名乗り出ろよ。
>どこかにスタックからデータを取り出す文があれば、エラーは起きないらしいです。
そうか?

#define _push(%1) %tp %s1 #define _pop %tp %o _push "a" _push "a" mes _pop
ほれエラー。

#define _push(%1) %tp %s1 #define _pop %tp %o mes _pop _push "a"
ほれエラー。
君の言うとおり、どこかにスタックから取り出す文を入れたが、エラーでまくりだよ。
君の言うとおりにしたけどエラーでまくり。どういうこと??????



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