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の違いについて †
C++のprivateなポインタ変数をreturnで外に出す †
- クラスでprivateで宣言したポインタ変数を,return でクラスの外に出すと,何も問題なく編集出来てしまう.
-
#include
-
#include
-
-
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の定義方法 †
- いっつも忘れるので自分用の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 を検出しました。 †
ジャンル:Visual Studio
fatal error C1020: 予期しない #endif です。 †
ジャンル: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: 引数を取り込む関数には評価されません。 †
ジャンル: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) が異なります。 †
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に << 演算子で出力する。
-
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;
}
- 後述するように、ヘッダファイルと実装を切り分けないと、多重定義が発生するので注意。
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: プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) †
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 を 抑制
-
#pragma warning(disable : 4819)
-
#include
-
#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にキャストしている
-
bool
function
(
int number
)
{
-
return
(bool
)number;
// warning C4800
-
}
- int型の変数が0だったらfalse,それ以外の場合はtrueとする場合は多々ある.
- しかし,intをboolにキャストしてはいけない(厳密には非boolの型どんなものでも)(仕様)
- 対処
- キャストするときに != 0 を使うのが一番簡単
-
bool
function
(
int number
)
{
-
return number
!=
0;
-
}
- 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++の場合(多分ほかも同じだと思うけれど)
- ビルド(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*構造体 †
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); †
コード要素***が読み取り専用であるため、追加と削除操作は出来ません †
- 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の画面
- 参考:応用機械情報工学 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
プリプロセッサ †
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を使う方法 †
-
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 の相互変換 - かおるんダイアリー *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内で使える文字列検索関数 †
vector でfindする方法 †
-
-
#include
-
-
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;
-
}
‘&’ cannot appear in a constant-expression †
- Visual Studio では通ったが、gccでは通らなかった
-
std
::
vector
<std
::
vector
<std
::
string
>> dataArrayNG
// '>' が2つ続くと、gccだと叱られる
-
std
::
vector
<std
::
vector
<std
::
string
>
> dataArrayOK
// これならOK
- また、gcc で const の宣言と代入を同時に行うと、同じメッセージが出力される*28
sleep について †
- clock 関数や gettickcount 関数などがある
- 時間測定関数の性能(分解能と最大値)のまとめ*29
iostream のフォーマット指定子 †
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 †
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閲覧
添付ファイル:
command-line-argument.png
112379件
[詳細]