In article <030911215310.M0126955@flame.hirata.nuee.nagoya-u.ac.jp> takao@hirata.nuee.nagoya-u.ac.jp writes:
>ただ, 対応するポインタ変数を確保することによって「コンパイラが配
>列の大きさを意識しなくていい」ということは言えると思います.
>
>これは 2次元以上の配列になると影響してくるんですが, C で a[M][N]
>という配列 (M, N は定数) を確保したときに a[i][j] をアクセスしよ
>うとすると, 実質的に *(a[0] + i*N + j) という計算をすることになり,
>このため N を記憶しておく必要があります (場合によっては i*N とい
>う乗算も必要). ところが, BCPL では同じ配列に対して a の分に加えて
>a!0〜a!(M-1) の分も確保します (a の内容は a!0 のアドレス, a!i の
>内容は a!i!0 のアドレス). こうすると a!i!j のアクセスに必要な処理
>は C で書くと *(*(a + i) + j) となり, N の値を記憶する必要はなく
>なります (しかも乗算も不要).
このこと自体は解るんですが、
だからって、配列を切る際に、
コンパイラが有無を言わせずポインタ変数を確保する理由には
ならないような気がするんですけどねえ……

そういうアクセス法が必要だとプログラマが判断した場合に、
明示的にプログラミングによって確保するとする方が、
BCPLの哲学にも合っているような気がします。

                                戸田 孝@滋賀県立琵琶湖博物館
                                 toda@lbm.go.jp