TOC PREV NEXT INDEX

Put your logo here!


7.15 文字列値を読み書きする


文字列は基本的なNetCDF外部データ型ではありません。なぜならば、FORTRANでは可変長の文字列の抽象化をサポートしていないからです。(FORTRANのLEN関数は文字列の動的な長さではなく、静的な長さを返します。)その結果、NetCDFインターフェースでは文字列は単一のオブジェクトとして読み書きすることができません。文字列は文字の配列として扱わなければならないのです。したがって、NetCDFファイルの変数データとして文字列を読み書きするためには配列アクセスをしなければなりません。さらに、NetCDFインターフェースでは可変長の文字列は規約による場合を除いてはサポートされていません。例えば、null文字を文字列の終端として扱うことは可能ですが、NetCDF変数に読み書きされる文字列の長さを明示しなければなりません。

文字列を属性値として扱えば使用しやすくなります。それは文字列がアクセスする際に一つの単位として扱われるからです。しかしながら、文字列の属性値の値はやはり固有の長さを持つ文字の配列であり、その長さは属性が定義されるときに指定される必要があります。

文字列値を持つ変数を定義する際には、文字列位置次元(character-position dimension)を最も早く変化する次元として使用しなければなりません(FORTRANの変数において最初の次元)。文字列次元の長さは文字列変数に格納されるあらゆる文字列の最大長です。最大長の列を格納するスペースは、使用するか否かにかかわらず、文字列変数のディスク表現の中に割り当てられます。仮に、2個以上の変数の最大長が同じである場合には、変数の形を定義するにあたって同じ文字位置次元を使用しても構いません。

文字列変数に文字列の値を書き込むには、全変数アクセスもしくは配列アクセスを使用します。後者を使用する場合には隅と縁の長さのベクトルの両方を指定する必要があります。文字位置次元の隅はFORTRANにおいて1です。もし書き込む列の長さがnと仮定すると、縁の長さのベクトルは文字位置次元にnを指定し、他の次元にはすべて1を指定します:(n, 1, 1, …, 1)

FORTRANにおいてはスペースを節約するために、固定長の文字列はNetCDFファイルに終了文字無しで書き込むことができます。可変長の文字列はCのnull文字を加える規約に従い、後にCまたはFORTRANのプログラムで目的となる文字列の長さが識別できるようにしておかなければなりません。

文字列を読み書きするためのFORTRANインターフェースは文字列値と数値をアクセスとをするのには異なる関数を必要とします。それは、標準のFORTRANでは文字列値と数値の両方に同じ正式なパラメータを使用することが禁じられているからです。さらに、NF_PUT_VARA_TEXTNF_GET_VARA_TEXTにおいては、指定された、値として扱われた文字列の長さを指定する別の引数が必要です。文字列の実際の長さは、対応する文字位置次元の縁の長さベクトルの値として指定されます。

この例では、文字列を扱う記録変数txを定義し、NF_PUT_VARA_TEXTを使用して文字列値を3番目の記録に書き込みます。ここでは、文字列変数とデータは既に未制限記録次元timeを持つ既存のNetCDFファイルfoo.ncに書き加えられると仮定します。

INCLUDE 'netcdf.inc'

INTEGER TDIMS, TXLEN
PARAMETER (TDIMS=2) ! TX次元の数
PARAMETER (TXLEN = 15) ! 文字列の例の長さ
INTEGER NCID
INTEGER CHID ! 文字の位置の次元ID
INTEGER TIMEID ! 記録次元のID
INTEGER TXID ! 変数ID
INTEGER TXDIMS(TDIMS) ! 変数の形
INTEGER TSTART(TDIMS), TCOUNT(TDIMS)
CHARACTER*40 TXVAL ! 最大長40
DATA TXVAL /'example string'/

TXVAL(TXLEN:TXLEN) = CHAR(0) ! null terminate

STATUS = NF_OPEN('foo.nc', NF_WRITE, NCID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)
STATUS = NF_REDEF(NCID) ! 定義モードに入る
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)

! 最大長が40文字の文字列の文字の位置の次元を定義
STATUS = NF_DEF_DIM(NCID, "chid", 40, CHID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)

! 文字列の変数を定義する
TXDIMS(1) = CHID ! 最初の文字の位置の次元
TXDIMS(2) = TIMEID
STATUS = NF_DEF_VAR(NCID, "tx", NF_CHAR, TDIMS, TXDIMS, TXID)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)

STATUS = NF_ENDDEF(NCID) ! 定義モードを抜ける
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)

! write txval into tx NetCDF variable in record 3
TSTART(1) = 0 ! 先頭の変数から開始
TSTART(2) = 3 ! 書き込む記録の数
TCOUNT(1) = TXLEN ! 書き込む文字数
TCOUNT(2) = 1 ! 一つの記録のみ記入
STATUS = NF_PUT_VARA_TEXT (NCID, TXID, TSTART, TCOUNT, TXVAL, 40)
IF (STATUS .NE. NF_NOERR) CALL HANDLE_ERR(STATUS)



Quadralay Corporation
http://www.webworks.com
Voice: (512) 719-3399
Fax: (512) 719-3606
sales@webworks.com
TOC PREV NEXT INDEX