next up previous contents
Next: この文書について... Up: B. C 言語と行列 Previous: B.4 二つの方法の優劣

B.5 サンプル・プログラム

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


next up previous contents
Next: この文書について... Up: B. C 言語と行列 Previous: B.4 二つの方法の優劣
Masashi Katsurada
平成17年6月2日