第4章 FORTRAN用サブルーチンを利用する

4.1 FORTRANサブルーチンの概要

 FORTRAN用インタフェースを用いてMQDBデータファイルにアクセスする場合は、第3章で述べた、MqCreate(), MqRead() を利用する場合とは異なり、ファイル記述子(file descriptor)(注)によるファイル管理を行なう必要がある。すなわち、次のような手順を踏まなければならない。
(注)ここで述べる「ファイル記述子」は、UNIXシステムなどで使用される「ファイル記述子」とは(似てはいるものの)全く異なるものである。
  1. MQLIBの初期化。これはMQINIT()サブルーチンを呼ぶことによって行なわれる。これはプログラム内で、MQLIBサブルーチンを利用する前に1回だけ行なえばよい。
  2. ファイルのオープン。これはMQOPEN()サブルーチンにより行なわれる。このサブルーチンを呼ぶと、MQLIBはファイル記述子(実際には0以上の整数である)をプログラムに返す。以後、ファイルへのアクセスはこのファイル記述子によって行なわれる。
  3. ファイルへのアクセス。
  4. ファイルのクローズ。これはMQCLOS()サブルーチンにより行なわれる。このサブルーチンを呼ぶことによって、利用していたファイル記述子は破棄される。
このうち、2. 〜 4. の段階は、プログラム中で何回も繰り返してよい。但し、同時に利用できるファイル記述子の数は 16 個までである。従って、多数のMQDBフォーマットファイルをオープンする場合には、必ず使用後に MQCLOS() サブルーチンを呼び、ファイル記述子を破棄するようにする。さもないと、ファイル記述子が不足してしまう可能性がある。

4.2 データファイルの作成

FORTRANを利用したデータファイルの作成は、次のようにして行なう。
  1. 書き出したい変数を用意する。変数の型に注意すること。また、必ずプログラム署名を用意しておく。
  2. MQINIT()サブルーチンを呼び出す。これによって、MQLIBの変数が初期化され、サブルーチンが利用できる状態となる。ここでプログラム署名を引数で渡す。
  3. MQOPEN()サブルーチンを呼び出す。このサブルーチンは、次のような仕様となっている。

    MQOPEN( CHARACTER FILENAME, INTEGER*2 MQRW, INTEGER*2 MQFILE, INTEGER FILDESC )

    ここで、各引数は次のような意味を持つ。

    引数 意味
    FILENAME ファイル名。もし標準入出力または標準エラー出力に対して入出力を行なうのであれば、この変数は空白文字で構わない。入出力先は第3引数で指定 する。
    MQRW 入力(読み)か出力(書き)かの指定。ファイルを読み出す場合には 0、ファイルに書き出す場合には 1 を指定する。それ以外の数値は許されない
    MQFILE 入出力先。通常のファイルへの入出力の場合には 0、標準入力へアクセスする場合には 1、標準出力にアクセスする場合には 2、標準エラー出力にアクセスする場合には 3を指定する。それ以外の数値は許されない
    FILDESC ファイル記述子。以後サブルーチンのアクセスには、ここで得られたファイル記述子が使用される。

    ファイルへの書き出しを行う場合には、MQRWを 1、MQFILEを 0 にセットし、MQOPEN()を呼び出す。この呼び出しによって、変数FILDESCにファイル記述子がセットされる。もしエラーが発生すれば、プログラムが異常終了する。標準出力へ書き出す場合には、MQFILEに 2 を指定する。
    (注)標準エラー出力に書き出すことも可能であるが、もともとエラー出力を行なうために設けられている出力先であるから、利用しない方が望ましい。
  4. ヘッダ書き出し用のサブルーチンを呼び出す。サブルーチンを呼び出す場合には、第1引数には必ず、MQOPEN()により得られたファイル記述子を指定すること。決してファイル名を指定してはならない。
  5. データ書き出し用サブルーチン MQCD() を呼び出す。このサブルーチンは、データを自動的に書き出す一方、ヘッダデータも指定されたファイルへ出力する。すなわち、MQCD() の呼び出しによってデータファイルが作成される。
  6. MQCLOS()サブルーチンを呼び出す。これによって、利用していたファイル記述子が破棄され、再利用できる状態となる。
    (注)MQCLOS()サブルーチンの呼び出しによって、該当するファイル記述子についての全ての情報が消去される。従って、MQCLOS()サブルーチンを呼び出す前に、必ずMQCD()サブルーチンが呼び出されていることを確認するべきである。
