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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0126
りなおそらくモジュール変数だと思うのですが…11解決


りな

リンク

2012/1/26(Thu) 02:13:07|NO.44540

初めまして、基礎の基礎身につけたばかりで
初心者な質問になってしまいますがお許し下さい…m(_ _)m

aがbと同じか、bより5〜20少ない値になるまでその下の命令を繰り返す
という命令なのですが、bの数が増えてしまい
動かす画像の処理がぎこちなくなってしまいました。

a=0 : b1=60 : b2=120・・・

repeat
a=+25

if a=b1 | a=b2 | a=b3 | a=b4 | a=b5 | a=b6 | 〜〜a=b15 : goto *syori2
if a>=b1-20 & a<=b1-5 : goto *syori2
if a>=b2-20 & a<=b2-5 : goto *syori2
if a>=b3-20 & a<=b3-5 : goto *syori2
if a>=b4-20 & a<=b4-5 : goto *syori2
if a>=b5-20 & a<=b5-5 : goto *syori2
:
:
if a>=b10-20 & a<=b15-5 : goto *syori2

;上記に当てはまらない時の命令
loop

*syori2

おそらく配列変数かモジュール変数の使い方の質問になると思うのですが、

一つの変数(この場合だとb)の中に20,40,60などまとめて代入して
比較処理出来るようなものがあればと勉強しているのですが
初めての#文でつまづいてしまって検索が空回りしています…

こういった場合の代入の仕方やif文での使い方をご教授いただきたいですm(_ _)m



この記事に返信する


りな

リンク

2012/1/26(Thu) 02:15:58|NO.44541

すいません、誤字がありました;;

× if a>=b10-20 & a<=b15-5 : goto *syori2
○ if a>=b15-20 & a<=b15-5 : goto *syori2



荒河

リンク

2012/1/26(Thu) 02:21:47|NO.44542

とりあえず、ぱっと見て一つ木になったのはrepeat〜loopの中にgotoがあることでしょうか。
breakでloopを脱出してからgotoするか、gosubを使ってみてはどうでしょう。


a=0 : b1=60 : b2=120・・・ repeat a=+25 if a=b1 | a=b2 | a=b3 | a=b4 | a=b5 | a=b6 | 〜〜a=b15 : gosub *syori2 if a>=b1-20 & a<=b1-5 : gosub *syori2 if a>=b2-20 & a<=b2-5 : gosub *syori2 if a>=b3-20 & a<=b3-5 : gosub *syori2 if a>=b4-20 & a<=b4-5 : gosub *syori2 if a>=b5-20 & a<=b5-5 : gosub *syori2 : : if a>=b10-20 & a<=b15-5 : gosub *syori2 ;上記に当てはまらない時の命令 loop *syori2 ;なんらかの処理 return



check

リンク

2012/1/26(Thu) 02:26:12|NO.44543

何を言っているのかがさっぱりだ。
で、モジュール変数ではなく、おそらく配列変数のことだろう。
HSPがわけの分からない仕様を作るから混乱する元になるんだけどな。

dim b, 20 // 必要な数だけ確保する b(0) = 60 : b(1) = 120 repeat 20 a += 25 if a >= b(cnt) - 20 & a <= b(cnt) - 5 : gosub *syori loop *syori return
こんな感じか。
repeat内でgotoは使うな。gosubを使え。
もしくはbreakでループを抜けておけば大丈夫だ。



荒河

リンク

2012/1/26(Thu) 02:43:53|NO.44544

えーと、寝ぼけていて質問の意味を理解するのに時間かかりました。
まず、先ほども書きましたが、repeat〜loopの繰り返し処理から抜け出すのにgotoは使わないでください。
繰り返しの中でbreakを実行するとloopの次の行に飛びます。

>一つの変数(この場合だとb)の中に20,40,60などまとめて代入して
>比較処理出来るようなものがあれば
配列変数のことですね。
これは

b=60,120,240,480,960
と書くだけです。
あとは

;最初の数字を取り出す mes "最初の数字は"+b(0) ;何個の数字が入ってるか調べる mes "bには"+length(b)+"個の数字が入っています"
あとは自力でできますね?



りな

リンク

2012/1/26(Thu) 02:58:09|NO.44545

>荒河さん

