C/C++のトラブル集

C/C++のトラブル集

http://tessy.org/wiki/index.php?C%2FC%2B%2B%A4%CE%A5%C8%A5%E9%A5%D6%A5%EB%BD%B8 ツイート

メモ

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

  • argcとargv
  • sizeof
  • ダイアログをMFCダイアログから呼び出すと反応が異様に遅い.
  • CTimeを使わずに時間を取得する
  • floatとdoubleの違いについて
  • C++のprivateなポインタ変数をreturnで外に出す
  • enumの定義方法
  • 実行時にMSVCR80.DLL (MSVCR80D.DLL?) が無いと言われる
  • fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
  • fatal error C1020: 予期しない #endif です。
  • fatal error C1033:
  • error C2062: 型 'char' は不要です。
  • error C2064: 引数を取り込む関数には評価されません。
  • error C2059: 構文エラー : サフィックスが無効です。
  • error C2065: 'M_PI' : 定義されていない識別子です。
  • error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。
  • error C2679: 二項演算子 '<<' : 型 'const largeNumber' の右オペランドを扱う演算子が見つかりません (または変換できません)。
  • error C3861: 'min'識別子が見つかりませんでした
  • error D8016 : コマンド ライン オプション '/GL' と '/ZI' は同時に指定できません
  • warning C4390: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?)
  • warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
  • warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)
  • warning LNK4098: defaultlib '*****' は他のライブラリの使用と競合しています。
  • warning MSB8012: TargetPath does not match the Library's OutputFile
  • 0xc0150002 アプリケーションを正しく初期化できませんでした
  • OpenCV 1.1でプロセス(プログラム)が終了しなくなる
  • 関数を使用しただけで,突然大量の「型が定義されていません」エラーが発生する
  • Visual Studio .NETでプロファイラを使う方法
  • FILE*構造体
    • int fseek(FILE *fp, long offset, int whence);
    • void rewind(FILE *fp);
    • FILE* fopen(const char *filename, const char *mode);
  • コード要素***が読み取り専用であるため、追加と削除操作は出来ません
  • コード要素***が読み取り専用であるため、追加と削除操作は出来ません VS2010編
  • プロジェクトにクラスの追加を行うとVisutal Studioがフリーズする
  • CRとLF
  • コンソール画面が消えない
  • Visual Studio でコマンドラインアプリをデバッグする際,引数を指定する方法
  • OpenCV のリポジトリにアクセスしようとしたらユーザ名とパスワードを要求された
  • ビットリバースとポップカウント
  • プリプロセッサ
  • C言語の文字コード変換について
    • ::WideCharToMultiByte を使う方法
    • iconvを使う方法
    • ICUを使う方法
  • std::string内で使える文字列検索関数
  • vector でfindする方法
  • ‘&’ cannot appear in a constant-expression
  • sleep について
  • iostream のフォーマット指定子
  • typedef の順序
  • << operator のオーバーロード
  • getopt を使おう
  • すべてのプログラマが読むべき記事10選
  • クラスのoperatorを定義するときの戻り値の型
  • string
  • Visual Studio でcppunitをビルドするお話
  • Sleep関数
  • 複数桁数の数字を文字列に変換する
  • ある型が定義されているか確認する方法
  • Cコンパイラとプラットフォームを判定する定義済みマクロ
  • ビット操作
  • streamクラスのeof
  • Error: use of enum ‘AVCodecID’ without previous declaration
  • C++でvectorの参照渡しを省略可能にする方法

argcとargv †

int main(int argc, char **argv)
  • が一般的な宣言
  • arguments count(argc), arguments value(argv)と覚えよう

sizeof †

  • sizeof()の返り値
    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ダイアログから呼び出すと反応が異様に遅い. †

  • C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll
  • を読み出そうとして遅くなってるっぽ.
  • 何故,読み出すようになったのか・・・それだけが分からないよ.

:未解決?

CTimeを使わずに時間を取得する †

  • 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の違いについて †

  • float vs. double 参照*1

