%表題   ごくらくDCL
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{おまかせ一次元図}
\Dchapterhead

第\ref{s:step_lime}節のプログラム {\tt STEP1} では, $x$ 座標値の配列を
宣言して等間隔に値を代入し, {\tt UULIN} で $f(x)$ 型の一次元図を描きま
したが, これはちょっと大げさな気もします. {\tt USGRPH} や {\tt UULIN} 
などのサブルーチンで「未定義値」をうまく使うと, $x$ または $y$ 方向の
座標値が等間隔な $f(x)$ や $g(y)$型のグラフを簡単に作図できます.


%-----------------------------------------------------------------------
\section{基本概念(5): 内部変数「未定義値」}

DCLでは {\tt xxpGET}, {\tt xxpSET} 型の内部変数管理ルーチンが多く使わ
れています(いままで一度もお目にかかっていませんが). {\tt xx} は通常パッ
ケージの先頭2文字で, {\tt p} は変数の型によって, {\tt I}(整数型), {\tt
R}(実数型), {\tt L}(論理型), {\tt C}(文字型)のうちのひとつになります. 
内部変数はそれぞれのパッケージ毎に数多くあり, 「未定義値」{\tt
'RUNDEF'} もそのような実数型内部変数のひとつで, SYSLIB パッケージで管
理されています. 一般に, 内部変数は, あらかじめシステムが用意した値「初
期値」をデフォルトで保持しています. {\tt 'RUNDEF'}の場合, この値を 
{\tt GLRGET} ルーチンによって参照し, {\tt GLRSET} ルーチンによって変更
することがでます.

\begin{itemize}
\item {\tt GLRGET(CP,RPARA)} [DCL全体で使用する実数型内部変数を参照する]
       \label{GLRGET}
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt CP}    & (文字型) & 内部変数の名前.   \\
      {\tt RPARA} & (実数型) & 内部変数の値. 
    \end{tabular}
  \end{quote}

\item {\tt GLRSET(CP,RPARA)} [DCL全体で使用する実数型内部変数を変更する]
       \label{GLRSET}
  \begin{quote}
    \begin{tabular}{llp{10cm}}
       パラメータは上と同じ. 
    \end{tabular}
  \end{quote}
\end{itemize}

ところで, {\tt 'RUNDEF'} は「ユーザーが陽に指定していない」ことを表す
内部変数で, その値 {\tt RUNDEF} を「未定義値」と呼びます. これまで, お
まかせサブルーチンの説明で「○○が陽に指定されていなければ」というくだ
りがいくつかでてきましたが, これは「○○が {\tt RUNDEF} に等しい時には」
ということだったのです. この {\tt RUNDEF} を {\tt USGRPH} ルーチンなど
の引数に用いると, $x$ または $y$ の座標値を「おまかせ」にすることが出
来ます.
\vspace{1em}

この {\tt RUNDEF} の値は初期値として $-999.$ が与えられていますが, こ
の値が不都合な時(例えば, $-1000$ から $-999$ までのグラフを描く場合な
ど)は {\tt GRFRM} ルーチンを\.呼\.ぶ\.前に {\tt CALL GLRSET('RUNDEF',
-999999.)} などとして未定義値の値を変更しておきます. {\tt GRFRM} ルー
チンでこの {\tt RUNDEF} を使っているからです.


%-----------------------------------------------------------------------
\section{f(i$\Delta$x)}
\label{s:u1d_fx}

次のプログラム例 {\tt U1D1} では, $x$ 方向には [1945, 1995] の範囲で等
間隔に点をとり, $y$ 方向には配列{\tt Y}で与えられた座標値を結んで折れ
線を描きます. 25行めの {\tt USGRPH} ルーチンで {\tt X} を指定するかわ
りに {\tt RUNDEF} を指定する(つまり, {\tt X} は定義されていないと宣言
する)と, {\tt USGRPH} は $x$ 座標値がウインドウの幅いっぱいに等間隔に
ならんでいるものと解釈してグラフを描きます. このとき, {\tt USGRPH} が
呼ばれる前に $x$ 方向のウインドウは決まっていないといけませんから,
{\tt GRSWND} ルーチンで $x$ 方向だけを陽に与えています. ここでも, $y$ 
方向は未定義にして, 正規化変換の確定は {\tt USGRPH} におまかせします. 
なお, {\tt RUNDEF} の値は, 13行めの {\tt GLRGET}ルーチンで参照していま
す.

\Dproginput{u1d/u1d1.f}

\begin{center}
\Depsf[10cm]{u1d/u1d1.eps}\\
{\bf u1d1.f: frame1}\\
\end{center}
\vspace{5em}

%-----------------------------------------------------------------------
\section{g(j$\Delta$y)}

前節と同様に, $y$ 方向に座標値が等間隔な場合にも, {\tt Y} を指定するか
わりに {\tt RUNDEF} を指定します. 次のプログラム {\tt U1D2} では, {\tt
USSPNT}, {\tt UUMRK}, {\tt UULIN} の各ルーチンで {\tt Y} を未定義値と
しています. ここでは {\tt USSPNT} ルーチンを使ってウインドウを決め, ビュー
ポートの設定は初期値に頼りますので, {\tt GRSTRF} ルーチンの前に {\tt
USPFIT} を呼んでいることを再確認しておきましょう. なお, 変換関数番号を
3として, 片対数座標にしています. 

\Dproginput{u1d/u1d2.f}

\begin{center}
\Depsf[10cm]{u1d/u1d2.eps}\\
{\bf u1d2.f: frame1}\\
\end{center}
