プチコン3号&BIGまとめWiki

DEF 引数の省略

パンくずリスト

投稿者 : うつりきまぐれ ( Ryou Tanpo ) / タグ : DEF

 

のべ 2429 人にお越しいただきました。

合計2429 人
今日4 人
昨日1 人

ありがとうございます!

概要

たまに DEF で定義した命令の引数を省略可能にしたいという声が聞かれますが、SmileBASIC には、省略された引数を判断するための手段がありません。
また、そのまま SmileBASIC の命令や関数に渡すとエラーとなってしまいます。

これまでは、 PRG 系命令を駆使してプログラムを変換したりという方法で我慢するしかありませんでした。

そこで朗報です!!

引数が省略されたかをトリッキーに判断する関数 UNDEFINED() を作成致しました。
省略可能な引数を持つ命令・関数内で使用します。

 

UNDEFINED() でこのようなことが実現できます。

IMG_3862.JPG

注意

  • SmileBASIC では、DEF で定義した命令や関数は、引数の数が 1 つでも異なるとエラーを発生します。
  • 例えば、TEST という命令の中で、 UNDEFINED() で引数を調べるときは、 TEST は 2 つ以上の引数を持っていなければなりません。それは、コンマを使わずに引数を省略した場合、引数の数が異なるため Illegal function call になってしまうからです。従って、コンマで引数区切らない第1引数のみの命令は引数を省略できません。

ソースコード

数値引数バージョンでは数値変数、文字列引数バージョンでは文字列変数のみ判定できます。 数値+文字列引数バージョンでは両方判定できます。

ver2.0.0 数値+文字列引数バージョン

  1. DEF UNDEFINED(A%,B%)
  2.  VAR X%,Y%,C%,D%
  3.  IF ”A”==B%&&”B”==B% THEN
  4.   BGOFS A% OUT X%,Y%
  5.   BGOFS A%,0,1
  6.   BGOFS A%,B%,B%
  7.   BGOFS A% OUT C%,D%
  8.   BGOFS A%,X%,Y%
  9.   RETURN C%!=D%
  10.  ELSE
  11.   RETURN 0
  12.  ENDIF
  13. END

ver1.0.2 数値引数バージョン

Soybeanman さんの意見を参考に、BG で実装

  1. DEF UNDEFINED(X)
  2.  VAR U,V,A,B,C,D,S=0
  3.  BGOFS S OUT U,V
  4.  BGOFS S,0,0
  5.  BGOFS S OUT ,A
  6.  BGOFS S,1,X
  7.  BGOFS S OUT B,C
  8.  BGOFS S,X,1
  9.  BGOFS S OUT D,
  10.  BGOFS S,U,V
  11.  RETURN A==C && B==D
  12. END

ver1.0.2 文字列引数バージョン

  1. DEF UNDEFINED(X$)
  2.  RETURN ”A”==X$ && ”B”==X$
  3. END

使い方

Ver2.0.0

まず、ソースコードをプログラム末尾などに手入力してください。両バージョンを使用する場合は適宜関数名を変更してください。 第1引数(A%) には、一時的に使うBGレイヤーを指定してください。 第2引数 (B$)には、省略されているかどうかを調べる数値を入れてください。 第2引数 (B$) が省略されていたら TRUE 、そうでなければ FALSE を戻り値として返します。

Ver1.0.2

まず、ソースコードをプログラム末尾などに手入力してください。両バージョンを使用する場合は適宜関数名を変更してください。

ver1.0.2の両バージョンともに、UNDEFINED() は、第1引数 (ARG) が省略されていたら TRUE 、そうでなければ FALSE を戻り値として返します。

  1. 結果=UNDEFINED(ARG)

前述の理由で、自分の命令や関数を省略可能にするには 2 つ以上の引数を用意してください。
また、自分の命令や関数を省略して呼び出すときにコンマは省略しないでください。

解説

DEF の引数が省略されたとき、その引数は命令の引数に渡すとエラーになります。しかし、LOCATESPOFS などの、コンマをつけたまま省略する引数に渡すと、省略される扱いとなります。*1 例えば、

  1. LOCATE 15,

とすると、X 座標だけ変化し、 Y 座標は維持できます。

 
  1. DEF TEST Y,TXT$
  2.  LOCATE 50−LEN(TXT$),Y
  3.  PRINT TXT$
  4. 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() はこの原理を利用しています。

