プログラムの実行中にサイズを選べるようにするには、 行列を double へのポインターのポインターとして表現し、 malloc() を使って動的にメモリーを確保することになるが、 手順はやや複雑になる。 ポインターに慣れていないと難しいかもしれない。
/* * prog12b.c --- ポインターのポインターで行列を実現 */ #include <stdio.h> #include <stdlib.h> /* doubleへのポインターをvector, vectorへのポインターをmatrixとする */ typedef double *vector; typedef vector *matrix; /* matrix データを表示する */ void display(int m, int n, matrix A) { int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%7.2f ", A[i][j]); printf("\n"); } } /* 行数、列数を指定して matrix を確保 (エラー・チェックつき) */ matrix new_matrix(int m, int n) { int i; vector ap; matrix a; if ((a = malloc(sizeof(vector) * m)) == NULL) { return NULL; } if ((ap = malloc(sizeof(double) * (m * n))) == NULL) { free(a); return NULL; } for (i = 0; i < m; i++) a[i] = ap + i * n; return a; } /* matrixデータを解放 */ void free_matrix(matrix a) { free(a[0]); free(a); } int main(void) { int i, j, m, n; matrix a, b, c; m = 2; n = 2; a = new_matrix(m, n); b = new_matrix(m, n); c = new_matrix(m, n); if (a == NULL || b == NULL || c == NULL) { fprintf(stderr, "メモリーの確保に失敗しました。\n"); exit(1); } /* a の値の設定 */ a[0][0] = 1; a[0][1] = 2; a[1][0] = 3; a[1][1] = 4; /* bの入力 */ for (i = 0; i < m; i++) for (j = 0; j < n; j++) { printf("b[%d][%d]=", i, j); scanf("%lf", &b[i][j]); } /* c:=a+b */ for (i = 0; i < m; i++) for (j = 0; j < n; j++) c[i][j] = a[i][j] + b[i][j]; /* a,b,c を表示 */ printf("a=\n"); display(m, n, a); printf("b=\n"); display(m, n, b); printf("c=\n"); display(m, n, c); return 0; }