- 締切済み
定義されてないというので定義するとエラーが増えた
ARToolKitを卒研で使用するのにプログラムをいじっててどうしてもわからないことがあったので質問します。 環境はWindows7のVisualStudio2008です。 まず、このプログラムは以前別の方が作って完成したものです。 なぜ自分が今、いじっているかというと、このプログラムを使いたいとおもったところ卒研の論文に乗せていたものしかなく、さらにいくつかの文字において定義の部分が完全になくなっていたからです。 で、定義をして、エラーを消していくと最後にどうしても消せないエラーが出たのです。 そのエラーが以下のものです。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(407) : error C2065: 'windowCV' : 定義されていない識別子です。 このwindowCVを使っているのはこの部分だけです。 cvShowImage( windowCV, lineE); 調べてみるとこのwindowCVは「const char *」という型だそうで、さっそく「const char *windowCV」と定義しました。 すると次はこのようなエラーが出ました。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(168) : warning C4101: 'pt2' : ローカル変数は 1 度も使われていません。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(167) : warning C4101: 'pt1' : ローカル変数は 1 度も使われていません。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(148) : warning C4101: 'j' : ローカル変数は 1 度も使われていません。 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector(220) : error C2129: 静的関数 'void keyEvent(unsigned char,int,int)' が宣言されましたが定義されていません。 1> f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(48) : 'keyEvent' の宣言を確認してください。 プログラム内を検索したところ使用されていないというローカル変数は確かに宣言の部分にしかありませんでした。 一応「const char* windowCV」とも定義してみましたが結果は変わりませんでした。 この問題についてですが cvShowImage( "Hough", color_dst ); このような一文もあるのですが不思議なことにこちらは「Hough」の定義がどこにも書かれていないにもかかわらず、これについてのエラーは一つもありませんでした。 一体何が違うのでしょう? 回答については ・この問題の解決方法 ・「cvShowImage( "Hough", color_dst );」と「cvShowImage( windowCV, lineE);」の違いについて ・windowCVの定義の仕方について ・プログラム内にある問題点 を教えていただけると嬉しいです。 もちろん、それ以外のことも教えていただければ嬉しいです。 四つ目ですが、これより下には関係ありそうな部分を貼っておきます。 長いのでどこを乗せたらいいのかわからず関係あるかと思った一部のみとなってしまいますが、もしそこに原因があることがわかる方はぜひ教えてください。 必要があれば補足もいたします。 よろしくお願いします。 IplImage *src=cvCreateImage(cvSize(arImXsize, arImYsize),IPL_DEPTH_8U, 4); memcpy(src->imageData, dataPtr, src->imageSize); IplImage *Gray=cvCreateImage( cvGetSize (src),IPL_DEPTH_8U,1); cvCvtColor(src, Gray, CV_RGBA2GRAY); IplImage* dst = cvCreateImage( cvGetSize(Gray), 8, 1 ); IplImage* color_dst = cvCreateImage( cvGetSize(Gray), 8, 3); IplImage* lineE = cvCreateImage( cvGetSize(Gray), 8, 3); cvCanny( Gray, dst, 50, 200, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR ); cvCvtColor( dst, lineE, CV_GRAY2BGR);
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
卒研って、今年のですか?だとするとあと1月ないですが。 まず、このプログラムは、OpenCVというライブラリを利用しています http://opencv.jp/ C言語では、文字列は、「文字(char)の配列」として表現します。 "Hough"のように""で括ったものは「文字列リテラル」と呼ばれるもので、実際には 'H','o,'u,'g,'h','\0' と並んだ「配列」の「先頭アドレス」になります。 各要素はcharですが、文字列リテラルの内容は書き換えできない領域に置かれるのが普通なので、「変更できない」を表わす const charになります。 その先頭アドレスなので、ポインタになります。const char *型です。 C言語では、文字列、配列、ポインタの使い方が肝となります。 ここで挫折する人も多いところです。 せめて一通りの使い方を読んでやってほしいところです。 "Hough"を変数と勘違いしているようだと、「直したつもり」で逆に取り返しのつかない間違いにしていそうで。
- TooManyBugs
- ベストアンサー率27% (1472/5321)
コンパイラの仕様で違いますが はじめのコンパイルでは未定義の変数windowCVが出てきたのでコンパイラは途中でコンパイルを放棄します。 修正後はwindowCVについてはエラーが無くなったのでコンパイルが先まで進んだのでコンパイルの終了した関数の中で見つかった未使用のローカル変数をワーニングで知らせています。 keyEventのエラーは全く別の物でインクルードファイルとソースの間で齟齬があるのでは? コンパイルエラーを一つ潰すと潜在化していたエラー、ワーニングかぞろっと出てくるのはよく有ることです。
お礼
回答ありがとうございます。 以前作られたもので「これで完成形だ」と思い込んでいたのでこのような質問をしました。 この後ちゃんと対処できました。
> 「cvShowImage( "Hough", color_dst );」と「cvShowImage( windowCV, lineE);」の違いについて どうも定義と宣言がごっちゃになってる気がするんです。その説明は私も忘れました(汗) "Hough" はコレ自体で文字列変数ですよね。 windowCV ってのは文字列変数へのポインタな訳ですが、ダメって事はこれが存在しないと。 (引数としてのwindowCV はもちろん定義されてるでしょうけども。) const char *windowCV = "Hough"; cvShowImage( windowCV, lineE); と変数をまずは作成して、関数を呼べばOKでしょう。 #アカン。なんか説明できてないかも
お礼
回答ありがとうございます。 うまく定義することができました。
お礼
回答ありがとうございます。 取り返しのつかない間違い、してそうで怖いですがこの質問については無事に解決しました。