前回は一番多く見るエラーとして、
「ERROR : Syntax error」
を取り上げましたが、
今回は次によく見るものとして
「ERROR : Type mismatch」
を見ていきましょう。
まず例です。
次のスクリプトは、自分の土地に置いて、
タッチすると自分のもの以外のプリムがあるか、
その数はいくつかを教えてくれるものを作ろうとしています。
default
{
touch_start(integer total_number)
{
integer numPrims; // 自分のものではないプリム数
vector myPos = llGetPos(); // オブジェクトのある場所
numPrims = llGetParcelPrimCount(myPos,PARCEL_COUNT_OTHER,FALSE);
llSay(0, numPrims + " prims are not mine!");
}
}
これを実行しようとすると、
「(7, 43) : ERROR : Type mismatch」
と言われてしまいました。
8行目の「llSay...」のところに何か問題がある。。。
そうです。
「Type mismatch」とは、一緒に処理しようとしている
変数の「型」が合っていないことを言います。
ここでは「integer」=整数である「numPrims」と文字列を
足そうとしたので怒られてしまったわけです。
今回のようにどうしても異なる型を足したい時は、
型を変換する必要があります。
今回の場合は、llSay が要求しているのが文字列ですから
整数の numPrims を文字列に変換する必要があるのです。
こんな時は変換先の型名をかっこでくくって
その変数の前につけてあげるといいですね。
上記の例の場合、
llSay(0, (string)numPrims + " prims are not mine!");
としてあげればスクリプトは無事コンパイルできて実行できます。
上の例の場合は簡単なので、まず間違えることはありませんが、
複雑なスクリプトになってくると
同じような名前の変数名が増えてきます。
例えば、オブジェクトの色を変えるスクリプトを作る時に、
選択できる色の種類を入れておくリスト型の colorlist、
リストから取得した色名を処理する文字列の colorname、
実際に色を設定する時に使うベクトル型の colorといった
3つの変数を用意する場合などです。
長いスクリプトを書いているうちに、
あれ? 色の名前は color だっけ、colorname だっけ?
なんて自分でもわからなくなることはよくあることです。w
そんな時に、この型間違い、
「ERROR : Type mismatch」
に出会しますね。
自分で定義した変数で間違っちゃうというのは
何ともトホホな話ですが、
それでも発生する以上は回避しなければなりません。
そんな時お勧めなのが、変数の前に型を表す文字をつけておくことです。
さっきの色の例で言うと、
リスト型のものは lstColor
文字列型のものは strColorName
ベクトル型のものは vecColor
もし整数型のものもあったら intColorNum
なんていう風にしておくと、例えば
llSay(0, "Now color is " + vecColor);
なんて書いた瞬間に、あれ、これは型が違う、と気づきやすくなります。
この方法は最近のプログラミングの世界では
あまり流行らなくなってきてるようですが、
初心者のうちは型を強く意識する上で有効だと思いますので
是非試してみて下さい。
それでは、長くなりましたので、
今回はこの辺で。
セカフェス4に黒縞屋が出演!
3 年前
No response to “スクリプトの話(5)〜次によくある間違い”
Leave a Reply