2008年10月11日土曜日

スクリプトの話(5)〜次によくある間違い

前回は一番多く見るエラーとして、

「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);

なんて書いた瞬間に、あれ、これは型が違う、と気づきやすくなります。
この方法は最近のプログラミングの世界では
あまり流行らなくなってきてるようですが、
初心者のうちは型を強く意識する上で有効だと思いますので
是非試してみて下さい。

それでは、長くなりましたので、
今回はこの辺で。

No response to “スクリプトの話(5)〜次によくある間違い”

Leave a Reply