- ベストアンサー
SetPixel関数で円を描くプログラムでコンパイルエラーが発生する
- WindowsXPのノートでVisualC++2008ExpressEditionを使ってSetPixel関数で円を描くプログラムを作成しています。しかし、math.hの問題によりコンパイルエラーが発生しています。
- 具体的には、96行目と98行目で'pow'関数のオーバーロードの解決に失敗しており、math.hを編集する必要があるかどうか検討しています。
- 質問の内容を理解してくれる方に助言をいただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そのエラーに書いてある通りです。 C++では、同じ関数名でも、引数の型や数によって、違う関数として定義できる機能があります。(オーバーロードといいます) Cでは、powは pow(double,double)だけであって、どんな型を指定しても、doubleに型変換してくれました。 しかし、C++では http://msdn.microsoft.com/ja-jp/library/dt5dakze.aspx これだけありますが、メッセージにあるように、 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 相当のことをしても無意味です。
その他の回答 (1)
老婆心ながら・・・ Ellipse という楕円を描く関数があります。もちろん円も描けます。 http://msdn.microsoft.com/ja-jp/library/cc428585.aspx # SetPixel を使うにしても,もう少しうまくやらないと,場所によって隙間が開いてしまう。
補足
申し遅れましたが、猫でもわかるゲームプログラミングって本の例題なんですよ。 横が掠れた円を、点を打って描くというプログラムのようです。 Ellipseも後のプログラムで出てきてました。
お礼
ありがとうございます。第二因数をdouble型にしたら解決しました。 pow関数ですか~知らなかったです。 プログラム初心者なので、本に書いてあることも殆ど理解できずサンプルを打ってコンパイルすることばかりやってます。C++は習ったことがなかったので、色々Cと違うんでしょうね。 この先も本の通りやってもコンパイルできないことがよく起こるのかもしれないと思うとちょっと不安です。すみません、また質問することもあるかと思いますがよろしくお願いします。