C++のprivateなポインタ変数をreturnで外に出す †

  • クラスでprivateで宣言したポインタ変数を,return でクラスの外に出すと,何も問題なく編集出来てしまう.
    1. #include
    2. #include
    3.  
    4. class Hoge {
    5.         public :
    6.                 Hoge ( ) {memory = new int; };
    7.                 ~Hoge ( ) {delete memory; };
    8.         private :
    9.                 int * memory;
    10.         public :
    11.                 int * a ( void ) { return memory; }
    12. };
    13.  
    14. int main ( int argc ,  char  **argv ) {
    15.         Hoge *a = new Hoge ( );
    16.         int * b;
    17.         b = a ->a ( );   //←ここで問題なくポインタを取得できる
    18.         *b =  5;     //←ここで変更できてしまう
    19.         return  0;
    20. }
  • private変数をreturnする段階でアウトなんじゃね?と思うんだが,コンパイラも実行時エラーも出ない.
  • ポインタが指す番地の中身は変更できるが、ポインタが指す番地自体は変更できない

enumの定義方法 †

  • いっつも忘れるので自分用のmemo
    enum 型 {値1, 値2, ... 値N };
  • Example
    enum the_sin {PRIDE, GLUTTONY, GREED, SLOTH, WRATH, ENVY, LUST};

実行時にMSVCR80.DLL (MSVCR80D.DLL?) が無いと言われる †

  • OpenCVのデバッグ用ライブラリとリンクした後,実行時に言われた.
  • 以下の2点を修正
    • highguid.libを外した
    • highguid.libをビルドしなおし
  • あとcxcored.libをリンクすると,heapがどうの,と文句を言われた.

ジャンル:OpenCV:未解決?

fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 †

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

ジャンル:Visual Studio

fatal error C1020: 予期しない #endif です。 †

  • "stdafx.h"をインクルードすると,それ以前のプリプロセッサ行は無視されるらしい.
  • よって,下記のようにWindowsの場合はインクルードして,それ以外のOSの場合はしないでと言うコードは失敗する
    #ifdef _WIN32
    #include "stdafx.h"
    #endif
  • この場合はstdafx.hへのincludeは諦め,「プリコンパイル済みヘッダを利用しない」と定義する

ジャンル:Visual Studio

fatal error C1033: †

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

ジャンル:Visual Studio

error C2062: 型 'char' は不要です。 †

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

ジャンル:Visual Studio

error C2064: 引数を取り込む関数には評価されません。 †

  • 変数と関数で同じ名前を使用すると発生する
  • 変数が優先されるらしい.
    time_t time;
    time = time(NULL); //関数のtimeが正しく取り扱われない

ジャンル:Visual Studio

error C2059: 構文エラー : サフィックスが無効です。 †

  • 変数名の最初に数字を用いるとエラーになる.
 int 3DPoints[200]; // <- 変数名の頭に数字は使えない

ジャンル:Visual Studio

error C2065: 'M_PI' : 定義されていない識別子です。 †

  • M_PIはmath.hで定義されてる円周率
  • しかし,math.hをincludeしただけではdefineされない
  • _USE_MATH_DEFINESをdefineする必要がある
  • ちなみにVC++6では定義されてないとのうわさ.
 #define _USE_MATH_DEFINES  // <-これが一番大事♪
 #include 
 int main(){
   printf("%f\n", M_PI);
 }

ジャンル:Visual Studio

error C2381: 'exit' : 再定義 ; __declspec(noreturn) が異なります。 †

  • OpenGLとOpenCVの共存参照

error C2679: 二項演算子 '<<' : 型 'const largeNumber' の右オペランドを扱う演算子が見つかりません (または変換できません)。 †

  • error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion) [duplicate]
  • cppunitを使ってテストをビルドしようとしたら、このエラーが出た。
  • 下記、assertionを使うと、OStringStreamに << 演算子で出力する。
    1. template <class T >
    2. struct assertion_traits
    3. { 
    4.     static bool equal (  const T & x ,  const T & y )
    5.     {
    6.         return x == y;
    7.     }
    8.  
    9.     static std :: string toString (  const T & x )
    10.     {
    11.         OStringStream ost;
    12.         ost << x;   // error
    13.         return ost. str ( );
    14.     }
    15. };
  • このOStreingStreamはstd::ostringstream として、Stream.hに定義されている。
  • なので、この operator << を定義する必要がある
  • headerファイル
    std::ostream& operator << (std::ostream& out, const class foo& right);
  • cppファイル
    std::ostream& operator << (std::ostream& out, const class foo& right)
    {
    	out << right.getString();	// 適当な処理を行う
    	return out;
    }
  • 後述するように、ヘッダファイルと実装を切り分けないと、多重定義が発生するので注意。

