DEFで引数に配列を渡す方法
プチコン3号ではDEFおよびCOMMON DEFが導入され、ユーザー定義関数(または命令)を記述できるようになり、利便性が大幅にアップしました。
ユーザー定義関数(または命令)の引数には配列も指定できるのですが、ここではまったので、以下にまとめておきます。
まず、DEFの記述方法には、①関数として定義し値を返す書き方、②命令として定義し値を返さない書き方、の2種類があります。それぞれは、基本、以下のように書きます。
① DEF 関数名([引数[,引数...]]) ② DEF 命令名 [引数[,引数...]] [OUT 変数[,変数...]]
①で定義された関数は、呼び出し側では、
A=関数名(B)
のように記述します。
②で定義された命令は、呼び出し側では、
命令名 A,B OUT C,D
のように記述します。
ここで、OUT以下に記述された変数は値を受け取るための変数です。
つまり、CとDは命令中で書き換えられますよ、ということを表しています。
ここで、配列を引数として渡して、ユーザー定義命令中で書き換えを行いたい場合には、当然、以下のように書くと思うでしょう。
DEF TEST X OUT ARRAY[] PUSH ARRAY, X END DIM ARR[1] TEST 1 OUT ARR
ところがこれはType Mismatchになって通りません。
正しい書き方はこうです。
DEF TEST X, ARRAY[] PUSH ARRAY, X END DIM ARR[1] TEST 1, ARR
なんと、配列のみは標準で参照渡しになるらしく、OUTに書くと逆に通りません。
これはおそらく、内部をCかC++で記述していて、配列=ポインタで、ポインタを渡してるからということだと思います。
かなりはまったので、こういうのはちゃんとヘルプに書いておいてほしい...。