FUNCTION-FEND

本ページには広告が含まれています。

戻り値のある関数を定義します。

構文
FUNCTION 関数名( 引数, Var 引数, 引数[ ], Var 引数[ ][ ], 引数 = 定数, … )
処理
RESULT = 戻値
FEND
引数
引数 省略可
値渡し
Var 引数 省略可
参照元の値が変更されます。参照引数
引数[ ] 省略可
配列
Var 引数[ ][ ] 省略可
二次元配列。参照引数
引数 = 定数 省略可
関数の呼び出し時に省略された場合に使用されるデフォルト値(デフォルト引数)。
戻り値

引数

定義した関数が受け取る引数は仮引数と呼ばれ、その関数の中でのみ有効となります。変数の前にVarをつけると参照引数となり、関数内で変更した値が呼び出し元の実引数に代入されます。仮引数の変数名は、実引数と同じ名前である必要はありません。以下に引数の受け取り方を記述します。

構文にある引数Var 引数引数[ ]Var 引数[ ][ ]引数 = 定数は引数の受け取り方を表したもので、この順番ですべて使用しなければならないというものではありません。必要なものを必要な数だけ自由に記述していきます。

引数の渡し方

値渡し

値渡しとは実引数(呼び出し元)の変数の値をコピーする渡し方です。関数内で引数の値を変更しても、呼び出し元の変数に影響を与えることはありません。

以下の例では、初めにn10が代入されています。func関数に渡したとき仮引数のx1が加算されていますが、値渡しなので呼び出し元のnの値は更新されず、10が出力されます。

UWSC
DIM n = 10

func(n)
PRINT n

PROCEDURE func(x)
	x = x + 1
FEND
結果
プレーンテキスト
10
参照渡し

参照渡しとは実引数(呼び出し元)の参照を渡す方法です。関数内で引数の値を変更すると、呼び出し元の変数の値も変更されます。

以下の例では、初めにn10が代入されていますが、func関数に渡したとき仮引数のx1が加算されています。参照引数なので呼び出し元のnの値も更新され、11が出力されます。

UWSC
DIM n = 10

func(n)
PRINT n

PROCEDURE func(Var x)
	x = x + 1
FEND
結果
プレーンテキスト
11

引数に渡せるデータの種類

値とは文字列や数値のことで、呼び出し元の関数の引数にそのまま指定することで渡すことができます。

UWSC
func(1, 2)

PROCEDURE func(x, y)
	PRINT x + y
FEND
結果
プレーンテキスト
3

値が代入された変数も渡すことができます。

UWSC
DIM a = 1
DIM b = 2

func(a, b)

PROCEDURE func(x, y)
	PRINT x + y
FEND
結果
プレーンテキスト
3
配列
一次元配列

配列を渡すときは呼び出し元では配列の変数名のみを指定し、呼び出された関数では変数名のあとに[ ](角括弧)をつけて受け取ります。

UWSC
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個つけて受け取ります。

UWSC
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にはデフォルト引数である名無しが代入され、名無しさん、こんにちは!と出力されます。

UWSC
PRINT func("田中")
PRINT func()

FUNCTION func(name = "名無し")
	RESULT = name + "さん、こんにちは!"
FEND
結果
プレーンテキスト
田中さん、こんにちは!
名無しさん、こんにちは!

戻り値

値を返す

変数 = 関数名()と記述することで戻り値(RESULTで指定した値)を受け取ることができます。

以下はsum11が代入されます。

UWSC
DIM sum = add(5, 6)

FUNCTION add(x, y)
	RESULT = x + y
FEND

一次元配列を返す

複数の値を返したい場合は関数内で配列を宣言・代入し、RESULTSLICE(配列)と指定します。

UWSC
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自身を配列にすることも可能です。

UWSC
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

二次元配列を返す

二次元配列を戻り値として返す場合は、RESULTSAFEARRAY関数 (スクリプト関数)safearray型で宣言し、要素を代入していきます。戻り値として二次元配列を返すのはスクリプト関数だとXLGETDATA関数 (スクリプト関数)くらいですが、自作関数で行列データを返すときは二次元配列使うと良いと思います。

UWSC
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