error C3861: 'min'識別子が見つかりませんでした †

  • '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);

error D8016 : コマンド ライン オプション '/GL' と '/ZI' は同時に指定できません †

  • C/C++のトラブル集#Visual Studio .NETでプロファイラを使う方法参照

ジャンル:Visual Studio

warning C4390: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) †

  • クラスのコンストラクタが引数が無いのに、空っぽのカッコ付きでコールするとこうなる
    class CHogehoge{
    public:
        CHogehoge() {};
    };
    main(){
        CHogehoge temp(); // ←こいつが警告を引き起こす
        //CHogehoge temp; // 正しくは、カッコ無しで宣言する
    }
  • 参考:コンパイラの警告 (レベル 1) C4930*2

warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 †

  • OpenCVをVisual Studio 2005で利用するとこのwarningが出る.
  • cv/cvcompat.h が原因.
  • Visual Studio 2005でcv/compat.hを編集(一文字入力してから消去)してファイルを保存するとwarningが消える.
  • 参考:Visual C++ 2008 Express Edition - OpenCV@Chihara-Lab., 2007-12-07公開, 2012-01-23更新, 2013-03-12閲覧};

ジャンル: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 を 抑制
  1. #pragma warning(disable : 4819)
  2. #include
  3. #pragma warning(default: 4819)
  • 上記のようにwarningを吐き出すファイルの直前と直後をpragma で囲めばwarningが消える
  • 参考:【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! « 吟遊詩人の戯言*3
  • 正しいファイルをインクルードする
    • 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' に強制的に設定します (警告の処理) †

  • 原因:intをboolにキャストしている
    1. bool function ( int number ) {
    2. return  (bool )number; // warning C4800
    3. }
  • int型の変数が0だったらfalse,それ以外の場合はtrueとする場合は多々ある.
  • しかし,intをboolにキャストしてはいけない(厳密には非boolの型どんなものでも)(仕様)
  • 対処
  • キャストするときに != 0 を使うのが一番簡単
    1. bool function ( int number ) {
    2. return number !=  0;
    3. }
  • cf:コンパイラの警告 (レベル 3) C4800 (C++)

warning LNK4098: defaultlib '*****' は他のライブラリの使用と競合しています。 †

  • プロジェクト->リンカ->コマンドライン->追加のオプションに/NODEFAULTLIB:****.libを追加
  • 参照:http://d.hatena.ne.jp/kasei_san/20080109/p1

ジャンル:Visual Studio

warning MSB8012: TargetPath does not match the Library's OutputFile †

  • 古いVSのプロジェクトを新しいVSでビルドする発生する
  • リンクするライブラリ名などを、$(TargetName) などのマクロで定義してる場合、新しいVSでそのあたりの仕様がかわっているっぽい
  • 自前で$(TargetName)などと書き換える必要があるっぽい
  • 参考:How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow*4

0xc0150002 アプリケーションを正しく初期化できませんでした †

  • OpenCV 1.1pre1にした途端,このエラーが出る人いるみたい
  • Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)をインストールすると直るみたい.
    • 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でプロセス(プログラム)が終了しなくなる †

  • 以下あたりを参照
    • Yusuke Sugano/ Blog » OpenCV 1.1pre1
    • OpenCV1.1のcvLoadimage|hidelab
  • SHBrowseForFolder APIとOpenCV 1.1 pre1を使うとプロセスが正常に終了できなくなるらしい.
  • 聞いただけで,使ったこと無いので原因はつかめてない.
  • 'Invalid allocation size'とか出るみたい

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

関数を使用しただけで,突然大量の「型が定義されていません」エラーが発生する †

  • KLTの実装にて起きた.
  • 原因というより,C言語で起きてたので,仕様とも言うべき事態.
  • KLTの本体はC言語で書かれている割に,メインプログラムはC++でコンパイルできる.
  • よって,メインプログラム内の適当な場所で関数をコールすると,それより後で宣言が行われていた場合,宣言が全てエラーになる.
  • 初歩的な・・・

