Apropos of the virtue of negative subscripts.
by pointing into the middle of another data structure
you've created a
data aliasing situation
Not if all references are relative to the offset pointer. The following
example is silly, but I recently used exactly this trick to simplify
calculations on a first-quadrant (x,y) grid by supplying "out-of-bounds"
zeroes at (x,-2), (x,-1) and (-1,y). It was much cleaner to access the
zeroes like ordinary elements than to provide special code to handle the
boundary conditions.
/* Fill an N-element array with Fibonacci numbers, f(i), where 0<=i<N.
The recursion accesses a zero "out of bounds" at i=-1 */
const int N = 100;
int base[N+1];
#define fib(i) base[(i)+1]
void fill() {
int i;
fib(0) = 1;
for(i=1; i<N; i++)
fib(i) = fib(i-2) + fib(i-1);
}
Doug