コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
初心者 ◆ULvuffpmw1rp
2018/12/27 16:03
情報交換
@ 〜RETURN の存在意義
DEF〜ENDを使っていると利点がわからなくなりました。教えて下さい。

コメント

アバター
Soybeanman 2018/12/27 16:44 ◆SDLkyXUP6WqK
>>ブルーさん
CALLを使えばDEFでもできますね。
GO$="Stage_"+STR$(Stage)
CALL GO$
GOSUBとかのことについてはおちゃめさんとかが一番詳しいと思うのでそっちに任せます。
アバター
初心者 2018/12/27 16:51 ◆ULvuffpmw1rp
はぁ?
そんなのGOSUBだってそのぶん
@〜RETURN追加するじゃない!
もういいわ…
他の存在意義をよこしなさい。(デレ要素0 )
アバター
ブルー 2018/12/27 17:00 ◆F30iKws/Dqrq
変数を使うときに
DEF 〜 END      → 引数や戻り値が必要な分だけ宣言が必要
GOSUB 〜 RETURN → 必要無し
アバター
ブルー 2018/12/27 17:06 ◆F30iKws/Dqrq
そもそもボクってそんなにDEFを使わないっていう。
アバター
Soybeanman 2018/12/27 17:06 ◆SDLkyXUP6WqK
>>ブルーさん
それはDEFの方が上位互換だということを裏付けてしまっているのですがそれは…
強いて言うならば、GOSUBの方がプログラム本体を検索しやすいってことですかね。
CHR$(13)+"@"をファンクションキーに入れておくことで、プログラム本体を検索出来ます。
アバター
Soybeanman 2018/12/27 17:09 ◆SDLkyXUP6WqK
あ、ごめんDEFも検索簡単だったわ。
"DEF 命令名"でいつでも検索できる。
結論:EXEC最強!!!!!!!
アバター
こういち 2018/12/27 17:12 ◆ou0jbJnEJ0Kb
・速度が速い
・stack overflowになりにくい
以外の利点は無さそう。
アバター
初心者 2018/12/27 17:19 ◆ULvuffpmw1rp
うーん、ないのかな?
アバター
Soybeanman 2018/12/27 17:28 ◆SDLkyXUP6WqK
@ラベルはDATAでよく使うので一個減ってしまうのは痛い。
このままGOSUBの負けで終わってしまうのか…!?
アバター
あまさとしおん 2018/12/27 17:40 ◆mzDKTVUAtwqE
結局のところ互換じゃないの
他のBASICに存在するからってだけ
アバター
ブルー 2018/12/27 17:57 ◆F30iKws/Dqrq
そうなのかなぁ...
アバター
ブルー 2018/12/27 17:59 ◆F30iKws/Dqrq
アバター
こういち 2018/12/27 21:02 ◆ou0jbJnEJ0Kb
正直に言うと@〜RETURNはGoToでも飛べるのが痛い。
アバター
うょリウム(元 SPDX) 2018/12/28 10:25 ◆UTOEg1c1vr.B
@A
GOSUB ”@”+STR$(A)
IF A==0 THEN A=1:GOSUB @A
IF A==1 THEN A=2:RETURN
END
こんな芸当ができるのは
GOSUBだけですよ。(無意味)

あと、OPSION STRICTを
するかしないかでDEFの性質が
変わるのでSTRICTしない方では
変数がローカルにならないGOSUBの
方が勝手がいいかもしれませんね。
アバター
たんじぇ 2018/12/28 12:31 ◆WDmFkVwZ4yMl
DEFのような関数は「引数に渡した値を関数内で計算や処理して戻り値として返す」という目的なので、本来は何か値を渡して計算するだけの処理であって、グローバル変数を更新したりするのはおすすめできません。
とはいえ SmileBASICはほとんどがグローバル変数でしか値を覚えられないので、DEFからグローバル変数を更新する処理が必要になってきます。

