既に GCC で拡張機能として導入されていた可変長配列だが、 C99 にも採用された。 しかし今のところ GCC の可変長配列機能は厳密には Broken らしい。 ともあれ、簡単にメモしておく。
#include <stdio.h> void test(int n); void test2(int n); void test3(int m, int n, double a[m][n]); void test(int n) { int i; double a[n]; for (i = 0; i < n; i++) a[i] = i; for (i = 0; i < n; i++) printf("%g\n", a[i]); } void test2(int n) { double a[2*n][n]; test3(2*n, n, a); } void test3(int m, int n, double a[m][n]) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { a[i][j] = i * j; printf("%g ", a[i][j]); } printf("\n"); } } int main() { int n; printf("n: "); scanf("%d", &n); test(n); test2(n); return 0; } |
C99 については、 『プログラミング言語Cの新機能』 が便利な (日本語で読める) 情報源である。 他にも複素数型などが導入されているとか (もっともこれも GCC は Broken だとか)。
…で、どうなのかな。 これを使ってまじめなプログラムを書いても良いのだろうか。 「C++ は C に対する上位互換性」はまったく成り立たないことになったのは、 色々混乱を招きそうである。 将来的に C++ は C99 のスーパーセットになれるのかどうか? 個人的に気になるのは、 C99 の可変長配列機能と FORTRAN で書かれたライブラリィとの相性であるが、 ネットではそれについての記述がまだないみたい。 そもそも自動変数では巨大な配列を宣言できないだろうから、無理な望みなのか? だったら多次元版 malloc() とかできないか? ちょっと妄想が入ってきた。
(気を取り直して) 英文になるが、次のページは見ておくと良い。