Array index range (Re: pointer)
新城@筑波大学情報です。こんにちは。
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
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735