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

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

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

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

Q&A

解決済

3回答

413閲覧

キーの入力により動きが変わる処理を関数に

fute

総合スコア1

C

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

0グッド

0クリップ

投稿2021/01/02 18:13

前提・実現したいこと

キーを入力することで動きを変えるものを作ろうとしています。
この処理を関数にすることが必要です。
エラーメッセージの意味がわからないので何をどう直せばいいのかがわからないです。

発生している問題・エラーメッセージ

assigning to 'Pacman' (aka 'struct Pacman') from incompatible type 'int' pac = pacKeyIn(pac); // キー入力に反応する

該当のソースコード

c言語(長くなるので関係ない部分は省きました)

1 2typedef struct Pacman { 3 double x, y; 4 double size; 5 double dx, dy; 6} Pacman; 7 8int pacKeyIn(Pacman pac) { 9 10 hgevent *event = HgEventNonBlocking(); 11 12 if(event != NULL && event->type == HG_KEY_DOWN) { 13 14 switch(event->ch) { 15 16 case 'i': pac.dx = 0.0; pac.dy = PAC_STEP; break; 17 case 'k': pac.dx = 0.0; pac.dy = -PAC_STEP; break; 18 case 'j': pac.dx = -PAC_STEP; pac.dy = 0.0; break; 19 case 'l': pac.dx = PAC_STEP; pac.dy = 0.0; break; 20 } 21 } 22 return 0; 23} 24 25//(((この間に他の関数などが並んでますが長くなるので省きました))) 26 27int main() { 28 29 HgOpen(400.0, 400.0); 30 31 Pacman pac; // Pacman 構造体を用意する 32 pac=pacSetup(200.0, 200.0, 20.0, -8.0, 5.0); 33 34 35 while(1) { 36 37 HgClear(); // 画面を消去 38 pac = pacKeyIn(pac); // キー入力に反応する (((ここがエラーの部分です))) 39 pac = pacMove(pac); // 移動させる 40 41 if( pac.dx < 0.0 ) { 42 pac_left(pac); // 描画する 43 44 } else { 45 pac_right(pac); 46 } 47 48 if( hitWall(pac) == 1 ) break; // 衝突判定 49 50 HgSleep(0.1); // 少し待つ 51 } 52} 53 54

試したこと

エラーメッセージを翻訳したり、コピーして調べましたがそれでも意味がわかりませんでした。

補足情報

main以降は教材のままなので間違っていないと思います。

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

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

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

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

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

guest

回答3

0

main以降は教材のままなので間違っていないと思います。

mainを変更しないとなると、

Pacman pac; // Pacman 構造体を用意する ... pac = pacKeyIn(pac); // キー入力に反応する (((ここがエラーの部分です)))

コレ↑がコンパイルされにゃならんのだから、関数 pacKeyIn() の戻り値は Pacman でなきゃならんです。

投稿2021/01/03 02:18

episteme

総合スコア16614

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

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

0

ベストアンサー

Google翻訳

互換性のない型「int」から「Pacman」(別名「structPacman」)に割り当てる

pacはPacman型(typedefで struct PackmanのことをPacman型という名前にしていますね)の変数です。

pacKeyin関数を
int pacKeyIn(Pacman pac) {
として定義しましたから、関数はint型の値を返します。

Pacman型の変数にint型の値を代入...出来ません、というのがエラーの読み解きです。

main以降は教材のままなので間違っていないと思います。

というより、mainが間違いにならないようにそれ以外を作りなさい、ということでしょう?

Pacman型に代入出来るのはPacman型ですから、関数はPacman型を返すようにしましょう。
main関数から、
Pacman pacKeyIn(Pacman pac) {
にしなければいけない、ということが決まります。
pacSetup関数やpacMove関数も同様の条件ですね。それらはエラーになっていないのなら、それが参考になるでしょう。

投稿2021/01/03 00:39

thkana

総合スコア7659

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

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

fute

2021/01/03 05:13

main以降についてですが、確かにその様な感じの課題ですが少しやりやすいように手を加えてるので、一応間違っていないはずという意味で書かせて頂きました。 確かにあとの2つはその形でした。 それらは教材にその形で載っていたので出来ていました。 1番分かりやすく解決策まで書いて頂けたのでベストアンサーにさせて頂きました。 ありがとうございます。
guest

0

pac = pacKeyIn(pac); // キー入力に反応する

pacKeyIn関数の戻り値はintです。
ところが、これをpacに代入してしまってますね

投稿2021/01/02 20:35

編集2021/01/02 20:36
y_waiwai

総合スコア87800

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問