ジャンル:Visual Studio

Visual Studio .NETでプロファイラを使う方法 †

  • Professional Edition のみ?
  • VC++の場合(多分ほかも同じだと思うけれど)
  1. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメント(I)を実行
    • リビルドが行われる
    • Debugモードだとerror D8016が出たので無理かも
  2. ビルド(B)→ガイド付き最適化のプロファイル(P)→インストルメントまたは最適化されたアプリケーションの実行(R)
    • アプリケーションが起動するので,適当に動かす(最適化させたい動作がベスト)
    • アプリケーションを終了する
  3. ビルド(B)→ガイド付き最適化のプロファイル(P)→最適化(O)
    • 実行した情報がカウントして統計される
  4. ツール(T)→Visual Studio 2005 Command Promptを実行
  5. コマンドプロンプト上でコマンドを実行
    C:\Program ... \VC\bin>pgomgr /summary XXXXXX\apli.pgd 
    • XXXXXXにはアプリのReleaseフォルダへのパス
    • apliはソリューションの名前
  6. これでこんな表示が出るはず.長いのでリダイレクト推奨
    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が実行時間の累計和
  7. 次回ビルドするときに何か言われることがあるが,プロファイラをしないなら,リビルドを行ってよい.

ジャンル:Visual Studio

FILE*構造体 †

int fseek(FILE *fp, long offset, int whence); †

  • whenceからoffsetバイト分移動したところに移動する
  • whenceは,
    • ファイルの先頭を表すSEEK_SET
    • 現在位置であるSEEK_CUR
    • 終端位置であるSEEK_END
  • のどれか

void rewind(FILE *fp); †

FILE* fopen(const char *filename, const char *mode); †

  • filenameとmodeの順番に注意!!

コード要素***が読み取り専用であるため、追加と削除操作は出来ません †

  • Visual Studio 2005で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はncbファイルの破損っぽい.
  • http://blogs.yahoo.co.jp/dpdtp652/837997.html 参照
  • ncbファイルはちなみにintellisenseの情報を保存したファイルっぽい.
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するプロジェクト名.ncbファイルを削除
  • 再びソリューションを開くと問題が解決している

ジャンル:Visual Studio

コード要素***が読み取り専用であるため、追加と削除操作は出来ません VS2010編 †

  • Visual Studio 2010で発生
  • MFCダイアログボックスにボタンを追加し,イベントハンラを追加しようとしたら発生
  • 原因はインテリセンスの保存されているsdfファイルの模様
  • ソリューションを1度閉じた後,ソリューションと同じフォルダに存在するソリューション名.sdfファイルを削除
  • 再びソリューションを開くと問題が解決している
  • また、だいたいのクラスウィザードのエラーはこれ

ジャンル:Visual Studio

プロジェクトにクラスの追加を行うとVisutal Studioがフリーズする †

  • メニューからクラスの追加操作を行うだけでVisual Studioがフリーズする.
  • 原因はコード要素が読み取り専用..と類似
  • ncbファイルを削除すること

ジャンル:Visual Studio

CRとLF †

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

コンソール画面が消えない †

  • 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

ジャンル:Visual Studio

Visual Studio でコマンドラインアプリをデバッグする際,引数を指定する方法 †

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

C/C++のトラブル集_第1张图片

  • 参考:応用機械情報工学 2006@八戸工業大学機械情報技術学科 の手順06

ジャンル:Visual Studio

OpenCV のリポジトリにアクセスしようとしたらユーザ名とパスワードを要求された †

  • 本来はOpenCVのリポジトリにuserもpasswordも要らない
  • 最近*5OpenCVのリポジトリが code.ros.org から code.opencv.org に移行した.
    • 更にその昔は CVS でバージョン管理してた時代にはユーザ名があったはずだけれど
  • ちなみにリポジトリ間では互換性(?)が無いので,もう1度 full checkout する必要がある.
  • そして2012年7月26日にOpenCVのリポジトリもSVNからgitに変わった
  • 参考:OpenCV Computer Vision Library ()*6

