« SendModelingCommand()とスプラインでセグメントの最後に任意のポイントを追加の続き | トップページ | C.O.F.F.E.E.での配列変数のテスト-2 »

C.O.F.F.E.E.での配列変数のテスト-1

今日は基本的なところの配列変数のテストと言う事で…
今さらですが、間抜けな実験です。

スクリプトマネージャに次のようなスクリプトを

/*
配列変数テスト
2008.12.19
*/


var data_1 = new(array , 5);
var i;

for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

変数を5個格納できる配列変数data_1を宣言して、data_1の内容を表示する。
配列の宣言は、

var 変数名 = new(array , インデックス数1[ , インデック数2[ , インデックス数3[ ...]]]);

勿論、実行するとコンソールには、配列にはデータを格納していないのでnilが5個表示されます。

変更してデータを格納して表示させてみましょう。あえてfor()を2回使いました。

/*
配列変数テスト
配列変数にデータを格納して表示する
2008.12.19
*/


var data_1 = new(array , 5);
var i;

//データの格納
for(i = 0 ; i < 5 ; i++){
  data_1[i] = i;
}

//データの表示
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

単純に配列変数には、インデックス数を格納してみます。
結果は0~4までの数字がコンソールに表示されます。全く問題なしです。
今回は整数を格納しましたが、実数でもベクトルでも文字列でも可能ですね。

では、次のスクリプト

/*
配列変数テスト
配列変数に整数を格納して表示した後、同じ配列変数にベクトルを格納しなおして表示する
2008.12.19
*/


var data_1 = new(array , 5);
var i;

//1回目のデータの格納
for(i = 0 ; i < 5 ; i++){
  data_1[i] = i;
}

//1回目のデータの表示
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}


//2回目のデータの格納
for(i = 0 ; i < 5 ; i++){
  data_1[i] = vector(0 , i , 0);
{

//2回目のデータの表示
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

「おいおい、配列変数の内容を表示させるコードは同じなんだから関数にしなさいっ」て?短いし、テストだし…まぁそんな事は気にせず。
実行すると先ほどと同じ整数5個0~4とベクトル5個[0.0 , 0.0 , 0.0]~[0.0 , 4.0 , 0.0]が表示されます。
配列に限らずCOFFEEの変数は、整数を格納し同じ変数で途中からベクトルや文字列を格納し直すことができます。柔軟なスクリプトだね。でも…
C/C++なら変数を宣言するの時に変数型も指定しますが、COFFEEは変数を変数型なしで宣言するのみ。実行中も変数型を気にせず使い回す事が可能な分、注意を払わなければ思わないところでバグが生まれることになります。

多分このスクリプトで気付いた人もいると思います。何をだろう…
では次のスクリプト。

/*
配列変数テスト
配列にいろいろな変数型で格納する
2008.12.19
*/


var data_1 = new(array , 5);
var i;

//データの格納
data_1[0] = 15;
data_1[1] = vector(20.0 , 21.0 , 30.0);
data_1[2] = "abc";
data_1[3] = 23.5;

//データの表示
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

これは、間違いなくエラーなしで実行します。整数、ベクトル、文字列、実数、nilの5種類を1つの配列変数に格納しています。複数の変数型を格納できると言うことです。

では、更にテスト。次のスクリプト。

/*
配列変数テスト
配列変数の代入
2008.12.19
*/


var data_1 = new(array , 5);
var data_2;
var i;

//データの格納
data_1[0] = 15;
data_1[1] = vector(20 , 21 , 30);
data_1[2] = "abc";
data_1[3] = 23.5;

//data_2にdata_1を代入
data_2 = data_1;

//data_1のデータの表示
println("--- data_1 ---");
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

//data_2のデータの表示
println("--- data_2 ---");
for(i = 0 ; i < 5 ; i++){
  println(data_2[i]);
}

data_1をdata_2に代入してみました。
結果はdata_1、deta_2共に同じ値を表示しています。が、しかし…
次のスクリプトを試してみよう。

/*
配列変数テスト
配列変数を代入して配列の1つの要素の値を変更
2008.12.19
*/


var data_1 = new(array , 5);
var data_2;
var i;

//データの格納
data_1[0] = 15;
data_1[1] = vector(20.0 , 21.0 , 30.0);
data_1[2] = "abc";
data_1[3] = 23.5;

data_2 = data_1;

//data_1のデータの表示
println("--- data_1 ---");
for(i = 0 ; i < 5 ; i++){
  println(data_1[i]);
}

//data_2のデータの表示
println("--- data_2 ---");
for(i = 0 ; i < 5 ; i++){
println(data_2[i]);
}


//data_2[3]の値のみを変更
data_2[3] = "xyz";



//data_1のデータの表示
println("=== data_1 ===");
for(i = 0 ; i < 5 ; i++){
println(data_1[i]);
}

//data_2のデータの表示
println("=== data_2 ===");
for(i = 0 ; i < 5 ; i++){
println(data_2[i]);
}

deta_2にdata_1を代入後、確認のためコンソールに表示、その後data_2[3]のみに”xyz”の文字列を代入し更に確認のためコンソールに表示。結果は?見事にdata_1[3]も”xyz”に変更されている。ん?変更されている?のか?
今のスクリプトの後に次のスクリプトを追加し実行。

println("data_1 " , data_1);
println("data_2 " , data_2);

結果は、

data_1 [array-21EF377C]
data_2 [array-21EF377C]

と、data_1,data_2共に同じ値を示している。array-の次の数値はPCや実行時の状況によって変わります。結論から言うと、C/C++で言うポインタ等に相当するものだろう。勉強不足で断定はできません。array-の次の数値は多分配列が格納されているメモリーのアドレスだと思う。そうすると、data_1を変更すると自動的にdata_2も変更されるのではなく、data_1もdata_2も同じものを参照しているということになる。

|

« SendModelingCommand()とスプラインでセグメントの最後に任意のポイントを追加の続き | トップページ | C.O.F.F.E.E.での配列変数のテスト-2 »

コメント

この記事へのコメントは終了しました。