:
明確にするため、以下の画像をご覧下さい。理由だけタイプの、行列の要素が依然としてa[i][j]
として書き込まれること
typedef int **matrix;
注:
我々は、第1のタイプint **
ように、ダブルポインタとしてタイプmatrix
を定義しますa
がポインタの配列へのポインタの代わりに配列の配列である場合のように。
この定義では、我々はいくつかの行列関数を定義することができます。
#include <stdio.h>
#include <stdlib.h>
matrix
alloc_matrix(int n, int m) {
int i;
matrix a;
a = (int **) malloc(n*sizeof(int *));
for (i = 0; i < n; i++)
a[i] = (int *) malloc(m*sizeof(int));
return a;
}
void
free_matrix(matrix a, int n, int m) {
int i;
for (i = 0; i < n; i++)
free(a[i]);
free(a);
}
void
print_matrix(matrix a, int n, int m) {
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
printf("%d%s", a[i][j], j < m - 1 ? " " : "\n");
}
void
set_const_matrix(matrix a, int n, int m, int c) {
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
a[i][j] = c;
}
void
multiply_matrices(matrix a, matrix b, int n, int m, int l, matrix ab) {
int i, j, k;
int sum;
for (i = 0; i < n; i++)
for (k = 0; k < l; k++) {
sum = 0;
for (j = 0; j < m; j++)
sum += a[i][j] * b[j][k];
ab[i][k] = sum;
}
}
その後、我々はまた、あなたのthree address呼び出し規約を使用してmultiply_matrices
をinvoes機能multiply_triple
を持っている:
void
multiply_triple(int ***p, int n, int m, int l) {
multiply_matrices(p[0], p[1], n, m, l, p[2]);
}
最後に我々がこれをテストあなたの質問の図の中のマトリックス:
int
main() {
int ***p, i;
p = (matrix *) malloc(3*sizeof(matrix));
for (i = 0; i < 3; i++)
p[i] = alloc_matrix(3, 3);
set_const_matrix(p[0], 3, 3, 1);
set_const_matrix(p[1], 3, 3, 1);
multiply_triple(p, 3, 3, 3);
print_matrix(p[2], 3, 3);
return 0;
}
確かにこれはあなたの写真からの出力が得られます。
3 3 3
3 3 3
3 3 3
あなたは柔軟性があなたの行列は非正方形である必要があり、あるいは寸法が世界的に固定したいしたくない場合は、あなたがの一部またはすべてを省略することができますn
,m
およびl
のパラメータ。
構造体の境界でダブルポインタをパックし、結果をそれ自体で割り当てるなどしてもかまいません。しかし、あなたは "トリプルポインタ"アプローチをもう利用できません。
あなた自身で問題を解決しようとしましたか?はいの場合は、試した内容を投稿し、どこに問題があるのかを説明してください。 See [ask]。 –
いいえ、それはポインタのコンセプトを使用して実装できるので、それについて考えてみましょう。私はゴランでそれを試しています。 –
あなたが試したことを投稿すると、ここで助けを受ける可能性が高くなります。何の努力もしていない質問を投稿することはあまり役に立ちません。 –