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

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

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

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

Q&A

1回答

1320閲覧

三次元ベクトルを表す構造体の演算プログラム

sinnjinndesuga

総合スコア0

C

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

0グッド

0クリップ

投稿2022/07/10 20:04

編集2022/07/10 22:27

構造体へのポインタの受け渡し方をよく理解していないため、このような書き方しかできませんでした。ド素人質問で申し訳ないのですが、下記のプログラムを手直ししていただけないでしょうか。
答えが表示すらされない状況です。
returnとprintV3とprintfをちょこちょこいじったのでさらにわからなくなりました。

エラーコード
??.c: In function ‘v3k’:
??.c:40:9: warning: ‘return’ with a value, in function returning void
40 | return ( r);
| ^
??.c:34:6: note: declared here
34 | void v3k( double k, V3 *p, V3 *r)
| ^~~
??.c: In function ‘v2k’:
??.c:45:18: warning: implicit declaration of function ‘v3abs’ [-Wimplicit-function-declaration]
45 | r->wx = p->wx / v3abs( p);
| ^~~~~
??.c: At top level:
??.c:50:8: error: conflicting types for ‘v3abs’
50 | double v3abs( V3 *p)
| ^~~~~
??.c:45:18: note: previous implicit declaration of ‘v3abs’ was here
45 | r->wx = p->wx / v3abs( p);
| ^~~~~
??.c: In function ‘v3t’:
??.c:57:16: warning: implicit declaration of function ‘v3ip’ [-Wimplicit-function-declaration]
57 | return( acos( v3ip( p, q) / v3abs( p) * v3abs( q)));
| ^~~~
??.c: In function ‘v3cp’:
??.c:66:9: warning: ‘return’ with a value, in function returning void
66 | return ( r);
| ^
??.c:60:6: note: declared here
60 | void v3cp( V3 *p, V3 *q, V3 *r)
| ^~~~
??.c: At top level:
??.c:69:8: error: conflicting types for ‘v3ip’
69 | double v3ip( V3 *p, V3 *q)
| ^~~~
??.c:57:16: note: previous implicit declaration of ‘v3ip’ was here
57 | return( acos( v3ip( p, q) / v3abs( p) * v3abs( q)));
| ^~~~
??.c: In function ‘main’:
??.c:93:10: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘double *’
-Wformat=]
93 | scanf("%d", &k);
| ~^ ~~
| | |
| | double *
| int *
| %le
??.c:94:9: warning: too many arguments for format [-Wformat-extra-args]
94 | printf("定数倍 k * a", &c);
| ^~~~~~~~~~~~~~~~~
??.c:96:2: warning: implicit declaration of function ‘v3u’; did you mean ‘v3t’? [-Wimplicit-function-declaration]
96 | v3u(&a, &c);
| ^~~
| v3t
??.c:106:19: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘struct _v3 *’ [-Wformat=]
106 | printf("外積%.2f", &c);
| ~~~^ ~~
| | |
| | struct _v3 *
| double

「三次元ベクトルを表す構造体を定義して、この構造体の演算のための関数を作る」

