! Copyright (C) GFD Dennou Club, 2000. All rights reserved. ! --- 属性の列挙 --- ! ある変数 var に付随した属性をすべて取得するにはまず ! attr_rewind(var) を呼び出してから無限ループの中で ! attr_next(var, name, [end]) を呼び出す。name がひとつ ! ひとつの属性名を与える。name が空文字列になったとき、 ! すべての属性を探索し終えたことになる。このとき end を ! 与えていればそれが真になることでも判定できる。 ! 大域属性は、その名前の先頭に "+" が付加された普通の変数属性で ! あるかのように見える。 subroutine ANVarAttrRewind(var) use an_types, only: AN_VARIABLE type(AN_VARIABLE), intent(inout):: var var%attrid = 0 end subroutine subroutine ANVarAttrNext(var, name, end) use an_types, only: AN_VARIABLE use dc_string, only: VSTRING, assignment(=) use netcdf_f77 use dc_url, only: GT_PLUS type(AN_VARIABLE), intent(inout):: var type(VSTRING), intent(out):: name logical, intent(out), optional:: end character(len = NF_MAX_NAME):: attrname integer:: stat if (var%fileid <= 0) goto 999 if (var%varid <= 0) goto 999 ! 最初は変数属性の検索 if (var%attrid >= 0) then var%attrid = var%attrid + 1 stat = NF_INQ_ATTNAME(var%fileid, var%varid, var%attrid, attrname) if (stat == NF_NOERR) then name = trim(attrname) end = .FALSE. return endif var%attrid = -1 endif ! 次は大域属性の検索 stat = NF_INQ_ATTNAME(var%fileid, NF_GLOBAL, -var%attrid, attrname) if (stat == NF_NOERR) then var%attrid = var%attrid - 1 name = GT_PLUS // trim(attrname) end = .FALSE. return endif 999 continue end = .TRUE. name = "" return end subroutine