投稿
たまご tamagopu
Mk2の初心者講座とかggったりとかしたけど、やっぱりサブルーチンやGOSUBっていまいちピンと来ない。最初はdef文とか構造体とかCのvoid型あたりに近いものかとも思ったけど戻り値ないしなあとかもやもやしてます。結局のところこの子達って何が美味しいの?使うときの注意点とかも教えてもらえると有り難いです。
8そうだね
プレイ済み
返信[1]
親投稿
つばさ tu2001
説明書は読んどいた方が良いよ 使えないのとか書いてあるし
1そうだね
プレイ済み
返信[2]
親投稿
TINY TINY-YAROU
基本的には、「void型で引数を与えられない関数」だと思ってもらえれば良いと思います。 main() { init(); while(1) { proc(); draw(); sync(); } } みたいな。 プログラムがスッキリするとか、何度も呼ぶときに便利とか、メリットは色々ありますね(^_^)
3そうだね
プレイ済み
返信[3]
親投稿
TINY TINY-YAROU
ちなみに、前の例をプチコン風に書き換えると、 @MAIN GOSUB @INIT WHILE(1) GOSUB @PROC GOSUB @DRAW GOSUB @SYNC WEND みたいな感じになります。
2そうだね
プレイ済み
返信[4]
親投稿
りゅう uramino
Cがよくわかってないのであれですが、自分の場合、何度も使うルーチンを読み出すために使ってます。 画像のやつでは、「会話を表示+入力待ち」をひとつのかたまりにまとめ、 メインプログラムで必要となるたびに3行ほど使って読み出してます。
1そうだね
プレイ済み
返信[5]
親投稿
TURNER TURNER-puni
C言語に慣れてるなら プチコン3号で実装された DEF ~ END で関数や処理を定義するのがおすすめですよ ローカル変数も使えるし 関数なら戻り値も使えますし
1そうだね
プレイ済み
返信[6]
親投稿
TINY TINY-YAROU
注意点としては、Cなどと違って、プチコンの変数は基本的に全てグローバルなので、呼び出す側で使っている変数と同じ名前の変数をサブルーチン内でも使ったりすると、何のエラーも出ずにバグを生むことになります。 -------- FOR I=1 TO 100 GOSUB @SUB PRINT I NEXT END @SUB FOR I=0 TO 1 NEXT RETURN -------- こんなのとか。
3そうだね
プレイ済み
返信[7]
親投稿
けんさん amazake
何度も使う命令をまとめてラベルをあて GOSUBとRETURNで行き来できる。 …と、BASICの本には書かれています。 モジュールみたいな感じでしょうか(?)
0そうだね
プレイ済み
返信[8]
親投稿
GOSUBは、classはおろかユーザ定義関数すらない昔のBASICの名残といったところ。 内容的にはGOTOの親戚といったところで、GOTOと違ってサブルーチン内の処理が終了したら呼出元に戻れるのがGOTOと比較してのメリットでしたが。 プチコン3号ではユーザ定義関数がGOSUBの上位互換の機能として存在するので、あまり使う旨みもない気がします。 プチコン3号ではCALLよりGOSUBの方が処理が速いようなので、少しでも処理速度を稼ぎたい時は使うことになるのかも。
2そうだね
プレイ済み
返信[9]
親投稿
もやしもどき Pseudomoyashi
私もプチコンは初めてでBASIC自体も昔授業で少し触れたことがあるという程度ですが、基本的に同じ処理を何度も使い回すことが出来るとかプログラムの見通しを良くするとか、関数やメソッドと同じ感覚でいいんじゃないかと思っています。 引数や戻り値が無いことについては、変数のスコープの区分が基本的に無くどこからでも変数にアクセスできてしまうので 引数用の変数に値を入れておく・戻り値用の変数を定義しておく  ↓ サブルーチン内から引数用の変数を読んで処理・戻り値用の変数に値を入れる  ↓ サブルーチン終了後、戻り値用の変数を読み取る という感じでやれば関数っぽく使えるのかなといった印象です。
2そうだね
プレイ済み
返信[10]
親投稿
のざらし longyearsago
自分は C++ からやって来ましたが、 DEF だけでほぼ全て置き換えられるので グローバル変数の定義以外では基本 GOTO, GOSUB を使わないようにしています。 (スパゲッティ化が怖いので・・・) 機能として用意されているだけで、 全て使わないといけないわけではないはず! 自分のルールを構築してしまいましょう。
3そうだね
プレイ済み
返信[11]
親投稿
よっぱらい yopparai1965
Mk2では関数定義できなかったので、サブルーチンはgosubしかなかったはず。 Cの関数ほど独立性が保持できないため、Cになれた人には使いづらい... それがMk2を挫折した理由のひとつでもあります。
1そうだね
プレイ済み
返信[12]
親投稿
ASA fusuian
DEFで命令や関数をユーザー定義できるようになったので、今やGOSUBにはあまりいいところがありません。mkIIをはじめとした、DEFのないBASICからの移植の時に使うくらいですかねー。 3号で初めてプログラムをするなら、覚えなくていいかも?
1そうだね
プレイ済み
返信[13]
親投稿
たまご tamagopu
>つばささん ありがとうございます。3号とmk2で結構仕様が変わってるのですかね。3号から始めたので特に気にしてなかったのですが確かに初心者講座読むときは気にしたほうがいいですね TINYさん cのコードとの比較すごくありがたかったです!ありがとうございますっ。ちょっとサブルーチンのイメージがクリアになりました。全部グローバル変数は怖いですね(/´△`\)単なる数え上げでもちゃんと名前考えないといけなくなるのか…
0そうだね
プレイ済み
返信[14]
親投稿
たまご tamagopu
りゅうさん いえいえ、実例があると分かりやすいです、ありがとうございます。何度も書かずにすむのはいいですね。3DSで書くならなおのことw TURNERさん ありがとうございますっ。DEFって三号からなのですね。確かにこっちのほうが慣れてる感覚で使えそうです。 けんさん ありがとうございます。モジュールも近いのかなとは思ったけれどなんとなく慣れなくて不思議な感じですね(/´△`\) もやしもどきさん 詳しい使い方の流れを教えてくださってありがとうございますっ 引数用や戻り値用の変数を作っちゃうって発想いいですね!それならすこし安心して使えそうな気もします。
1そうだね
プレイ済み
返信[15]
親投稿
たまご tamagopu
コアさん ありがとうございます。 ユーザー定義関数って昔なかったのですか(((( ;゚д゚))) 特にうま味がないならバグの原因になりそうだから避けたい気もするけど、速度と言われてしまうと捨てがたい感じもしてしまいますね(笑) のざらしさん GOTO,GOSUBはちょっと怖いですよねー(´・ω・`;) いうほど詳しいわけでもないけど元々避けた方がいいものとして覚えていただけに(笑)折角basicに触れるならちょこっもbasicらしい書き方にチャレンジャーするのもありかなーなんちゃって← でも長いのを書くときは慣れてるのを使うのが一番かもしれませんね。 よっぱらいさん ありがとうございます。他の方のコードみてるとGOSUB使っている方が多かったのでこっちがいいのかなと思ったけどmk2にそれ以外なかったからなのかな(゜_゜)
0そうだね
プレイ済み
返信[16]
親投稿
たまご tamagopu
ASAさん ありがとうございますっ うーん、やっぱりDEFがあったらこっち使うべきですかね。 折角basicに触れる機会を得たからサブルーチンをあっさりすてるのも勿体ない気もするしすこしだけ練習してから決めようかな(笑)やめるとしたら何でサブルーチンやGOTOがなくなったのかがっつり体感してからでも遅くない……ハズ←
0そうだね
プレイ済み
返信[17]
親投稿
ぷちこ lomeys
ぷちこなんかだとBASICから入ってるので逆にCのグローバル、ローカル、引数、帰り値なんかがすごくややこしく感じましたにゅw Cから入ってる人は逆にその方が簡単という話を聞いてなるほど今の人はそういう人が多いんだろうなと驚いていますにゅw
1そうだね
プレイ済み
返信[18]
親投稿
たまご tamagopu
ぷちこさん うーん、そういう考え方に慣れちゃうんですかね。 いいともいえるし、考え方が偏っちゃうから悪い面もありますよ。たぶん。 あとべーしっくから入った方やゲーム作る方と今まであまり接点がなかったので色んな考え方があってすごく楽しいです(*´ω`*) 最近だとC(←学校とか)やJAVA(←アプリ作りたい人とか)たまーにpythonから入るのが定番みたいになってるけど前ふたつははじめての人には難しいですよねえ(´・ω・)じゃばはやったことないけども。。
0そうだね
プレイ済み
返信[19]
親投稿
ASA fusuian
GOSUBの悪夢はですね、 FOR I=0 TO 20 GOSUB @SUB NEXT ?I END @SUB FOR I=0 TO 30 ?"SUB: I=";I NEXT RETURN なんてコードを実行すると軽く体験できると思います(^^
0そうだね
プレイ済み
返信[20]
親投稿
たまご tamagopu
ASAさん 短くてわかりやすい例ありがとうございます!助かります! 早速打ち込みました! ……んんん!?wwww なんか思ってたのと違うのが出ましたw 一回やったらループしないし最後に+2されて出てくるIも?だし、 最初を違う変数名にしても、1から始めても最後は+1されて出てきますね。 …すごく楽しいですね!!!ありがとうございます!!! 同じ変数で別のループまわすと数え上げする変数が続きからになっちゃってるのかな。 最後の+1になったり+2されるの分からない…(;ω; ループで回数表示させてもちゃんと代入してるしNEXTの後に+1されているのはなぜ??
0そうだね
プレイ済み
返信[21]
親投稿
ASA fusuian
逆に、メインルーチン側のTOのあとを40とかにすると終了しなくなりますww @SUBの方でIを書き換えちゃうから絶対思った通りにいかないという。
0そうだね
プレイ済み
返信[22]
親投稿
たまご tamagopu
にゃははwこれは愉快ですねw 知らずにやらかしたら「!?」ってなるかもだけど←ぉぃ んーメイン側で変えたのですが…。GOSUBコメントアウトしてもなるからFORの仕様?なのかな。こういうものだっけかな(こんらんちう 多分最初同じ変数名で+2されちゃうのはNEXTを二回またぐからなのかな。…ってぐりぐりしてたらだんだんごちゃごちゃしてきた…一回落ち着こうorz
0そうだね
プレイ済み