解決済
このプログラム見てください。
#include <stdio.h>#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#define NVALUE 30
#define MAXSIZE NVALUE
struct City{
float x;
float y;
};
struct Country{
struct City cities[MAXSIZE];
int size;
};
struct Itine{
float quality;
int route[MAXSIZE];
int noc;
};
float plength(struct Itine *tour,struct Country *pcountry)
{
int i,j;
double dy;
double dx;
float length=0.0;
for(i=0;i<tour->noc;i++){
j=i+1;
if(j==tour->noc)
j=0;
struct City &c1=pcountry->cities[tour->route[i]-1];
struct City &c2=pcountry->cities[tour->route[j]-1];
double dx = c1.x-c2.x;
double dy = c1.y-c2.y;
length+=(float)sqrt(dx*dx+dy*dy);
}
return length;
}
なんか間違っていますか?
回答(1)
1.

dx、dy がforループの外と内で定義されています。通常は、外側の定義だけでいいのでは?
あと、なんか Cっぽい書き方けど、コンパイラはC++なんですかね。
だったら、わざわざ、struct City とか書かなくても、City だけでもいいような。
でも、これは、好き好きってやつ?
どうもすみません…
コメント(7)
質問の仕方が間違ってます。
どのような仕様のプログラムで何がしたいのかを明記しないと 検証ができません。
>>たのたのさん
すみません、エラーが出てしまったので、
そのエラーの部分を見てもらいたかったのです。
Cなら数箇所文法エラー。C++ならコンパイルは通りますが、C++のプログラムには見えないですね。
C++なら、mainを正しく書けばエラーにはならないですよ。たぶん、エラーは他の部分だと思います。
C++流に書くなら、class Countryを作って、その中に距離を求めるメソッドを置くのが自然。
あと、設計的に、構造体の中の配列のバウンダリーがわからないので危ないです。
処理系がC++かな~っと思ったのは、参照が使われてるようなので。
あと、一緒にエラーメッセージも添えてもらえるとよかったかもしれませんね。
蛇足ですが、class Country も sturct Country も似たりよったりです。好きに使えばいいと思いますよ。そのうちメソッドとかメンバーとか使えるようになりますよ。
がんばれ!
そうですね、C++としてコンパイルしたらエラーが格段に少なくなりました!
でもやはりエラーが残っています。
もう一度見直してみたいと思います。
>>#5
Cとして書きたいなら、参照による宣言:
struct City &c1=...;
のようなものは使えません。この書き方は、右辺にエイリアスをつけるものなので、どうしてもやりたければ、
struct City *c1=&(...);
のように、ポインタ宣言でアドレスを代入するとよいと思いますが、混乱するような使わない方が吉です。
また、変数の定義・宣言は、途中に書いてはいけなくて、スコープの先頭に並べないといけません。
{
int i;
double dx;
struct Country c1;
...
この後に手続きを書く
}
これは、C++でも作法として覚えておいた方がいいです。現に、double dxは2回定義されていますので。
もうひとつアドバイスすると、コメントを書いてからプログラムをした方がよいと思います。

