データの最大値を求める

 カレント座標軸の配列id=0を持つデータのの最大値を求めます。ここではTopazスクリプトの基本的な文法とグラフオブジェクトへの基本的アクセス方法を学びます。またCUI関数"edittext"の基本的な使い方を学びます。


  # frameオブジェクトの配列idとして$_CURを指定すると、カレント座標軸
  # の配列idが自動的に代入されます。配列id=0を持つデータオブジェクトの
  # 数値データ数を求め、変数$lengthに代入します。

  $length = $graph->frame[$_CUR]->data[0]->datalength();

  # $length < 1の場合(データが無い場合)スクリプトを終了します。

  if ($length < 1)
  {
    exit(1);
  }
  
  # 変数$maxvalの初期値として、数値データの0番目を代入します。

  $maxval = $graph->frame[$_CUR]->data[0]->y[0];

  # 変数$iを0から$lengthまでスキャンすることにより、yデータの値を
  # 変数$valに格納します。$valが$maxvalよりも大きければ、$maxval
  # の値を$valで置き換えます。

  for ($i = 0; $i < $length; $i++)
  {
    $val = $graph->frame[$_CUR]->data[0]->y[$i];
    if ($val > $maxval)
    {
       $maxval = $val;
    }
  }

  # メッセージエリアに最大値を表示します。

  print "$maxval\n";


 以上のスクリプトは以下のように変形し、より一般化することも可能です。


  $length = $graph->frame[$_CUR]->data[0]->datalength();
  
  if ($length < 1)
  {
    print 'No data found. aborted.';
    exit(1);
  }

  ################## この部分が変更点です ###############
  # CUI関数"edittext"を用いて、メニュー画面上から、最大値を求める
  # データオブジェクトの番号を、ユーザが選択できるよう一般化されて
  # います。 ユーザが選択した番号は、特殊変数$_RETに返されます。
  # この値を$indexに保管します。

  if (!edittext(0, 'input data object index'))
  {
    print "canceled\n";
    exit(1);
  }
  $index = $_RET; 

  # ユーザが入力した番号をチェックし、不正なデータオブジェクト番号
  # の場合スクリプトを停止するためのエラールーチンです。

  if ($index < 0 || $index >= $graph->frame[$_CUR]->length('data'))
  {
    print 'invalid data index. aborted.';
    exit(1);
  }
  ######################## ここまで #######################
 
  $maxval = $graph->frame[$_CUR]->data[$index]->y[0];

  for ($i = 0; $i < $length; $i++)
  {
    $val = $graph->frame[$_CUR]->data[$index]->y[$i];
    if ($val > $maxval)
    {
       $maxval = $val;
    }
  }

  print "maxdata of data[$index] = $maxval\n";