- 締切済み
C++プログラムの問題。。
テンプレートマッチングというプログラムをやってますが、テンプレート画像にボックスカウンティング処理を行い、フラクタル次元を求めようという進み方で行こうと思って、プログラムを作ってみました。でもコンパイルするとエラーが出てきちゃいました。 int main(int argc, char* argv[]) { int x,y; int r,g,b; int wh=0,BC2=0,BC3=0,BC4=0,BC5=0,BC6=0; float p; char* filename = argc == 2 ? argv[1] : (char*) "apple.bmp"; if((src = cvLoadImage(filename,1)) == 0) return -1; IplImage *grayimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage *edgeimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage *img = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,3); IplImage *his = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); cvCvtColor(src,grayimg,CV_BGR2GRAY); cvEqualizeHist(grayimg,his); cvCanny (his,edgeimg,50,200,3); cvCvtColor (edgeimg,img,CV_GRAY2BGR); for(y=0;y< img->height;y++){ for(x=0;x< img->width ;x++){ getpixel(img,x,y,&r,&g,&b); if(r == white){ wh++; } } } p = (wh*100)/ (img->height * img->width); printf("height = %d width = %d\n",img->height,img->width); printf("white pixel = %d(%3.2f %%)\n",wh, p); (ここで x,y=1 x,y=2 x,y=4 x,y=5 と x,y=6 ももちろん入れてます) printf("log10(%d)/log10(2)=%1.4f\n",BC2,(log10(BC2)/log10 (2))); printf("log10(%d)/log10(3)=%1.4f\n",BC3,(log10(BC3)/log10 (3))); (ここでlog10(6)までの続きがあります) printf("((log10(%d)-log10(%d))/(log10(2)-log10(3)))=%1.4f\n",BC2,BC3,(log10(BC2)-log10(BC3))/(log10(2)-log10(3))); (ここでlog10(6)までの続きがあります) double fd,fd23,fd34,fd24,fd25,fd35,fd45,fd26,fd36,fd46,fd56; fd23 = -(log10(BC2)-log10(BC3))/(log10(2)-log10(3)); (ここでlog10(6)までの続きがあります) fd = ((fd23+fd34+fd24+fd25+fd35+fd45+fd26+fd36+fd46+fd56)/10); printf("フラクタル次元は%1.4fです\n",fd); 。 。 ここからはopenCVの関数が使ってます。 。 。 プログラムはこのようなんですが、コンパイルするとこのエラーが出てきました。 jikken2.cpp(528) : error C2668: 'log10' : ambiguous call to overloaded function c:\program files\microsoft visual studio 8\vc\include\math.h(569): could be 'long double log10(long double)' c:\program files\microsoft visual studio 8\vc\include\math.h(521): or 'float log10(float)' c:\program files\microsoft visual studio 8\vc\include\math.h(122): or 'double log10(double)' while trying to match the argument list '(int)' 誰かお分かりになる方々をぜひぜひお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
これは、ソースコードを見る限りC++じゃなくてC言語のソースコードですね。C++のオーバーロードのエラーメッセージが分からないの文法理解レベルでは、素直にC言語オプションでコンパイルしたほうが良いと思います。 それとエラーの原因であるデータ型の適当さは今のうちに直しましょう。パラメータを暗黙のデータ型変換にまかせたりせず、ちゃんと型を合わせて関数を使うクセをつけた方が良いですよ。思わぬバグで後で苦労すると思います(無闇にキャストでごまかさないように)。
- jacta
- ベストアンサー率26% (845/3158)
log10に限らず、<cmath>で宣言される関数の大部分は、float、double、long doubleについて多重定義されています。また、<complex>をインクルードすれば、そのうちの多くの関数がcomplexクラステンプレートについても多重定義されます。 そのため、int型の実引数を渡した場合には、多重定義がうまく解決できなくてエラーが発生します。 > jikken2.cpp(528) : error C2668: 'log10' : ambiguous call to overloaded function このエラーメッセージが、そのものズバリの指摘をしています。 もし英語が読めないのなら、無理をせず、日本語版を使うことをお勧めします。