プログラムの実行中にサイズを選べるようにするには、 行列を 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;
}