行列の和の計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
朝比奈
記事: 3
登録日時: 7ヶ月前

行列の和の計算

#1

投稿記事 by 朝比奈 » 7ヶ月前

大学の課題で行列の和の計算をするコードを書いているのですがこのようなコードを書いたらエラーが起こります。

コード:

#include <stdio.h>

float func_add(float, float);

int main(){
    
    /*変数の宣言*/
    int n,m;
    
    n=2;
    m=3;
    
    /*配列変数の宣言*/
    float a[n][m],b[n][m],c[n][m];
    
    /*カウンタ用変数の宣言*/
    int i,j;
    
    a[0][0]=2.3;a[0][1]=0.2;a[0][2]=0.1;
    a[1][0]=-0.3;a[1][1]=0.0;a[1][2]=-0.5;
    
    b[0][0]=-1.0;b[0][1]=-0.1;b[0][2]=1.8;
    b[1][0]=0.0;b[1][1]=2.2;b[1][2]=2.5;
    
    /*行列の和を計算*/
    for(i=0; i<n; i=i+1){
        for(j=0; j<m; j=j+1){
            
            c[i][j]=func_add(a[i][j], b[i][j]);
        }
    }
    
    /*行列aの表示*/
    printf("a=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",a[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    /*行列bの表示*/
    printf("b=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",b[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    /*行列cの表示*/
    printf("c=a+b=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",c[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    return 0;    

}

/*関数func_add*/
/*変数の宣言*/
    int o,p;
    float func_add(float x[o][p], float y[o][p]){
        
    float z[o][p];
    o=2;
    p=3;
    
    /*カウンタ用変数の宣言*/
    int i,j;
    
    /*行列の和を計算*/
    for(i=0; i<o; i=i+1){
        for(j=0; j<p; j=j+1){
            
            z[i][j]=x[i][j]+y[i][j];
        }
    }
    return z[o][p]; 
        
    }
エラーの内容は
main.c:76:11: error: conflicting types for ‘func_add’
float func_add(float x[o][p], float y[o][p]){
^~~~~~~~
main.c:3:7: note: previous declaration of ‘func_add’ was here
float func_add(float, float);
^~~~~~~~
となります。
プロトタイプ宣言をしているはずなのにどうしてこのようなエラーが起こるのかがどうしてもわかりません。コンパイラはonline GDBを使用しています

アバター
usao
記事: 1635
登録日時: 7年前

Re: 行列の和の計算

#2

投稿記事 by usao » 7ヶ月前

> どうしてこのようなエラーが起こるのか

エラーメッセージの通りだと思いますが.

あなたは,

コード:

float func_add(float, float);
として,関数func_addの型を宣言しました.
つまり,
「関数 func_add とは,引数はfloat型が2つで,戻り値はfloat型であるぞ!」とコンパイラに対して声高に宣言したのです.

にもかかわらず,あなたは
先の宣言とは矛盾した(型の異なる)関数func_addの定義を記述しました.

それを見たコンパイラからすれば,「は? さっきの宣言とちがくね?」となるわけです.

Butter
記事: 15
登録日時: 8ヶ月前
住所: <個人情報保護法に基づき削除されました>(適当)

Re: 行列の和の計算

#3

投稿記事 by Butter » 7ヶ月前

mとn、oとpは最初に代入した2、または3から
変わってませんよね?
最初から#defineとかで定数にした方が
良いんじゃ無いですか?

というかC言語ってサイズに変数を使って
配列を宣言出来ましたっけ…
(動的メモリ確保は別として)
C言語歴1年弱の中学生です
・dxlib中心にやってるので、たまに不可解な発言をします
・実行チェックはしない主義。時間が無いので…(言い訳)
どうぞよろしくお願いします
By Butter.

朝比奈
記事: 3
登録日時: 7ヶ月前

Re: 行列の和の計算

#4

投稿記事 by 朝比奈 » 7ヶ月前

どのように訂正すればいいのでしょうか。
プログラミングを初めて1か月程度しかたっていない初心者なので申し訳ありません…

Math

Re: 行列の和の計算

#5

投稿記事 by Math » 7ヶ月前

コード:

#include <stdio.h>

#define n 2
#define m 3

float func_add(float, float );

int main(){

    /*変数の宣言*/
    //int n,m;
    
    // int n=2;
    // int m=3;
    
    /*配列変数の宣言*/
    float a[n][m],b[n][m],c[n][m];
    
    /*カウンタ用変数の宣言*/
    int i,j;

    a[0][0]=2.3;a[0][1]=0.2;a[0][2]=0.1;
    a[1][0]=-0.3;a[1][1]=0.0;a[1][2]=-0.5;
    
    b[0][0]=-1.0;b[0][1]=-0.1;b[0][2]=1.8;
    b[1][0]=0.0;b[1][1]=2.2;b[1][2]=2.5;
    
    /*行列の和を計算*/
    for(i=0; i<n; i=i+1){
        for(j=0; j<m; j=j+1){
            
            c[i][j]=func_add(a[i][j], b[i][j]);
        }
    }
    
    /*行列aの表示*/
    printf("a=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",a[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    /*行列bの表示*/
    printf("b=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",b[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    /*行列cの表示*/
    printf("c=a+b=\n");
    for(i=0; i<n; i=i+1){
        printf("[");
        for(j=0; j<m; j=j+1){
            
            printf("%5.2f",c[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
    
    return 0;    

}

/*関数func_add*/
/*変数の宣言*/
//    int o,p;
//    float func_add(float x[o][p], float y[o][p]){




    float func_add(float x, float y){        
    
        return x+y;
    }

コード:

C:\20\z\z2020\c>c1.exe
a=
[ 2.30 0.20 0.10]
[-0.30 0.00-0.50]

b=
[-1.00-0.10 1.80]
[ 0.00 2.20 2.50]

c=a+b=
[ 1.30 0.10 1.90]
[-0.30 2.20 2.00]


C:\20\z\z2020\c>rem pause
C:\20\z\z2020\c>
#3の方が言われるように
”#defineで定数にする”
https://www.math.nagoya-u.ac.jp/~naito/ ... atrix.html
なお関数で配列を返すのはむつかしいです
https://marycore.jp/prog/c-lang/return-array/

朝比奈
記事: 3
登録日時: 7ヶ月前

Re: 行列の和の計算

#6

投稿記事 by 朝比奈 » 7ヶ月前

うまく実行できました!教えていただきありがとうございます

返信

“C言語何でも質問掲示板” へ戻る