新城@筑波大学情報です。こんにちは。

In article <s7f3c70vluu.fsf@xxx.kgc.co.jp>
        candy@xxx.kgc.co.jp writes:
> まあそうなんですが、別記事にも書きましたように、元ネタは
> <URL:http://www.numerical-recipes.com/pubdom/nrutil.c.txt>
> で、なにやら数値演算のパッケージの一部らしいのです。
> で、オフセットは 1 に限らず(負も含め)任意にしたいみたいですね。

Pascal みたい。v : array[-128..127] of integerだったかなあ。
あ、Pascal の文法忘れている。

Cでやるなら、こんな感じ。

struct array
{
        int     lower ;
        int     upper ;
        int     data[0];
};

#define ref(a,i) ((a)->data[(i)-(a)->lower])

まあ、せっかくやるなら、添字の範囲チェックもしたいですね。

#define ref(a,i) (((a)->lower <= (i) && (i) < (a)->upper) ? \
        ((a)->data[(i)-(a)->lower]) : exit(1))

突っ込みがあったので、括弧を増やしてみました。

> でも配列名もマクロに組み込むと
> #define index(v,i)
> とかなって見苦しいですね。

そういう時には、ローカル・マクロ。

struct array *_v;
_v = malloc(sizeof(struct array)+256*sizeof(int));
v->lower = -128 ; _v->upper = 128 ;

#define v(i)    ref(_v,(i))
        v(10) = 100 ;
#undef  v

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\