以下の例は、MQDBフォーマットファイルを書き出すプログラムである。
      CHARACTER   INFILE*80, OUTFILE*80, PROGSIGN*16
      INTEGER*2   CHANNELS, DATAFORM, STATION, TAPENUM, OBSMODE
      INTEGER*2   FDIN, FDOUT
      INTEGER*2   DATATYPE, FILETYPE
      INTEGER*2   AACHANNEL, MXCHANNEL, SRCHANNEL
      INTEGER*2   YEAR, DAY, HOUR, MINUTE, SECOND, MS
      INTEGER*4   STARTREC, ENDREC, NOD
      REAL*8      AVEAMP(255), MAXAMP(255), SAMPRATE(255)
      REAL*8      DATA(100000)

      INTEGER*2   MQREAD, MQWRITE
      INTEGER*2   MQFILE, MQSTDIN, MQSTDOUT, MQSTDERR

      MQREAD   = 0
      MQWRITE  = 1

      MQFILE   = 1
      MQSTDIN  = 2
      MQSTDOUT = 3
      MQSTDERR = 4

      OUTFILE = 'test.lp'
      PROGSIGN = 'ftest'

      CALL MQINIT( PROGSIGN )

      CALL MQOPEN( OUTFILE, MQWRITE, MQFILE, FDOUT )

      CALL MQCAA( FDOUT, AACHANNEL, AVEAMP )
      CALL MQCCH( FDOUT, CHANNELS )
      CALL MQCDF( FDOUT, DATAFORM )
      CALL MQCDT( FDOUT, DATATYPE )
      CALL MQCERC( FDOUT, ENDREC )
      CALL MQCFT( FDOUT, FILETYPE )
      CALL MQCMA( FDOUT, MXCHANNEL, MAXAMP )
      CALL MQCNOD( FDOUT, NOD )
      CALL MQCOM( FDOUT, OBSMODE )
      CALL MQCSTN( FDOUT, STATION )
      CALL MQCSR( FDOUT, SRCHANNEL, SAMPRATE )
      CALL MQCSRC( FDOUT, STARTREC ) 
      CALL MQCST( FDOUT, YEAR, DAY, HOUR, MINUTE, SECOND, MS )
      CALL MQCTN( FDOUT, TAPENUM )

      CALL MQCD( FDOUT, DATA )

      CALL MQCLOS( FDOUT )
      STOP
      END

4.3 データファイルの読み込み

FORTRANを利用してデータファイルの読み込みを行なうプログラムを書く際には、次 のような手順を踏む。
  1. 必要な変数を用意する。
  2. MQINIT()サブルーチンを呼び出す。これによって、MQLIBの変数が初期化され、サブルーチンが利用できる状態となる。
  3. MQOPEN()サブルーチンを呼び出す。このサブルーチンの仕様は前節に述べられている。ファイルの読み込みを行う場合には、MQRWを 0、MQFILEを 0 にセットし、MQOPEN()を呼び出す。この呼び出しによって、変数FILDESCにファイル記述子がセットされる。もしエラーが発生すれば、プログラムが異常終了する。標準入力からMQDBフォーマットファイルを読み出す場合には、MQFILEに 1 をセットする。
  4. ヘッダ、データ読み出し用のサブルーチンを呼び出す。サブルーチンを呼び出す場合には、第1引数には必ず、MQOPEN()により得られたファイル記述子を指定すること。決してファイル名を指定してはならない。
  5. MQCLOS()サブルーチンを呼び出す。これによって、利用していたファイル記述子が破棄され、再利用できる状態となる。
以下の例は、MQDBフォーマットファイルを読み込むプログラムの例である。この例では deepmq.lpという名前の MQDB フォーマットファイルを読み込んでいる。
      CHARACTER   INFILE*80, PROGSIGN*16
      INTEGER*2   CHANNELS, DATAFORM, STATION, TAPENUM, OBSMODE
      INTEGER*2   FDIN, FDOUT
      INTEGER*2   DATATYPE, FILETYPE
      INTEGER*2   AACHANNEL, MXCHANNEL, SRCHANNEL
      INTEGER*2   YEAR, DAY, HOUR, MINUTE, SECOND, MS
      INTEGER*4   STARTREC, ENDREC, NOD
      REAL*8      AVEAMP(255), MAXAMP(255), SAMPRATE(255)
      REAL*8      DATA(100000)

      INTEGER*2   MQREAD
      INTEGER*2   MQFILE, MQSTDIN, MQSTDOUT, MQSTDERR

      MQREAD   = 0
      MQWRITE  = 1

      MQFILE   = 1
      MQSTDIN  = 2
      MQSTDOUT = 3
      MQSTDERR = 4

      INFILE = 'deepmq.lp'
      PROGSIGN = 'ftest'

      CALL MQINIT( PROGSIGN )

      CALL MQOPEN( INFILE, MQREAD, MQFILE, FDIN )

      CALL MQRAA( FDIN, AACHANNEL, AVEAMP )
      CALL MQRCH( FDIN, CHANNELS )
      CALL MQRDF( FDIN, DATAFORM )
      CALL MQRDT( FDIN, DATATYPE )
      CALL MQRERC( FDIN, ENDREC )
      CALL MQRFT( FDIN, FILETYPE )
      CALL MQRMA( FDIN, MXCHANNEL, MAXAMP )
      CALL MQRNOD( FDIN, NOD )
      CALL MQROM( FDIN, OBSMODE )
      CALL MQRSTN( FDIN, STATION )
      CALL MQRSR( FDIN, SRCHANNEL, SAMPRATE )
      CALL MQRSRC( FDIN, STARTREC ) 
      CALL MQRST( FDIN, YEAR, DAY, HOUR, MINUTE, SECOND, MS )
      CALL MQRTN( FDIN, TAPENUM )
      CALL MQRD( FDIN, CHANNELS, NOD, FILETYPE, DATA )

      CALL MQCLOS( FDIN )

      STOP
      END
▲このページの先頭へ


前の章へ

目次へ

次の章へ
月震ホームページへ
terakinizers!!トップへ