Up|<<Prev|Next>>


8.4 属性値を取得する: nc_get_att_ type

nc_get_att_ type の一族の関数は、変数IDと名前を与えるとNetCDF属性の値を 返す。

 

int nc_get_att_text (int ncid, int varid, const char *name,

char *tp);

int nc_get_att_uchar (int ncid, int varid, const char *name,

unsigned char *up);

int nc_get_att_schar (int ncid, int varid, const char *name,

signed char *cp);

int nc_get_att_short (int ncid, int varid, const char *name,

short *sp);

int nc_get_att_int (int ncid, int varid, const char *name,

int *ip);

int nc_get_att_long (int ncid, int varid, const char *name,

long *lp);

int nc_get_att_float (int ncid, int varid, const char *name,

float *fp);

int nc_get_att_double (int ncid, int varid, const char *name,

double *dp);

 

ncid

以前の nc_open 又は nc_create 呼び出しで返されたNetCDF ID。

varid

属性の変数の変数 ID 、又はグローバル属性の場合には NC_GLOBAL

name

属性名

tp, up, cp, sp, ip, lp, fp, or dp

返された 属性の値の位置を示すポインタ。属性値のベクトルの要素が全て返されるために、それらを格納するために十分なスペースを確保する必要があります。 NC_CHAR 型の属性では、 これがtrailing零バイトを含むと仮定しないこと。属性が元々trailing零バイト無しに格納されている場合には含まれません。FORTRANプログラムなどの場合がこれに相当します。C の記号列としてこの値を使用する前に、終端が零であること(null-terminated) を確認してください。どれだけのスペースを確保しておかなければならないか分からない時には、 まず nc_inq_attlen を呼び出して属性の 長さを調べましょう。

 

エラーが発生していなければ、 nc_get_att_ type NC_NOERR の値を返します。 それ以外の場合には、返された状態がエラーを示します。エラーの原因として次のようなものが考えられます。

 

この例では nc_get_att_double を使って、既存の foo.nc というNetCDFファイルにおいて 、 rh という名前のNetCDF変数の属性 valid_range の属性値と、 title という名前のグローバル属性の値を調べます。この例では、幾つの値が返されるかは不明だが、属性の型は既知であることを前提としています。従って、返された値を格納するスペースを十分に取るために、ます始めに属性の長さについて問い合わせます。.

#include <netcdf.h>
   ... 
int  status;               /* エラーステータス */
int  ncid;                 /* NetCDF ID */
int  rh_id;                /* 変数 ID */
int  vr_len, t_len;        /* 属性長 */
double *vr_val;            /* 属性値へptr  */
char *title;               /* 属性値へptr  */
extern char *malloc();     /* メモリ配置 */
 
   ... 
status = nc_open("foo.nc", NC_NOWRITE, &ncid);
if (status != NC_NOERR) handle_error(status);
   ... 
status = nc_inq_varid (ncid, "rh", &rh_id);
if (status != NC_NOERR) handle_error(status);
   ... 
/* 属性値に必要なスペース調べる */
status = nc_inq_attlen (ncid, rh_id, "valid_range", &vr_len);
if (status != NC_NOERR) handle_error(status);
status = nc_inq_attlen (ncid, NC_GLOBAL, "title", &t_len);
if (status != NC_NOERR) handle_error(status);
 
/* 値を取得する前に必要なスペースを配置 */
vr_val = (double *) malloc(vr_len * sizeof(double));
title = (char *) malloc(t_len + 1);  /* + 1 trailing null用 */
 
/* 属性値を取得 */
status = nc_get_att_double(ncid, rh_id, "valid_range", vr_val);
if (status != NC_NOERR) handle_error(status);
status = nc_get_att_text(ncid, NC_GLOBAL, "title", title);
if (status != NC_NOERR) handle_error(status);
title[t_len] = '\0';       /* null terminate */
   ... 

Up|<<Prev|Next>>