プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

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++で記述していて、配列=ポインタで、ポインタを渡してるからということだと思います。

かなりはまったので、こういうのはちゃんとヘルプに書いておいてほしい...。