AX

電霊ログ

私のやってるサイト、電子の言霊の活動ログ

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • [HSP超入門] 繰り返し10

今回は繰り返し命令でのネストを試して見ましょう。
ネストと言うのは if の時にやりましたね。

ネストはこの様に、自分の中に自分と同じ構造の物が入っている状態の事です。
if a=1	{
if b=1 {
mes "ネスト"
}
}
繰り返しのネストでは、これを repeat ~ loop でやるだけです。

repeat は loop との間を繰り返し実行しますが。その時 repeat がネストされている場合は どうなるかを考えて見ましょう。
まず「1つ目の repeat」が実行された時、HSPは「1つ目の repeat」に対応するそこから一番近い loop を探すわけですが、ネストをした場合その前に「2つ目の repeat」が出て来ます。repeat が出て来たと言う事はその分の loop を探す事になります。この「2つ目の repeat」が探すのは、「2つ目の repeat」 に対応したそこから一番近い loop です。
そして「2つ目の repeat」 に対応した loop を抜けたら、そこから一番近い loop が「1つ目の repeat」に対応する loop になります。(このまま3つ目4つ目と repeat が増えていっても同じ事です。)
repeat 10
repeat 100
loop
loop

たとえばこのようなスクリプトなら、最初の「repeat 10」を見つけたらそこから1番近い次の「loop」まで繰り返そうとしますが、その途中で新たな「repeat 100」に遭遇し、そこからまた一番近い次の loop まで繰り返そうとします。


回りくどい説明で余計分からなくならない様に、実例を見て見ましょう。
リピートでネストをすると例えばこんな事が出来る様になります。
これを実行すると、縦と横に規則正しく並んだ青紫色のボックスが表示されます

color 120,50,255

repeat 10
cnt2=cnt

repeat 10
boxf cnt*20,cnt2*20,cnt*20+10,cnt2*20+10
loop
loop


「実行結果」
20070225004658.png


一見複雑に見えるかも知れませんが、順をおって考えていれば今までの応用で出来ている事が分かります。
まずこれをネストしない状態で考えて見ましょう。

color 120,50,255

repeat 10
boxf cnt*20,0,cnt*20+10,10
loop


「実行結果」
20070225004705.png


この例ではボックスを横方向(左から右)にずらしながら表示しています。
ここまでは前にやったのと同じなので分かると思いますが 一応説明すると、repeat 内の cnt の値が変化するのを利用して 四角形の場所を少しずつ変えて表示しています。つまりは、cnt を横方向の移動量のタネに使っていると言う事です。

そしてこれをネストする訳ですが、1つ問題があります。
それはこれを実行する事で「アレ?」と気付くと思います。

repeat 10
repeat 1
mes cnt
loop
loop


そうです、mes で表示している cnt の中身がなぜか 0 のままになってしまっています。
うすうす気付いているかも知れませんが、cnt は今自分がいる repeat の回数がかくのうされているので、常に「repeat 1」の方の cnt が表示されたわけです。
ですので「repeat 10」の cnt を「repeat 1」の中で表示させるには、いったん変数に保存しておいて好きな時に使えるようにします。

repeat 10
a=cnt
repeat 1
mes a
loop
loop



それともう一つ気にしておかなければいけない事があります、たとえばプログラムはネストせずに repeat 100 と書けば100回繰り返しが行われますがこの様に、
repeat 10
repeat 100
loop
loop

ネストした場合は、100回を10回繰り返す事になるため、その結果 合計で 100×10で1000回分繰り返しているのと同じになります。まあこれは当たり前の事ですが慣れるまで気に止めて置いてください。

続いて中の動きを見て見ましょう。
といっても処理が早すぎて一瞬で終わってしまうので、前に覚えた wait 命令を入れてゆっくり確認します。

repeat 4
cnt2=cnt
repeat 10
boxf cnt * 40 , cnt2 * 60 , cnt * 40 + 30 , cnt2 * 60 + 50
wait 10
loop
loop


このサンプルを実行させると、まず横方向に1列の四角形が10個表示されて、それから下方向に四角形約1つ分ずれた所から また横方向に10個表示されて・・・と言う風に4回繰り返して停止している事が分かります。

「1つ目の repeat」の cnt2 は四角形の縦方向(上から下)の移動に使われています。(縦方向に4列表示するための物です。)
そして「2つ目の repeat」の cnt はさっきと同じで横方向の移動に使われています。(横方向に10個連続で表示される部分です。)
boxf の引数の変化が分かるように表にして見ました。(全部で 10*4=40 回分)
00 : boxf 0	, 0 	, 30	, 50
01 : boxf 40 , 0 , 70 , 50
02 : boxf 80 , 0 , 110 , 50
03 : boxf 120 , 0 , 150 , 50
04 : boxf 160 , 0 , 190 , 50
05 : boxf 200 , 0 , 230 , 50
06 : boxf 240 , 0 , 270 , 50
07 : boxf 280 , 0 , 310 , 50
08 : boxf 320 , 0 , 350 , 50
09 : boxf 360 , 0 , 390 , 50
10 : boxf 0 , 60 , 30 , 110
11 : boxf 40 , 60 , 70 , 110
12 : boxf 80 , 60 , 110 , 110
13 : boxf 120 , 60 , 150 , 110
14 : boxf 160 , 60 , 190 , 110
15 : boxf 200 , 60 , 230 , 110
16 : boxf 240 , 60 , 270 , 110
17 : boxf 280 , 60 , 310 , 110
18 : boxf 320 , 60 , 350 , 110
19 : boxf 360 , 60 , 390 , 110
20 : boxf 0 , 120 , 30 , 170
21 : boxf 40 , 120 , 70 , 170
22 : boxf 80 , 120 , 110 , 170
23 : boxf 120 , 120 , 150 , 170
24 : boxf 160 , 120 , 190 , 170
25 : boxf 200 , 120 , 230 , 170
26 : boxf 240 , 120 , 270 , 170
27 : boxf 280 , 120 , 310 , 170
28 : boxf 320 , 120 , 350 , 170
29 : boxf 360 , 120 , 390 , 170
30 : boxf 0 , 180 , 30 , 230
31 : boxf 40 , 180 , 70 , 230
32 : boxf 80 , 180 , 110 , 230
33 : boxf 120 , 180 , 150 , 230
34 : boxf 160 , 180 , 190 , 230
35 : boxf 200 , 180 , 230 , 230
36 : boxf 240 , 180 , 270 , 230
37 : boxf 280 , 180 , 310 , 230
38 : boxf 320 , 180 , 350 , 230
39 : boxf 360 , 180 , 390 , 230

ちなみに足し算より掛け算の優先順位が高いのでたとえば 2+4*6 と言う式があったら 4*6 が先に計算され、最後に 2+24 が実行されるので答えは 26 になります。

ではこれらを知った上でもう一度最初のスクリプトを見て見ましょう。

color 120,50,255

repeat 10
cnt2=cnt

repeat 10
boxf cnt*20,cnt2*20,cnt*20+10,cnt2*20+10
loop
loop


今ならこれが何をしているのかが分かるでしょう、全ては基本の積み重ねなのです。
どんなに高い山も全てはこの道にあると言う事ですね。(カッコイイ~~~!!バキ/☆д★)
スポンサーサイト
  • [HSP超入門] 繰り返し9

「予備知識その2」
前回予備知識としてスクリプトやらソースコードらやの単語を紹介しましたが、今回もそれに関連する言葉を紹介したいと思います。(書き忘れただけ)
コードというのはプログラム文の言い方の1つでしたが、そこからプログラムを書く事を「コーディング」と言います。

前回、continue で無限ループにになっちゃうよ と紹介した時に if を使っていましたが、ifが無くても同じ状態になります。理由は前回書いた事と同じなので簡単ですね。

repeat 10
wait 32
mes cnt
continue 5
loop


これはループの回数に関係なくシステム変数の cntが、永遠にリピート回数の10になれず ずーと5になり続けるので無限ループになります。

repeat 10
wait 32
mes cnt
continue cnt
loop


これは cnt を現在のループ回数に変更してしまっています。最初のループでは cnt の中身は0です、cnt をその中身に変更してrepeat の先頭に戻るので、永遠に cnt が0のままになり cnt はリピート回数にはなれません。

repeat 10
wait 32
mes cnt
if cnt=5 :continue cnt
loop


このように if を入れた場合もさっきと同じで continue を実行した時のリピート回数が cnt にセットされるので、この場合 cnt はずっと5でなので、ループが終わりません。

continue cnt+1
とすると、パラメータを省略した時(contine だけの時)と同じ動きになります。

今回はここまで。
次回はリピートのネスト。
  • [HSP超入門] 繰り返し8

今まで結構やってたのにプログラム系の文章を理解するのに大事な事を教えるの忘れていました、
HSPなどのインタープリタ言語で書かれたプログラム文の事を「スクリプト」と言います。
そしてそれを保存したものを「スクリプトファイル」と言います。
HSP3の場合 ファイル名.hsp という拡張子のファイルの事です。

拡張子とはファイルの種類をあらわすファイル名の最後についている .hsp などの文字の事で、ウィンドウズの初期状態では表示されていないかも知れませんが、これはウィンドウズの設定によって表示させる事が出来ます。ないと色々不便なので ぜひ表示させておきましょう。

ちょうどいい機会なのでついでにもう一つ。
HSPに限らずもっと一般的なプログラミング言語ではプログラムの書かれた文章の事をソースコードと言い、単に ソース や コード などと呼ぶ事もあります。そういう理由でHSPで書かれたスクリプトの事もその様に呼ばれる事があるため覚えて置きましょう。

少し前に continue 命令を使ったのを覚えてますか?
continue 命令は repeat などの繰り返し命令の中で、実行ぎょうを先頭に戻す命令でしたね。
その時にはこの様に、
「continue サンプル1」

repeat 10
if (cnt>=2) & (cnt<=5) :continue
mes cnt
loop


パラメーターを何を付けずに使用していましが、実は contimue 命令にもパラメーターを指定する事が出来ます。

(この上のプラグラムでは、パラメーターを付けずに使うと、システム変数の cnt が1ずつ増えてくれるので それを利用して、0から1つずつ順番に if で見て行き 特定の回になったら continue で飛ばして つぎへ行くという作業をしています)

continue にパラメーターを付けて実行すると、実行ぎょうを先頭に戻し、さらにシステム変数 cnt の内容を変更する事が出来ます。
たとえば、continue 3 とすると、cnt の内容は 3 になります。
「continue サンプル2」

repeat 10
if cnt=2 :continue 6
mes cnt
loop


このプログラムは最初のプログラムと結果は同じですが、やり方が少し違います。
最初のプログラムでは10回のループ全てをみはって1つずつ処理を飛ばしていましたが、2つ目のプログラムでは cnt が 2 になった時点で continue 6 によって実行ぎょうが移動し cnt が 6 に変わっているので、10回のループのうち 2,3,4,5 回目は実行すらされていません。


とここで、ふと思った方も居るかも知れませんが、どうして最初に continue をやった時 一緒に説明しなかったのかと言うと、それは無限ループを説明していなかったからです。
一見 無限ループとは関係なさそうに見えますが、continue のパラメーターに指定する値によっては なんと無限ループになってしまうのです。
「無限ループになるスクリプト」

repeat 10
wait 10
if cnt=5 :continue 2
mes cnt
loop


とりあえずこれを実行してみて下さい。無限ループになりますが、反応しなくならないように wait を入れています。
すると 0,1,2,3,4,2,3,4,2,3,4 ... と4を超えられずに2~4を繰り返しているのが分かります。なぜこれで無限ループになってしまうのかというと、それは凄く簡単な事です、
この repeat 命令は、何回繰り返したかと言うより cnt が指定した回数にいたったかどうかでループを抜けているので、continue で現在の cnt より少ない数を指定してしまうと常に cnt が戻されてしまい、永遠に指定回数と一致しなくなるため無限ループにおちいってしまうのです。
ですので continue に引数を指定する時は現在の cnt より多く指定するか、if を使って別の条件でループを抜ける様にしなければいけません。

今回はあらかじめ無限ループになる事が分かっているので wait を入れて回避できていますが、普段のプログラミングでは無限ループを作るつもりなんて普通はありません。そのために知らずに wait を入れずに無限ループ作ってしまい固まる事があるので、回避のしようがありません。もうこれは気を付けるしかないです。
私も未だに無限ループよく作るもん(笑・・・えない)
  • [HSP超入門] 繰り返し7

今まで繰り返しをする時は必ず
repeat 10
の様にループ回数を指定していました、
それはコンピューター君に何回繰り返したらいいかを教えるためです。

では
repeat
のように回数を指定しない時は どうなるでしょうか?
実は、回数を指定しないと repeat から loop の間を「永遠」に繰り返し続けるのです。怖いですね~。
(一般的に 意図せずに永遠に回り続ける繰り返しの事を 無限ループと言います。)

それではさっそく 回数指定の無いループ を作って見たい所ですが、HSPではこれをする際に1つ 注意しておかなければいけない事があります。
それは必ず wait 命令で、待ち時間を入れる事です。
wait は指定した時間だけプログラムを止める命令ですが、永遠に止まらないループの場合は必ずこれを入れなければいけません。
でもなんでそんな面倒くさい事をわざわざしなければいけないのか疑問に思うはずです。

HSPプログラムを書いて実行すれば、勝手にタイトルバーやウィンドウを閉じる×ボタンなどが表示され、タイトルバーをドラッグすればウィンドウの移動が、×ボタンを押せばプログラムの終了が行われます。しかもこれまた勝手に。
これはHSPがウィンドウズの機能を使って自動でやってくれている事です。

それでもいくら自動でやってくれているとは言え いつかどこかでその作業をしている事は間違いありません、そして wait を入れる理由を説明をするのに大切なのはその「いつか」の所です。
いつその作業をしているのかと言うと、それはHSPプログラムが実行されていない時なのです。

今まで作ってきたプログラムはどれも、すぐにプログラムが終わるものばかりで それを意識する必要もありませんでしたが、回数指定の無いループでは 永遠にプログラムを実行し続けるので、ウィンドウズの機能が働くすきが無くなってしまいます。
そうなるとドラッグによる移動はもちろん、実行しているHSPのプログラムにくっ付いている、ウィンドウズの機能全てが機能しなくなり、プログラムを終了する事すら出来なくなります。(強制終了は出来ます)

そんな恐ろしい思いをしないために ループ中にワザとプログラムを待機させる命令を入れ、ウィンドウズに仕事をさせる時間を与えてあげる事で無限ループになるのを回避させてあげます。

そのためには まず、
wait 命令
を覚えましょう。

wait 命令は指定した時間だけ プログラムを停止させる命令です、stop 命令に制限時間が付いた様な物だと考えると分かりやすいでしょう。

使い方は、
wait 100
の様に100分の1秒で待ち時間を指定します。
100分の一秒は 1秒を100個に分けた内の1つなので、上の様に100を指定する事で1秒待ちます。
「wait の例」

mes "ここは・・・"
wait 150
mes "いったい・・・・"
wait 240
mes "わたしは・・・"
wait 320
mes "だれ・・・・"



おまたせしました、それではお待ちかねの止まらないループを作ってみましょう。
これはプログラムを終了させるまで(×を押すまで)命令を実行し続けます
「終わらないループの例1」

repeat

mes "ループ中・・・"

wait 100

loop



ループから抜け出さない以外は今までと変わらないので、大した感動は無いかも知れません。高速にプログラムを実行させたい時は、wait の数値を少なくして見て下さい。遅くしたい時は逆に大きく。

しかしどれだけ気を付けてプログラミングしていても、気付かずにうっかり無限ループを作ってしまう事があります。もしそうなってしまったら、強制終了しかありません。
ここではXPで プログラムの強制終了をするやり方を簡単に説明したいと思います。そのためにはまず、「タスク マネージャー」を呼び出しますが やり方は2通りあります。

