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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1614閲覧

少し複雑なC言語です。

kohaku_

総合スコア0

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/30 09:21

編集2020/07/30 12:04

移動する順番を求めるプログラムです
説明はわかりやすく書いています。
エラー部分の内容の修正と、プログラム自体の考えはあっているのか教えて頂きたいです。
色々と考えましたが、これ以降わかりません。
距離は三角法です。

コード #include<stdio.h> #include <math.h> #define sqr(n) ((n)*(n)) typedef struct{ int num; /*家番号*/ double x; /*家の座標*/ double y; double distance; /*現在地から家までの距離*/ double weight; /*家への荷物の重さ*/ int compe; /*完了状況*/ }deliver; /*最初の荷物の重さ求める*/ void deliv_w(int num,double *weight){ int i; double sum=0.0; for(i=0;i<num;i++){ sum+=weight[i]; } } /*家までの距離を算出して、それぞれの距離を出力*/ double span(deliver pa,deliver pb) { int i,n; for(i=0;i<n;i++){ return sqrt(sqr(pa.x-pb.x)+sqr(pa.y-pb.y)); } } /*最短の家番号を出力*/ int effort(double *xpos, double *ypos,deliver c){ *xpos=c.x; *ypos=c.y; printf("%d\n",c.num); } /*変更される各データを設定*/ int deliv_c(deliver *c,deliver dest){ double d=span(c->num,dest); /*移動距離*/ if(0>=c->weight) /*重さが0*/ return 0; /*終了*/ c->num=dest; /*今いる位置を更新*/ c->weight-=d; /*重さを更新*/ return 1; } int main(void) { int i; deliver data[]= {{0,4.0,7.5,0.0,0.0,0},{1,3.0,4.5,0.0,2.3,0},{2,3.6,4.0,0.0,8.7,0},{3,7.0,2.0,0.0,6.0,0}; while(1){ printf(data[i]); /*順番を出力*/ } return 0; }

エラーはこんな感じです

main.c:29:1: warning: control may reach end of non-void function [-Wreturn-type]
}
^
main.c:36:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
main.c:40:17: error: passing 'int' to parameter of incompatible type 'deliver'
double d=span(c->num,dest); /移動距離/
^~~~~~
main.c:23:21: note: passing argument to parameter 'pa' here
double span(deliver pa,deliver pb)
^
main.c:43:11: error: assigning to 'int' from incompatible type 'deliver'
c->num=dest; /今いる位置を更新/
^~~~~
main.c:54:107: error: expected '}'
...;
^
main.c:54:19: note: to match this '{'
deliver data[]= {{0,4.0,7.5,0.0,0.0,0},{1,3.0,4.5,0.0,2.3,0},{2,3.6,4.0,0.0,8.7,0...
^
main.c:56:10: error: passing 'deliver' to parameter of incompatible type 'const char *'
printf(data[i]); /順番を出力/
^~~~~~~
/usr/include/stdio.h:318:43: note: passing argument to parameter '__format' here
extern int printf (const char *__restrict __format, ...);
^

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

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

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

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

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

y_waiwai

2020/07/30 10:48

で、しつもんはなんでしょうか
kohaku_

2020/07/30 11:30

エラー部分の内容を修正する方法と、プログラム自体の考えがあってるのか知りたいです。
y_waiwai

2020/07/30 11:34

質問を編集して、それを追記しましょう。 いまのままでは単に報告でしかありませんw
kohaku_

2020/07/30 11:53

ありがとうございます。変更させていただきました。
guest

回答1

0

エラーに書かれているままです。
c.numberと書かれていますが、
deliverの定義の中には、以下のようにnumberはありません。

typedef struct{ int num; /*家番号*/ double x; /*家の座標*/ double y; double distance; /*現在地から家までの距離*/ double weight; /*家への荷物の重さ*/ int compe; /*完了状況*/ }deliver;

span(c->num,dest);と書かれていますが、
定義は、double span(deliver pa,deliver pb)で、
引数はdeliverなのに、c->numは、intで型が合いません。

c->num=dest;と書かれていますが、
c->numintdestdeliver なので型が合わず代入できません。

エラー部分の内容の修正

変数の型と引数の型を合わせてください。

プログラム自体の考えはあっているのか教えて頂きたいです。

int main(void) { int i; deliver data[]= {{0,4.0,7.5,0.0,0.0,0},{1,3.0,4.5,0.0,2.3,0},{2,3.6,4.0,0.0,8.7,0},{3,7.0,2.0,0.0,6.0,0}; while(1){ printf(data[i]); /*順番を出力*/ } return 0; }

このコードには、考え方自体が含まれていません。
mainからは何も呼ばれていませんし、謎の無限ループしかないです。

(ついでにprintfにはJAVAみたいにオブジェクトのデータを自動的に変換して出すような機能は存在しません。
表示方法は自分でフォーマット指定と各種変数にして与える必要があります。)

double span(deliver pa, deliver pb)

に対しspan(c->num,dest)とする場合、deliver内からnumを持ってきているのですが、それではなぜダメなのでしょうか。

span関数の第一引数には、deliver paというように、deliver型の変数が指定されているので、
渡せる値も同じくdeliver型のものになります。
c->numは、『deliver内からnumを持ってきている』の通り、
deliver型の中にint num;と定義されている要素です。
つまり、c->numは、int型の変数になります。
deliver型を渡さないといけないところに、int型の値が渡されているため、エラーになります。

対策は、deliver型の値を渡してください。

今いる位置を表したい場合c->num以外にどのように表せるのかわかりません。

そもそもの問題として、c->num は、「今いる位置」を表したデータなのでしょうか?
構造体の中のコメントには、「家番号」と書かれています。
家番号を元に現在位置を割り出すシステムである、というのは設計としてはあり得ます。
しかし、肝心の呼ばれた先のspan関数の中には、渡された家番号(整数値)を元にして、今いる位置の座標を割り出すといったようなコードは何一つ書かれていません。

「座標を含むdeliverを渡して、それを元に距離を計算する」
「家番号(c->num)を渡して、それを元に現在座標を割り出して、そこから距離を計算する」
設計としてはどちらでも良いのですが、呼び出し元と関数側で、どちらか1つには統一する必要があります。
現状では、双方の設計が食い違っている為にエラーとなってしまっています。
まずは、どちらの設計にするかを決めることが先です。

投稿2020/07/30 09:29

編集2020/07/31 05:52
amiya

総合スコア1218

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

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

kohaku_

2020/07/30 12:09

無知ですみません。double span(deliver pa, deliver pb) に対しspan(c->num,dest)とする場合、deliver内からnumを持ってきているのですが、それではなぜダメなのでしょうか。このプログラムで、今いる位置を表したい場合c->num以外にどのように表せるのかわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問