ポインター配列の方法で、行列を確保する関数 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