dポイントプレゼントキャンペーン実施中!

「二辺の長さが与えられているとき、斜辺の長さを求めよ」という問題です。
#include <stdio.h>
#include <math.h>

#define a 3
#define b 4
int main (void)
{
double c=0;

c=sqrt(a*a+b*b);

printf("%f",c);

return 0;
}
visual2010c++で作ったんですが、sqrtに下線がついて、コンパイルエラーしちゃいます。
すんごい初歩的なことなんだと思いますが、どこなのか気づけません。
どなたかよろしくお願いします。

A 回答 (6件)

sqrt()の引数が合っていないということでしょう。



一般的に
double sqrt( double );
ですが、引数が#defineされていて、3と4。
これは、整数なので、「a*a+b*b」の計算結果は整数。
よって、
#define a 3.0
とするか、
c=sqrt(0.0+a*a+b*b); // 「0.0+」を付けて実数計算にした。
c=sqrt(1.0*a*a+b*b); // 「1.0*」を付けて実数計算にした。
とすれば良いでしょう。

それと、C++モードでコンパイルされている様ですが、Cモードでコンパイルすれば、
c=sqrt(a*a+b*b); /* Cモードでコンパイルしよう。 */
のままでO.K.なはず。

C言語は同名の関数を定義できず、関数の引数に合わせてキャストしてくれますが、C++は同名で引数の違う関数を定義できるので関数の引数が合わないと関数が存在しないことになってしまう。
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事解決できました

お礼日時:2011/11/06 00:35

C言語をやるなら、『型』の概念は完璧にしてください。



sqrt()の引数、戻り値は浮動小数型です。 おそらく「オーバーロードが見つからない」旨のエラーが出たのでしょう。 引数をdouble型にしてください。
    • good
    • 0

> C言語で直角三角形の斜辺を求めるプログラムについて



ここに嘘があります。
「C言語」ではなく、C++ですね。

> sqrtに下線がついて、コンパイルエラーしちゃいます。

C++のmath.hでは、三種類のsqrt関数が多重定義されています。

float sqrt(float);
doble sqrt(double);
long double sqrt(long double);

これに対して、aもbもint型ですので、それらを組み合わせた式 a*a+b*b もint型になり、どのsqrt関数を選べばよいのかコンパイラには判断が付かないのです。

一方、Cの場合、こうした多重定義はできませんから、

float sqrtf(float);
doble sqrt(double);
long double sqrtl(long double);

のように関数名が異なります。
結果として、int型の実引数を渡しても、選ぶべきsqrt関数は一種類だけなのです。

ちなみに、Visual C++ 6.0のような標準準拠度の低い処理系では、上記のCの場合と同様になっているため、コンパイルエラーになりません。
    • good
    • 0

Visual C++ 6.0ではエラーは起きないです。



実行結果は
5.000000
です。

1.コンパイル環境によって
 sqrt関数が違うのでしょう。

2.
Visual C++では
double sqrt( double x );
です。
#define a 3.0
#define b 4.0
double c=0.0
以上のようにしたらどうでしょうか。

3.
math.hではないのか


ところで
でも通常cは char型の変数を用いることが多いようです。
プロになってからcを charと間違えないようにしてください。
    • good
    • 0

sqrtが整数の引数を受け付けない、って事かと思いますが。

    • good
    • 0

コンパイルしたときに出るエラーメッセージの全文を、そのまま貼り付けてください。

この回答への補足

error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。
math.h(589): 'long double sqrt(long double)' の可能性があります。
math.h(541): または 'float sqrt(float)'
math.h(127): または 'double sqrt(double)'
引数リスト '(int)' を一致させようとしているとき

全文は難しいので・・・
No2の人が言っているところを張り付けました。
けど、よくわかりません。

補足日時:2011/10/14 22:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!