ビットリバースとポップカウント †

  • bit表記した変数(例えば16bitのshort)の中に1がいくつ存在するかをカウントするのがポップカウント
  • bit表記した変数(例えば16bitのshort)のbitの並びを前後逆にするのがビットリバース
  • 10進数 16進数 2進数 ビットリバース ポップカウント
    1 0x01 00000001 10000000 1
    2 0x02 00000010 01000000 1
    3 0x03 00000011 11000000 2
    182 0xB6 10110110 01101101 5
    88 0x58 01011000 00011010 3
  • ルックアップテーブルを使うと結構速い。*7*8*9
  • ビット単位で数える/並べ替えると著しく遅い*9*7*8
  • また、マスキングを使った分割統治法もある*10

プリプロセッサ †

  • #ifdefなんかはよく使う
    #define
    #if defined()
    #if !defined()
  • cppコマンドというのを使うと、プリプロセッサ後のファイルを得られる*11*12
  • C言語のプリプロセッサの定義に関して解説
  • C言語のプリプロセスのメモ(Hishidama's C pre-process Memo)*13

C言語の文字コード変換について †

  • 特に限定してないけれど、基本的にSJIS→UTF-8への変換ができるAPIやライブラリを調べてみた。

::WideCharToMultiByte を使う方法 †

  • WindowsのWIN32APIなので、広くWindowsで使うことができる。
  • SJIS→UTF16→UTF8 の順で変換する。(逆も然り)
  • 参考:its55 lab » C++でShift-JISをUTF-8に変換する*14
  • 参考:its55 lab » C++でUTF-8をShift-JISに変換する*15
  • 参考:WideCharToMultiByte 関数 - msdn*16
  • 参考:MultiByteToWideChar 関数 - msdn*17
  • 参考:GetTextCharset 関数 - msdn*18
  • 参考:IsTextUnicode 関数 - msdn*19
  • 参考:文字コードの変換ライブラリ | プログラマーズ雑記帳*20

iconvを使う方法 †

  1. iconv_t ic = iconv_open ( "SJIS" ,  "UTF-8" );
  2. memcpy ( in , utf8 ,  sizeof (utf8 )  );
  3. iconv ( ic ,  &in ,  &in_size ,  &out ,  &out_size );
  4. iconv_close (ic );
  • 当然ながらiconvがインストールされてなければならない
  • 参考:LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー *21
  • 参考:文字コードの変換ライブラリ | プログラマーズ雑記帳*20

ICUを使う方法 †

  • クロスプラットフォーム対応のICU
  • 参考:ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう*22
  • 参考:ICU - International Components for Unicode*23
  • 参考:C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家*24
  • 参考:utf 8 - C++ UTF-8 output with ICU - Stack Overflow*25
  • 参考:ICU による文字コード変換ライブラリ - yanoの日記*26

std::string内で使える文字列検索関数 †

  • STLにあるstd::string内にある関数
    find()・・・指定した文字列が、最初に現れる位置を返す
    rfind()・・・指定した文字列が、最後に現れる位置を返す
    find_first_of()・・・指定した文字列の一部の文字が、最初に現れる位置を返す
    find_last_of()・・・指定した文字列の一部の文字が、最後に現れる位置を返す
    find_first_not_of()・・・指定した文字列の一部に含まれない文字が、最初に現れる位置を返す
    find_last_not_of()・・・指定した文字列の一部に含まれない文字が、最後に現れる位置を返す
  • 引用元:C++編(標準ライブラリ) 第1章 string*27

vector でfindする方法 †

  1. #include
  2. #include
  3.  
  4. std :: vector <int > datas;
  5. int needle;
  6.  
  7. std :: vector <int >:: iterator it = std :: find (datas. begin ( ) , datas. end ( ) , needle );
  8. if (it == datas. end ( ) ) {
  9. //見つからなかった場合
  10. std :: cout  <<  "Not Found"  << std :: endl;
  11. }

‘&’ cannot appear in a constant-expression †

  • Visual Studio では通ったが、gccでは通らなかった
    1. std :: vector <std :: vector <std :: string >>  dataArrayNG // '>' が2つ続くと、gccだと叱られる
    2. std :: vector <std :: vector <std :: string >  > dataArrayOK // これならOK
  • また、gcc で const の宣言と代入を同時に行うと、同じメッセージが出力される*28

sleep について †

  • clock 関数や gettickcount 関数などがある
  • 時間測定関数の性能(分解能と最大値)のまとめ*29

iostream のフォーマット指定子 †

  • printfに慣れてしまったので、書式指定がどうもしっくりこない。
  • ゼロ埋め
    cout << setfill('0') << setw(5) << 20 << endl;
  • 16進数、10進数、8進数も使える*30
    cout << oct << 42;
    cout << dec << 42;
    cout << hex << 42;

typedef の順序 †

  • いつも混乱する*31
    typdef int MyType; 

<< operator のオーバーロード †

  • << operator をオーバーロードしたら、error LNK2005 リンクエラーが発生した。*32
  • 宣言と実装をヘッダとCPPで分ける必要がある。

getopt を使おう †

  • オレオレ実装でオプションを受け付けるのでなく、なるべくgetoptを使おう
  • 向川先生の解説サイトが分かりやすい*33

すべてのプログラマが読むべき記事10選 †

  • すべてのプログラマが読むべき記事10選 | POSTD*34
  • 10 Articles Every Programmer Must Read上記の元ネタ。英語*35
  • What Every Computer Scientist Should Know About Floating-Point Arithmetic*36
  • What Every Programmer Should Know About Memory*37

クラスのoperatorを定義するときの戻り値の型 †

  • 実験した上でまとめてるサイト*38
  • 代入演算
    foo& foo::operator = (const foo&);
  • 四則演算
    const foo foo::operator + (const foo&);
  • 四則演算と代入
    foo& foo::operator += (const foo&);
  • 比較演算
    bool foo::operator == (const foo&);
  • などなど
  • クラスの operator を定義するとき、戻り値の型はどうすべきか*38
  • 実験した上で考察されているので、自分が理解する手助けになった

string †

  • 文字を消すときはeraseでchar のindex単位で削除できる
    std::string hoge = std::string("foo");
    hoge.erase(0,1);
    std::cout << hoge << std::endl;
  • 実行結果
    oo

Visual Studio でcppunitをビルドするお話 †

  • cppunit*39 自体は2008-02-20時点からアップデートされていない(1.12.1)(2014-11-30時点)
  • 付属しているサンプルはdsw(VS6)でビルドする用なので、Visual Studio 2012 とかでビルドしようとすると、若干手間取る。
  • Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks*40
  • というか、VisualStudio2012あたりだと、自前でテスト機能がついているっぽいから、そっちから勉強しないと。
  • cppunit をVisual Studio で使うためのチュートリアル。*41
  • cppunit自体が古いのかなぁ。

Sleep関数 †

  • 標準関数ではないので、実装系により、適当なファイルをインクルードする必要がある
  • Windows標準はWindows.hにある
  • unix系だと、unistd.hにsleepがある
  • What is the proper #include for the function 'sleep' in C? - Stack Overflow*42

複数桁数の数字を文字列に変換する †

  • std::to_string を使うと便利。
  • string ヘッダにある。
  • Alternative to itoa() for converting integer to string C++? - Stack Overflow*43

ある型が定義されているか確認する方法 †

  • C/C++の仕組みでやるのは無理
  • define されてるヘッダのインクルードガードで判別するのが良い。
  • c++ - How to check if a datatype is "defined" with typedef - Stack Overflow*44

Cコンパイラとプラットフォームを判定する定義済みマクロ †

  gcc msvc
64bit (IA64) __ia64__ _M_IA64
64bit (x86_64) __x86_64__ _M_X64
32bit (x86) __i386__ _M_IX86
  • Cコンパイラのプラットフォーム、コンパイラを判別する定義済みマクロ*45*46
  • メジャーなarchitecture/compiler による pre defined macros
  • Alpha, AMD64, ARM, ARM64, Blackfin, Convex, Epiphany, HP/PA RISC, Intel x86, Intel Itanium IA-64, Motorola 68k, MIPS, PowerPC, Pyramid 9810, RS/6000, SPARC, SuperH, SystemZ, TMS320, TMS470
  • こんなアーキテクチャあるんだ・・
  • Pre-defined Compiler Macros / Wiki / Architectures*47

ビット操作 †

  • ビット操作だけでかなりの数学的に処理を再現できる
  • 特にループが無くビット操作で再現出来ると、くっそ速い。
  • 参考:Bit Twiddling Hacks *48

streamクラスのeof †

  • streamクラスがC++の標準ライブラリで定義されている
  • eofが返す値のタイミングをチェック
  • 【C/C++】 streamクラスのeofメンバ: 日々此精進*49

Error: use of enum ‘AVCodecID’ without previous declaration †

  • Ubuntu 12.04(32bit)に自前ビルドのffmpegをインストールしたのが恐らく原因
  • Compile error using old ffmpeg with OpenCV
  • ffmpegとOpenCVのバージョンが食い違うと発生する
  • Old types and enums cause this error
  • 型やenumが食い違う
  • ffmpegを最新にしたり、パッケージからインストールしたり、最悪アンインストールすればビルドできるはず
  • cap_ffmpeg_impl.hpp内のenumを書き換える方法も示唆されている*50
  • 参考:OpenCVふのフォーラムでの回答*50
  • 参考:ffmpegをソースからビルドしてOpenCVをビルドする方法*51
  • 参考:OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin*52
  • 参考:Debian上にffmpegをインストールする方法*53

C++でvectorの参照渡しを省略可能にする方法 †

  • 普通の引数はオプションにすることが可能
    void func(int a, int b = 0);
  • と宣言されていれば、
    func(1);    // func(1, 0) と等価
    func(1, 0); // 上記と同じ挙動
    func(1, 1); // いずれもエラーにならない
  • という呼び方が可能
  • ただ、引数にvector何かをオプションで渡したいときに悩む
    void func(int a, std::vector<int>& b = std::vector<int>());
  • こうすれば、bのvectorはオプション扱い
  • 参考:shnya_mさんはTwitterを使っています: "@uchumik ディフォルト引数取るってことは、*54
  • 参考:gist:5048103*55

*1  float vs. double, 2005-08-08公開, 2009-08-15更新, 2013-03-12閲覧
*2  コンパイラの警告 (レベル 1) C4930, 2007-11更新, 2013-08-22閲覧
*3  【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! « 吟遊詩人の戯言, 2009-07-14公開, 2013-03-12閲覧
*4  How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow, 2013-06-01投稿, 2013-06-01回答, 2014-11-30閲覧
*5  詳しくはいつだか覚えてないけれど
*6  OpenCV Computer Vision Library (), 2012-04-30投稿, 2013-03-26閲覧
*7  Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C - Stack Overflow, 2012-11-26閲覧
*8  ビットリバース - sileの日記, 2012-11-26閲覧
*9  ビットを数える・探すアルゴリズム, 2004-05-04公開, 2012-09-01更新, 2013-05-09閲覧
*10  ビットリバース - 簡潔なQ, 2012-11-26閲覧
*11  Man page of cpp, 1993-04-30公開, 2013 -03-11更新, 2013-03-12閲覧
*12  16.3 プリプロセッサ cpp, 2013-03-12閲覧
*13  C言語のプリプロセスのメモ(Hishidama's C pre-process Memo), 2006-10-30更新, 2015-01-13閲覧
*14  its55 lab ≫ C++でShift-JISをUTF-8に変換する, 2008-06-11公開, 2013-03-26閲覧
*15  its55 lab ≫ C++でUTF-8をShift-JISに変換する, 2008-06-25公開, 2013-03-26閲覧
*16  WideCharToMultiByte 関数 - msdn, 2013-03-26閲覧
*17  MultiByteToWideChar 関数 - msdn, 2013-03-26閲覧
*18  GetTextCharset 関数 - msdn, 2013-03-26閲覧
*19  IsTextUnicode 関数 - msdn, 2013-03-26閲覧
*20  文字コードの変換ライブラリ | プログラマーズ雑記帳, 2011-11-24公開, 2013-03-26閲覧
*21  LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー , 2010-03-12公開, 2013-03-26閲覧
*22  ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう, 2010-03-18公開, 2013-03-26閲覧
*23  ICU - International Components for Unicode, 2013-03-26閲覧
*24  C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家, 2010-04-29公開, 2012-08-08修正, 2013-03-26閲覧
*25  utf 8 - C++ UTF-8 output with ICU - Stack Overflow, 2010-04-29投稿, 2013-03-26閲覧
*26  ICU による文字コード変換ライブラリ - yanoの日記, 2010-08-22公開, 2013-03-26閲覧
*27  C++編(標準ライブラリ) 第1章 string, 2013-04-10更新, 2013-04-16閲覧
*28  Cannot appear constant-expression? - yukimiの成長記, 2009-04-08公開, 2013-04-16閲覧
*29  時間測定関数の性能(分解能と最大値)のまとめ, 2013-08-22閲覧
*30  C++ の iostream フォーマット指定早見表, 2012-04-13公開, 2013-08-22閲覧
*31  typedefの使い方, 2013-08-22閲覧
*32  c++ - overloading << for my class - Stack Overflow, 2011-08-20投稿, 2013-08-28閲覧
*33  向川康博, getoptによるオプション解析, 1998-08-18公開, 2004-06-16更新, 2014-06-30閲覧
*34  すべてのプログラマが読むべき記事10選 | POSTD, 2014-06-27公開, 2014-06-30閲覧
*35  Javin Paul, 10 Articles Every Programmer Must Read, 2014-05-13公開, 2014-06-30閲覧
*36  David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic, 1991-03公開, 2014-06-30閲覧
*37  Ulrich Drepper, What Every Programmer Should Know About Memory, 2007-11-21公開, 2014-06-30閲覧
*38  クラスの operator を定義するとき、戻り値の型はどうすべきか, 2012-04-07更新, 2014-11-30閲覧
*39  CppUnit - C++ port of JUnit | SourceForge.net, 2008-02-20更新(v1.12.1), 2014-11-30閲覧
*40  skmk, Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks, 2011-01-25公開, 2011-04-16更新, 2014-11-30閲覧
*41  επιστημη(えぴすてーめー), 連載 C++開発者のための単体テスト入門:第2回 C++アプリケーションの効率的なテスト手法(CppUnit編) (1/4) - @IT, 2007-08-17更新, 2014-11-30閲覧
*42  What is the proper #include for the function 'sleep' in C? - Stack Overflow, 2013-02-11投稿, 2013-02-11回答, 2014-04-18更新, 2014-11-30閲覧
*43  Alternative to itoa() for converting integer to string C++? - Stack Overflow, 2008-10-23投稿, 2008-10-23回答, 2013-05-07更新
*44  c++ - How to check if a datatype is "defined" with typedef - Stack Overflow, 2010-08-18投稿, 2010-08-18回答, 2014-12-01閲覧
*45  Jonathan de Boyne Pollard, FGA: Predefined macros in C/C++ that tell you what the target processor is., 2014-05-12閲覧
*46  定義済みマクロ, VS2013, 2014-05-12閲覧
*47  Pre-defined Compiler Macros / Wiki / Architectures, 2014-07-11更新, 2014-09-25閲覧
*48  Sean Eron Anderson, Bit Twiddling Hacks, 2014-08-04閲覧
*49  【C/C++】 streamクラスのeofメンバ: 日々此精進, 2009-12-12公開, 2015-01-13閲覧
*50  Build problems for openCV 2.4.1 with Ubuntu 12.04 LTS - OpenCV Q&A Forum, OpenCV 2.4.1, Ubuntu 12.04, 2013-04-28投稿, 2014-11-21更新, 2015-06-09閲覧
*51  Install OpenCV 2.4 on Ubuntu 12.04 « So Tired !_!, OpenCV 2.4, Ubuntu 12.04, 2012-07-17公開, 2015-06-09閲覧
*52  OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin, OpenCV 2.3.1, Ubuntu 12.04, 2015-06-09閲覧
*53  How to install FFmpeg on Debian? - Super User, 2011-05-21投稿, 2015-01-16更新, 2015-06-09閲覧
*54  shnya_mさんはTwitterを使っています: "@uchumik ディフォルト引数取るってことは、, g++ 4.4, 2013-02-27公開, 2015-06-09閲覧
*55  gist:5048103, 2013-02-27公開, 2015-06-10閲覧

添付ファイル: filecommand-line-argument.png 112379件 [詳細]

你可能感兴趣的:(C/C++のトラブル集)