ポインター配列の方法で、行列を確保する関数 new_matrix()
を以
下に示す。
/* * test3.c --- GLSC で使うために連続した領域を確保することにした。 */ #include <stdio.h> #include <math.h> typedef double scalar; typedef scalar *vector; typedef vector *matrix; static maxm = 0; /* m行n列の行列を作る */ matrix new_matrix(m, n) int m, n; { int i; matrix a; vector abody; if ((a = (matrix)malloc((m + 1) * sizeof(vector))) == NULL) return NULL; if ((abody = (vector)malloc(m * n * sizeof(scalar))) == NULL) return NULL; for (i = 0; i < m; i++) { a[i] = abody; abody += n; } a[m] = NULL; if (m > maxm) maxm = m; return a; } void del_matrix(a) matrix a; { int i; vector atop; atop = a[0]; for (i = 0; i <= maxm; i++) { if (a[i] == NULL) break; if (a[i] < atop) atop = a[i]; } free(atop); free(a); } int main() { int m,n,i,j; matrix a; printf("m,n: "); scanf("%d %d", &m, &n); a = new_matrix(m,n); if (a == NULL) { fprintf(stderr, "new_matrix() に失敗\n"); exit(1); } kuku(a,m,n); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("a[%d][%d]=%g ", i, j, a[i][j]); printf("\n"); } del_matrix(a); return 0; } kuku(a,m,n) matrix a; int m,n; { int i,j; for (i = 0; i < m; i++) for (j=0; j < n; j++) a[i][j] = (i + 1) * (j + 1); } #ifdef __TURBOC__ double dummy() { return sin(0.0); } #endif