ver2.0.0

  1. DEF TEST A%,B
  2.  PRINT UNDEFINED(0,A%)
  3. END
  4. DEF UNDEFINED(A%,B%)
  5.  ’上のソースコードをうつしてね
  6.  ’あるいは、別のファイルとして保存して、
  7.  ’EXECで別のスロットに呼び出す
  8. END
  • TEST を第1引数を指定して呼び出したら 0 、省略して呼び出したら 1 が表示されます。
  • TEST 0,
    • 0
  • TEST A,
    • 0
  • TEST ,
    • 1

ver1.0.2

  1. DEF TEST A,B
  2.  PRINT UNDEFINED(A)
  3. END
  4. DEF UNDEFINED(X)
  5.  ’上のソースコードをうつしてね
  6.  ’あるいは、別のファイルとして保存して、
  7.  ’EXECで別のスロットに呼び出す
  8. END
  • TEST を第1引数を指定して呼び出したら 0 、省略して呼び出したら 1 が表示されます。
  • TEST 0,
    • 0
  • TEST ,
    • 1
  • TEST A,
    • エラー

投票

選択肢 投票
これは使える!! 1  
知らなかった... 1  
ふつうかな 0  
ダメダメかなぁ 0  
いまいち機能がわからない 0  

コメント

  • ご指摘、ご要望、ご感想、およびバグ報告はこちら。
  • コメントの並び順を変更したため、過去のコメントは消去しました。

  • あまさとしおん : 配列が入ってくる引数の省略の調べ方って存在しないんだろうか (2022/06/23 (木) 20:59:05)
  • Na : しかもこの関数専用のスプライトならC,Dを取得した後座標を戻す必要がありません。 (2020/04/11 (土) 16:02:16)
  • Na : BGOFSを使うとBGANIMが止まってしまうので、代わりに最初に空き番号にスプライトを作成してSPHIDEで非表示にしておいて、SPOFSを使いました。 (2020/04/11 (土) 15:59:20)
  • 名無しさん : 3 3 4 (2018/06/25 (月) 22:36:21)
  • Ryou Tanpo : すみません、わざわざ例まで編集していただきありがとうございます...! 数値と文字列両対応を作ってしまうとは... (2018/01/05 (金) 21:14:09)
  • Soybeanman : 「UNDEFINED には「命令の仮引数」を指定すればエラーにならない」なるほど。理解できました。解説ありがとうございます。 (2018/01/05 (金) 19:58:06)
  • Soybeanman : わかりました。編集しました。 (2018/01/05 (金) 19:20:43)
  • Ryou Tanpo : >Soybeanman さん すみません、現在都合でダウンロードできないため上の ver 2.0.0 に編集お願いできますか? (2018/01/05 (金) 17:09:03)
  • Ryou Tanpo : >Soybeanman さん UNDEFINED には「命令の仮引数」を指定すればエラーにならないはずですが… (2018/01/05 (金) 17:06:22)
  • 名無しさん : いやったアアアアア (2018/01/05 (金) 16:54:27)
  • Soybeanman : [EKX33PL6]両方対応バージョンを作りました。このページに載せてもらって差し支えありません。 (2018/01/05 (金) 16:33:45)
  • Soybeanman : 文字列引数バージョンを使うとエラーになります。あと、 数値引数バージョンの第2引数(_)がなくなっているのでこちらもエラーになると思います。 (2018/01/05 (金) 16:08:52)
  • 名無しさん : 続き)単にstringとdoubleで判別(v>0<3)するだけじゃできなかったので・・・() (2018/01/04 (木) 21:39:33)
  • 名無しさん : 両方対応バージョン作ってください!!(無茶ぶり) (2018/01/04 (木) 21:37:30)
  • Ryou Tanpo : 文字列引数バージョン作成できたのでソースコードのせました。 (2018/01/04 (木) 21:10:41)
  • Ryou Tanpo(インテリもどき) : 文字列対応の UNDEFINED() は厳しいかもなぁ… (2017/11/29 (水) 15:09:25)

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 3 人がこのサイトを見ています
  • このページはこれまでに 2429 回、本日は 4 回、昨日は 1 回閲覧されました

ページの先頭に戻る

*1 例えば BEEPCOLOR なども該当しますが、省略時にコンマまで省略するものは別です。例えば GPSET などの色コードは直前のコンマも省略するため残念ながら当てはまりません。

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.289 秒 | このページの最終更新 : 2022/06/23 (木) 20:59:06 (54d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30