GOSUBではグローバル変数を更新して、DEFではDEFが更新する目的のグローバル変数しか更新しない、というような作り方をすると本当は良いんですが、プログラムは動けば正義なので、プログラムを書く人次第というところです。


他のプログラムでも使えそうな処理ならDEF、このプログラム専用ならGOSUBという分け方をするのもアリです。
(他のプログラムでも使えるということは引数を受け取って処理して、自分で定義したグローバル変数を参照したり更新していないということだけど、そのDEF専用のグローバル変数もあわせてDEFの動作ということもあります)
アバター
おちゃめ 2018/12/28 13:45 ◆jH1opV6FnGyx
GOSUB〜RETURNは昔からBASICで使われてきた命令ということもあるためプチコン3号に搭載されているのだと思います。
RETURNで元の場所に戻るだけの命令なので最初に覚えることが少なくグローバル変数だけを使用するため小規模なプログラムを作っている初心者には理解しやすい命令だと思います。
この「シンプルな仕組み」こそがGOSUBの最大のメリットだと思います。

とはいえ、私は「プチコン3号自作関数完全マニュアル」という本を作るくらいDEF〜ENDによる自作関数の方が好きなのですが、どういう面が良くてどういう面がダメであり、そのダメなところはこうすれば良くなるというのを説明するのに原稿用紙数100枚分の解説を行っています。
http://petitverse.hosiken.jp/community/petitcom/topic/?read=897

その本で解説しているのですが、プチコン3号のDEF〜ENDは初心者泣かせ(経験者でもハマってしまう)仕様がたくさんあります。
そういう面からすると「グローバル変数しか使えないため発生する問題」を除けばGOSUB〜RETURNの方がハマってしまうリスクは減らせると思います。(それにこういちさんも書いているように高速だし)
ハマってしまうリスクなんてDEF〜ENDの仕様を完全に理解すれば防げる問題なのですが、GOSUB〜RETURNを使うことでDEF〜ENDをより活用できる場面もあります。

例えばDEF〜ENDの中から「他のスロットのプログラムで配列変数を宣言して値を書き込みたい」という場合にはGOSUB〜RETURNを有効活用できます。
これはEXECで代用が効く場合もありますが、「他の変数を初期化せずに配列変数を宣言したい」という場合はGOSUB〜RETURNを使わないと実現ができません。

とはいえ、趣味のプログラミングならば自分で作りやすいやり方で作るのが一番だと私は思います。
DEF〜ENDが使いやすいと思うならばそれでいいと思います。
無理にGOSUB〜RETURNを使う必要はありません。
もちろんGOSUB〜RETURNの方が作りやすい場面もあるのですが、「こういう場合にGOSUB〜RETURNを使うべき」とこちらが提示するよりもご自身で「GOSUB〜RETURNを使った方が作りやすいな」と感じた時に使うのが一番ですね。
アバター
ツララ 2018/12/28 17:28 ◆ArUdBYOYME1V
飛び先のラベルを工夫することで頭の処理をスキップしたりできるのがGOSUBの利点だったりするんじゃないんです?
IF BUTTON()==#X THEN GOSUB @RESTART ELSE GOSUB @MAIN
END
@RESTART
 変数初期化処理
@MAIN
 メインの処理
RETURN
みたいな
アバター
初心者 2018/12/28 18:37 ◆ULvuffpmw1rp
なるほど、
どうやらグローバル変数 ローカル変数が鍵のようですね。
確かにGOSUBの方がシンプルですね。
いちいち定義しないのが利点なのかな?
皆さん丁寧にありがとうございました。おかげでモヤモヤが無くなりました。
アバター
まるだい 2018/12/29 17:12 ◆AdwyE6qhnxpV
再帰ができる?
速い?
見やすい?
アバター
しんしん 2018/12/30 16:08 ◆F5jfeXS93jff
自分は必要な時だけメモリを確保するのによく使います。あと速いです。
GOSUB @INIT

@INIT
DIM A[100]
DIM B
RETURN

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -