Up|<<Prev|Next>>


ファイルオフセットの計算

指定されたデータ値の オフセット(ファイル内の位置)を計算するには、指定された変数型 nc_type に適切なデータ値の一つの外部サイズ(バイト単位)を external_sizeof とする。

NC_BYTE         1
NC_CHAR         1
NC_SHORT        2
NC_INT          4
NC_FLOAT        4
NC_DOUBLE       8

Nc_open (or nc_enddef)呼び出しは前もって var_arrayと示された 変数配列内をスキャンし、 recsize を計算するために"記録”変数の vsize の和を計算する。

変数の次元サイズの積を右から左にとっていき、記録変数の最も左の(記録)次元は飛ばし、各変数についての結果を product 配列に格納する。例えば:

Non-record variable:
 
        dimension lengths:      [  5  3  2 7]
        product:                [210 42 14 7]
 
Record variable:
 
        dimension lengths:      [0  2  9 4]
        product:                [0 72 36 4]

この時点では、最も左にある積を次の4の倍数に丸めたものが変数サイズ、すなわち、上の文法においては vsize になる。例えば、上記の非記録変数では、 vsize フィールド値は 212 (210を次の4の倍数に丸めた値)となる。記録変数に対しては、 vsize の値はちょうど 72である。なぜならば、72は既に4の倍数であるからである。

求めるデータ値の座標の配列を coord とし、求める結果を offset とする。この時、 offset は単に、求める変数の最初のデータ値のファイルオフセット(その begin フィールド)に coord productベクトル の内積を変数の各データのサイズ(バイト単位)を掛けたものを加えた値となる。最後に、もしその変数が記録変数であれば、 記録数 `coord[0]' と記録サイズ recsize との積が加算され、最終的な offset 値が導かれる。

擬似C コードにおける offset の計算は次のようになる。

for (innerProduct = i = 0; i < var.rank; i++)
        innerProduct += product[i] * coord[i]
offset = var.begin;
offset += external_sizeof * innerProduct
if(IS_RECVAR(var))
        offset += coord[0] * recsize;

故に、(外部表現法の)データ値を取得するには、次のようになる。

lseek(fd, offset, SEEK_SET);
read(fd, buf, external_sizeof);

特殊例:記録変数が一つしかない場合には 、各記録が4倍と境界に合っていなければならないという制限をはずすので、この場合には記録の詰め込みが行なわれません。


Up|<<Prev|Next>>