さて、それでどうするか、という最初の問題に戻るけれど、 C の場合はポインターのポインターを使うことを勧める。
#include <stdlib.h> // malloc() に必要 int main(void) { int m,n, i; double **a; // doubleへのポインターのポインター double *a_data; // doubleへのポインター printf("m,n="); scanf("%d%d", &m, &n); a = malloc(sizeof(double *) * m); // doubleへのポインター m 個分の領域確保 a_data = malloc(sizeof(double) * (m * n)); // double m*n 個分の領域確保 for (i = 0; i < m; i++) a[i] = a_data + (i * n); // これで a[i][j] (0≦i≦m-1, 0≦j≦n-1) が使える |
#include <stdlib.h> // malloc() のため typedef double *vector; typedef vector *matrix; // matrix って行列という意味です。 // m行n列の行列 (あるいは2次元格子上の数値データ) を記憶する領域の割り当て matrix new_matrix(int m, int n) { matrix a; vector a_data; int i; a = malloc(sizeof(double *) * m); if (a == NULL) // せっかくなのでエラー・チェックも return NULL; a_data = malloc(sizeof(double) * (m * n)); // 必要十分なサイズ if (a_data == NULL) { free(a); return NULL; } for (i = 0; i < m; i++) a[i] = a_data + (i * n); return a; } void delete_matrix(matrix a) { free(a[0]); free(a); // a[0] は a_data であるから } int main(void) { int m,n; matrix a, b, c; printf("m,n="); scanf("%d%d", &m, &n); a = new_matrix(m, n); // 関数にしておけば3つ用意するのも簡単 b = new_matrix(m, n); c = new_matrix(m, n); if (a == NULL || b == NULL || c == NULL) { ... } ... free_matrix(a); free_matrix(b); free_matrix(c); // 要らなくなったら解放 |
(int main(void) の前はコピペして使えば良い。)
このやり方の特徴をまとめておく。
void mulmat(int n, matrix a, matrix b, matrix c) { int i, j, k; double s; // 略 for (i=0; i<n; i++) for (j=0; j<n; j++) { s=0.0; for (k=0;... } |
自作でない関数を使う場合にも、少しの工夫で対応できる場合が多い。 例えば、上で話題に出した、GLSC の g_contln() や g_hidden() を使う場合、 2次元格子上の数値データが
u = new_matrix(nx+1, ny+1); |
g_hidden(1.0, 1.0, 0.4, -1.0, 1.0, 5.0, 25.0, 20.0, 20.0, 20.0, 150.0, 100.0, u[0], nx + 1, ny + 1, 1, G_SIDE_NONE, 2, 1); |
桂田 祐史