SetPixel関数で円を描くプログラムでコンパイルエラーが発生する

このQ&Aのポイント
  • WindowsXPのノートでVisualC++2008ExpressEditionを使ってSetPixel関数で円を描くプログラムを作成しています。しかし、math.hの問題によりコンパイルエラーが発生しています。
  • 具体的には、96行目と98行目で'pow'関数のオーバーロードの解決に失敗しており、math.hを編集する必要があるかどうか検討しています。
  • 質問の内容を理解してくれる方に助言をいただきたいです。
回答を見る
  • ベストアンサー

SetPixel関数のmath.h

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

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

そのエラーに書いてある通りです。 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 相当のことをしても無意味です。

REINBOW01
質問者

お礼

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

その他の回答 (1)

noname#137556
noname#137556
回答No.2

老婆心ながら・・・ Ellipse という楕円を描く関数があります。もちろん円も描けます。 http://msdn.microsoft.com/ja-jp/library/cc428585.aspx # SetPixel を使うにしても,もう少しうまくやらないと,場所によって隙間が開いてしまう。

REINBOW01
質問者

補足

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

関連するQ&A

  • atan2 オーバーロード関数の呼び出しを解決することができません

    はじめまして。 超初心者のものです。 かなり古いMayaのプラグインのソースファイルをコンパイルすることになり、以下のようなエラーが出てどうにも解決することができません。 1>.\MayaMath.cpp(164) : error C2668: 'atan2' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(547): 'long double atan2(long double,long double)' の可能性があります。 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(499): または 'float atan2(float,float)' 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(110): または 'double atan2(double,double)' 大変申し訳ないのですが、こういった場合の回避の仕方 などご存じの方がいましたらよろしくお願いいたします。

  • Cプログラミングの質問です。

    方程式2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x=0の解xを二分法により求め、それを”atai=××”と表示させるプログラムを書こうと思っているのですが、エラーがでてしまい、さらにどこを直していいかわかりません。 詳しい方がおられましたら、アドバイスをいただけたらと思います。よろしくお願いいたします。 <エラー内容> 「コンパイルしています... tom.cpp .\tom.cpp(34) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): または 'float pow(float,int)' C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): または 'double pow(double,int)' 引数リスト '(int, int)' を一致させようとしているとき .\tom.cpp(34) : error C2059: 構文エラー : 'サフィックスが無効です。' .\tom.cpp(34) : error C2146: 構文エラー : ';' が、識別子 'x' の前に必要です。 ビルドログは "file://c:\Documents and Settings\satoutakaaki\デスクトップ\file\tom\tom\Debug\BuildLog.htm" に保存されました。 tom - エラー 3、警告 0」 <プログラム> #include "stdafx.h" #include <stdio.h> #include <math.h> double fx(double x); int main (void){ double x1=-1000; double x2=1000; double xn; double y; int i=0; for(i=1;i<100;i++) { xn=0.5*(x1+x2); y=fx(xn); if(y>0) {x1=x1/2+x2/2;} if(y<0) {x2=x1/2+x2/2;} i=i+1; } printf("atai=%f",xn); return 0; } double fx(double x) { double z; z=2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x; return z; }

  • string.h内でエラー

    Visual C++ 2005でプログラムを組んでいます。 あるプログラムをビルドすると以下のようにstring.h内でエラーが大量に発生します。string.hをインクルードしないとエラーは出ないことからおそらくstring.hまわりの設定がおかしいとは思うのですがよくわかりません。 エラー 2 error C2144: 構文エラー : 'char' は ')' によって先行されなければなりません。c:\program files\microsoft visual studio 8\vc\include\string.h 136 エラー 3 error C2144: 構文エラー : 'char' は ';' によって先行されなければなりません。c:\program files\microsoft visual studio 8\vc\include\string.h 136 エラー 5 error C2143: 構文エラー : ';' が ',' の前にありません。c:\program files \ microsoftvisualstudio8 \ vc\ include\ string.h 136 宜しくお願いします。

  • 粒子法プログラムのビルドエラー(cstdlibのエラー)

    粒子法のMPS法のプログラミングをしているのですが、C++でmps.cをビルドをすると、cstdlibのエラーが出てビルドが出来ません。 mps.cの本文中にはエラーは無く、visual studio 9.0にあるcstdlibの構文エラーが出てしまいます。 最初から入っているライブラリファイルが間違っているとは思えません。 解決法を教えてください。お願いします。 ↓ mps.c内でcstdlibを使っている場所 ↓ #include <cstdlib> /* This line is necessary for C++ compiler. Remove this line in C compiler */ #include <stdio.h> #include <sys/types.h> #include <math.h> #include <string.h> ↓ エラーメッセージ ↓ 1>コンパイルしています... 1>mps.c 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2143: 構文エラー : '{' が ':' の前にありません。 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2059: 構文エラー : ':' 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2143: 構文エラー : '{' が ':' の前にありません。 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2059: 構文エラー : ':' 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2143: 構文エラー : '{' が ':' の前にありません。 1>c:\program files\microsoft visual studio 9.0\vc\include\cstdlib(21) : error C2059: 構文エラー : ':' 省略(21行目のエラーが23~32行目まで同じエラーが続く) 1>MPS3000 - エラー 62、警告 0 ========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

  • <math.h>があるのにsqrtが・・・

    最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c) 「 #include<stdio.h> #include<math.h> int main(void){ int atai; double x=2.0; atai=(int)sqrt(x); printf("atai is %c",atai); } 」 sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。 「 /tmp/ccqEejZ1.o(.text+0x4d): In function `main': test3.c: undefined reference to `sqrt' collect2: ld はステータス 1 で終了しました 」 ちなみにLinux(Fedora core 4)を使用しています。 初心者ということもありなぜエラーが出るのか分かりません。 ちなみに<math.h>を使用しないプログラムは普通に動作します。 解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。 よろしくお願いします。

  • WiiYourself!をコンパイルできない

    WiiYourselfをVisualStadio2008(visual C++)でDemoフォルダのソースをコンパイルしようとしたのですがコンパイルエラーが100個以上出て失敗してしまいました(ソースは入手したときのままです)。エラーは以下のとおりです。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2065: '_In_' : 定義されていない識別子です。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2144: 構文エラー : '_EXCEPTION_RECORD' は ')' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2448: '_except_handler' : 関数の定義が間違っています。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(61) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(62) : error C2144: 構文エラー : '_CONTEXT' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(63) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(64) : error C2059: 構文エラー : ')' 1>c:\winddk\7600.16385.0\inc\api\windef.h(49) : error C2143: 構文エラー : ';' が '*' の前にありません。    ........ 開発環境は以下の通りです Windows vista WDM (インクルード(inc/api) ライブラリ(lib/wxp/i386)をvisual C++に設定している) WiiYourself1.01a とWiiYourself!_1.14b両方試しましたが同じ結果でした 原因をご存知の方がいらっしゃたらどうか書き込みお願いします。 よろしくお願いします。

  • OpenCVを使いたいのですが

    Visual C++ 2010にOpenCV2.4.3の導入し、設定を終えたのでプログラムをビルドさせるとエラーが吐き出され動作しません。 どなたか原因がわかる方はいらっしゃらないでしょうか? 【プログラム】 #include<stdio.h> #include<openCV2/opencv.hpp> #ifdef _DEBUG #pragma comment(lib,"opencv_core243d.lib") #pragma comment(lib,"opencv_highgui243d.lib") #pragma comment(lib,"opencv_objdetect243d.lib") #else #pragma comment(lib,"opencv_core243d.lib") #pragma comment(lib,"opencv_highgui243d.lib") #pragma comment(lib,"opencv_objdetect243d.lib") #endif //-------------------------------------------------------- //main int main(int argc,char* argv[]) { const char* szWndName="画像"; if(argc<2) { fprintf(stderr,"入力ファイル名を指定してください。\n"); return -1; } IplImage *img=cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR); if(img==NULL) return -1; cvNamedWindow(szWndName); cvShowImage(szWndName, img); cvWaitKey(0); cvDestroyAllWindows(); cvReleaseImage(&img); return 0; } 【ビルド後にでるエラーメッセージ】 ------ すべてのリビルド開始: プロジェクト: OpenCV, 構成: Debug Win32 ------ TEST02.c C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2054: 'using' の後に '(' が必要です。 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2061: 構文エラー : 識別子 'using' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(19): error C2054: 'using' の後に '(' が必要です。 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'using' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'abs' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2061: 構文エラー : 識別子 'atexit' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(21): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atof' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atoi' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2061: 構文エラー : 識別子 'atol' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(22): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'bsearch' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'calloc' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2061: 構文エラー : 識別子 'div' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(23): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'exit' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'free' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2061: 構文エラー : 識別子 'getenv' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(24): error C2059: 構文エラー : ';' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\cstdlib(25): error C2061: 構文エラー : 識別子 'labs' この後はエラー表記が続きます。

  • VC++ iostreamの不具合(?)

    手強いVC++のエラーです(対処が効かない #include <iostream> int main () {cout << "ggrks"; return 0;} C2065エラー 'cout' : 定義されていない識別子です。 #include <iostream.h> int main () {cout << "Hello C++!"; return 0;} C1083エラー include ファイルを開けません。'iostream.h': No such file or directory iostream(拡張子無)はCドライブのプログラムファイル、Microsoft Visual Studio 9.0\VC\includeに存在してます。 パスは許可してあります。 ツール→VC++ディレクトリ→インクルードファイルで C:\Program Files\Microsoft Visual Studio 9.0\VC\include と C:\Program Files\Microsoft Visual Studio 9.0\VC\include\iostream もついでに。 インストが完全でなかったのかと思い、「修復又は再インストール」で再インストしましたが変わりません。 気分転換(?)に一回アンインストールしてから再インストール(あまり意味ありませんけど)しても同様です。 どうすれば良いでしょうか。ご教授願います。

  • windows10でVC6.0++のclを使いたい

    cl.exeの場所:C:\Program Files\Microsoft Visual Studio\VC98\Bin 環境変数INCLUDE設定:C:\Program Files\Microsoft Visual Studio\VC98\Include 環境変数LIB設定:C:\Program Files\Microsoft Visual Studio\VC98\Lib を登録したのですが、mspdb60.dllがないといわれました。 検索したらあるのですが、 どうすれば、Windows10でvc6.0++のCコンパイラを使えますか? 教えてくださいよろしくお願いします。

  • C言語のpow関数の不具合

    linux(ubuntu)の上でgccを使っています。 powの関数がおかしいです。 pow(10,-1)を計算させると正しく1e-1が出力されます。 #include <math.h> #include <stdio.h> int main(void){ double x = -1; printf("%f",pow(10,x)); return 0; } 上記のプログラムを走らせると、 In function "main"; *****.c:(.text+0x2d):undefined reference to 'pow' collect2: ldはステータス1で終了しました。 というエラーメッセージがでます。 なぜかpow関数の中に変数を入れるとプログラムが動きません。

専門家に質問してみよう