« C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するためのスクリプトテスト | トップページ | ガベージコレクション »

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

一応、C.O.F.F.E.E.プラグイン「ThreePointsToArc」の完成させるめどが付いたのですが、もうしばらく掛かります。C4Dに割いてる時間の調整が…
プラグイン完成の為の配列変数のテストを…

以前配列テストをした時、
・関数へ配列を渡す
・関数へ渡した配列を変更する
・新しい変数に配列変数を代入する
・同じ配列変数内に型違いの数値を代入
を試してみました。

では今回は、関数内で配列を宣言し、その配列を戻すテストをして見ます。
今回作る関数は、配列のインデックス数を変更する関数を作ってみます。
手順は、
・関数に配列変数と変更後のインデックス数を渡す。
・新たな配列を変更後のインデックス数のサイズで宣言。
・渡された配列変数の内容を新たな配列に代入する。
・新しい配列を関数の戻り値として返す。

/*
配列テスト
・配列のインデックス数を変更する関数
・関数で宣言した配列を戻せるのか
2009.1.11
*/




//配列変数のインデックス数を変更
ArrayResize(ary , siz)
{
  if(typeof(siz) != DT_LONG)return;          //サイズが整数でなければ処理を終了
  if(siz < 1)return;                         //変更後のサイズが1未満であれば処理を終了
  if(typeof(ary) != DT_ARRAY)return;         //配列変数として渡されるべき変数が配列でなけでば処理を終了

  var res = new(array , siz);if(!res)return; //変更後のサイズで配列を新たに宣言し、失敗したら処理を終了
  var i , cmax;                              //カウンター類

  if(sizeof(ary) < sizeof(res))              //古い配列の内容を新しい配列へ渡す為に
    cmax = sizeof(ary);                      //少ない方のインデックス数を取得
  else
    cmax = sizeof(res);

  for(i = 0 ; i < cmax ; i++)res[i] = ary[i];//古い配列の内容を新しい配列へ代入
  return res;                                //新しい配列を戻す
}


//配列変数の内容を表示
printarray(ary)
{
  if(typeof(ary) != DT_ARRAY)return;        //渡された変数が配列でなければ処理を終了
  if(sizeof(ary) == 0)return;               //配列のサイズが0であれば処理を終了

  var i;                                    //カウンター
  for(i = 0 ; i < sizeof(ary) ; i++)print(ary[i] , "  ");//配列の内容をラインバッファに蓄積
  println("");                              //ラインバッファ内のデータをコンソールに表示
}



//メイン
main(doc , op)
{
  var test_array = new(array , 10);                   //配列変数
  var i;                                              //カウンター

  for(i = 0 ; i < 10 ; i++)test_array[i] = i;         //配列変数の数値をインデックス番号を代入
  println("*** test start ***");                      //コンソールに表示
  printarray(test_array);                             //配列内容をコンソールに表示
  println("test_array size : " , sizeof(test_array)); //変更前の配列のサイズをコンソールに表示

  test_array = ArrayResize(test_array , 15);if(!test_array)return;//配列のサイズを変更。失敗したらスクリプトを中止
  println("(15)変更後 : " , sizeof(test_array));       //変更後の配列サイズをコンソールに表示
  printarray(test_array);                             //配列内容をコンソールに表示

  test_array = ArrayResize(test_array , 8);if(!test_array)return;//配列サイズを変更。失敗したら終了
  println("(8)変更後 : " , sizeof(test_array));        //変更後のサイズを表示
  printarray(test_array);                             //配列変数内の数値を表示

  println("*** test end ***");
  println(" ");
}

結果は、

Testarray_01

関数内で新たに配列を宣言し、配列内に数値を代入しても問題なく関数の戻り値として戻す事ができました。

さて、ここで気になる事があります。
配列を宣言する時インデックス数に変数を使えますが、変数の内容が、0以下/0/1(1以下の場合)だった場合はどうなるか知ってますか?計算させてサイズを決めるとき、計算式が間違っていて想定していない数値が入る可能性があります。
この様にnew(a , 5)と直接タイプする場合は、この値(0以下/0/1)を打つ事は無いと思います。ではどうなるのか?

/*
配列の宣言のインデックス数を1以下を設定
2009.1.11
*/


var a = new(array ,  1);println(a);
var b = new(array ,  0);println(b);
var c = new(array , -1);println(c);

結果は…

Testarray_02

インテックス数が0以上だとメモリは確保されたようです。
でもインデックス数が0の場合はいったいどうなっているのでしょう。変数bは配列として宣言が成功しています。
インデックス数が1の場合でも配列として宣言が可能でした。でも1個の要素の配列を使う必要性はあるんだろうか?
-1の場合はもともとありえないから予想通りC.O.F.F.E.E.エラー。

0や1を禁止していないと言うことは、何か特別な意味のあるのだろうか?
SDKを見てみましたが、記載されていません。

|

« C.O.F.F.E.E.プラグイン「ThreePointsToArc」-不具合を修正するためのスクリプトテスト | トップページ | ガベージコレクション »

コメント

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