! 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, an_variable_entry use an_vartable, only: vtable_set_attrid use netcdf_f77, only: NF_NOERR use dc_trace, only: DbgMessage implicit none type(AN_VARIABLE), intent(in):: var integer:: stat stat = vtable_set_attrid(var, 0) call DbgMessage("anvarattrrewind %d", i=(/stat/)) end subroutine subroutine ANVarAttrNext(var, name, end) use an_types, only: AN_VARIABLE, an_variable_entry use an_vartable, only: vtable_set_attrid, vtable_lookup use netcdf_f77 use dc_url, only: GT_PLUS implicit none type(AN_VARIABLE), intent(in):: var character(len = *), intent(out):: name type(an_variable_entry):: ent logical, intent(out), optional:: end character(len = NF_MAX_NAME):: attrname integer:: stat integer:: new_attrid stat = vtable_lookup(var, ent) if (stat /= NF_NOERR) goto 999 new_attrid = ent%attrid ! 最初は変数属性の検索 if (ent%attrid >= 0) then new_attrid = ent%attrid + 1 stat = NF_INQ_ATTNAME(ent%fileid, ent%varid, new_attrid, attrname) if (stat == NF_NOERR) then name = attrname stat = vtable_set_attrid(var, new_attrid) end = .FALSE. return endif new_attrid = -1 endif ! 次は大域属性の検索 stat = NF_INQ_ATTNAME(ent%fileid, NF_GLOBAL, -new_attrid, attrname) if (stat == NF_NOERR) then new_attrid = new_attrid - 1 name = GT_PLUS // attrname stat = vtable_set_attrid(var, new_attrid) end = .FALSE. return endif 999 continue ! ここでは attrid の再設定はしない。次呼んでもエラーになるのが適当。 end = .TRUE. name = "" return end subroutine