大学でC言語を勉強し、プログラミング歴1年未満の初心者です。
以下のコードのmain関数内の行列の掛け算を行うような関数mat_mulを作りたいのですが、うまくいかないので問題点を指摘していただきたいです。
#include<stdio.h>
#define ROW 3
#define COL 3
#define SUM 3
void mat_mul(float*,float*);
void mat_mul(float *a ,float *b){
int i,j,k; float c[100][100]={0}; for(i=0;i<ROW;i++){ for(j=0;j<COL;j++){ for(k=0;k<SUM;k++){ *(*(c+i)+j) += *(*(a+i)+k) * *(*(b+k)+j); } } } return c;
}
int main (void){
float mat[100][100]={ {1.0, 2.0, 3.0} , {4.0, 5.0, 6.0} , {7.0, 8.0, 9.0} }; float mat_pro[100][100]={0}; int i,j,k; //A*A for(i=0;i<ROW;i++){ for(j=0;j<COL;j++){ for(k=0;k<SUM;k++){ *(*(mat_pro+i)+j) += *(*(mat+i)+k) * *(*(mat+k)+j); } } } //出力 for(i=0;i<ROW;i++){ for(j=0;j<COL;j++){ if(j==2){ printf("%f\n",*(*(mat_pro+i)+j)); }else{ printf("%f ",*(*(mat_pro+i)+j)); } } } return 0;
}
mat_mul関数内の*(*(c+i)+j) += ((a+i)+k) * ((b+k)+j);でポインタの付け忘れというエラーが出てしまいます。
今回main関数内はこれはこれでいいのですが、最終的にはmat_mul関数を使ってmain関数内をもっとコンパクトにしたいです。
自分で調べたところ、こちらのサイト
http://bituse.info/c/30
を参考にしたのですが・・・。
疑問点として
①引数のポインタを2次元配列にしたい場合はどこで決めるべきなのか?
void func(int *temp){
のように書く場合、tempが2次元というのはどこで決めるべき?
②戻り値をポインタにした場合、main関数内でmat_mul(*a,*a)はmat_mul関数内でいうcの先頭アドレスを指すのか?
③void func(int*);の意味、必要性
以上の内容を踏まえて、正しい書き方を教えてください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/15 16:27