3.12.4 prog12b.c

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



桂田 祐史