既に 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() とかできないか? ちょっと妄想が入ってきた。
(気を取り直して) 英文になるが、次のページは見ておくと良い。