トピック
ぽんんん koumei-id

【初心者】CALLのつかいかた【教えてください】

CALLはGOSUBの上位機能のようなもの、と聞いたのですが 公式の説明だとよくわかりません… GOTO/GOSUBとの違い、CALLでできること、サンプル(使い方) を教えていただけると助かります!よろしくお願いします!
3そうだね
プレイ済み
返信[1]
親投稿
たとえば音を出すとき BEEP って書く。 CALLを使うと CALL "BEEP"ってなる。 命令の使うための命令。 意味ないように見えるんだけど「どの命令にするかを変数とかで選べる」っていうメリットがある。 CALL "A"+(BUTTON()==#A)+"CLS" Aボタンだけを押せばACLS、それ以外はCLSになるね。
2そうだね
プレイ済み
返信[2]
親投稿
打ち間違い修正 CALL "A"*(BUTTON()==#A)+"CLS"
0そうだね
プレイ済み
返信[3]
親投稿
ほしけん Hosiken
GOSUBの上位とは…ちょっと違います。 その前に、DEF~ENDは使ったことありますか。 こっちがGOSUBの上位版といえます。 RET=KANSUU(5,10) PRINT "AかけるBは";RET DEF KANSUU(A,B)  PRINT "A+B=";A+B  RETURN A*B  ' もどりちをかえす END GOSUBと違う点は「プチコンの命令と同じように数値や文字列をパラメータとして渡せる」「RETURN で戻り値を返すことが出来る」「DEFの中と外で変数名がかぶっても大丈夫にできる」という点です。 それで、上記の RET=KANSUU(5,10) は、RET=CALL("KANSUU",5,10) と書くこともできます。
1そうだね
プレイ済み
返信[4]
親投稿
ほしけん Hosiken
どっちも同じ意味で、しかもCALLを使わない方が読みやすいように見えます。 CALLのメリットは、関数名(上記例でいうと「KANSUU」)を文字列で指定できるという一点です。 ここを変数で作ると、かなりトリッキーなことができます。しかしよーく考えて設計しないと一気に訳が分からなくなります! DEF に相当慣れるまでは一旦忘れていい感じです。 (ちなみに、GOTOやGOSUBの飛び先も文字列にできます。)
2そうだね
プレイ済み
返信[5]
親投稿
ぽんんん koumei-id
皆さんありがとうございます、今はまだ忘れておきます・・・(笑) スパゲッティプログラムにならないようにCALLを使うといいと言われていたのですが他に方法はありますでしょうか? IF A=1 THEN GOTO @A IF A=2 THEN GOTO @B ・・・ っていうふうに繰り返しているのがみづらくなる原因らしいのですが…
1そうだね
プレイ済み
返信[6]
親投稿
ぽんんん koumei-id
あ、DEFはつかったことないのでわからないです・・・ 戻り値は変数の値で合ってます?
0そうだね
プレイ済み
返信[7]
親投稿
文字列ラベルでいいかと GOTO CHR$(64+A)
0そうだね
プレイ済み
返信[8]
親投稿
GOTO "@"+CHR$(64+A) 1→A 2→B … 戻り値は 戻ってくる数 例えばRND(4)すると、出てくる「0-3の数」が戻り値
0そうだね
プレイ済み
返信[9]
親投稿
ほしけん Hosiken
これをCALLに置き換えるという判断は間違いだと思います。 @TOBISAKI_1,@TOBISAKI_2,@TOBISAKI_3,@TOBISAKI_4 … というラベルがある場合、 GOTO "@TOBISAKI_"+STR$(A) とやればその答えてくださった方の想定通りにいくと思います。 STR$は数値を文字列に変換する関数です。 GOTOの行き先や、CALLの関数名のように文字列を指定できるのは、プチコンの独自機能であまり類を見ません。(個人的にはかなり変態的な仕様だと思います。すごく便利ですが) ただし、この場合、Aの値が想定外で、ないラベルに飛ぼうとするとエラーになります。CHKLABEL でラベルの存在確認が出来るので、これによりエラー回避が出来ます。
1そうだね
プレイ済み
返信[10]
親投稿
確かに「変数に入る数」と覚えるものありですが、 ダイレクトに「PRINT RND(256)」みたいな変数を介さずに書けちゃうからね。
0そうだね
プレイ済み
返信[11]
親投稿
(そして文字列で変数を呼べるVAR関数も変態仕様なのか…)
2そうだね
プレイ済み
返信[12]
親投稿
ぽんんん koumei-id
CALLへの置き換え>そのようにやればスッキリしそうですね・・・! ありがとうございます!STRについてはもう少し勉強してきます; 変数に入る値と返り値の違いがまだいまいちみえてこないです… 勉強不足ですみません…
2そうだね
プレイ済み
返信[13]
親投稿
STR$は数字がそのまんま文字になるものです。 PRINT STR$(888)これやるとすごく無用に見えますが PRINT 888*3,STR$(888)とやると意味がわかるんじゃないかな、と。
0そうだね
プレイ済み
返信[14]
親投稿
ミスタイプ失礼。 PRINT 888*3,STR$(888)*3 ただの「888かける3」と、「文字の"888"かける3」を見比べるためのプログラムです。 お好みで数字をいじってもどうぞ。
0そうだね
プレイ済み
返信[15]
親投稿
ぽんんん koumei-id
STR$>なるほど、888×3とSTR$×3ですか、わかりました CHR$はどういう機能ですか?ヘルプを読んでもわかりません・・・; あとSTRですが中身が変わらないならさきほどのほしけんさんのTOBISAKIの判定はすべて1になるのでは・・・?と思ってしまいました…
0そうだね
プレイ済み
返信[16]
親投稿
KU kerorinU
プチコンで使える文字には番号が振られている。例えばAは65番、スペースは32番など。これをASCII文字コードと呼ぶ。 chr$は、文字コードをぶちこむとそれに対応する文字が返ってくる関数。 chr$(65)と"A"は、本質的に同じ文字列となる。
2そうだね
プレイ済み
返信[17]
親投稿
KU kerorinU
関数の引数と戻り値(返り値)について ・関数とは、数値や文字列をぶちこむと、何かが返ってくるものである。 ・引数とはぶちこむもの、戻り値(返り値)とは返ってくるものである。 例として、sqr関数について考えよう。これは数値をぶちこむと、その数値の正の平方根が返ってくる関数である。つまり、sqr関数は「数値を引数にとり、引数の正の平方根を返り値とする関数」であるといえる。 返ってきた数値を利用してみよう。 ルート2をprintしたい場合、print sqr(2)と書く。 ルート27をaに代入したい場合、a=sqr(27)と書く。 このように、関数は普通の数値や文字列と同じように利用できる。
2そうだね
プレイ済み
返信[18]
親投稿
ほしけん Hosiken
プチコンは文字列と数値の足し算が出来ません。 以下は変数Aに数値の「3」が入っている場合です。 × "TOBISAKI"+A → "TOBISAKI"+3 これだと Type Missmatch という型が違うエラーになります ○ "TOBISAKI"+STR$(A) → これは "TOBISAKI"+"3" ということで、文字列同士の足し算になるのでエラーになりません。 また、上記の通りAがそのまま文字列になるので、 「全部1になる」ということはないです。
1そうだね
プレイ済み
返信[19]
親投稿
ナルミンチョ naru_starfy28
なんかCALLを使えとか言ってしまいましたが、 つまりは、処理を細分化して、 わかりやすくして欲しかったからです。 人によっては、気にすることの無いかもしれませんが、つい大規模なプログラムを書いていると、プログラムの構造に関して言いたくなってしまうのです。GOTOは使うべきじゃないよ。
2そうだね
プレイ済み
返信[20]
親投稿
ぽんんん koumei-id
ほしけんさん>詳しい解説ありがとうございました! やっとわかりました・・・! ナルミンチョさん>CALLで分岐がきれいに書けるようになったので満足です! CALLの存在を教えてくださりありがとうございました・・・! KUさん>解説ありがとうございます!文字コードの勉強はまだいいかなあ…
2そうだね
プレイ済み
返信[21]
親投稿
ナルミンチョ naru_starfy28
GOGUBではなく、CALLを勧める理由は、ローカル変数を使えることです。 変数の有効範囲を縮めることによって、名前がかぶる心配がなく、不用意に変数の値が変更されないようにできるからです。 BASICらしくないかもしれません。
3そうだね
プレイ済み
返信[22]
親投稿
ほしけん Hosiken
先ほど間違いと書いたのは、GOTOをCALLに書き換えると 飛び先も全部書き換えないと行けない大改造になるためで、 最初からCALLを使うつもりでDEFを使うならば おすすめなのはナルミンチョさんと同感です。 (というか、今作ってるものでこれを盛大にやってます)
2そうだね
プレイ済み
返信[23]
親投稿
ナルミンチョ naru_starfy28
そういうことでしたか、 理解していませんでした、すいません。
1そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
IF A==1 THEN GOTO @A IF A==2 THEN GOTO @B IF A==3 THEN GOTO @C みたいなプログラムであればON~GOTOを使うのがベターだと私は思います。 ON A-1 GOTO @A,@B,@C ONとGOTOの間の式の値が0、1、2、3、・・・と変化する場合その順番に応じたラベルにジャンプできます。(式の値が3ならば4番目に記述したラベル)
2そうだね
プレイ済み
返信[25]
親投稿
MIKI ifconfig
※ミスがあったので書き直しました call が便利に使えるのは例えばRPGで敵の動作を書く時とか def slime_attack id というような感じで、スライムの攻撃ルーチンを書いておく (id は敵の出席番号) 戦闘ルーチンでは enemy$[0] = "dragon" enemy$[1] = "ghost" enemy$[2] = "slime" としておいて for i = 0 to 2 call enemy$[i]+"_attack",i next などとすれば、敵の種類ごとに独立した命令を書けるのでラッキーというわけです。
2そうだね
プレイ済み
返信[26]
親投稿
ぽんんん koumei-id
皆さん回答ありがとうございました。 回答を締め切らせていただきます~
0そうだね
プレイ済み