//------- 3次元ベクトルを扱うプログラム #include <stdio.h> #include<math.h> // 構造体の定義 struct _v3{ double wx; double wy; double wz; }; #define V3 struct _v3 // 関数の型の定義(プロトライプ宣言) void printV3( char *s, V3 *p); // 二次元ベクトルの名前付き表示 void v3add( V3 *p, V3 *q, V3 *r); // 3次元ベクトルの足し算 r = p + q void v3sub( V3 *p, V3 *q, V3 *r); // 3次元ベクトルの引き算 r = p - q void v3k( double k, V3 *p, V3 *r); // 3次元ベクトルの定数倍 r = k * p void v3u( V3 *p, V3 *r); // 3次元ベクトルを単位ベクトルに r <- p/|p| double v3abs( V3 *p); // 3次元ベクトルの絶対値 double v3t( V3 *p, V3 *q); // 3つのベクトルのなす角 double v3cp( V3 *p, V3 *r); // 3次元ベクトルの外積 double v3ip( V3 *p, V3 *q); // 3次元ベクトルの内積 // 3次元ベクトルの表示 void printV3( char *s, V3 *p) { printf("%s = (%.2f, %.2f, %.2f)\n", s, p->wx, p->wy, p->wz); } // 3次元ベクトルの和 void v3add( V3 *p, V3 *q, V3 *r) { r->wx = p->wx + q->wx; r->wy = p->wy + q->wy; r->wz = p->wz + q->wz; } // 3次元ベクトルの差 void v3sub( V3 *p, V3 *q, V3 *r) { r->wx = p->wx - q->wx; r->wy = p->wy - q->wy; r->wz = p->wz - q->wz; } // 3次元ベクトルの定数倍 void v3k( double k, V3 *p, V3 *r) { r->wx = k * p->wx; r->wy = k * p->wy; r->wz = k * p->wz; return ( r); } // 3次元ベクトルの単位ベクトル Unit vector void v2k( V3 *p, V3 *r) { r->wx = p->wx / v3abs( p); r->wy = p->wy / v3abs( p); r->wz = p->wz / v3abs( p); } // 3次元ベクトルの絶対値 double v3abs( V3 *p) { return( sqrt( p->wx * p->wx + p->wy * p->wy + p->wz * p->wz)); } // 3次元ベクトルのなす角 double v3t( V3 *p, V3 *q) { return( acos( v3ip( p, q) / v3abs( p) / v3abs( q))); } // 3次元ベクトルの外積 Cross product void v3cp( V3 *p, V3 *q, V3 *r) { r->wx = (p->wy * p->wz) - (p->wz * p->wy); r->wy = (p->wz * p->wx) - (p->wx * p->wz); r->wz = (p->wx * p->wy) - (p->wy * p->wx); return ( r); } // 3次元ベクトルの内積 Inner product double v3ip( V3 *p, V3 *q) { return( p->wx * q->wx * q->wz + p->wy * q->wy * q->wz); } int main( void) { double k, theta; // 3次元ベクトルの表示 V3 a = { 1.0, 3.0, 5.0}, b = { 4.0, 5.0, 6.0}, c; printV3( "a", &a); printV3( "b", &b); // 3次元ベクトルの和 v3add( &a, &b, &c); printV3( "和 a+b", &c); // 3次元ベクトルの差 v3sub( &a, &b, &c); printV3( "差 a-b", &c); // 3次元ベクトルの定数倍 v3k(k, &a, &c); printf("定数倍 k * a", &c); // 3次元ベクトルの単位ベクトル Unit vector v3u(&a, &c); printV3("単位ベクトル", &c); // 3次元ベクトルの絶対値 v3abs( &a); printf("絶対値%.2f", v3abs( &a)); // 3次元ベクトルのなす角 Theta v3t( &a, &b); printf("なす角", &c); // 3次元ベクトルの外積 Cross product v3cp( &a, &b, &c); printf("外積", &c); // 3次元ベクトルの内積 Inner product v3ip( &a, &b); printf("内積", &c); }

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

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

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

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

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

int32_t

2022/07/10 21:30

現状どんな問題があるんでしょうか。 コード全体を ``` と ```で囲ってください。
sinnjinndesuga

2022/07/10 21:43

