質問: 移動する順番を求めるプログラムです 説明はわかりやすく書いています。 エラー部分の内容の修正と、プログラム自体の考えはあっているのか教えて頂きたいです。 色々と考えましたが、これ以降わかりません。 距離は三角法です。 ``` コード #include #include #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;inum,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, ...); ^
回答: エラーに書かれているままです。 `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->num`は`int`、`dest`は`deliver` なので型が合わず代入できません。 > > エラー部分の内容の修正 > > > 変数の型と引数の型を合わせてください。 > > プログラム自体の考えはあっているのか教えて頂きたいです。 > > > ``` 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つには統一する必要があります。 現状では、双方の設計が食い違っている為にエラーとなってしまっています。 まずは、どちらの設計にするかを決めることが先です。