if文のgotoは避けるべきなんですね。ありがとうごさいます。
戻ってこない場合だとbreakの方が使えそうなのでやってみたいと思います。
早速レス書いて下さってありがとうございました。

>checkさん
a=0と書いたのが間違いだったかもしれないです; ごめんなさい。
リピート入る前に

a=-877 repeat a+=25 if a>=383 : a-=1260a    onkey gosub で質問の場所へ loop

等でaが細かく変動してて毎回値が違うので
止まる場所をb1、b2等で指定していたのですが文量が多くなってしまって
1つの変数に60,200,1111等まとめて代入出来るものがあれば動作も軽くなるのかなと思いまして;
分かりにくい文ですみません;;



りな

リンク

2012/1/26(Thu) 03:06:55|NO.44546

>荒河さん

再レスありがとうございます。
b=の後を,で仕切ることも出来たんですね。

b1=もb(1)=も似たような感じなのかと思っていて
if a=b(1) : a=b(2)・・・のように同じく長くなってしまうのかなと思っていました。
#module a x,y,zみたいなのを使うのかな…と。

b=60,120,240,480,960の使い方をちょっと試行錯誤してみたいと思います。
ご教授本当にありがとうございました。



りな

リンク

2012/1/26(Thu) 03:58:31|NO.44547

とりあえずまだまだ要勉強ですが解決済しておきます
荒河さん、checkさんありがとうございました



荒河

リンク

2012/1/26(Thu) 14:20:12|NO.44549

>if文のgotoは避けるべきなんですね

「repeat」と「loop」に挟まれてる中にgotoを書くのが問題なのであって、ifとgotoの組合せ自体は問題ありません。



りな

リンク

2012/1/29(Sun) 02:32:47|NO.44584

あっ…頭では分かっていたのですが誤字申し訳ございません;;

あともう一つお聞きしたいのですが、

if a=b(1),(2),(3) : goto *syori
(エラーになりますが…)
みたいな文の短縮方法ってありますか? checkさんにご教授頂いた
repeat
if a >= b(cnt) - 20 & a <= b(cnt) - 5 : gosub *syori
;上記に当てはまらない時の命令
loop

だと毎回a(1)(2)(3)全てと比較処理出来ない感じで;;

if a=b(1) | a=b(2) | a=b(3) | a=b(4) | a=b(5) … a=b(20) : goto *syori

と書く他に方法があればご教授お願いしたいですm(_ _)m



暇人

リンク

2012/1/29(Sun) 09:02:23|NO.44587

NO.44540のを有る程度無駄な判定を無くしてみた


repeat 15 b(cnt)=60*(cnt+1)//b(0)=60,120,180・・・と同等の処理 b_20(cnt)=60*(cnt+1)-21//先に判定用のデータを作っとく( >= を > で比較できるように21引いてる) b_5(cnt)=60*(cnt+1)-4//( <= を < で比較できるように4引いてる) loop a=-377 syoriend=0 //ループを抜けるためのフラグ(必ず0でクリア) cnta=0//b()の判定する位置を決める最初はかならず0にする repeat a+25 repeat 15-cnta,cnta//記録した位置からループ if a>b_20(cnt) {//aがb_20(cnt)より大きい時だけ下の判定をする cnta=cnt//判定位置を記録 if (a>b_20(cnt) and a<b_5(cnt)) or (a=b(cnt)) {syoriend=1:break}//条件を満たしたのでsyoriendを1にしてループを抜ける }else{ break//aが判定範囲外なのでループを抜ける } loop if syoriend=1{break}//syoriendが1ならループを抜ける mes "上記に当てはまらない時の命令" loop mes "syori2"



りな

リンク

2012/1/30(Mon) 02:41:29|NO.44605

>暇人さん(←失礼いたします;;;;)

ありがとうございます!
cntはややこしくなるのかな、なんとなく使う所じゃないかなと避けてしまっていたのですが
暇人さんのプログラムを分かるまで熟読して自分なりに組み込んでみたら一挙解決しました!

ずらっと15行くらい書いていた判定文がほぼ1行に…
代入、判定文がすごくスムーズになりました。
そして補足文すごく分かりやすく書いて下さって本当にありがとうございました。

ご教授ありがとうございます。



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