コード全体 ``` //------- 3次元ベクトルを扱うプログラム #include <stdio.h> #include<math.h> // 構造体の定義 struct _v3{ double wx; double wy; double wz; }; #define V3 struct _v3 // 3次元ベクトルの表示 void printV3( char *s, V3 *p) { printf("%s = (%.2f, %.2f, %.2f)\n", s, p->wx, p->wy, p->wz); } // 3次元ベクトルの和 void v3add( V3 *p, V3 *q, V3 *r) { r->wx = p->wx + q->wx; r->wy = p->wy + q->wy; r->wz = p->wz + q->wz; } // 3次元ベクトルの差 void v3sub( V3 *p, V3 *q, V3 *r) { r->wx = p->wx - q->wx; r->wy = p->wy - q->wy; r->wz = p->wz - q->wz; } // 3次元ベクトルの定数倍 void v3k( double k, V3 *p, V3 *r) { r->wx = k * p->wx; r->wy = k * p->wy; r->wz = k * p->wz; return ( r); } // 3次元ベクトルの単位ベクトル Unit vector void v2k( V3 *p, V3 *r) { r->wx = p->wx / v3abs( p); r->wy = p->wy / v3abs( p); r->wz = p->wz / v3abs( p); } // 3次元ベクトルの絶対値 double v3abs( V3 *p) { return( sqrt( p->wx * p->wx + p->wy * p->wy + p->wz * p->wz)); } // 3次元ベクトルのなす角 double v3t( V3 *p, V3 *q) { return( acos( v3ip( p, q) / v3abs( p) * v3abs( q))); } // 3次元ベクトルの外積 Cross product void v3cp( V3 *p, V3 *q, V3 *r) { r->wx = (p->wy * q->wz) - (q->wz * p->wy); r->wy = (p->wz * q->wx) - (q->wx * p->wz); r->wz = (p->wx * q->wy) - (q->wy * p->wx); return ( r); } // 3次元ベクトルの内積 Inner product double v3ip( V3 *p, V3 *q) { return( p->wx * q->wx * q->wz + p->wy * q->wy * q->wz); } int main( void) { double k, theta; printf("課題33 2022/07/06 21F2023C 坂本 美佑\n\n"); // 3次元ベクトルの表示 V3 a = { 1.0, 3.0, 5.0}, b = { 4.0, 5.0, 6.0}, c; printV3( "a", &a); printV3( "b", &b); // 3次元ベクトルの和 v3add( &a, &b, &c); printV3( "和 a+b", &c); // 3次元ベクトルの差 v3sub( &a, &b, &c); printV3( "差 a-b", &c); // 3次元ベクトルの定数倍 v3k(k, &a, &c); scanf("%d", &k); printf("定数倍 k * a", &c); // 3次元ベクトルの単位ベクトル Unit vector v3u(&a, &c); printV3("単位ベクトル%.2f", &c); // 3次元ベクトルの絶対値 v3abs( &a); printf("絶対値%.2f", v3abs( &a)); // 3次元ベクトルのなす角 Theta v3t( &a, &b); printf("なす角%.2f", v3t( &a, &b)); // 3次元ベクトルの外積 Cross product v3cp( &a, &b, &c); printf("外積%.2f", &c); // 3次元ベクトルの内積 Inner product printf("内積%.2f", v3ip( &a, &b)); } ``` 答えが表示すらされない状況です。 returnとprintV3とprintfをちょこちょこいじったのでさらにわからなくなりました。
int32_t

2022/07/10 21:57

