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

WindowsXPのノートでVisualC++2008ExpressEditionを使っています。
SetPixel関数で円を描くプログラムで、math.hの問題だと思われる4つのエラーでコンパイルできません。
宣言は
#include<windows.h>
#include<math.h>
ウィンドウプロシージャ内で
switch (msg) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
for (i = a - r;i <= a + r; i++) {
x = i;
y = (int)sqrt(pow(r, 2) - pow(x - a, 2)) + b;←96行目
SetPixel(hdc, x, y, RGB(0, 0, 0));
y = (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目

1>c:\documents and settings\REI\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)'
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)'
1> 引数リスト '(int, int)' を一致させようとしているとき
同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。
どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m

A 回答 (2件)

そのエラーに書いてある通りです。




C++では、同じ関数名でも、引数の型や数によって、違う関数として定義できる機能があります。(オーバーロードといいます)

Cでは、powは pow(double,double)だけであって、どんな型を指定しても、doubleに型変換してくれました。
しかし、C++では
http://msdn.microsoft.com/ja-jp/library/dt5dakze …
これだけありますが、メッセージにあるように、 pow(int , int) と定義されているものはありません。第2引数がintのものがありますが、第1引数が3通りあり、intをどれに変換してよいのか、判断できないのです。

対処法としては
・第1引数をキャストして、曖昧さをなくす
例: pow( static_cast<double>(r), 2) // 第1引数がdoubleになるので、 double pow(double,int)が選ばれる
・第2引数をdoubleにして、候補を1つにする
例: pow(r, 2.0) // 第2引数がdoubleになるので、 double pow(double,double)しか候補がない
・二乗くらいなら、pow関数なんて使わない。
例: r*r



なお、gcc の -lm は、リンクの際にライブラリ(libm)をリンクするように指定するものです。今回のエラーはその前のコンパイルの段階で発生するものなので、 -lm 相当のことをしても無意味です。
    • good
    • 0
この回答へのお礼

ありがとうございます。第二因数をdouble型にしたら解決しました。
pow関数ですか~知らなかったです。
プログラム初心者なので、本に書いてあることも殆ど理解できずサンプルを打ってコンパイルすることばかりやってます。C++は習ったことがなかったので、色々Cと違うんでしょうね。
この先も本の通りやってもコンパイルできないことがよく起こるのかもしれないと思うとちょっと不安です。すみません、また質問することもあるかと思いますがよろしくお願いします。

お礼日時:2010/11/29 20:30

老婆心ながら・・・


Ellipse という楕円を描く関数があります。もちろん円も描けます。

http://msdn.microsoft.com/ja-jp/library/cc428585 …


# SetPixel を使うにしても,もう少しうまくやらないと,場所によって隙間が開いてしまう。

この回答への補足

申し遅れましたが、猫でもわかるゲームプログラミングって本の例題なんですよ。
横が掠れた円を、点を打って描くというプログラムのようです。
Ellipseも後のプログラムで出てきてました。

補足日時:2010/11/29 19:30
    • good
    • 0

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