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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0127
MNIGHTネストレベルを下げる?9解決


MNIGHT

リンク

2012/1/27(Fri) 13:53:13|NO.44556

repeat〜loopからgoto命令等で抜け出した時にネストレベルを下げる(という表現で正しいかも分からないですが)ことって出来ますか?

あと、
gosub *syori1
stop
*syori1
gosub *syori2
mes "Aは0じゃない"
return
*syori2
if A=0:(ここでいきなりgosub *syori1の行まで戻りたい)
return

ということは出来ますか?
文字を用意したら出来ますが、そうではなくてジャンプ元のアドレスを1つ消すような・・・。
うまく説明できなくてすいません。
スタック(HSPでスタックという単語があるのかも知らないです;;)に保存されたアドレスを引き出したり書き換えてジャンプ元のアドレスを操作するようなことです。



この記事に返信する


MNIGHT

リンク

2012/1/27(Fri) 14:00:39|NO.44558

すいません、あと質問を追加します。
repeat〜loop中にgosubで飛んだ先でbreakを使うとgosubでのジャンプ元のアドレスは何処かに残り続けますか?
もしそうであるなら、breakを使っても大丈夫なやり方を教えてください。



いなえ

リンク

2012/1/27(Fri) 14:41:26|NO.44559

>repeat〜loopからgoto命令等で抜け出した時に…
repeat等をマクロで定義し直すことができれば可能かもしれません。
まぁ、しようとは思いませんが。

>あと、…ということは出来ますか?
"2段階returnを実行する時は「return ,2」"のような感じでしょうか。
残念ながら方法を思いつきません。
goto,gosub系の命令をすべてマクロで組み直すとできるのかしら…。
もちろん、しようとは思いませんが。

>スタック…
「ラベル型変数」あたりが関係しているかもしれません。

>repeat〜loop中にgosubで飛んだ先でbreakを…
そもそもbreakを使えないと思われます。
自分で何も考えずにとりあえず質問をするという行為は、
相手に不快感を与える場合があるということをお忘れなく。

ちなみにこの流れは、いわゆる"スパゲッティコード"路線です。
あまりお勧めできません。
基本的な文法でうまくいかない場合は、
プログラムの構造的に問題がある場合が多いものです。
見直してみるとよりスマートに構築できるかもしれません。

回答が質問に合っていない場合はご容赦下さい。



check

リンク

2012/1/27(Fri) 17:52:40|NO.44562

何を言っているのかよく分からない、で書き始めるのが習慣になってしまったが、
本当に何を言っているのかよく分からない。

とりあえず、氏がしたいことはHSPでは不可能だ。

HSPのサブルーチンジャンプはスタックに現在のコードの位置をプッシュし、
リターンするときにスタックから値をポップして、そのコードの位置に飛ぶ、
という作業が行われているはずだ。

これはインタプリタに限らず、実際のマシン語のサブルーチンジャンプでも
同じような事が行われている。


で、問題になるのはスタックのサイズだ。
メモリは有限なんで、決められた量を超えたらエラーを出さなければならない。
HSPでは32個のコードの位置がスタックできるようになっているはずだ。

氏の言っているとおり、スタックの値を書き換えることもできなくはないが、
非常に危険なプログラムになる。
というか、わざわざコンパイラが吐き出した正常に動作するコードを
おかしくするようなまねはやめたほうがいい。


まずはモジュール機能でも学んでみたらどうだ。
モジュール機能のマニュアルはとても難解で人の頭を狂わせるので、
以下のサイトでも見て研究すればいい。
http://chokuto.ifdef.jp/advanced/module.html
http://dita.iza-yoi.net/hspmodule.html



MNIGHT

リンク

2012/1/27(Fri) 18:24:05|NO.44564

すいません、自分で調べて事故解決しました。
モジュールではなく、スタックの書き換え(書き換えというより引き出すだけで良かった)でやりたい事が出来そうなので。



check

リンク

2012/1/27(Fri) 19:48:51|NO.44566

解決したらいいんだが、このままこの状態でプログラムを
組み続けるといつか破綻すると思っておいたほうがいいぞ。



HK2

リンク

2012/1/28(Sat) 09:09:57|NO.44574

自己解決されたようですが、その方法を教えていただけないでしょうか。
私もその方法を利用したいと思っています。



MNIGHT

リンク

2012/1/28(Sat) 11:16:44|NO.44576

ここ見て気づきました。
http://hspdev-wiki.net/?%A5%B7%A5%B9%A5%C6%A5%E0%A4%CE%A5%B9%A5%BF%A5%C3%A5%AF%A4%F2%BB%C8%A4%EF%A4%CA%A4%A4gosub

自分でスタックを管理したら基本的に何でも出来ます。
何かのミスでエラーが起こる時も、HSPの基本的なエラーしか起こらないので安心。

少々面倒ですが。
HSPで直接アドレス値をプッシュやポップは無理そう?(というかアドレスの指定方法が無い、コンパイルの仕組みを考えても)
だから自分で作ります。
サブルーチンジャンプを命令1つで解除できるのは便利だと思うのですが、変でしょうか・・・。



MNIGHT

リンク

2012/1/28(Sat) 11:41:44|NO.44578

追記
repeat〜loop命令も自分で独自のものを用意すれば、どこででも解除できたり、不正に2つ以上のrepeat〜loopを連結したり出来るようになります。
それと自分でネストレベル等を計(漢字?)っておけば、異なるネストレベルを統一したり等々かなり強引なプログラムも組めます。

自分は元々6502や65816等の解析をしていたので、この辺が無いとどうもしっくりこなくて・・・。



HK2

リンク

2012/1/29(Sun) 12:51:50|NO.44589

私がしたいと思っていることは現在のところ実現できなさそうです。
お手数をおかけしました。
ありがとうございした。



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