コードをコメントに書かず、質問文を更新してください。 コメントでは ``` は使えません。
sinnjinndesuga

2022/07/10 22:08

利用方法がわからないままint32_tさんのお手を煩わせてしまいまして申し訳ございません。 よろしくお願いいたします。
int32_t

2022/07/10 22:13

v3k() と v3cp() でコンパイルエラーが出ませんか? コンパイルできているなら、printV3( "b", &b); で b の内容は表示できていますか?
sinnjinndesuga

2022/07/10 22:19

コンパイルエラーが下のように出ます。 note: declared here 34 | void v3k( double k, V3 *p, V3 *r) conflicting types for ‘v3abs’ 50 | double v3abs( V3 *p) previous implicit declaration of ‘v3abs’ was here 45 | r->wx = p->wx / v3abs( p); declared here 60 | void v3cp( V3 *p, V3 *q, V3 *r) conflicting types for ‘v3ip’ 69 | double v3ip( V3 *p, V3 *q) previous implicit declaration of ‘v3ip’ was here 57 | return( acos( v3ip( p, q) / v3abs( p) * v3abs( q)));
int32_t

2022/07/10 22:23

エラーメッセージをすべて省略なく質問文に追記してください。
int32_t

2022/07/10 23:29

> ??.c: In function ‘v2k’: > ??.c:45:18: warning: implicit declaration of function ‘v3abs’ [-Wimplicit-function-declaration] > 45 | r->wx = p->wx / v3abs( p); > | ^~~~~ > n??.c: At top level: > ??.c:50:8: error: conflicting types for ‘v3abs’ 質問文のコードでこのエラーが出るとは考えられないのですが、このエラーは質問文のソースコードに対して出たもので間違いないですか? 他のエラーに関して、ご自身ではまったく対処不能ですか?
BeatStar

2022/07/10 23:34

ヒント: [質問者さんが学ぶべきこと] ■ 関数とは ■ 関数の書き方 ■ 戻り値とは ■ 関数の型とは ■ (戻り値扱いの)引数としてのポインタ ■ ポインタを介したアクセス
jimbe

2022/07/11 03:37

> 下記のプログラムを手直ししていただけないでしょうか teratail は依頼する場所では無いと思います。
guest

回答1

0

まず個別のメッセージについて解説します。次にどうすればいいのかを解説します。


ではエラーメッセージです
なお、殆どがただ日本語訳しただけです。すでにわかっている場合は読み飛ばしてください。


??.c: In function ‘v3k’: ??.c:40:9: warning: ‘return’ with a value, in function returning void 40 | return ( r); | ^ ??.c:34:6: note: declared here 34 | void v3k( double k, V3 *p, V3 *r) | ^~~

返り値の型がvoidなのに、値を返そうとしていると指摘されています。


??.c: In function ‘v2k’: ??.c:45:18: warning: implicit declaration of function ‘v3abs’ [-Wimplicit-function-declaration] 45 | r->wx = p->wx / v3abs( p); | ^~~~~ ??.c: At top level: ??.c:50:8: error: conflicting types for ‘v3abs’ 50 | double v3abs( V3 *p) | ^~~~~ ??.c:45:18: note: previous implicit declaration of ‘v3abs’ was here 45 | r->wx = p->wx / v3abs( p); | ^~~~~

これはちょっと私の環境では出ませんでした。
たぶんあなたが動かしているコードと(私が見た時点での)質問文のコードが食い違っています


??.c: In function ‘v3t’: ??.c:57:16: warning: implicit declaration of function ‘v3ip’ [-Wimplicit-function-declaration] 57 | return( acos( v3ip( p, q) / v3abs( p) * v3abs( q))); | ^~~~

これも私の環境では出ませんでした。


??.c: In function ‘v3cp’: ??.c:66:9: warning: ‘return’ with a value, in function returning void 66 | return ( r); | ^ ??.c:60:6: note: declared here 60 | void v3cp( V3 *p, V3 *q, V3 *r) | ^~~~

返り値の型がvoidなのに、値を返そうとしていると指摘されています。


??.c: At top level: ??.c:69:8: error: conflicting types for ‘v3ip’ 69 | double v3ip( V3 *p, V3 *q) | ^~~~ ??.c:57:16: note: previous implicit declaration of ‘v3ip’ was here 57 | return( acos( v3ip( p, q) / v3abs( p) * v3abs( q))); | ^~~~

これも私の環境では出ませんでした。


??.c:93:10: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘double *’ -Wformat=] 93 | scanf("%d", &k);

これも私の環境では出ませんでしたが、
%dだから続く引数にint*がくるはずなのに、double *が渡されていると指摘されています。


??.c:94:9: warning: too many arguments for format [-Wformat-extra-args] 94 | printf("定数倍 k * a", &c); | ^~~~~~~~~~~~~~~~~

引数が多すぎます。
なぜかといえば"定数倍 k * a"の中に%なんとかが無いからです。


??.c:106:19: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘struct _v3 *’ [-Wformat=] 106 | printf("外積%.2f", &c); | ~~~^ ~~ | | | | | struct _v3 * | double

これも私の環境では出ませんでしたが、
%fだから続く引数にdoubleが来るはずなのに、実際にはstruct_V3が来たと指摘されています。


ではどうすればいいのかを解説します。
とはいえ具体的なコードについてはエラーメッセージの通り直せばいいだけなので
ここではアドバイス程度のことにとどめます。

「一つ関数を実装するたびに、その関数が正しく動くことを確認してから次の関数を実装してください。」

そのようにすれば新しい関数を実装してなにか問題が発生したとしても、
かなりの確率で前に動作を確認してから書き足したところに問題があるとわかります。

言われなくともすでに実践していた場合は申し訳ありません。
ですがエラーメッセージの出方と質問文から漂う空気感から実践できていない雰囲気を感じました。

投稿2022/07/11 00:27

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問