質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1203閲覧

値を正確に渡すことができません。

Red_Bull

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/10/05 14:42

編集2021/10/05 15:30

2×3と3×2の2次行列の積を求めるコードが書きたいのですが、
bの部分を__mul_array__に正確に伝えることができません。
なぜこのようなことが起こっているのかを教えていただきたいです。

c

1 2#include <stdio.h> 3 4void mul_array( const int (*x)[3], const int (*y)[3], int (*ans)[3] ); 5 6int main(void) { 7 int i,j; 8 int a[2][3] = {1,2,3, 4,5,6}; 9 int b[3][2] = {1,5, 5,3, 8,1}; 10 int ans[2][2] = {0}; 11 12 mul_array(a,b,ans); 13 14 return (0); 15} 16 17void mul_array( const int (*x)[3], const int (*y)[3], int (*ans)[3] ) { 18 int a,b,i; 19 for(int a=0; a<2; a++) { 20 for(int b=0; b<2; b++) { 21 ans[a][b]=0; 22 for(int i=0; i<3; i++) { 23 24 printf("[%d,%d]",a,i); 25 printf("[%d,%d]",i,b); 26 printf("[%d]",x[a][i]); 27 printf("[%d]",y[i][b]); 28 putchar('\n'); 29 ans[a][b]+=x[a][i]*y[i][b]; 30 } 31 } 32 } 33} 34

terminal

1[0,0][0,0][1][1] 2[0,1][1,0][2][3] 3[0,2][2,0][3][0] 4[0,0][0,1][1][5] 5[0,1][1,1][2][8] 6[0,2][2,1][3][0] 7[1,0][0,0][4][1] 8[1,1][1,0][5][3] 9[1,2][2,0][6][0] 10[1,0][0,1][4][5] 11[1,1][1,1][5][8] 12[1,2][2,1][6][0]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WoodenHamlet

2021/10/06 02:46

別に大したことじゃないけど、mul_array で i が二度宣言されてて、片方しか使われてないなら最初に宣言した方は消した方が良いんじゃないかな
guest

回答1

0

ベストアンサー

void mul_array( const int (*x)[3], const int (*y)[3], int (*ans)[3] );

(*y)[2]ではないですか?

投稿2021/10/05 14:46

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Red_Bull

2021/10/05 15:29

そこに部分が指定されていて他の部分を考える問題なのでそこは変更できないんです...すみません。
itagagaki

2021/10/05 15:54 編集

(?) 日本語の意味がわかりませんが…。謝られても困りますし。 とにかく、仮引数の型 const int (*)[3] と実際に渡しているデータの型 int (*)[2] とが異なっているので、そりゃおかしくなるのは当たり前だとしか言えません。 const int (*y)[3] は、int [3] を指すポインタですから y[1] は y からint 3つ分先のアドレスになります。 しかし本当は y[1]は y からint 2つ分先のアドレスになってほしいのではないですか? int b[3][2]; と定義した b を渡すのですから。
Red_Bull

2021/10/05 15:54

void mul_array( const int (*x)[3], const int (*y)[3], int (*ans)[3] ); を用いて2×3,3×2の積を求めるという問題を解いているという意味です。 ちなみに(*y)[2]に変更したのですができませんでした。
itagagaki

2021/10/05 16:00

それなら y として int b[3][2]; と定義した b を渡しているのが間違いです。 理由は上記のコメントを読んでください。 質問のタイトルは「値を正確に渡すことができません。」とありますが、 渡している b は配列データではなく、配列データのアドレスです。 アドレスとして b は正確に渡されているはずです。 そのアドレスの指すデータは何かという定義が、仮引数 const int (*y)[3] では int [3] となります。
Red_Bull

2021/10/05 16:28

宣言の部分を int a[3][3] = {1,2,3, 4,5,6, 0,0,0}; int b[3][3] = {1,5,0, 5,3,0, 8,1,0}; int ans[3][3] = {0}; にすることしか思い浮かばなかったのですが、他の解き方はありますか...?
itagagaki

2021/10/05 16:44

Cプログラムとしては関数mul_arrayに渡すデータはそんな風に定義するのが順当かと思います。 たぶん課題の意図は2×3行列と3×2行列の積を3x3行列と3x3行列の積の計算に当てはめて考えなさいということのようなので、行列の拡張のしかたがそれで良いかどうかは検証してみてください。
fana

2021/10/06 02:12 編集

関数 mul_array って何をする物なのか? というのが謎すぎる(各引数の型と内部での扱い具合とか). 「この関数を用いて何かをする」という話をするためには,まずはそこをはっきりさせるべき. (「この関数を使ってやれ」という指定があるなら,そこのところの説明がありそうに思いますが,どうなんでしょう? そこもコードを読んで判断しろ,という話なのでしょうか?) 例えば,mul_array に関して, 「各引数は 3x3 なのだけども, 処理としては 2x3 と 3x2 の積を計算して ans の左上の2x2 部分だけを更新するぜ! っていう関数なのである!!」 とか何とかいう前提の話が存在するのであれば,黙って 3x3 の形で引数を用意して与える以外にやることはないわけで(何故ならば「引数は 3x3 だぞ」とされているのだから).
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問