next up previous contents
Next: B.12.0.0.1 なぜ正の添字からは始められないか?: Up: B. がらくた箱 Previous: B.11 数学定数どうしよう?

B.12 C で負の添字を使う方法

C 言語の配列の添字は 0 から始まりますが、何とかこれをこちらの好き なものに変更する方法はないでしょうか?この問題はささいなことのようです が、不可能となると、不自然なプログラミングを強要されることになりかねな いので困ってしまいます。

他の言語では、任意の整数から添字を始めることが出来るものがあります。 例えば $ -2$ から $ 5$ までを添字として使いたい場合は

FORTRAN
real a(-2:5)
Pascal
a: array [-2..5] of real;
のように出来ます。

それで C 言語の場合はどうかというと、残念ながら正の整数から添字を始 める標準的な方法はありませんが、負の整数から添字を始める方法は場合によっ ては、一応存在します。

/*
 * negative-index.c
 */

#include <stdio.h>

#define LOWER	(-2)
#define HIGHER	5

int main()
{
  int i;
  double adummy[HIGHER-LOWER+1], *a;

  a = adummy - LOWER;
  for (i = LOWER; i <= HIGHER; i++) {
    a[i] = i;
  }
  for (i = LOWER; i <= HIGHER; i++)
    printf("a[%d]=%f\n", i, a[i]);
  for (i = 0; i <= HIGHER-LOWER; i++)
    printf("adummy[%d]=%f\n", i, adummy[i]);
  
  return 0;
}

a[-2]=-2.000000
a[-1]=-1.000000
a[0]=0.000000
a[1]=1.000000
a[2]=2.000000
a[3]=3.000000
a[4]=4.000000
a[5]=5.000000
adummy[0]=-2.000000
adummy[1]=-1.000000
adummy[2]=0.000000
adummy[3]=1.000000
adummy[4]=2.000000
adummy[5]=3.000000
adummy[6]=4.000000
adummy[7]=5.000000
つまり、a[-2]adummy[0] を指すように、ポインター a を細工します。実際には a[0]ad[2] を指すように a = ad+2 とすれば OK です。




next up previous contents
Next: B.12.0.0.1 なぜ正の添字からは始められないか?: Up: B. がらくた箱 Previous: B.11 数学定数どうしよう?
Masashi Katsurada
平成18年4月28日