Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20154
次のページ(過去)
返信[9]
親投稿
おちゃめ ochame_nako
プチコン3号の自作関数の引数の変数の型、OUT以降の戻り値の変数の型は最初に値を代入した時点で型が決まるというのは最初に書いた通りであり、型を曖昧にせずサフィックス(#や%や$という記号)通りにきちんと動作するようにすれば扱いやすくなりそうですが、その場合はできることが減ってしまいます。(型が厳格化された場合には整数型、実数型、文字列型すべてに対応させた関数を作ることはできず、3つの関数を作りそれを使い分ける必要性が出てくるため不便になる)
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
もちろん、こんな知識がなくても上記の「0.0ではなく0を代入したら整数型になる」ということさえ知っていれば下記のように記述することもできます。 DEF X2 A OUT B  B=0  B=A  IF A>0 THEN B=B*1.5 END Bに0を代入した時点でBは整数型の変数になり、それで型が決定されるためB=AとしてAを代入したらBにはAを整数値に丸めた値が入り、B=B*1.5も整数値に丸めらた値が変数Bに入ります。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
この場合だと下記のように記述すると想定しているような動作になります。 DEF X2 A OUT B  B=A>>0  IF A>0 THEN B=B*1.5 END シフト演算、ビット演算は値を整数値で返すだけではなく整数型として返すので覚えておくと良いでしょう。(A>>0、A<<0、0 OR A、-1 AND A、NOT-A+1、A DIV 1はすべて同じく値を実数型から整数型へと変換できる) FLOOR(A)とA>>0はAの値が正数であれば両者は全く同一と思われがちですが、同じ整数値であってもFLOOR(A)は実数型、A>>0は整数型であるため覚えておくとよいかもしれません。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
では、上記の自作関数X2を正数の場合は1.5倍、負数の場合はそのままの値を整数型で返すという場合にはどうなるかを考えてみましょう。(例えばX2(3.6)ならば3.6を整数値にした3を1.5倍にして得られた4.5をさらに整数にした4を返すという感じ) DEF X2 A OUT B  B=FLOOR(A)  IF A>0 THEN B=B*1.5 END これでBの初期値はAを整数にした値、Aが正数ならばその値を1.5倍になっているので想定しているような動作になりそうですが、X2 3.6 OUT Bとしてみると変数Bの値は4.5になります。 これはFLOORでは整数型ではなく単なる整数値であるためです。 分かりやすく言えばA%=3.6においてA%は3という整数型の値になりますが、A#=FLOOR(3.6)においてA#は3という実数型の値(3.0と同じ値)になっているのと同じ状態なのです。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
以前はこれを正解例としましたが、実は正しいとは言い切れないのです。 それはBに0を代入した時点で型が決まるためです。 実は0というのは整数型であるためB=0の時点で戻り値の変数Bの型は整数型になります。 Bを実数型にしたいという場合はB=0.0とする必要があるのです。 とはいえ、B=0とB=0.0のどちらかが正解になるというものではなく「整数型として動作させたいのか」「実数型として動作させたいのか」という制作者側の判断でどちらが適切なのかが決まります。 実数値で返すようにしたい(整数に丸められて欲しくない)という場合にはB=0.0にする必要があるということです。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
これはOUTを使った場合にも注意しなくてはなりません。 例えばAの値が正数の時に2倍した値を返し、負数の時は0を返す関数X2を下記のように記述したとします。 DEF X2 A OUT B  IF A>0 THEN B=A*2 END この関数ではAの値が0以下の場合は戻り値Bには代入されないためBの型が決定できずエラーとなってしまいます。 そこで下記のようにしました。 DEF X2 A OUT B  B=0  IF A>0 THEN B=A*2 END
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
数値にも整数型と実数型の2つの型があります。 これは引数に使うのが実数型変数か整数型変数かで変わってきます。 例えばこの自作関数X2をDEF外においてB=X2(A%)として使用した場合にはDEF内のローカル変数Aは整数型変数として処理されB=X2(A#)として使用した場合には実数型変数として処理されます。(OPTION DEFINTを使用してない場合はデフォルトの変数は実数型となる) では、変数ではなく定数でこの関数を使用した場合の挙動はどうなるかというとX2(1)だとローカル変数Aは整数型、X2(1.0)だと実数型となります。現在は2倍する関数なので戻り値はどちらも2ですが、戻り値を1.5倍するようにA=A*1.5に変更した場合はX2(1)は1を返し、X2(1.5)は1.5を返します。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
では、数値が与えられた場合はそれを2倍した値を返し、文字列ならばnanを返すようにしてみましょう。 そのためには引数の変数が数値か文字列かを判断しなくてはなりません。それには私の自作関数SUFFIXを用いると簡単です。 自作関数 SUFFIX() https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fSfxRUkA DEF X2(A)  IF SUFFIX(A) THEN   A=A*2  ELSE   A="nan"  ENDIF  RETURN A END このようにSUFFIXを使えば与えられた型によって動作が変わる自作関数を作ることが容易にできます。
0そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
ず、最初に覚えておくべきことはDEFの引数の変数は代入された時点で型が決まるという点です。 例えば値を2倍する関数X2は下記のようになります。 DEF X2(A)  RETURN A*2 END では、X2(123)としてAが123となるならば戻り値は246ですが、X2("ABC")の場合は"ABC"*2なので戻り値は"ABCABC"となります。 変数名Aには文字列変数のサフィックスとなる"$"は付いてないのですが文字列変数が代入された場合は文字列変数として動作するということです。 この辺は以前下記のトピックスにも書いた通りです。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHjYtPmLxg
2そうだね
プレイ済み
プレイ日記
おちゃめ ochame_nako
今回はDEFで自作関数を作る時の変数の型について書いておきます。 中上級者向けの知識ですが、初心者において「DEFで自作関数を作っていて挙動がおかしいけど何が原因かは分からない」という場合の解決方法も記しているためためぜひ読んでみてください。
14そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
こういちさんへ 整数化したいのであればA>>0で問題ないし整数型として処理されるのですがSilverBlueさんのようにFLOORを使用すれば実数型の整数値になりますが整数型の限界を超える値にも対応というメリットがありますね。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
シフト演算もそうですが、ビット演算等の整数型で値を返す演算子はすべて整数型変数に代入したのと同じ挙動をしてくれますね。 例 A>>0 A<<0 0 OR A -1 AND A NOT-A+1 A DIV 1 ちなみにFLOORやROUND等は戻り値は整数値ですが整数型ではなく実数型です。 これは自作関数で整数型として動作させたい場面なのに実数型として動作してしまう場合もあるため覚えておくと良いかもしれないです。
2そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
ツララさんへ 私は「プチコン3号でこんなこともできるよ」というのを提示しているだけであり、この2軸回転プログラムはすでに公開済みであり自由に使ってもらって問題ないのでツララさんがそういうサンプルプログラムを望んでいるならばツララさん自身で作ってもいいのですよ。
1そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
しんいちさんへ 高速化のポイントはリアルタイム処理であれば元画像からの参照速度をいかに上げるかということです。 ver.1.0のプログラムは基本的にmkIIのプログラムをベースとしていてそれなりには高速であったもののプチコン3号に最適化されたものではありませんでした。 最適化の1番のポイントとなるのはACOSです。ACOSの存在を完全に忘れていた(先日のれいさんの正距方位図法プログラムで思い出した)のでATANから置き換えてみたらそれだけで30%くらい高速化できました。(ATAN2と違ってACOSは0除算の可能性があるため例外処理が必要) あとはループから出せるものはすべて出して処理をすることでトータルで40%少々の高速化ができました。 これが現状の限界というのはよく感じますが、(大抵の場合は)限界なんてどんどん超えられるのでぜひさらに上を目指してみてください。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
QSPというのはWIDTH 16を実行し縦横2倍の文字になった時に1画面に収まるプログラムです。通常の1画面プログラムの約4分の1のサイズなのでQuarter Screen Gameの略でQSPと命名されました。(プチコン3号専用の用語) ちなみに下記のものは私が作った簡易関数電卓QSPですべての関数が使える関数電卓でOSもどきのような使い方もできるプログラムです。公開キーは【 2DC4VNNE 】 それ以外にもQSPを多数作っているので興味があれば私のすべての活動からご覧になってください。
1そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
GOTOはWHILEを覚えた時点で使う機会は激減するでしょうね。 もっとも、QSPなどの文字数制限のあるプログラムの場合はGOTOを使いまくりスパゲッティになっても「1画面に収まる」ということが何より重視されるためも音大ありません。 GOTOが「悪」のように考えている人は少なくないですが、それはGOTOはどこにで自由にジャンプできる反面でどこからどこまでを繰り返しているのかが希薄になってしまうためです。 自分できちんと把握できていると思うならばWHILEを覚えた後でGOTOを使っても構いませんが残念ながらGOTOよりもWHILEの方が速い場面が多いのです。 プチコン3号の中ではループ命令で最速なのがREPEATですが、GOTOが速度でこれに勝てる場面はほんのごくわずかしかありません。 というわけで、速度を求めるならばREPEAT~UNTILを使いましょう。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
わざわざこんなものを使わなくても紙の単語帳で十分と思う人もいるかもしれないですが、紙の単語帳だと順番に出題されるのみという問題があります。(たまにシャッフルを行える程度) 順番で覚えた場合にはこの単語はあの単語の次に書いてあったという情報で覚えてしまうため試験では役に立ちません。 あと英単語の綴りをなかなか覚えられないという致命的な問題があります。 単語帳に止まらずすでにあるものをプチコン3号でわざわざ作るならば紙にはないアドバンテージが必要だと私は思っています。(お絵かきソフトならばアンドゥが容易というのも十分なアドバンテージになる)
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
肝心の単語帳データの作り方ですが、プログラム末尾のマニュアルにも記載しているし単語帳データそのものは単純なテキストファイルなので開いてもらえれば一目瞭然ですが1行に1つの問題を書き問題と正解との間を「:(コロン)」でつなげるだけです。 あとは自分が覚えたいものをひたすら入力してください。 《 データの例 》 abnormal;異常な↓ fool:愚か者↓ ↓ (↓は改行マークを示す) 注意すべき点はこのようにデータの最後の1行は改行のみの空白データにすることです。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
入力が終わったら単語帳からランダムに出題されます。 Aボタンを押すと正解を見ることができます。 シャッフルではなくランダムなので同じ問題が連続する場合もありますが、それは仕様となります。 あとはひたすら繰り返してください。 紙の単語帳で英単語を覚えたい場合、実際に書かないので綴りが覚えられないという致命的な問題があります。 しかし、この簡易単語帳QSPならばその問題を解決できます。 日本語出題、英語で回答という場合だと日本語に対して英単語をキーボードから入力できます。綴りが合っているかどうかは自動でチェックしてBEEP音で知らせてくれます。(完全一致のみサポート)
1そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
公開キーは【 KVE3XVD 】です。 このツールを使うためにはまず最初に単語帳(覚えたいもの)のデータを入力したファイルを用意する必要があります。 しかし、どんなツールなのかを分かって貰うために英単語を50語登録したサンプルファイルを用意しました(ファイル名はSAMPLE) 1GQ_TNGOがこの簡易単語帳QSPのプログラムです。 起動したら読み込む単語帳ファイルのファイル名を聞いてくるのでサンプルデータを試してみたいならばSAMPLEと入力してください。 次に単語帳を表から見るか裏から見るか(反転表示)の選択になります。(表が英語、裏が日本語ならば反転表示だと日本語を見て英語で答える形になる) 裏から見たい場合は「1」を入力し、表から見たい場合は何も入力せずAボタンのみを押してください。
0そうだね
プレイ済み