[[メモ]]

メモに全部突っ込んで書いていたら,まさかの「サイズがデカすぎて処理できませんエラー」がサーバから返されてしまった.
しょうがないので,C/C++系のトラブルだけこっちに移すことにした.
#contents

*argcとargv [#v7a9a87c]
 int main(int argc, char **argv)
-が一般的な宣言
-''arg''uments ''c''ount(argc), ''arg''uments ''v''alue(argv)と覚えよう

*sizeof [#o204777d]
-sizeof()の返り値
|OS|>|>|~Windows XP|>|>|>|~FreeBSD|
|コンパイラ|VS 2005|.NET 2003|VS6|gcc(C)|gcc(C++)|cc(C)|cc(C++)|
|char|1|1|1|1|1|1|1|
|unsigned char|1|1|1|1|1|1|1|
|short|2|2|2|2|2|2|2|
|int|4|4|4|4|4|4|4|
|long int|4|4|4|4|4|4|4|
|float|4|4|4|4|4|4|4|
|double|8|8|8|8|8|8|8|
|OS|>|>|>|~Windows XP|>|>|>|~FreeBSD|
|コンパイラ|VS 2008|VS 2005|.NET 2003|VS6|gcc(C)|gcc(C++)|cc(C)|cc(C++)|
|char|>|>|>|>|>|>|>|1|
|unsigned char|>|>|>|>|>|>|>|1|
|short|>|>|>|>|>|>|>|2|
|int|>|>|>|>|>|>|>|4|
|long int|>|>|>|>|>|>|>|4|
|float|>|>|>|>|>|>|>|4|
|double|>|>|>|>|>|>|>|8|

*ダイアログをMFCダイアログから呼び出すと反応が異様に遅い. [#ocd95d1d]
-C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll
-を読み出そうとして遅くなってるっぽ.
-何故,読み出すようになったのか・・・それだけが分からないよ.

[[:未解決]]

*CTimeを使わずに時間を取得する [#r3754c09]
-time.hを使う
 struct tm *timeinfo;
 time_t	timer;
 timer    = time(NULL);
 timeinfo = localtime(&timer);
 strftime(buffer, length, "%m%d-%H%M%S", timeinfo);
-もっと短い時間(ミリ秒とか)を取得する場合は[[GetTickCount()>時間の計測]]とかを使うべし.

*floatとdoubleの違いについて [#l55831b8]
-http://homepage1.nifty.com/herumi/prog/prog90.html 参照

*C++のprivateなポインタ変数をreturnで外に出す [#g9842975]
-クラスでprivateで宣言したポインタ変数を,return でクラスの外に出すと,何も問題なく編集出来てしまう.
-え,良いんですか?
#geshi(c++,number){{
#include <stdlib.h>
#include <stdio.h>

class Hoge{
        public:
                Hoge(){memory = new int;};
                ~Hoge(){delete memory;};
        private:
                int* memory;
        public:
                int* a(void){return memory;}
};

int main(int argc, char **argv){
        Hoge *a = new Hoge();
        int* b;
        b = a->a();  //←ここで問題なくポインタを取得できる
        *b = 5;     //←ここで変更できてしまう
        return 0;
}
}}
-private変数をreturnする段階でアウトなんじゃね?と思うんだが,コンパイラも実行時エラーも出ない.
-const int test[] = {1,1,1};とかは変更利かないんだけれどな.
-一応Visual C++ 2005とg++で確認したんだが,どうもC++の規則っぽい

*enumの定義方法 [#ve588d6d]
-いっつも忘れるので自分用のmemo
 enum 型 {値1, 値2, ... 値N };
-Example
 enum the_sin {PRIDE, GLUTTONY, GREED, SLOTH, WRATH, ENVY, LUST};

*実行時にMSVCR80.DLL (MSVCR80D.DLL?) が無いと言われる [#ge232471]
-OpenCVのデバッグ用ライブラリとリンクした後,実行時に言われた.
-以下の2点を修正
--highguid.libを外した
--highguid.libをビルドしなおし
-あとcxcored.libをリンクすると,heapがどうの,と文句を言われた.

ジャンル[[:OpenCV]][[:未解決]]

*fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 [#fffda5d4]
-プリコンパイル済みヘッダが定義されてるプロジェクトに自身で作ったファイルを追加するとこうなる
-MFCのダイアログベースのプロジェクトの場合,''stdafx.h''なるプリコンパイル済みヘッダーが作られる
-cppファイル側で,ヘッダファイルをincludeする前に
 #include "stdafx.h"
 #include "xxxx.h"
-としてやればエラーは回避できる
-プロジェクトのプロパティで「''プリコンパイル済みヘッダを利用しない''」と定義するのも1つの手

ジャンル[[:Visual Studio]]

*fatal error C1020: 予期しない #endif です。 [#med01e84]
-http://www004.upp.so-net.ne.jp/ya_chari/ 参考
-"stdafx.h"をインクルードすると,それ以前のプリプロセッサ行は無視されるらしい.
-よって,下記のようにWindowsの場合はインクルードして,それ以外のOSの場合はしないでと言うコードは失敗する
 #ifdef _WIN32
 #include "stdafx.h"
 #endif
-この場合はstdafx.hへのincludeは諦め,「''プリコンパイル済みヘッダを利用しない''」と定義する

ジャンル[[:Visual Studio]]

*fatal error C1033: [#tdd35f4e]
-おそらくテンポラリなエラー
-Visual Studioでこれが起きる場合,IntelliSenseの更新とかぶって編集が出来ていない可能性があり.

ジャンル[[:Visual Studio]]

*error C2062: 型 'char' は不要です。 [#xc0bd5af]
-smallと言う変数名は予約語
-RpcNdr.hを(どういう経緯でincludeしたかは知らないが)includeすると,
 #define small char
-とされている.
-と言うわけで,変数名smallを使用するとcharを宣言したことになり,上記のエラーが発生する.
-レアなエラーかも.

ジャンル[[:Visual Studio]]

*error C2064: 引数を取り込む関数には評価されません。 [#gf363b3a]
-変数と関数で同じ名前を使用すると発生する
-変数が優先されるらしい.
 time_t time;
 time = time(NULL); //関数のtimeが正しく取り扱われない

ジャンル[[:Visual Studio]]

*error C2059: 構文エラー : サフィックスが無効です。 [#g5ece01c]
-変数名の最初に数字を用いるとエラーになる.

#geshi(c++){{
 int 3DPoints[200]; // <- 変数名の頭に数字は使えない
}}

ジャンル[[:Visual Studio]]

*error C2065: 'M_PI' : 定義されていない識別子です。 [#p09aa339]
-M_PIはmath.hで定義されてる円周率
-しかし,math.hをincludeしただけではdefineされない
-_USE_MATH_DEFINESをdefineする必要がある
-ちなみにVC++6では定義されてないとのうわさ.
-参考:http://www.m--takahashi.com/bbs/pastlog/10200/10130.html

#geshi(c++){{
 #define _USE_MATH_DEFINES  // <-これが一番大事♪
 #include <math.h>
 int main(){
   printf("%f\n", M_PI);
 }
}}

ジャンル[[:Visual Studio]]

*error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。 [#sbb9a68f]
-[[OpenGLとOpenCVの共存>OpenGLとOpenCVの共存#o909b031]]参照

*error C3861: 'min'識別子が見つかりませんでした [#ua5dc299]
-'max'も同じく
-Visual Studio 2005からVisual Studio 2008に変更したら起きた
-どうやら,min,maxは非標準のマクロだったらしい.
-std::min, std::maxでリプレースするのが妥当かと.
 std::max(a, b)
-しかし,それでもダメなときがある.
 error C2780: 'const _Ty &std::max(const _Ty &,const _Ty &,_Pr)' : 3 引数が必要です - 2 が設定されます。
-引数にテンプレート関数を使ってる関係で,どうやら,引数の2つが違うtypeだとエラーの模様.
-両方の引数の型が違うとこける模様.
 double d = 1.0;
 int i = 0;
 std::max(i, d);  // ←ここでdoubleとintの比較なのでこける
-ってな具合に.
-静的キャストを使って回避しよう
 std::max(1.0, (double)0);
-CF:[[C言語関係掲示板>http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+32866]]

*error D8016 : コマンド ライン オプション '/GL' と '/ZI' は同時に指定できません [#w8355d09]
-[[C/C++のトラブル集#Visual Studio .NETでプロファイラを使う方法>C/C++のトラブル集#da453f4d]]参照

ジャンル[[:Visual Studio]]

*warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 [#e785e7d6]
-OpenCVをVisual Studio 2005で利用するとこのwarningが出る.
-cv/cvcompat.h が原因.
-Visual Studio 2005でcv/compat.hを編集(一文字入力してから消去)してファイルを保存するとwarningが消える.
-参考:http://chihara.naist.jp/opencv/?Visual%20C%2B%2B%202008%20Express%20Edition#ca99c600

ジャンル[[:OpenCV]][[:OpenCV 1.1]][[:OpenCV 2.0]][[:OpenCV 2.1]][[:Visual Studio]]

-Visual Studio 2008 + OpenCV 2.2 ではlegacy/compat.hpp がこのwarningを出す.
-上記方法では何故かwarningが消えない.
-原因は追求中.
-対症療法と根本的な解決方法を1つずつ
- #pragma を使って warning を 抑制

#geshi(c++,number){{
#pragma warning(disable : 4819)
#include <cv.h>
#pragma warning(default: 4819)
}}

--上記のようにwarningを吐き出すファイルの直前と直後をpragma で囲めばwarningが消える
--参考:[[【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! &laquo; 吟遊詩人の戯言>http://gurizuri0505.halfmoon.jp/20090714/8497]]
- 正しいファイルをインクルードする
--OpenCV 2.2 でファイル構造が大幅に変わった.
--C++インタフェース用のファイルとCインタフェース用のファイルが別々になってる.
--旧来の cv.h や cxcore.h のincludeも compatibility として残されている(build\include\opencv 以下のファイル達)
--それらをincludeすると,上記C4819 warningが発生する.
--対応するヘッダファイルを opnecv2 以下から探してくれば良い
---cxcore.h <-> opencv2/core/core_c.h (Cインタフェース) opencv2/core/core.hpp (C++インタフェース)
---cv.h <-> opencv2/imgproc/imgproc_c.h (Cインタフェース) opencv2/imgproc/imgproc.hpp (C++インタフェース)
---highgui.h <-> opencv2/highgui/highgui_c.h (Cインタフェース)  opencv2/highgui/highgui.hpp (C++インタフェース)
---など(あくまでも一例)
-いずれにしろwarningなだけなんだが.

ジャンル[[:OpenCV]][[:OpenCV 2.2]][[:Visual Studio]]

*warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理) [#bff22449]
-原因:intをboolにキャストしている
#geshi(C++,number){{
bool function(int number){
	return (bool)number; // warning C4800
}
}}
-int型の変数が0だったらfalse,それ以外の場合はtrueとする場合は多々ある.
-しかし,intをboolにキャストしてはいけない(厳密には非boolの型どんなものでも)(仕様)
-対処
-キャストするときに ''!= 0'' を使うのが一番簡単
#geshi(C++,number){{
bool function(int number){
	return number != 0;
}
}}
-cf:[[コンパイラの警告 (レベル 3) C4800 (C++)>http://msdn.microsoft.com/ja-jp/library/b6801kcy%28v=vs.80%29.aspx]]

*warning LNK4098: defaultlib '*****' は他のライブラリの使用と競合しています。 [#l95c8157]
-プロジェクト->リンカ->コマンドライン->追加のオプションに/NODEFAULTLIB:****.libを追加
-参照:[[http://d.hatena.ne.jp/kasei_san/20080109/p1]]

ジャンル[[:Visual Studio]]

*0xc0150002 アプリケーションを正しく初期化できませんでした [#y16edcfc]
-OpenCV 1.1pre1にした途端,このエラーが出る人いるみたい
-[[Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)>http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=ja]]をインストールすると直るみたい.
--http://d.hatena.ne.jp/piy/20081130/1228020473
--http://d.hatena.ne.jp/cvcvcv/20081127/1227780876
--http://naruhodo.nazo.cc/modules/plzXoo/index.php?action=detail&qid=247
--あたりを参考にした
-ミソは,VS .NET 2005 SP1+Redistribution Packageが必要

ジャンル[[:OpenCV]][[:OpenCV 1.1]][[:Visual Studio]]

*OpenCV 1.1でプロセス(プログラム)が終了しなくなる [#n127daa9]
-以下あたりを参照
--[[Yusuke Sugano/ Blog  &raquo; OpenCV 1.1pre1>http://www.hci.iis.u-tokyo.ac.jp/~sugano/archives/96]]
--[[OpenCV1.1のcvLoadimage|hidelab>http://ameblo.jp/hidelab/entry-10159096282.html]]
-SHBrowseForFolder APIとOpenCV 1.1 pre1を使うとプロセスが正常に終了できなくなるらしい.
-聞いただけで,使ったこと無いので原因はつかめてない.
-'Invalid allocation size'とか出るみたい

ジャンル[[:OpenCV]][[:OpenCV 1.1]][[:Visual Studio]][[:未解決]]

*関数を使用しただけで,突然大量の「型が定義されていません」エラーが発生する [#ga861571]
-KLTの実装にて起きた.
-原因というより,C言語で起きてたので,仕様とも言うべき事態.
-KLTの本体はC言語で書かれている割に,メインプログラムはC++でコンパイルできる.
-よって,メインプログラム内の適当な場所で関数をコールすると,それより後で宣言が行われていた場合,宣言が全てエラーになる.
-初歩的な・・・

ジャンル[[:Visual Studio]]

*Visual Studio .NETでプロファイラを使う方法 [#da453f4d]
-Professional Edition のみ?
-VC++の場合(多分ほかも同じだと思うけれど)
+ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメント(I)を実行
--リビルドが行われる
--Debugモードだとerror D8016が出たので無理かも
+ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメントまたは最適化されたアプリケーションの実行(R)
--アプリケーションが起動するので,適当に動かす(最適化させたい動作がベスト)
--アプリケーションを終了する
+ビルド(B)→ガイド付き最適化のプロファイル(P)→最適化(O)
--実行した情報がカウントして統計される
+ツール(T)→Visual Studio 2005 Command Promptを実行
+コマンドプロンプト上でコマンドを実行
 C:\Program ... \VC\bin>pgomgr /summary XXXXXX\apli.pgd 
--XXXXXXにはアプリのReleaseフォルダへのパス
--apliはソリューションの名前
+これでこんな表示が出るはず.長いのでリダイレクト推奨
 Microsoft(R) Profile Guided Optimization Manager 8.00.50727.762
 Copyright (C) Microsoft Corporation. All rights reserved.
 
 PGD ファイル: \XXXXXXXX\apli.pgd  11/20/2008 12:54:52
 モジュールの数: 1  関数の数: 389  Arc の数: 1248  値の数: 18
 
 静的命令: 11054  基本ブロック: 1743  平均 BB サイズ: 6.3
 動的命令: 327756730
 
                                      entry  static       dynamic     %     run
 関数名                               count   instr         instr  total   total
 tSubtractAverage                    307200      93     134351620   41.0   41.0
 shift                              1603470      90      44897160   13.7   54.7
 C2TSI::getInnerProductMap              240     181      35021113   10.7   65.4
 tLowPass                            153600     322      34713600   10.6   76.0
 tPadZero                            307200     122      32070160    9.8   85.8
 CTSI::SearchStartAndEnd                960     118      31556620    9.6   95.4
 CTSI::extractRawColumn              307200      29       8908800    2.7   98.1
 CTSI::getNormMap                       480      58       3699360    1.1   99.2
 CTSI::getTimeSpaceImage               1442     357        977770    0.3   99.5
 _cvGetRow                            40560       9        365040    0.1   99.6
 CTSI::loadImageFromImageFile         20164      23        302460    0.1   99.7
 CTSI::loadImageFromImageFile         20164      11        221804    0.1   99.8
--右から3列目のdynamic instrが実行回数
--右から2列目の%totalがその関数が実行に要した時間
--一番右のrun totalが実行時間の累計和
+次回ビルドするときに何か言われることがあるが,プロファイラをしないなら,リビルドを行ってよい.

ジャンル[[:Visual Studio]]

*FILE*構造体 [#p34ae5f5]
**int fseek(FILE *fp, long offset, int whence); [#edbb9329]
-whenceからoffsetバイト分移動したところに移動する
-whenceは,
--ファイルの先頭を表すSEEK_SET
--現在位置であるSEEK_CUR
--終端位置であるSEEK_END
-のどれか
**void rewind(FILE *fp); [#y5e9870c]

**FILE* fopen(const char *filename, const char *mode); [#iddf74d6]
-filenameとmodeの順番に注意!!

*コード要素''***''が読み取り専用であるため、追加と削除操作は出来ません [#m57ef497]
-Visual Studio 2005で発生
-MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
-原因はncbファイルの破損っぽい.
-http://blogs.yahoo.co.jp/dpdtp652/837997.html 参照
-ncbファイルはちなみにintellisenseの情報を保存したファイルっぽい.
-ソリューションを1度閉じた後,ソリューションと同じフォルダに存在する''プロジェクト名.''ncbファイルを削除
-再びソリューションを開くと問題が解決している

ジャンル[[:Visual Studio]]

*コード要素''***''が読み取り専用であるため、追加と削除操作は出来ません VS2010編[#m57ef497]
-Visual Studio 2010で発生
-MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
-原因はインテリセンスの保存されているsdfファイルの模様
-ソリューションを1度閉じた後,ソリューションと同じフォルダに存在する''ソリューション名.''sdfファイルを削除
-再びソリューションを開くと問題が解決している
-また、だいたいのクラスウィザードのエラーはこれ

ジャンル[[:Visual Studio]]

*プロジェクトにクラスの追加を行うとVisutal Studioがフリーズする [#ha616bf4]
-メニューからクラスの追加操作を行うだけでVisual Studioがフリーズする.
-原因は[[コード要素が読み取り専用..>C/C++のトラブル集#m57ef497]]と類似
-ncbファイルを削除すること

ジャンル[[:Visual Studio]]

*CRとLF [#ya5e367e]
-CRが\nであり,Mac OS(9まで)などで使われていた改行コード
-LFが\rであり,Unix系のOSなどで使われている改行コード
-WindowsではCR+LFであり,\n\rで表される

*コンソール画面が消えない [#p918f671]
-%%OpenCV 2.1 にバージョンアップしてから,ときたま実行したプログラムが終了しないときがある%%
-%%OpenCV 2.1 + Visual Studio 2003 でコンソールアプリを作成%%
-%%実行して,正常終了→Visual Studioの画面が実行モードから編集モードに戻る%%
-%%が,それでもコンソール画面が出たまま%%
-%%少ない事例だが,今のところOpenCVで生成したウィンドウは消えている%%
-%%Visual Studioを終了させてもダメ%%
-%%再起動させようにも,残ったコンソール画面が悪さをして再起動できない.%%

-%%OpenCV 2.1でウィンドウを生成して,ウィンドウを破棄(cvDestroyWindow)せずにプログラムだけ止めると,発生する模様.%%

-どうやら,Visual Studio 固有の問題らしく,Hotfixが公開されていた
-[[You cannot close a console window of an application after you stop debugging the application in Visual Studio on a computer that is running Windows XP or Windows Server 2003>http://support.microsoft.com/kb/982551/en-us?fr=1]]

ジャンル[[:Visual Studio]]

*Visual Studio でコマンドラインアプリをデバッグする際,引数を指定する方法 [#u97c2e3d]
-コマンドラインアプリで,引数により挙動を変えるプログラムをよく作る(私は)
-ただし,デバッグモードでは,引数なしの状態でしか実行されない
-プロジェクト(P)→プロジェクトのプロパティ(P)→デバッグ→コマンド引数という欄に引数を指定できる
-Visual Studio 2008 と 2003で最低限確認した.
-ウィンドウのレイアウトは違うかも
-添付はVisual Studio 2008の画面

http://tessy.org/wiki/index.php?plugin=attach&pcmd=open&refer=C%2FC%2B%2B%A4%CE%A5%C8%A5%E9%A5%D6%A5%EB%BD%B8&file=command-line-argument.png
-参考:[[応用機械情報工学 2006@八戸工業大学機械情報技術学科>http://it.mech.hi-tech.ac.jp/~ono/appl/assign4.html]] の手順06

ジャンル[[:Visual Studio]]

*OpenCV のリポジトリにアクセスしようとしたらユーザ名とパスワードを要求された [#y5e103b6]
-本来はOpenCVのリポジトリにuserもpasswordも要らない
-最近((詳しくはいつだか覚えてないけれど))OpenCVのリポジトリが code.ros.org から code.opencv.org に移行した.
--更にその昔は CSV でバージョン管理してた時代にはユーザ名があったはずだけれど
-ちなみにリポジトリ間では互換性(?)が無いので,もう1度 full checkout する必要がある.
-参考:[[OpenCV Computer Vision Library ()>http://comments.gmane.org/gmane.comp.lib.opencv/53859]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS