投稿
”関数”とはどのようなものなのでしょうか? 初歩的な質問で申し訳ないのですが、どのようなものか今一つ分からないのです>< DEF文を使い、サブルーチンよりも便利~等は良く聞くのですが、どのように使い、どういう場面で便利と感じるのか、どうしてそこまで便利と言われるのかという事をお聞きしたいです。 分かりづらい文章ですが、親切な方は教えていただけないでしょうか
8そうだね
プレイ済み
返信[1]
親投稿
おかっぺ Japanese_WASABI
マシュマロさんの作品、ニャン吉の冒険はGOSUBで作られているので、以下のような経験がありませんか? FORループの中からGOSUBした先で、FORループしたら同じ変数を使っていたので、動きが変になっちゃった! あるいは、変数が増えすぎて、変数の意味していた内容を忘れちゃった。 とか。
0そうだね
プレイ済み
返信[2]
親投稿
おかっぺ Japanese_WASABI
ユーザ関数、ユーザ命令を知るには、GOSUBを理解していると、便利さがわかるので、もし、この投稿を見た人で、DEFに興味があるけど、GOSUB もわからない、と言う場合は、GOSUB を勉強してみてね。 それでも、とっても便利で感動するから。
0そうだね
プレイ済み
返信[3]
親投稿
おかっぺ Japanese_WASABI
本題、DEFで定義出来るものを、プチコンでは、ユーザ命令、ユーザ関数と呼びます。 ユーザ命令はGOSUB の様に処理が飛んで行って、終わったら帰ってくるもので、最初はこちらがわかりやすいと思います。
0そうだね
プレイ済み
返信[4]
親投稿
おかっぺ Japanese_WASABI
GOSUB との違いは、DEFの中で作った変数はDEFの中でしか見られないと言うことです。 DEF ORDER VAR I=5 END I=3 PRINT I ORDER PRINT I まずは、上記を実行してみて下さい。
0そうだね
プレイ済み
返信[5]
親投稿
おかっぺ Japanese_WASABI
DEF~ENDが、GOSUBで言うところのラベル~RETURNに相当し、呼び出しはDEFで定義した名前、ORDER と書くことで行います。
0そうだね
プレイ済み
返信[6]
親投稿
おかっぺ Japanese_WASABI
上記をGOSUB でやると、以下のようになりますね。 GOTO @MAIN @LABEL VAR I=5 PRINT I RETURN @MAIN I=3 PRINT I GOSUB @LABEL PRINT I
0そうだね
プレイ済み
返信[7]
親投稿
おかっぺ Japanese_WASABI
DEF とGOSUB で結果が違うのがわかりますでしょうか? DEFの中で作られた変数は、DEFの外の世界の変数とは同じ名前でも別物になると言うことです。 ※プチコンでは、DEFより上で変数を作ると、その変数はDEFから参照書き換え可能。DEFより下で変数を作ると、その変数はDEFから参照書き換え不可。
0そうだね
プレイ済み
返信[8]
親投稿
おかっぺ Japanese_WASABI
1つ前のコメントは難しいですが、最初に書いたDEFを使ったプログラムのDEF~ENDを今度は、プログラムの最後に移動させて、動かしてみて下さい。 また、値が変わりましたよね? ちょっと混乱しやすいところなので、 慣れるまでは、以下のルールを守っておけば、扱いやすいと思います。
0そうだね
プレイ済み
返信[9]
親投稿
おかっぺ Japanese_WASABI
主人公の座標など、ずっと覚えておきたいものは、DEFの前に作っておく。 ただし、FOR文のインデックスなど、使い捨てにしたい変数は、必ずDEFの後に書く。 こうすることで、冒頭に書いたGOSUB の不便な点を回避することが出来ます。 (使い捨ての変数は、DEFに影響しないのでFOR文に同じインデックスを使えるし、使い捨てなので、変数の意味をずっと覚えておく必要も無くなる)
0そうだね
プレイ済み
返信[10]
親投稿
おかっぺ Japanese_WASABI
実際に使ってみると、使い捨ての変数をDEFに渡したい場合や、DEFの中で作った使い捨ての変数を返して欲しい場合があるので、その時は人のプログラムか説明書を見てみてね。 (それでも、わからなければ、またきいて下さい。)
0そうだね
プレイ済み
返信[11]
親投稿
おかっぺ Japanese_WASABI
ユーザ関数は、考え方はユーザ命令と同じですが値が1つだけ帰ってきます。 DEF TASIZAN(L,R) RETURN L+R END PRINT TASIZAN(5,3) を試してみて下さい。
0そうだね
プレイ済み
返信[12]
親投稿
おかっぺ Japanese_WASABI
また、楽しいゲーム待ってますね♪ 3つ前のコメントに一ヶ所、訂正があります。使い捨ての変数はDEFの後か、DEFの中で初めて使う様にしてください。が、正しいです。
0そうだね
プレイ済み
返信[13]
親投稿
おかっぺ Japanese_WASABI
長々書いてしまいましたが、あまり、説明がうまい方でも無いので、もしわからなければ、その旨、書いちゃってください。 きっと、誰かが代わりに説明してくれるはず♪
0そうだね
プレイ済み
返信[14]
親投稿
おかっぺ Japanese_WASABI
ごめんなさい! 4つ目のコメントのDEFは、以下にしてください。 DEF ORDER VAR I=5 PRINT I END PRINT命令が抜けていました・・やっちまったー
0そうだね
プレイ済み
返信[15]
親投稿
説明ありがとうございます! 現在、煙を吐きながら解読中です(;‐ω‐) もし分からないことが出てこればまた、お願いします
0そうだね
プレイ済み
返信[16]
親投稿
あ、やはりそうでしたかw 結果が変わらないので、”?”ってなってました(;'∀') ユーザー命令についてはなんとなく理解できましたo(*'∀'*)o 同じ変数を使えるのは確かに便利ですね~
0そうだね
プレイ済み
返信[17]
親投稿
ふむふむ…大体のことは理解できました! 説明感謝です<(_ _)> しかし、関数の使いどころがなかなか難しいですね>< 簡単な、関数を用いた実用的なプログラムってご用意できますか? 先ほどから我が儘ばかりすみません
0そうだね
プレイ済み
返信[18]
親投稿
おかっぺ Japanese_WASABI
DEF BETWEEN(V,MIN,MAX) IF V<MIN THEN RETURN MIN IF MAX<V THEN RETURN MAX RETURN V END 多分、これで範囲内の値しか帰って来ないから、境界チェックで便利だと思います。
0そうだね
プレイ済み
返信[19]
親投稿
おかっぺ Japanese_WASABI
例えば主人公のスプライトが画面外に出られない様に、X=BETWEEN(X,0,400-16)みたいにすればスプライトは画面外に出られなくなりますよ♪
0そうだね
プレイ済み
返信[20]
親投稿
返信遅れましたすみません なるほど。。確かにこれなら画面外判定が出来ますね♪ しかし、理解力が足りないせいでいまいち便利さが分からないです;ω; 別にユーザー定義命令or関数は、使わなくても良いのではないかと思ってしまいます><
0そうだね
プレイ済み
返信[21]
親投稿
おかっぺ Japanese_WASABI
不思議に思うのも仕方ないかもしれません。 実はプログラムの世界では、不便にすることでバグが減る事があり、DEFもその一種の様な性質があります。 例えば、OPTION STRICT。不便になるだけに感じますがバグを未然に防いでくれます。 ユーザ命令、関数も同じ様に意図せず変数を壊してしまうのを防いだり、見た目がキレイになる、くらいのものです。でも、プログラムが大きくなるほど大事さがわかってきますよ。 昔のBASICには無かったし、使わないなら使わないでも良いと思います。
0そうだね
プレイ済み
返信[22]
親投稿
ASA fusuian
今はわからなくてもOKです。 でも、ある程度大きなプログラムを書いて、なんだかデバッグが大変だと思ったときに、このトピックを読み返すとピンと来るかも知れませんよ。
0そうだね
プレイ済み
返信[23]
親投稿
なるほど。。やはりプログラムは奥が深いですね(;'Д')ゴクリ 今回のことを頭の片隅に置いて今後のプログラム作りに活用していこうと思います。 ここまで付き合っていただきありがとうございました!
0そうだね
プレイ済み
返信[24]
親投稿
関数はまだともかく、ユーザー定義命令はGOSUBから置き換えられるしGOSUBより便利なので代わりに使っていくのがいいと思いますよー
0そうだね
プレイ済み
返信[25]
親投稿
おかっぺ Japanese_WASABI
ごめんなさい、今、ふと気付いたのですが、変数の名前を変えられる、と言うのがDEFの1番便利なところかもしれません。 通常、主人公と敵の変数は、別の名前になっていると思いますが、DEFを使うと(先程のユーザ関数の例の様に)DEFの前後で別の名前で扱うことが出来ますね。 GOSUBでこれをやろうとすると、呼び元で一旦、編集様変数に主人公や敵の座標をコピーして、たGOSUBして、戻ってきたら編集様変数から主人公や敵の座標にコピーして、とたくさん書かなきゃいけないから、変数名の変更が簡単に出来るのも、1つの特徴かなあと思います。
0そうだね
プレイ済み
返信[26]
親投稿
おかっぺ Japanese_WASABI
あとは、DEFを上手に設計しておくと、内部ロジックの変更が外部に影響しない、と言うのもあると思うけど、ちょっと説明が難しいなぁ。 親投稿に共感した方々って、この投稿に気付かないよなぁ。最初の回答に不足があったので、申し訳ないッス。
0そうだね
プレイ済み
返信[27]
親投稿
なるほど。。確かに同じ変数を何度も使えるというのは便利な点ですね。他の場所で使ってないか調べる必要がないというのは手間が省けて便利ですね^^/
0そうだね
プレイ済み