・1つ目のやり方。
  マウスで タスクバー(画面一番下のスタートボタンがあるバー全体の事)のボタンも何も無い所を右クリックして、「タスク マネージャー」をクリック。

・2つ目のやり方。
  キーボードの Ctrl と Alt を押しながら Delete キーを押す。

タスクマネージャーを開いたら、その中から「アプリケーション」タブをクリックしてください。
すると現在実行中のウィンドウを持つプログラム一覧が表示されます、その中から強制終了したい項目を選んで「タスクの終了」ボタンを押せば、これで固まったプログラムを終了させられます。

20070117121528.png

実はXPの場合 無限ループで固まったプログラムでも しばらく放って置けば×ボタンが押せるようになり、そこから終了する事が出来ます。そのほか固まっていないプログラムならキーボードの Alt + F4 キーでアクティブなウィンドウのプログラムを終了する事も出来ます。

しかしこれらの方法では、ウィンドウを持たないプログラムの強制終了は出来ませんね。でも安心して下さい、ちゃんとタスクマネージャーからなら終了させる事が出来ます。

タスクマネージャーから「プロセス」タブをクリックしてください。
そうすると現在実行中の全てのプログラムが表示されますので、終了したい項目を選択して「プロセスの終了」ボタンを押します。

20070117121533.png
ですがこれには注意して下さい。間違えて他の大事なプログラムを終了してしまうと、パソコンが不安定になったりフリーズしてしまう事もあるので、自分が分かっているプログラム以外はむやみに終了しないで下さい。

それでは最後に 実際にワザと無限ループを作って強制終了してみましょう。
(その前に作業中のデータがある場合は ねんのために保存して置きましょう、あとウィンドウズXP以外では少しやり方も見た目も違うので注意が必要です。特に Ctrl + Alt + Delete キーの同時押しを2回続けて押すとパソコンが再起動してしまうので特に注意して下さい。詳しく知りたい方は検索してみましょう。)

次の無限ループするプログラムを入力し、実行した後、タスクマネージャーから終了してみましょう。

repeat


loop



どうでしたか?ちゃんと終了させられましたか?
今回はちょっと長かったですね、
書いてる私も途中から訳が分からなくなって来ましたよ・・・。
ぐるぐるループを覚えると出来る事が増えてきます、
これからが楽しい時期ですよ。頑張って下さいね。
次回は、えっと・・・まだ繰り返しどぇす。
  • [HSP超入門] 繰り返し6

今回も繰り返しに関する新しい命令を覚えましょう。

それは、
continue 命令
です。(コンティニューと読む)

break 命令と同じで 繰り返し命令の中で使います。
それ以外では使用できないので注意しましょう。

この continue は loop に似た動きをする命令で 実行ぎょうを先頭に戻したい時に使います。
「continue 使用例1」

repeat 10

if cnt=5 :continue
mes cnt

loop


例えばこの様に cnt が 5 になった時に continue をすれば、
continue 以降は実行されずに repeat の先頭に戻ります。その時 cnt も1つ増えます
まさに loop と同じ動作ですね。
「continue 使用例2」

repeat 10

if cnt < 5 :continue
mes cnt

loop

しかしそれなら loop 命令を使えば良いんじゃないの? と思うかもしれませんが、
repeat と loop は、必ず1対1で存在しなければならない(エラーになる)ので
loop で代用する事は出来ません。
「エラーになる例1」

repeat 10

if cnt=5 :loop
mes cnt

loop


同じように loop を continue で代用する事も出来ません。
「エラーになる例2」

repeat 10

if cnt=5 :continue
mes cnt

continue



短いですが今回はここまで。
次回は、繰り返し応用。

  • ニューイヤー

あけまして。
暫く更新サボっていましたがこれからまたぼちぼちやって行きたいと思います。誰も見てないけど・・・・
今年もよろしくお願いします。ニョロロ~ン
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。