[[メモ]]

メモに全部突っ込んで書いていたら,まさかの「サイズがデカすぎて処理できませんエラー」がサーバから返されてしまった.
しょうがないので,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 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]
-[[float vs. double>http://homepage1.nifty.com/herumi/prog/prog90.html]] 参照&note{float-vs-double-herumi:[[float vs. double>http://homepage1.nifty.com/herumi/prog/prog90.html]], 2005-08-08公開, 2009-08-15更新, 2013-03-12閲覧};

*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する段階でアウトなんじゃね?と思うんだが,コンパイラも実行時エラーも出ない.
-ポインタが指す番地の中身は変更できるが、ポインタが指す番地自体は変更できない

*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]
-"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では定義されてないとのうわさ.

#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 C2679: 二項演算子 '<<' : 型 'const largeNumber' の右オペランドを扱う演算子が見つかりません (または変換できません)。 [#e157d805]
-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に << 演算子で出力する。
#geshi(c++,number=on,start=38){{
template <class T>
struct assertion_traits 
{  
    static bool equal( const T& x, const T& y )
    {
        return x == y;
    }

    static std::string toString( const T& x )
    {
        OStringStream ost;
        ost << x;  // error
        return ost.str();
    }
};
}}
-この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;
 }
-[[後述>#uee91c54]]するように、ヘッダファイルと実装を切り分けないと、多重定義が発生するので注意。

*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);

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

ジャンル[[:Visual Studio]]

*warning C4390: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) [#pa1fcdd4]
-クラスのコンストラクタが引数が無いのに、空っぽのカッコ付きでコールするとこうなる
 class CHogehoge{
 public:
     CHogehoge() {};
 };
 main(){
     CHogehoge temp(); // ←こいつが警告を引き起こす
     //CHogehoge temp; // 正しくは、カッコ無しで宣言する
 }
-参考:[[コンパイラの警告 (レベル 1) C4930>http://msdn.microsoft.com/ja-jp/library/4ddd21xh%28v=vs.90%29.aspx]]&note{compiler-warning-c4930-msdn-official:[[コンパイラの警告 (レベル 1) C4930>http://msdn.microsoft.com/ja-jp/library/4ddd21xh%28v=vs.90%29.aspx]], 2007-11更新, 2013-08-22閲覧};
 
*warning C4819:ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 [#e785e7d6]
-OpenCVをVisual Studio 2005で利用するとこのwarningが出る.
-cv/cvcompat.h が原因.
-Visual Studio 2005でcv/compat.hを編集(一文字入力してから消去)してファイルを保存するとwarningが消える.
-参考:[[Visual C++ 2008 Express Edition - OpenCV@Chihara-Lab.>http://chihara.naist.jp/opencv/?Visual%20C%2B%2B%202008%20Express%20Edition#ca99c600]], 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 を 抑制

#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]]&note{opencv-warning-gurizuri:[[【VC++】OpenCVのヘッダが C4819ワーニングを出してウザい! &laquo; 吟遊詩人の戯言>http://gurizuri0505.halfmoon.jp/20090714/8497]], 2009-07-14公開, 2013-03-12閲覧};
- 正しいファイルをインクルードする
--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]]

*warning MSB8012: TargetPath does not match the Library's OutputFile [#q1b97615]
-古いVSのプロジェクトを新しいVSでビルドする発生する
-リンクするライブラリ名などを、$(TargetName) などのマクロで定義してる場合、新しいVSでそのあたりの仕様がかわっているっぽい
-自前で$(TargetName)などと書き換える必要があるっぽい
-参考:[[How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow>http://stackoverflow.com/questions/16876429/how-do-i-fix-warning-msb8012-in-a-static-library-project-in-visual-c-2010]]&note{how-do-i-fix-warning-msb8012-in-a-static-library-project-in-visual-c-2010:[[How do I fix warning MSB8012 in a static library project in Visual C++ 2010? - Stack Overflow>http://stackoverflow.com/questions/16876429/how-do-i-fix-warning-msb8012-in-a-static-library-project-in-visual-c-2010]], 2013-06-01投稿, 2013-06-01回答, 2014-11-30閲覧};

*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]]

*Debug Assertion Failed! Expression: _pFirstBlock == pHead [#p76df858]
-概要
--DLL内で確保されたメモリを、DLL外で解放すると、"Debug Assertion Failed!"というダイアログが発生する可能性がある
-発生条件
--[[参考サイト>https://stackoverflow.com/questions/18882760/debug-assertion-failed-expression-pfirstblock-phead]]&note{debug-assertion-failed-expression-pfirstblock-phead-stackoverflow:[[c++ - Debug Assertion Failed! Expression: _pFirstBlock == pHead - Stack Overflow>https://stackoverflow.com/questions/18882760/debug-assertion-failed-expression-pfirstblock-phead]], 2013-09-18投稿, 2017-05-23更新, 2018-07-24閲覧, Visual Studio 2012};にも書いてあるが、いくつか条件がある
--Visual Studio の設定でRuntime Library の設定を"Multi-threaded Debug (/MTd)"にしている場合
--全部で/MDd、/MD、/MTd、/MTと4パターンあるが、/MTdの場合にしか起きない
--DLL内部で確保したメモリ配列をDLLの外部で解放する
--そのときに、Debug Assertion Failedが発生する
-手元の環境
--gtestを使ってテストプログラムを書いていたときに遭遇
--gtestを使うためには、"Multi-threaded Debug (/MTd)"もしくは"Multi-threaded (/MT)"にする必要がある&note{googletest-github:[[googletest/googletest at master &#183; google/googletest>https://github.com/google/googletest/tree/master/googletest]], 2018-07-25閲覧};
--さもないと、こんなエラーに遭遇する
  error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in main.obj
--で、Releaseではheapの状況とか確認しないので、見た目はエラーが起きてないように見える。
--以下のようなプログラムで発生した (一部省略)
#geshi(c++){{
void function()
{
    std::vector<cv::Point> imagePointsUndistorted;            // このstd::vectorはこの時点で空っぽ
    cv::undistortPoints(imagePoints, imagePointsUndistorted); // この関数(DLL)内部でstd::vectorにデータが追加される(=メモリ領域が確保される)
}                                                             // 返ってきたメモリ配列はこの関数から抜ける時点(DLL外部)で破棄される
}}
--Multi-ThreadedかMulti-Threaded DLLかは、ランタイムライブラリのことで、通常はdynamicリンク(実行時にロード)される
--しかし、このためには、実行するコンピュータにランタイムライブラリが入ってる必要がある。これが/MDもしくは/MDdの選択 (Multi-threaded DLL、Multi-threaded Debug DLL)
--/MTもしくは/MTdの選択にすると、利用するランタイムライブラリをstaticリンク(プログラムに埋め込み)される
--プログラムサイズが増大するので、一長一短。
--最後の小文字のdは、Debug版を意味し、メモリの配列外アクセスなどのチェックも行われる
--このランタイムライブラリで管理される部分がまさにstd::vectorであり、この配列確保がDLL内部で行われていると、まずい。
-解決方法
--std::vectorをDLLにわたす前に確保しておく。
#geshi(c++){{
void function()
{
    std::vector<cv::Point> arrayPoints;
    arrayPoints.reserve(1000);                    // 予めメモリ領域を確保する
    cv::undistortPoints(imagePoints, arrayPoints);// 予め確保した領域にデータを書き込む
}                                                 // これだと解放するのは確保したときと同じく、DLLの外側
}}
--ただし、この場合は事前に配列のサイズがわかっている必要がある
--わからない場合は、余裕を持って多めに確保しておけば良い。
--なお、OpenCVを使っていたときにエラーに遭遇したが、本質的にはOpenCVは関係無い


*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が\rであり,Mac OS(9まで)などで使われていた改行コード
-LFが\nであり,Unix系のOSなどで使われている改行コード
-WindowsではCR+LFであり,\r\nで表される

*コンソール画面が消えない [#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も要らない
-最近&note{when?:詳しくはいつだか覚えてないけれど};OpenCVのリポジトリが code.ros.org から code.opencv.org に移行した.
--更にその昔は CVS でバージョン管理してた時代にはユーザ名があったはずだけれど
-ちなみにリポジトリ間では互換性(?)が無いので,もう1度 full checkout する必要がある.
-そして2012年7月26日に[[OpenCVのリポジトリもSVNからgitに変わった>OpenCVをgitでチェックアウトする]]
-参考:[[OpenCV Computer Vision Library ()>http://comments.gmane.org/gmane.comp.lib.opencv/53859]]&note{gmane-opencv-repository:[[OpenCV Computer Vision Library ()>http://comments.gmane.org/gmane.comp.lib.opencv/53859]], 2012-04-30投稿, 2013-03-26閲覧};

*ビットリバースとポップカウント [#z5e59158]
-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|
-ルックアップテーブルを使うと結構速い。&note{bit-reversal:[[Best Algorithm for Bit Reversal ( from MSB-&gt;LSB to LSB-&gt;MSB) in C - Stack Overflow>http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb-to-lsb-msb-in-c]], 2012-11-26閲覧};&note{bit-reversal-3:[[ ビットリバース - sileの日記>http://d.hatena.ne.jp/sile/20111213/1323710429]], 2012-11-26閲覧};&note{popcount-nminoru:[[ビットを数える・探すアルゴリズム>http://www.nminoru.jp/~nminoru/programming/bitcount.html]], 2004-05-04公開, 2012-09-01更新, 2013-05-09閲覧};
-ビット単位で数える/並べ替えると著しく遅い&note{popcount-nminoru};&note{bit-reversal};&note{bit-reversal-3};
-また、マスキングを使った分割統治法もある&note{bit-reversal-qnighy:[[ビットリバース - 簡潔なQ>http://qnighy.hatenablog.com/entry/20091006/1254832950]], 2012-11-26閲覧};

*プリプロセッサ [#wc37cd85]
-#ifdefなんかはよく使う
 #define
 #if defined()
 #if !defined()
-cppコマンドというのを使うと、プリプロセッサ後のファイルを得られる&note{mapage-cpp:[[Man page of cpp>http://linuxjm.sourceforge.jp/html/GNU_gcc/man1/cpp.1.html]], 1993-04-30公開, 2013 -03-11更新, 2013-03-12閲覧};&note{cpp-wakhok-kanayama:[[16.3 プリプロセッサ cpp>http://www.wakhok.ac.jp/~kanayama/C/03/node114.html]], 2013-03-12閲覧};
-C言語のプリプロセッサの定義に関して解説
-[[C言語のプリプロセスのメモ(Hishidama's C pre-process Memo)>http://www.ne.jp/asahi/hishidama/home/tech/c/preproc.html]]&note{pre-processor-of-c:[[C言語のプリプロセスのメモ(Hishidama's C pre-process Memo)>http://www.ne.jp/asahi/hishidama/home/tech/c/preproc.html]], 2006-10-30更新, 2015-01-13閲覧};

*C言語の文字コード変換について [#p839bf54]
-特に限定してないけれど、基本的にSJIS→UTF-8への変換ができるAPIやライブラリを調べてみた。

**::WideCharToMultiByte を使う方法 [#a4fffe34]

-WindowsのWIN32APIなので、広くWindowsで使うことができる。
-SJIS→UTF16→UTF8 の順で変換する。(逆も然り)
-参考:[[its55 lab &raquo; C++でShift-JISをUTF-8に変換する>http://www.lab.its55.com/?p=32]]&note{its-lab-sjis-utf8:[[its55 lab ≫ C++でShift-JISをUTF-8に変換する>http://www.lab.its55.com/?p=32]], 2008-06-11公開, 2013-03-26閲覧};
-参考:[[its55 lab &raquo; C++でUTF-8をShift-JISに変換する>http://www.lab.its55.com/?p=33]]&note{its-lab-utf8-sjis:[[its55 lab ≫ C++でUTF-8をShift-JISに変換する>http://www.lab.its55.com/?p=33]], 2008-06-25公開, 2013-03-26閲覧};
-参考:[[WideCharToMultiByte 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448089.aspx]]&note{widechar2multi-msdn:[[WideCharToMultiByte 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448089.aspx]], 2013-03-26閲覧};
-参考:[[MultiByteToWideChar 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448053.aspx]]&note{multi2widechar-msdn:[[MultiByteToWideChar 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448053.aspx]], 2013-03-26閲覧};
-参考:[[GetTextCharset 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc447944.aspx]]&note{gettextcharset-msdn:[[GetTextCharset 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc447944.aspx]], 2013-03-26閲覧};
-参考:[[IsTextUnicode 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448048.aspx]]&note{istextunicode-msdn:[[IsTextUnicode 関数 - msdn>http://msdn.microsoft.com/ja-jp/library/cc448048.aspx]], 2013-03-26閲覧};
-参考:[[文字コードの変換ライブラリ | プログラマーズ雑記帳>http://yohshiy.blog.fc2.com/blog-entry-63.html]]&note{yohshiy-widechar:[[文字コードの変換ライブラリ | プログラマーズ雑記帳>http://yohshiy.blog.fc2.com/blog-entry-63.html]], 2011-11-24公開, 2013-03-26閲覧};

**iconvを使う方法 [#p82d755e]
#geshi(C++,number=on){{
iconv_t ic = iconv_open("SJIS", "UTF-8");
memcpy( in, utf8, sizeof(utf8) );
iconv( ic, &in, &in_size, &out, &out_size );
iconv_close(ic);
}}
-当然ながらiconvがインストールされてなければならない
-参考:[[LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー >http://d.hatena.ne.jp/kaorun55/20100312/1268413354]]&note{iconv-kaorun55:[[LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - かおるんダイアリー >http://d.hatena.ne.jp/kaorun55/20100312/1268413354]], 2010-03-12公開, 2013-03-26閲覧};
-参考:[[文字コードの変換ライブラリ | プログラマーズ雑記帳>http://yohshiy.blog.fc2.com/blog-entry-63.html]]&note{yohshiy-widechar};

**ICUを使う方法 [#pdd60d10]
-クロスプラットフォーム対応のICU
-参考:[[ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう>http://d.hatena.ne.jp/faith_and_brave/20100318/1268896477]]&note{faith-icu:[[ICU Shift_JISとUTF-8の変換 - Faith and Brave - C++で遊ぼう>http://d.hatena.ne.jp/faith_and_brave/20100318/1268896477]], 2010-03-18公開, 2013-03-26閲覧};
-参考:[[ICU - International Components for Unicode>http://site.icu-project.org/]]&note{icu-official:[[ICU - International Components for Unicode>http://site.icu-project.org/]], 2013-03-26閲覧};
-参考:[[C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家>http://winter-tail.sakura.ne.jp/pukiwiki/index.php?C%A1%BFC%2B%2B%A4%A2%A4%EC%A4%B3%A4%EC%2F%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9%CA%D1%B4%B9%A5%E9%A5%A4%A5%D6%A5%E9%A5%EAICU%A4%CE%A5%B5%A5%F3%A5%D7%A5%EB%A1%CAUTF-8%A2%AASJIS%A1%CB%A4%C7%A4%B9%A1%A3]]&note{winter-tail-icu:[[C/C++あれこれ/文字コード変換ライブラリICUのサンプル(UTF-8→SJIS)です。 - 笑猫酒家>http://winter-tail.sakura.ne.jp/pukiwiki/index.php?C%A1%BFC%2B%2B%A4%A2%A4%EC%A4%B3%A4%EC%2F%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9%CA%D1%B4%B9%A5%E9%A5%A4%A5%D6%A5%E9%A5%EAICU%A4%CE%A5%B5%A5%F3%A5%D7%A5%EB%A1%CAUTF-8%A2%AASJIS%A1%CB%A4%C7%A4%B9%A1%A3]], 2010-04-29公開, 2012-08-08修正, 2013-03-26閲覧};
-参考:[[utf 8 - C++ UTF-8 output with ICU - Stack Overflow>http://stackoverflow.com/questions/2739572/c-utf-8-output-with-icu]]&note{stackoverflow-icu:[[utf 8 - C++ UTF-8 output with ICU - Stack Overflow>http://stackoverflow.com/questions/2739572/c-utf-8-output-with-icu]], 2010-04-29投稿, 2013-03-26閲覧};
-参考:[[ICU による文字コード変換ライブラリ - yanoの日記>http://d.hatena.ne.jp/blono/20100822/1282410928]]&note{blono-ynao-icu:[[ICU による文字コード変換ライブラリ - yanoの日記>http://d.hatena.ne.jp/blono/20100822/1282410928]], 2010-08-22公開, 2013-03-26閲覧};

*std::string内で使える文字列検索関数 [#nabef9c5]
-STLにあるstd::string内にある関数
 find()・・・指定した文字列が、最初に現れる位置を返す
 rfind()・・・指定した文字列が、最後に現れる位置を返す
 find_first_of()・・・指定した文字列の一部の文字が、最初に現れる位置を返す
 find_last_of()・・・指定した文字列の一部の文字が、最後に現れる位置を返す
 find_first_not_of()・・・指定した文字列の一部に含まれない文字が、最初に現れる位置を返す
 find_last_not_of()・・・指定した文字列の一部に含まれない文字が、最後に現れる位置を返す
-引用元:[[C++編(標準ライブラリ) 第1章 string>http://www.geocities.jp/ky_webid/cpp/library/001.html]]&note{std-library-cpp-ky_webid:[[C++編(標準ライブラリ) 第1章 string>http://www.geocities.jp/ky_webid/cpp/library/001.html]], 2013-04-10更新, 2013-04-16閲覧};
*vector でfindする方法 [#w49a4d24]
#geshi(c++,number=on){{
#include <algorithm>
#include <vector>

std::vector<int> datas;
int needle;

std::vector<int>::iterator it = std::find(datas.begin(), datas.end(), needle);
if(it == datas.end()){
//見つからなかった場合
std::cout << "Not Found" << std::endl;
}

}}

* '>>' should be '> >' within a nested template argument list [#od3c9df7]
-Visual Studio では通ったが、gccでは通らなかった
#geshi(C++, number){{
std::vector<std::vector<std::string>>  dataArrayNG // '>' が2つ続くと、gccだと叱られる
std::vector<std::vector<std::string> > dataArrayOK // これならOK
}}

* cannot appear in a constant-expression [#cdd1e974]
-gcc で const の宣言と代入を同時に行うと、エラーになる&note{constant-expression-yukimi:[[Cannot appear constant-expression? - yukimiの成長記>http://d.hatena.ne.jp/yukichanko/20090408/1239148982]], 2009-04-08公開, 2016-02-19閲覧};

*sleep について [#e129bb07]
-clock 関数や gettickcount 関数などがある
-[[時間測定関数の性能(分解能と最大値)のまとめ>http://www.hiramine.com/programming/windows/timerperformancecomparison.html]]&note{measure-time-windows:[[時間測定関数の性能(分解能と最大値)のまとめ>http://www.hiramine.com/programming/windows/timerperformancecomparison.html]], 2013-08-22閲覧};

*iostream のフォーマット指定子 [#gaba9f2e]
-printfに慣れてしまったので、書式指定がどうもしっくりこない。
-ゼロ埋め
 cout << setfill('0') << setw(5) << 20 << endl;
-16進数、10進数、8進数も使える&note{cpp-corresponds-iostream-printf:[[C++ の iostream フォーマット指定早見表>http://sla0.jp/2012/04/cpp%E3%81%AEiostream%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%8C%87%E5%AE%9A%E6%97%A9%E8%A6%8B%E8%A1%A8/]], 2012-04-13公開, 2013-08-22閲覧};
 cout << oct << 42;
 cout << dec << 42;
 cout << hex << 42;


*typedef の順序 [#d06c8897]
-いつも混乱する&note{how-to-use-typedef:[[typedefの使い方>http://www.geocities.co.jp/bleis_tift/cpp/typedef.html]], 2013-08-22閲覧};
 typdef int MyType; 

* << operator のオーバーロード [#uee91c54]
-<< operator をオーバーロードしたら、error LNK2005 リンクエラーが発生した。&note{lnk-error-2005-operator-overload:[[c++ - overloading &lt;&lt; for my class - Stack Overflow>http://stackoverflow.com/questions/7129434/overloading-for-my-class]], 2011-08-20投稿, 2013-08-28閲覧};
-宣言と実装をヘッダとCPPで分ける必要がある。

* getopt を使おう [#l88cfe5d]
-オレオレ実装でオプションを受け付けるのでなく、なるべくgetoptを使おう
-[[向川先生の解説サイトが分かりやすい>http://omilab.naist.jp/~mukaigawa/misc/getopt.html]]&note{dr-mukaigawa-getopt-explanation:向川康博, [[getoptによるオプション解析>http://omilab.naist.jp/~mukaigawa/misc/getopt.html]], 1998-08-18公開, 2004-06-16更新, 2014-06-30閲覧};

*すべてのプログラマが読むべき記事10選 [#d9d4a97a]
-[[すべてのプログラマが読むべき記事10選 | POSTD>http://postd.cc/10-articles-every-programmer-must-read/]]&note{10-articles-all-programmer-should-read:[[すべてのプログラマが読むべき記事10選 | POSTD>http://postd.cc/10-articles-every-programmer-must-read/]], 2014-06-27公開, 2014-06-30閲覧};
-[[10 Articles Every Programmer Must Read>http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html]]上記の元ネタ。英語&note{ten-articles-every-programmer-must-read:Javin Paul, [[10 Articles Every Programmer Must Read>http://javarevisited.blogspot.sg/2014/05/10-articles-every-programmer-must-read.html]], 2014-05-13公開, 2014-06-30閲覧};
-[[What Every Computer Scientist Should Know About Floating-Point Arithmetic>http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html]]&note{what-every-computer-scientist-should-know-about-floating-point:David Goldberg, [[What Every Computer Scientist Should Know About Floating-Point Arithmetic>http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html]], 1991-03公開, 2014-06-30閲覧};
-[[What Every Programmer Should Know About Memory>http://www.akkadia.org/drepper/cpumemory.pdf]]&note{what-every-programmer-should-know-about-memory:Ulrich Drepper, [[What Every Programmer Should Know About Memory>http://www.akkadia.org/drepper/cpumemory.pdf]], 2007-11-21公開, 2014-06-30閲覧};

*クラスのoperatorを定義するときの戻り値の型 [#xfb43dfe]
-実験した上でまとめてるサイト&note{operator-definition:[[クラスの operator を定義するとき、戻り値の型はどうすべきか>http://www.hiramine.com/programming/c_cpp/operator.html]], 2012-04-07更新, 2014-11-30閲覧};
-代入演算
 foo& foo::operator = (const foo&);
-四則演算
 const foo foo::operator + (const foo&);
-四則演算と代入
 foo& foo::operator += (const foo&);
-比較演算
 bool foo::operator == (const foo&);
-などなど
-[[クラスの operator を定義するとき、戻り値の型はどうすべきか>http://www.hiramine.com/programming/c_cpp/operator.html]]&note{operator-definition};
-実験した上で考察されているので、自分が理解する手助けになった

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


*Visual Studio でcppunitをビルドするお話 [#c3ec0623]
-[[cppunit>http://sourceforge.net/projects/cppunit/]]&note{cppunit-sourceforge:[[CppUnit - C++ port of JUnit | SourceForge.net>http://sourceforge.net/projects/cppunit/]], 2008-02-20更新(v1.12.1), 2014-11-30閲覧}; 自体は2008-02-20時点からアップデートされていない(1.12.1)(2014-11-30時点)
-付属しているサンプルはdsw(VS6)でビルドする用なので、Visual Studio 2012 とかでビルドしようとすると、若干手間取る。
-[[Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks>http://unicus.jp/skmk/archives/422]]&note{smks-vs-cpp:skmk, [[Visual Studio C++でCppUnitをビルドできない、そんなとき | skmks>http://unicus.jp/skmk/archives/422]], 2011-01-25公開, 2011-04-16更新, 2014-11-30閲覧};
-というか、VisualStudio2012あたりだと、自前でテスト機能がついているっぽいから、そっちから勉強しないと。
-[[cppunit をVisual Studio で使うためのチュートリアル。>http://www.atmarkit.co.jp/ait/articles/0708/17/news078.html]]&note{how-to-use-cppunit-on-vs:επιστημη(えぴすてーめー), [[連載 C++開発者のための単体テスト入門:第2回 C++アプリケーションの効率的なテスト手法(CppUnit編) (1/4) - @IT>http://www.atmarkit.co.jp/ait/articles/0708/17/news078.html]], 2007-08-17更新, 2014-11-30閲覧};
-cppunit自体が古いのかなぁ。

*Sleep関数 [#i579fb1e]
-標準関数ではないので、実装系により、適当なファイルをインクルードする必要がある
-Windows標準はWindows.hにある
-unix系だと、unistd.hにsleepがある
-[[What is the proper #include for the function 'sleep' in C? - Stack Overflow>http://stackoverflow.com/questions/14818084/what-is-the-proper-include-for-the-function-sleep-in-c]]&note{what-is-the-proper-include-for-the-function-sleep-in-c:[[What is the proper #include for the function 'sleep' in C? - Stack Overflow>http://stackoverflow.com/questions/14818084/what-is-the-proper-include-for-the-function-sleep-in-c]], 2013-02-11投稿, 2013-02-11回答, 2014-04-18更新, 2014-11-30閲覧};


*複数桁数の数字を文字列に変換する [#r83345d9]
-std::to_string を使うと便利。
-string ヘッダにある。
-[[Alternative to itoa() for converting integer to string C++? - Stack Overflow>http://stackoverflow.com/questions/228005/alternative-to-itoa-for-converting-integer-to-string-c]]&note{alternative-to-itoa-for-converting-integer-to-string-c:[[Alternative to itoa() for converting integer to string C++? - Stack Overflow>http://stackoverflow.com/questions/228005/alternative-to-itoa-for-converting-integer-to-string-c]], 2008-10-23投稿, 2008-10-23回答, 2013-05-07更新};

*ある型が定義されているか確認する方法 [#se34d38f]
-C/C++の仕組みでやるのは無理
-define されてるヘッダのインクルードガードで判別するのが良い。
-[[c++ - How to check if a datatype is &quot;defined&quot; with typedef - Stack Overflow>http://stackoverflow.com/questions/3517174/how-to-check-if-a-datatype-is-defined-with-typedef]]&note{how-to-check-if-a-datatype-is-defined-with-typedef:[[c++ - How to check if a datatype is &quot;defined&quot; with typedef - Stack Overflow>http://stackoverflow.com/questions/3517174/how-to-check-if-a-datatype-is-defined-with-typedef]], 2010-08-18投稿, 2010-08-18回答, 2014-12-01閲覧};

*Cコンパイラとプラットフォームを判定する定義済みマクロ [#x1b1cd23]
||gcc|msvc|
|64bit (IA64)|__ia64__|_M_IA64|
|64bit (x86_64)|__x86_64__|_M_X64|
|32bit (x86)| __i386__|_M_IX86|
-Cコンパイラのプラットフォーム、コンパイラを判別する定義済みマクロ&note{predefined-macros-in-c-cpp:Jonathan de Boyne Pollard, [[FGA: Predefined macros in C/C++ that tell you what the target processor is.>http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/predefined-macros-processor.html]], 2014-05-12閲覧};&note{predefined-macros-in-VS2013:[[定義済みマクロ>http://msdn.microsoft.com/ja-jp/library/b0084kay.aspx]], VS2013, 2014-05-12閲覧};
-メジャーな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>http://sourceforge.net/p/predef/wiki/Architectures/]]&note{pre-defined-macros-sourceforge-wiki:[[Pre-defined Compiler Macros / Wiki / Architectures>http://sourceforge.net/p/predef/wiki/Architectures/]], 2014-07-11更新, 2014-09-25閲覧};
-[[Pre-defined Compiler Macros / Wiki / Compilers>https://sourceforge.net/p/predef/wiki/Compilers/]]&note{pre-defined-macros-compiler-sourceforge-wiki:[[Pre-defined Compiler Macros / Wiki / Compilers>https://sourceforge.net/p/predef/wiki/Compilers/]], 2015-07-02更新, 2016-08-17閲覧};

*ビット操作 [#p5494fba]
-ビット操作だけでかなりの数学的に処理を再現できる
-特にループが無くビット操作で再現出来ると、くっそ速い。
-参考:[[Bit Twiddling Hacks>http://graphics.stanford.edu/~seander/bithacks.html]] &note{bit-twidding-by-sean-anderson:Sean Eron Anderson, [[Bit Twiddling Hacks>http://graphics.stanford.edu/~seander/bithacks.html]], 2014-08-04閲覧};

*streamクラスのeof [#cdb4b69d]
-streamクラスがC++の標準ライブラリで定義されている
-eofが返す値のタイミングをチェック
-[[【C/C++】 streamクラスのeofメンバ&#x3a; 日々此精進>http://murakan.cocolog-nifty.com/blog/2009/12/cstreameof-7401.html]]&note{eof-of-cpp-stream-class:[[【C/C++】 streamクラスのeofメンバ&#x3a; 日々此精進>http://murakan.cocolog-nifty.com/blog/2009/12/cstreameof-7401.html]], 2009-12-12公開, 2015-01-13閲覧};

*Error: use of enum ‘AVCodecID’ without previous declaration [#wf1b1a16]
-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を書き換える方法も示唆されている&note{build-problems-for-opencv-241-with-ubuntu-1204-lts:[[Build problems for openCV 2.4.1 with Ubuntu 12.04 LTS - OpenCV Q&amp;A Forum>http://answers.opencv.org/question/12597/build-problems-for-opencv-241-with-ubuntu-1204-lts/]], OpenCV 2.4.1, Ubuntu 12.04, 2013-04-28投稿, 2014-11-21更新, 2015-06-09閲覧};
-参考:[[OpenCVふのフォーラムでの回答>http://answers.opencv.org/question/12597/build-problems-for-opencv-241-with-ubuntu-1204-lts/]]&note{build-problems-for-opencv-241-with-ubuntu-1204-lts};
-参考:[[ffmpegをソースからビルドしてOpenCVをビルドする方法>http://nick.txtcc.com/index.php/linux/883]]&note{install_opencv_2_4_on_ubuntu_12_04:[[Install OpenCV 2.4 on Ubuntu 12.04 &laquo; So Tired !_!>http://nick.txtcc.com/index.php/linux/883]], OpenCV 2.4, Ubuntu 12.04, 2012-07-17公開, 2015-06-09閲覧};
-参考:[[OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin>http://opencvlover.blogspot.be/2012/05/install-opencv-231-on-ubuntu-1204.html]]&note{install_opencv_2_3_1_on_ubuntu_12_04:[[OpenCV Lover: Install Opencv 2.3.1 on Ubuntu 12.04 Precise Pangolin>http://opencvlover.blogspot.be/2012/05/install-opencv-231-on-ubuntu-1204.html]], OpenCV 2.3.1, Ubuntu 12.04, 2015-06-09閲覧};
-参考:[[Debian上にffmpegをインストールする方法>http://superuser.com/questions/286675/how-to-install-ffmpeg-on-debian]]&note{how_to_install_ffmpeg_on_debian:[[How to install FFmpeg on Debian? - Super User>http://superuser.com/questions/286675/how-to-install-ffmpeg-on-debian]], 2011-05-21投稿, 2015-01-16更新, 2015-06-09閲覧};

*C++でvectorの参照渡しを省略可能にする方法 [#u71944f4]
-普通の引数はオプションにすることが可能
#geshi(c){{
void func(int a, int b = 0);
}}
-と宣言されていれば、
#geshi(c){{
func(1);    // func(1, 0) と等価
func(1, 0); // 上記と同じ挙動
func(1, 1); // いずれもエラーにならない
}}
-という呼び方が可能
-ただ、引数にvector何かをオプションで渡したいときに悩む
#geshi(c){{
void func(int a, const std::vector<int>& b = std::vector<int>());
}}
-こうすれば、bのvectorはオプション扱い
-constを付けないと、gccだと叱られる
-参考:[[shnya_mさんはTwitterを使っています: &quot;@uchumik ディフォルト引数取るってことは、>https://twitter.com/shnya_m/status/306766473781727232]]&note{how-to-use-vector-reference-as-an-option:[[shnya_mさんはTwitterを使っています: &quot;@uchumik ディフォルト引数取るってことは、>https://twitter.com/shnya_m/status/306766473781727232]], g++ 4.4, 2013-02-27公開, 2015-06-09閲覧};
-参考:[[gist:5048103>https://gist.github.com/anonymous/5048103]]&note{how-to-use-vector-reference-as-an-option-gist:[[gist:5048103>https://gist.github.com/anonymous/5048103]], 2013-02-27公開, 2015-06-10閲覧};

* invalid initialization of non-const reference of type [#c67147c2]
-Visual Studio では発生しないが、gccで発生するエラー
-関数の実引数が一時変数の時は、constを付けないと、エラーになる&note{gcc-recent-trouble-ousttrue:[[最近のはまりポイント - 三次元日誌>http://d.hatena.ne.jp/ousttrue/20081119/1227064302]], 2008-11-19公開, 2016-02-08閲覧};&note{call-by-reference-cpp:[[リリカル☆Lisp開発日記  &raquo; Blog Archive   &raquo; C++の参照を使ってもcall by referenceにはならない>http://blog.bugyo.tk/lyrical/archives/861]], 2011-06-05公開, 2016-02-08閲覧};
-普通の変数と一時的な変数
--int a などは普通の変数
--a + 1 の結果もintだが、格納するまでは一時変数
-サンプルコード
#geshi(c++){{
inline myClass myClass::clone() const
{
    myClass m;
    return m;
}

void function1(myClass& before)
{
    return;
}

void function2(const myClass& before)
{
    return;
}

int main(int argc, char **argv)
{
    myClass a = myClass();

    function1(a);
    function1(a.clone()); // this causes error 'invalid initialization of non-const reference of type'
    function2(a);
    function2(a.clone());

    return 0;
}
}}
--前述のサンプルコードのうち、2つ目のcall だけがgccでエラーになる&note{gcc-version:gcc 4.6.3で確認したが、どれも同じだと思う};
--Visual Studio では発生しない&note{vs-version:Visual Studio 2012で確認};
-参考:[[最近のはまりポイント - 三次元日誌>http://d.hatena.ne.jp/ousttrue/20081119/1227064302]]&note{gcc-recent-trouble-ousttrue};
-参考:[[リリカル☆Lisp開発日記  &raquo; Blog Archive   &raquo; C++の参照を使ってもcall by referenceにはならない>http://blog.bugyo.tk/lyrical/archives/861]]&note{call-by-reference-cpp};

* how to create a directory using c++ + WINAPI [#r011204d]
- use CreateDirectory API from WINAPI
#geshi(c++){{
void dumpdata(std::string dirname, std::vector<double> data)
{
    CreateDirectory(dirname.c_str(), NULL);
    if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
        std::cerr << "directory " << dirname << " already exists" << std::endl;
    }
}
}}
-[[c++ - Create a directory if it doesn&#39;t exist - Stack Overflow>http://stackoverflow.com/questions/9235679/create-a-directory-if-it-doesnt-exist]]&note{create-a-directory-if-it-doesnt-exist:[[c++ - Create a directory if it doesn&#39;t exist - Stack Overflow>http://stackoverflow.com/questions/9235679/create-a-directory-if-it-doesnt-exist]], 2012-02-10投稿, 2012-02-10回答, 2017-01-24更新, 2017-01-25閲覧};
-[[c++ - How to find out if a folder exists and how to create a folder? - Stack Overflow>http://stackoverflow.com/questions/5621944/how-to-find-out-if-a-folder-exists-and-how-to-create-a-folder]]&note{how-to-find-out-if-a-folder-exists-and-how-to-create-a-folder:[[c++ - How to find out if a folder exists and how to create a folder? - Stack Overflow>http://stackoverflow.com/questions/5621944/how-to-find-out-if-a-folder-exists-and-how-to-create-a-folder]], 2011-04-11投稿, 2011-04-11回答, 2014-10-02更新, 2017-01-25閲覧};
-if you need non-windows API, [[mkdir>http://pubs.opengroup.org/onlinepubs/009695399/functions/mkdir.html]] is an alternative&note{opengroup-mkdir:[[mkdir>http://pubs.opengroup.org/onlinepubs/009695399/functions/mkdir.html]], 2017-01-25閲覧};
-Also, on Visual Studio, there is _mkdir and _wmkdir API&note{mkdir_wmkdir_msdn:[[_mkdir, _wmkdir>https://msdn.microsoft.com/en-us/library/2fkk4dzw.aspx]], VS2003-VS2015, 2017-01-25閲覧};

*get the last character of std::string [#i25232b6]
- use rbegin API&note{get-the-last-element-of-a-stdstring:[[c++ - Get the last element of a std::string - Stack Overflow>http://stackoverflow.com/questions/4884548/get-the-last-element-of-a-stdstring]], 2011-02-03投稿, 2011-02-03回答, 2013-08-20更新, 2017-01-25閲覧};
#geshi(c++){{
    char lastCharacter = *string.rbegin();
}}
- If c++11 is available, use string.back()

* how to get a string which express time information [#c4f28a6f]
- use time_t and ostringstream&note{cpp_date_time:[[C++ Date and Time>https://www.tutorialspoint.com/cplusplus/cpp_date_time.htm]], 2017-01-25閲覧};
#geshi(c++){{
void getTimeString(std::string& result)
{
    time_t now =  time(0);
    tm ltm;
    localtime_s(&ltm, &now); // get the local time

    std::ostringstream ostr;  // use ostringstream to format the time
    ostr << ltm.tm_year + 1900;                                  // year
    ostr << std::setw(2) << std::setfill('0') << ltm.tm_mon + 1; // month
    ostr << std::setw(2) << std::setfill('0') << ltm.tm_mday;    // day
    ostr << std::setw(2) << std::setfill('0') << ltm.tm_hour;    // hour
    ostr << std::setw(2) << std::setfill('0') << ltm.tm_min;     // minute
    ostr << std::setw(2) << std::setfill('0') << ltm.tm_sec;     // second
    result = ostr.str();
}
}}
-itoa was a good function to convert an integer number to a string, but due to security issue, it's no longer standard&note{cplusplus-cstdlib-itoa:[[itoa - C++ Reference>http://www.cplusplus.com/reference/cstdlib/itoa/]],  2017-01-25閲覧};
-itoa_s(the alternative of itoa) doesn't convert the format, so it's not useful either&note{itoa_s_msdn:[[_itoa_s、_i64toa_s、_ui64toa_s、_itow_s、_i64tow_s、_ui64tow_s>https://msdn.microsoft.com/ja-jp/library/0we9x30h.aspx]], VS2005-VS2015, 2017-01-25閲覧};
-if WINAPI is available, use [[CString>http://stackoverflow.com/questions/12602526/how-can-i-convert-an-int-to-a-cstring]]&note{how-can-i-convert-an-int-to-a-cstring:[[c++ - How can I convert an Int to a CString? - Stack Overflow>http://stackoverflow.com/questions/12602526/how-can-i-convert-an-int-to-a-cstring]], 2012-09-12投稿, 2012-09-26回答, 2014-06-13更新, 2017-01-25閲覧};, otherwise depend on [[ostringstream>https://www.experts-exchange.com/articles/1577/Convert-String-to-int-Convert-int-to-String-in-C.html]]&note{Convert-String-to-int-Convert-int-to-String-in-C.html:[[Convert String to int / Convert int to String in C++>https://www.experts-exchange.com/articles/1577/Convert-String-to-int-Convert-int-to-String-in-C.html]], 2009-09-18公開, 2012-09-04更新, 2017-01-25閲覧};

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS