C言語関係掲示板

過去ログ

No.139.行列の掛け算


No.895

ポインタと関数について
投稿者---アキナ(2002/01/20 23:20:22)


ポインターと関数を使って4×4行列の掛け算の
プログラムを作りました。
もう少し簡略できるところはありませんか?
後、ポインターについて詳しく説明されている
HPがあれば教えてください。よろしくお願いします。

#include <stdio.h>
void kakezan (int * ,int * ,int *);
main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int b[3][3]={{10,9,8},{7,6,5},{4,3,2}};
int c[3][3];
int *(a_pnt),*(b_pnt),*(c_pnt);

a_pnt=&a[0][0];
b_pnt=&b[0][0];
c_pnt=&c[0][0];
kakezan(a_pnt,b_pnt,c_pnt);
printf("C=\n");
printf("|%d %d %d|\n",*(c_pnt),*(c_pnt+1),*(c_pnt+2));
printf("|%d %d %d|\n",*(c_pnt+3),*(c_pnt+4),*(c_pnt+5));
printf("|%d %d %d|\n",*(c_pnt+6),*(c_pnt+7),*(c_pnt+8));
}

void kakezan(int *x, int *y, int*z){
int i,j,k,d;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
d=0;
for(k=0;k<3;k++){
d=d+*(x+3*i+k)**(y+k*3+j);
}

*(z+i*3+j)=d;
}
}
}


No.896

Re:ポインタと関数について
投稿者---kikk(2002/01/21 00:46:59)


ども。


>int *(a_pnt),*(b_pnt),*(c_pnt);
>
>a_pnt=&a[0][0];
>b_pnt=&b[0][0];
>c_pnt=&c[0][0];
>kakezan(a_pnt,b_pnt,c_pnt);

これは冗長。直接、kakezan(a[0],b[0],c[0])でいいのでは。ついでに
言うと、ポインタを宣言するとき、上記ような()でくくるのも冗長では。


>printf("|%d %d %d|\n",*(c_pnt),*(c_pnt+1),*(c_pnt+2));
>printf("|%d %d %d|\n",*(c_pnt+3),*(c_pnt+4),*(c_pnt+5));
>printf("|%d %d %d|\n",*(c_pnt+6),*(c_pnt+7),*(c_pnt+8));

forをつかうともう少し簡単に(というかきれいに)書けます。あと、行列の
仕切りは'|'ではなく'['と']'でくくったほうが、行列式ないしノルムと区別
がつくので、個人的にはいいようにおもいます。


>void kakezan(int *x, int *y, int*z){

#define N 3 /* 扱う行列のサイズ */

としておいて

void kakezan(int x[N][N], int y[N][N], int z[N][N])

で設計したほうが、自分でアドレス計算しなくていいので、アルゴリズムが
素直に書けます。この場合、呼び出しは

kakezan(a,b,c);

となります。あと、Nは他のところでも使えますね。


ポインタの詳しい説明のあるHPを、とのことですが、ここのHPでは
足りませんか?足りないのであれば何についてが足りない(知りたい)
のでしょうか(題名からすると、関数呼び出しまわりでしょうか)?


では。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.02.03
Copyright(c) 2000-2002 TOMOJI All Rights Reserved