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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0420
木村repeat〜loop構文に使う変数を省略したい2解決


木村

リンク

2011/4/20(Wed) 00:15:12|NO.38562

 repeat〜loop構文を使っていると、時々以下のような事が起きる気がします。

1.二重にrepeat命令を使うので、repeat命令の次行にcnt相当の変数定義(以下は一例)

repeat 8 x = cnt repeat 6 y = cnt color x*30+15, y*40+15, 192 boxf x*40, y*20, x*40+39, y*20+19 pos x*40, y*20 color mes "("+x+","+y+")" loop loop

2.break命令で脱出した場合と、通常の場合を区別する為にフラグ変数定義(以下は一例)

is_breaked = 0 repeat rnd(5)+5 if cnt>8 : is_breaked = 1 : break loop if is_breaked = 1 : dialog "break命令で抜け出しました" : end dialog "普通に抜け出しました" end

3.上2つのせいでrepeat〜loop構文が絡むユーザー定義命令はローカル変数が多い(以下は一例)

#module #defcfunc area_checker array dimen, local breaked, local x, local y, local z, local t breaked = 0 repeat length(dimen) x = cnt repeat length2(dimen) y = cnt repeat length3(dimen) z = cnt repeat length4(dimen) t = cnt if dimen(x,y,z,t) = "ひゃっはー" : breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : return "ひゃっはーは("+x+","+y+","+z+","+t+")座標に存在します" return "ひゃっはーは存在しません" #global sdim dimension, 12, 10, 10, 10, 10 dimension(rnd(10),rnd(10),rnd(10),rnd(10)) = "ひゃっはー" mes area_checker(dimension)

 慣れてしまえば問題無いような気もしますが、この手の変数は命令の処理方法次第で消去する事ができます。ここに書くと非常に長くなるので開発Wikiのページに一例を。
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%C6%C3%BC%EC%2Frepeat%A1%C1loop%B9%BD%CA%B8%A4%CE%B3%C8%C4%A5
 上記の通り、命令をマクロで修正して新たな引数とマクロを加えてやるだけでも、変数の定義を省略したり変数自体を消去する事ができます。
 しかしながら、マクロレベルで修正してしまうとマクロ展開後のプログラムが恐ろしく読み辛くなってしまいます。どうにかHSP本体の部分で修正できないものでしょうか。



この記事に返信する


たんす

リンク

2011/4/20(Wed) 00:55:00|NO.38564

これじゃダメですか?

#module #defcfunc area_checker array dimen, local breaked, local x, local y, local z, local t breaked = 0 repeat length(dimen) x = cnt repeat length2(dimen) y = cnt repeat length3(dimen) z = cnt repeat length4(dimen) t = cnt if dimen(x,y,z,t) = "ひゃっはー" : breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : break loop if breaked = 1 : return "ひゃっはーは("+x+","+y+","+z+","+t+")座標に存在します" return "ひゃっはーは存在しません" #global #module DC #defcfunc DimChecker array dimen Rep_All=length(dimen)*length2(dimen)*length3(dimen)*length4(dimen) repeat Rep_All x = (cnt/(length2(dimen)*length3(dimen)*length4(dimen)))\length(dimen) y = (cnt/(length3(dimen)*length4(dimen)))\length2(dimen) z = (cnt/(length4(dimen)))\length3(dimen) t = cnt\length4(dimen) ;title ""+x+","+y+","+z+","+t //カウンタチェック用 if dimen(x,y,z,t) = "ひゃっはー" : breaked = 1 : break ;wait 1 //repeat保険 loop if breaked = 1 : return "ひゃっはーは("+x+","+y+","+z+","+t+")座標に存在します" return "ひゃっはーは存在しません" #global randomize sdim dimension, 12, 10, 10, 10, 10 dimension(rnd(10),rnd(10),rnd(10),rnd(10)) = "ひゃっはー" mes area_checker(dimension) mes DimChecker(dimension)



joya

リンク

2011/4/20(Wed) 11:31:44|NO.38571

マクロで十分ならわざわざ新命令にするほどかは疑問。
マクロ展開後のコードの見づらさなどは気にする必要があるとも思えない。
あとカウンタ用変数を指定するなら既存のforで十分な気がする。
その他の機能も使用頻度が多いとは思えない。



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