投稿者 : うつりきまぐれ ( Ryou Tanpo ) / タグ : DEF
のべ 2443 人にお越しいただきました。
合計 | 2443 人 |
---|---|
今日 | 1 人 |
昨日 | 0 人 |
ありがとうございます!
たまに DEF で定義した命令の引数を省略可能にしたいという声が聞かれますが、SmileBASIC には、省略された引数を判断するための手段がありません。
また、そのまま SmileBASIC の命令や関数に渡すとエラーとなってしまいます。
これまでは、 PRG 系命令を駆使してプログラムを変換したりという方法で我慢するしかありませんでした。
そこで朗報です!!
引数が省略されたかをトリッキーに判断する関数 UNDEFINED() を作成致しました。
省略可能な引数を持つ命令・関数内で使用します。
UNDEFINED() でこのようなことが実現できます。
数値引数バージョンでは数値変数、文字列引数バージョンでは文字列変数のみ判定できます。 数値+文字列引数バージョンでは両方判定できます。
- DEF UNDEFINED(A%,B%)
- VAR X%,Y%,C%,D%
- IF ”A”==B%&&”B”==B% THEN
- BGOFS A% OUT X%,Y%
- BGOFS A%,0,1
- BGOFS A%,B%,B%
- BGOFS A% OUT C%,D%
- BGOFS A%,X%,Y%
- RETURN C%!=D%
- ELSE
- RETURN 0
- ENDIF
- END
Soybeanman さんの意見を参考に、BG で実装
- DEF UNDEFINED(X)
- VAR U,V,A,B,C,D,S=0
- BGOFS S OUT U,V
- BGOFS S,0,0
- BGOFS S OUT ,A
- BGOFS S,1,X
- BGOFS S OUT B,C
- BGOFS S,X,1
- BGOFS S OUT D,
- BGOFS S,U,V
- RETURN A==C && B==D
- END
- DEF UNDEFINED(X$)
- RETURN ”A”==X$ && ”B”==X$
- END
まず、ソースコードをプログラム末尾などに手入力してください。両バージョンを使用する場合は適宜関数名を変更してください。 第1引数(A%) には、一時的に使うBGレイヤーを指定してください。 第2引数 (B$)には、省略されているかどうかを調べる数値を入れてください。 第2引数 (B$) が省略されていたら TRUE 、そうでなければ FALSE を戻り値として返します。
まず、ソースコードをプログラム末尾などに手入力してください。両バージョンを使用する場合は適宜関数名を変更してください。
ver1.0.2の両バージョンともに、UNDEFINED() は、第1引数 (ARG) が省略されていたら TRUE 、そうでなければ FALSE を戻り値として返します。
- 結果=UNDEFINED(ARG)
前述の理由で、自分の命令や関数を省略可能にするには 2 つ以上の引数を用意してください。
また、自分の命令や関数を省略して呼び出すときにコンマは省略しないでください。
DEF の引数が省略されたとき、その引数は命令の引数に渡すとエラーになります。しかし、LOCATE や SPOFS などの、コンマをつけたまま省略する引数に渡すと、省略される扱いとなります。*1 例えば、
- LOCATE 15,
とすると、X 座標だけ変化し、 Y 座標は維持できます。
- DEF TEST Y,TXT$
- LOCATE 50−LEN(TXT$),Y
- PRINT TXT$
- END
これは、なんの変哲もありませんね。例えば TEST 5,HELLO とすると、
LOCATE 50-LEN(HELLO),5:PRINT HELLO としたことになる。
つまり、指定された Y 座標の行の右端に HELLO と表示されます。
このことは当然ですね。それでは、 TEST ,HELLO としてはいかがでしょう。
こうすると、変数(Y:仮引数)は指定されているのですが、前述のとおりに、 LOCATE 50-LEN(TXT$),Y の Y が省略扱いになります。つまり、 LOCATE 50-LEN(TXT$), となるのです。すると、 Y 座標は維持されるので、結果的には、現在の Y 座標の行の、右端に HELLO と表示されるのです。
UNDEFINED() はこの原理を利用しています。
- DEF TEST A%,B
- PRINT UNDEFINED(0,A%)
- END
- DEF UNDEFINED(A%,B%)
- ’上のソースコードをうつしてね
- ’あるいは、別のファイルとして保存して、
- ’EXECで別のスロットに呼び出す
- END
- DEF TEST A,B
- PRINT UNDEFINED(A)
- END
- DEF UNDEFINED(X)
- ’上のソースコードをうつしてね
- ’あるいは、別のファイルとして保存して、
- ’EXECで別のスロットに呼び出す
- END
*1
例えば BEEP や COLOR なども該当しますが、省略時にコンマまで省略するものは別です。例えば GPSET などの色コードは直前のコンマも省略するため残念ながら当てはまりません。
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.135 秒 | このページの最終更新 : 2022/09/20 (火) 12:51:39 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30