Struct

構造体は複数の値を保持できる変数です。

個々の値(メンバと呼びます)にはピリオド「.」を使ってアクセスします。

構造体を使用する利点は、代入演算子を使用して簡単にそれをコピーできるという点で、多数の変数を一つ一つ代入していくより綺麗で簡潔なスクリプトを書くことが出来ます。


NWNスクリプトの構造体はC言語スタイルの構造体です。したがってメンバ関数を持つことが出来ません。

(C++言語には、構造体に関数を含められるようにした「クラス」というデータ型があります)


(注:以下のサンプルと文章は訳者の手によるものです。原文とは全く違います)

//構造体を宣言
struct xy {
        int x;
        int y;
};

//この構造体を使う関数を宣言
int compute_add( struct xy s )	//「struct xy」型の引数「s」を受け取る
{
        int ans;
        ans = s.x + x.y;	//メンバ変数xとyを足し算する
        return ans;
}

void main()
{
        struct xy str1, str2;	//「struct xy」型の変数「str1」と「str2」を宣言

        str1.x = 10;	//str1のxに10を代入
        str1.y = 20;	//str1のyに20を代入

        str2.x = 30;	//str2のxに30を代入
        str2.y = 40;	//str2のyに40を代入

        str2 = str1;	//str2にstr1を代入(全てのメンバ変数の値が代入される

        PrintInteger( compute_add(str2) );
					//出力されるのは70ではなく30となる
}


NWNスクリプトでは配列が使えないため構造体の利用方法はあまり思いつきませんが、自分で作った関数が多くの引数を必要とするような場合、もしくは複数の戻り値を持つ関数を作りたい場合には使えるかもしれません。

例1:引数にしたいものが50個くらいあるとか考えてみて下さい

arg.x = 10;
arg.y = 20;
arg.text = "hello";
arg.oPC = GetLastUsedBy();
arg.delay = 2.0;
myfunction( arg );
			

例2:この関数は四則演算の結果と「余り」が入った構造体を返します。

struct dest compute( int x, int y ){
	struct dest ret;
	ret.add = x+y;
	ret.sub = x-y;
	ret.mlt = x*y;
	ret.dev = x/y;
	ret.mod = x%y;
  return ret;
}

main関数などの中でanswer = compute( 10, 20 );として使えば、answer.addには足し算の結果が、answer.subには引き算の結果が入っているという仕組みです。



author: Ryan Hunt, editor: Charles Feduke, additional contributor(s): Jonathan Epp, JP team: ohtsuki
Send comments on this topic.