目次
戻り値のある関数を定義します。
- 構文
- FUNCTION 関数名( 引数, Var 引数, 引数[ ], Var 引数[ ][ ], 引数 = 定数, … )
処理RESULT = 戻値FEND
- 引数
- 引数 省略可
- 値渡し
- Var 引数 省略可
- 参照元の値が変更されます。参照引数。
- 引数[ ] 省略可
- 配列
- Var 引数[ ][ ] 省略可
- 二次元配列。参照引数。
- 引数 = 定数 省略可
- 関数の呼び出し時に省略された場合に使用されるデフォルト値(デフォルト引数)。
- 戻り値
引数
定義した関数が受け取る引数は仮引数と呼ばれ、その関数の中でのみ有効となります。変数の前にVarをつけると参照引数となり、関数内で変更した値が呼び出し元の実引数に代入されます。仮引数の変数名は、実引数と同じ名前である必要はありません。以下に引数の受け取り方を記述します。
構文にある引数、Var 引数、引数[ ]、Var 引数[ ][ ]、引数 = 定数は引数の受け取り方を表したもので、この順番ですべて使用しなければならないというものではありません。必要なものを必要な数だけ自由に記述していきます。
引数の渡し方
値渡し
値渡しとは実引数(呼び出し元)の変数の値をコピーする渡し方です。関数内で引数の値を変更しても、呼び出し元の変数に影響を与えることはありません。
以下の例では、初めにnに10が代入されています。func関数に渡したとき仮引数のxに1が加算されていますが、値渡しなので呼び出し元のnの値は更新されず、10が出力されます。
DIM n = 10
func(n)
PRINT n
PROCEDURE func(x)
x = x + 1
FEND
- 結果
10
参照渡し
参照渡しとは実引数(呼び出し元)の参照を渡す方法です。関数内で引数の値を変更すると、呼び出し元の変数の値も変更されます。
以下の例では、初めにnに10が代入されていますが、func関数に渡したとき仮引数のxに1が加算されています。参照引数なので呼び出し元のnの値も更新され、11が出力されます。
DIM n = 10
func(n)
PRINT n
PROCEDURE func(Var x)
x = x + 1
FEND
- 結果
11
引数に渡せるデータの種類
値
値とは文字列や数値のことで、呼び出し元の関数の引数にそのまま指定することで渡すことができます。
func(1, 2)
PROCEDURE func(x, y)
PRINT x + y
FEND
- 結果
3
値が代入された変数も渡すことができます。
DIM a = 1
DIM b = 2
func(a, b)
PROCEDURE func(x, y)
PRINT x + y
FEND
- 結果
3
配列
一次元配列
配列を渡すときは呼び出し元では配列の変数名のみを指定し、呼び出された関数では変数名のあとに[ ](角括弧)をつけて受け取ります。
DIM nums[4] = 0, 1, 2, 3, 4
func(nums) // 配列を渡す
PROCEDURE func(array[]) // 配列を受け取る
PRINT "要素数:" + RESIZE(array)
PRINT array[0]
PRINT array[1]
FEND
- 結果
要素数:4 0 1
二次元配列
二次元配列を渡すときは呼び出し元では一次元配列のときと同様に配列の変数名のみを指定し、呼び出された関数で変数名のあとに[ ](角括弧)を2個つけて受け取ります。
DIM nums[][3] = 0, 1, 2, 3, _
4, 5, 6, 7, _
8, 9, 10, 11
func(nums)
PROCEDURE func(array[][])
PRINT "■要素数"
PRINT "一次元目:" + RESIZE(array)
PRINT "二次元目:" + RESIZE(array[0])
PRINT "----------"
PRINT array[0][0]
PRINT array[0][1]
PRINT array[0][2]
PRINT array[0][3]
FEND
- 結果
■要素数 一次元目:2 二次元目:3 ---------- 0 1 2 3
デフォルト引数
デフォルト引数とは、引数に初期値を設定する機能のことです。関数を呼び出すときに、引数を指定していればその値が使用され、引数が省略された場合はデフォルト値が代わりに使用されます。デフォルトパラメータ以降に通常引数を書くことはできません。
以下のプログラムは、func関数の引数を指定したときとしなかったときの処理の違いを表したものです。1行目は引数に田中を指定しているのでnameには田中が代入され、田中さん、こんにちは!と出力されます。一方で、2行目は引数を指定していないのでnameにはデフォルト引数である名無しが代入され、名無しさん、こんにちは!と出力されます。
PRINT func("田中")
PRINT func()
FUNCTION func(name = "名無し")
RESULT = name + "さん、こんにちは!"
FEND
- 結果
田中さん、こんにちは! 名無しさん、こんにちは!
戻り値
値を返す
変数 = 関数名()と記述することで戻り値(RESULTで指定した値)を受け取ることができます。
以下はsumに11が代入されます。
DIM sum = add(5, 6)
FUNCTION add(x, y)
RESULT = x + y
FEND
一次元配列を返す
複数の値を返したい場合は関数内で配列を宣言・代入し、RESULTにSLICE(配列)と指定します。
DIM array = func()
FOR item IN array
PRINT item
NEXT
FUNCTION func()
DIM array[] = 0, 1, 2, 3
RESULT = SLICE(array)
FEND
- 結果
0 1 2 3
別に配列を用意せず、SAFEARRAY関数 (スクリプト関数)でRESULT自身を配列にすることも可能です。
FOR item IN func()
PRINT item
NEXT
FUNCTION func()
RESULT = SAFEARRAY(0, 3)
RESULT[0] = 0
RESULT[1] = 1
RESULT[2] = 2
RESULT[3] = 3
FEND
- 結果
0 1 2 3
二次元配列を返す
二次元配列を戻り値として返す場合は、RESULTをSAFEARRAY関数 (スクリプト関数)でsafearray型で宣言し、要素を代入していきます。戻り値として二次元配列を返すのはスクリプト関数だとXLGETDATA関数 (スクリプト関数)くらいですが、自作関数で行列データを返すときは二次元配列使うと良いと思います。
DIM array = dimention()
FOR i = 0 TO 3
FOR j = 0 TO 5
PRINT i + "-" + j + "<#TAB>" + array[i][j]
NEXT
NEXT
FUNCTION dimention()
RESULT = SAFEARRAY(0, 3, 0, 5) // RESULT[0][0] 〜 RESULT[3][5]の二次元配列を生成
FOR i = 0 TO 3
FOR j = 0 TO 5
RESULT[i][j] = i * j // 各要素に代入
NEXT
PRINT "-----"
NEXT
FEND
- 結果
0-0 0 0-1 0 0-2 0 0-3 0 0-4 0 0-5 0 ----- 1-0 0 1-1 1 1-2 2 1-3 3 1-4 4 1-5 5 ----- 2-0 0 2-1 2 2-2 4 2-3 6 2-4 8 2-5 10 ----- 3-0 0 3-1 3 3-2 6 3-3 9 3-4 12 3-5 15