C・C++Debug日記


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

fprintfで画像のRGB値が格納されない

1.現象
fprintfでImage[R][G][B]を格納しようとすると「ハンドルされていない例外」が発生する。ビルドは通る面倒なタイプ。
2.原因
Image[R][G][B]の各値をcharで定義していたため?charの範囲は0~255まで(符号なしの場合)それ以上はオーバーロードされてしまう。
3.解決策
面倒だがintへ変換する必要がある。

外部シンボルエラー@MFC

1.Error Message
エラー 1 error LNK2001: 外部シンボル "___argv" は未解決です。 nafxcwd.lib
2.意味・原因
今回はあらかじめ用意したライブラリ内の関数が使われていないので動作しないという意味?リンカの設定ミス。
3.解決方法
メニューバー→プロジェクト→~のプロパティ(ソリューションエクスプローラーから表示してもよい)→構成プロパティ→全般→プロジェクトの既定値→MFCの使用
で「スタティックライブラリでMFCを使用する」に変更する。
4.後日談
上記の変更によってビルド、実行共に問題なくできたが、再び「標準Windowsライブラリを使用する」に変更してもビルドが可能になってしまった。リビルドで中間ファイルを削除してもビルドできてしまった。なぜ?
5.Link
似たような解決方法
外部シンボルエラーに関する記述(最下)
あまり関係ない

もらったプログラムのエントリポイントが見つからない

1.現象
池田さんからシミュレーションのプログラムをもらったけど、「main」も「_tmain」も「WinMain」も見つからない。どこから始まったのかわからん!!
2.原因
MFCを使って作られたプログラムはWinMainが見つからないくらい深いところにあるらしい。
3.解決方法
(1)知識
MFC での見かけ上のエントリポイントは CWinApp::InitInstance になる。
(2)探し方
readme.txtファイルでメインファイルを探し、メインファイル上で適当な位置にブレイクポイントを作成、デバック状態で変数ウィンドウのコンテキスト(O)で関数が呼び出された順に表示されるので最上位の関数を探す。
4.Link
エントリポイント c++ MFC で検索した結果出てきたページ
掲示板でのやり取り

lstrcpyが上手く使えない

1.エラーメッセージ
error C2664: 'lstrcpyW' : 1 番目の引数を 'char [80]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
2.原因
VisualStudio2005からデフォルトの文字セットがUnicodeに変更された。以前はShift_JISだった。この変更によりlstrcpyやMessageBoxにcharで日本語を表示できなくなった。
3.解決方法
(1)プロジェクト全体でShift_JISを使えるようにする
メニューバー→プロジェクト→~のプロパティ(ソリューションエクスプローラーから表示してもよい)→構成プロパティ→全般→プロジェクトの既定値→文字セット
で「マルチバイト文字セットを利用する」に変更する。
(2)lstrcpy関数でShift_JISを使えるようにする
文字列の前に「TEXT」を付ける。
4.Link
(1)の解決方法
(2)の解決方法
原因について書き込み
別の角度から

関数の引数として配列を与えたが値が変化しない

1.現象
配列は元からポインタなので関数内でアスタリスクを付けなくてもいいし、引数の頭にアンドを付ける必要もないはずなんだが?
2.原因
複数定義された配列(array[1], array[2],…,array[99])に対して、引数では
//関数定義
bool function( int *array){
~~~
}
void main(){
int array[100] = {0};
function( array ); 
}
と与えてしまい、これでは関数に対してarrayの先頭要素へのポインタのみ与えていることになり、各配列(array[1], array[2],…,array[99])の存在を関数functionは感知できない。
3.解決方法
配列の要素数、または使いたい配列番号を別に与える。上記の場合
//関数定義 
bool function( int *array, int n){
~~~
}
void main(){
int array[100] = {0};
function( array ,100); 
}
と100を与えることによって配列arrayの各要素にアクセスできる。
4.Link
京都産業大学プログラミングページ「関数」

printfでおかしな値が出る

1.現象
上記の通り。関数に引数として渡していると特に混乱しやすい。
2.原因
printfのフォーマット指定子の誤用
printf("avgZ = %d, \n",avgZ );※avgZはfloat型
↓
printf("avgZ = %f, \n",avgZ );
C&C++豆知識のprintfのフォーマット指定子の項目も参照

コンストラクタに戻り値が必要と言われた

1.エラーメッセージ
error C2533: 'SaveImage::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。
2.原因
クラス定義の終わりでセミコロンを打つのを忘れてた。
3.Link
BBSで質問
BLOG

GSLが入っていない2( libgsl.a がない )

1.エラーメッセージ
LINK : fatal error LNK1181: 入力ファイル 'libgsl.a' を開けません。
2.現象
下記のGSLが入っていないのインストール方法では'libgsl.a が手に入らない?
3.解決方法
Cygwinを導入.Win32上でのLinx環境であったが一部にGSLが入っている.Libフォルダの中にあった.
4.Link(Cygwinの導入方法)
Cygwinのインストール&設定方法(ここを基本にした)
Studio Sixnine.(Cygwinの日本語化のサイト)日本語化は失敗

GSLが入っていない

1.エラーメッセージ
fatal error C1083: include ファイルを開けません。'gsl/gsl_sf.h': No such file or directory
2.原因
GSLライブラリが入っていなかった。
3.GSLのインストール方法
ここここを参考にこの中からGSLを探しwin32版の最新版をインストールする.(GSL_1.10__LCG_win32_vc71.tar.gz)今のところVer1.10が最新版?
後はいつも通りdllファイルへPathを通してInclude , Lib の場所を開発環境へ教えておく.
しかしこれでは足りない.
3.Link
GSLのインストール方法@顔画像情報処理
GSLをWindowsのVisual C++で使う
Index of /service-spi/external/distribution
GSL_1.10__LCG_win32_vc71.tar.gz(直リン)

ビルドしてもbool変数(Flag)の値がtureに変わらない

1.原因
中間ファイルが邪魔して値の変化が反映されなかった.
2.解決方法
「ソリューションのリビルド Ctrl + Alt + F7 」で中間ファイルを全削除してリビルドする(@VisualStudio2005・2008).

<> と "" で囲むことの違い

インクルードのファイル名を "" で囲むのと <> で囲むのとではヘッダーファイルの検索場所が変わってくる。
標準ライブラリーのヘッダーは基本的に <> で囲むこと。
//#include "iostream.h"
#include <iostream.h>
しかしせっかくなので、
#include <iostream>
の方がいいかも。こちらの方が新しい仕様の標準ライブラリーらしい。
(引用-STLの使い方(string))

プログラムの新規作成でどんな設定でプロジェクトを始めるべきか@2005

1.目的〔以下の形のプログラムを作りたい〕
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// MFC を初期化して、エラーの場合は結果を印刷します。
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
	// TODO: 必要に応じてエラー コードを変更してください。
	_tprintf(_T("致命的なエラー: MFC の初期化ができませんでした。\n"));
	nRetCode = 1;
}
else
{
	// TODO: アプリケーションの動作を記述するコードをここに挿入してください。
}
return nRetCode;
}
2.設定
(1)新規作成→プロジェクト→Win32コンソールアプリケーションを選択
アプリケーションの種類:コンソール アプリケーション
追加のオプション:プリコンパイル済みヘッダー
共通ヘッダー ファイルを追加:MFC
を選択
(2)新規作成→プロジェクト→Win32プロジェクトを選択
その他は(1)と同じ

ハンドルされていない例外が発生

1.エラーメッセージ
PTracker.exe の 0x0037f024 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000028 を読み込み中にアクセス違反が発生しました。
2.現象
上記のエラーメッセージの後、デバッグが求められOkすると
// 解像度を決める
triclopsSetResolution( m_triclops, m_nImageHeight, m_nImageWidth );
の部分にポインタが出る。ここはカメラ関係のパラメータ初期化関数inti()内であり、triclops関係の一番最初の関数である(すぐ上の行はdisiclops関係の関数)よってカメラの初期化ができていない可能性あり。
3.解決法
今井T曰くBumblebee2から1へ戻すのは難しいかも。自分もBB2からDisiclopsに戻そうとしてできなかった。ということでBB2へ直接移行で。
4.Link
0xC0000005に関する記述( 25 7 2007, 8:41 午前 UTC)
アクセス違反に関する書き込み(一番下2000 11/21 13:18)

外部参照の未解決

1.エラーメッセージ
エラー 1 error LNK2001: 外部シンボル ""double (* skinTableModel4)[256]" (?skinTableModel4@@3PAY0BAA@NA)" は未解決です。FaceDetection.obj
エラー 5 fatal error LNK1120: 外部参照 4 が未解決です。 C:\~~.exe
2.現象
エラーメッセージをクリックしても該当箇所に飛ばない面倒なタイプ。対応方法もケースバイケース。面倒なタイプ。大体リンクミスだったりする。
3.原因
このタイプのエラーの原因は
(1)プロジェクトに必要なライブラリを加えていない(こっちが原因だった回数→2)
(2)"外部シンボル"とやらの実体がない(こっちが原因だった回数→2)
の二つに分かれる。今回は後者。
開発環境をVC++6.0から2005に移行中で"double (* skinTableModel4)[256]"を定義していなかった。
4.解決策
double skinTableModel4[kColorScale][kColorScale];  // テーブル---GAUSS MODEL 4

WinAPIメッセージボックスについて

1.エラーメッセージ
エラー 2 error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [27]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) c:~~cpp 130
2.原因
開発環境をVC++6.0から2005に変更した。
以前のVCと違ってコンパイルオプションのデフォルト値が変わったため違う解釈になっているから。
具体的にいうと

[構成プロパティ]-[全般]-[文字セット]

が、”UNICODE文字セットを使用する” になっているためです。
ソースに手を加えずにコンパイルを通すのであればこれをマルチバイト文字セットを使用する に変更すればよい
3.解決法
"メッセージ"→TEXT("メッセージ")
に変更
4.Link
Visual C++ フォーラム

timeGetTime()が使えない

1.エラーメッセージ
error C3861: 'timeGetTime': 識別子が見つかりませんでした
2.原因
#include plugin Error : 指定されたページはございません。
<mmsystem.h>が入っていない。
3.解決方法
#include plugin Error : 指定されたページはございません。
<mmsystem.h>をインクルードする。
<winmm.lib>をプロジェクトに追加
4.ツッコミ
プログラムを移植した際に現れたエラー。では以前のプログラムではなぜ動作した?
5.Link
http://pasobegi.fc2web.com/frame/cbuild/cb029.htm

using namespase Systemが使えない

1.エラーメッセージ
c:~~: error C2871: 'System' : 存在しないか名前空間ではありません。
2.解決方法
平面検出の「PSF遅すぎ」の項でまとめたのでそちらを参照。

log関数が使えない

1.エラーメッセージ
error C2668: 'log' : オーバーロード関数の呼び出しを解決することができません。
2.原因
引数の変数の定義がおかしかった。log は引数に double か float を入れなければいけない.今回は int を入れていた.
3.解決方法
EX) log(2) → log(2.0)
EX2)log(2) → log(( double ) 2)
本当にこんな風に変更した.

atan2関数が使えない

1.エラーメッセージ
error C2666: 'atan2' : 3 のオーバーロード関数があいまいです。(新しい機能 ; ヘルプを参照) c:~~
2.原因
関数atan2( y , x )は引数がdouble型でなければいけない。float型の値を入れていた。
3.解決方法
floatの定義は別の関数の関係上変更できなかったので
atan2( y , x );
↓
atan2( (double)y , (double)x );
とした。ただしちょうど一行上に同じような使い方のatan2関数があるのにこちらはエラーが出なかった。なぜ?
4.Link
http://www9.plala.or.jp/sgwr-t/lib/atan2.html
http://www.bohyoh.com/CandCPP/C/Library/atan2.html
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

int型からstring型への変換方法(@C++)

#include<sstream>//ostringstreamを使うため
using namespace std;//ostringstreamを使うため
main(){
 int number = 10;// int型の数値を定義
 ostringstream oss;// ここがポイント。次の行のoss << number;で整数を一旦ostringstreamに変換する。
 oss << number;// stirngstreamというものもあったが使用できなかった。
 stiring Snumber;
 Snumber = oss.str();// 「ostringstreamの変数.str()」の形でstring型に変換される。
}
コンパイルはしていないがメモ程度のつもりで見てほしい。


"->"これはなに?

1.症状
C++のクラスの勉強をしていたら出てきた。教科書に説明がなかった。
2.解決策
名前「アロー演算子」
classやstructのポインタから、メンバー変数や関数を参照する時に使うらしい。
class Foo {
public:
 void func();
};
Foo f;
Foo* fp = &f;
f.func(); // 普通はコレ。
fp->func(); // ポインタでの呼び出し。
(*fp).func(); // ->と同じ。

謎のエラーC2857

1.エラーメッセージ
error C2857: /Ycstdafx.h コマンド ライン オプションで指定された '#include' ステートメントは、ソース ファイルに含まれていません。
2.現象
エラーメッセージをクリックして指定された箇所は#includeの部分で、このときは<stdio.h>,<cv.h>,<highgui.h>をインクルードしていた。
インクルード部分を全てコメントアウトしてもエラーメッセージは消えなかった。
というか、<stdio.h>まで消してしまうとプログラムとして動作しないわけで困ったことになった。
3.原因
正直、不明。
容疑者は例によってプリコンパイル済みヘッダーファイル。マジで勉強しなければいけない段階に来ているのかも。
4.解決方法
[プロジェクトのプロパティ@ソリューションウィンドウ]→[構成プロパティ]→[C/C++]→[プリコンパイル済みヘッダーの作成/使用]
において
プリコンパイル済みヘッダーを作成する (/Yc)
↓
プリコンパイル済みヘッダーを使用しない
に変更した。ついにプリコンパイル済みヘッダーを使わなくなってしまったorz
5.Link
http://msdn2.microsoft.com/ja-jp/library/7zc28563(VS.80).aspx
http://support.microsoft.com/kb/115707/ja
http://msdn2.microsoft.com/ja-jp/library/zeh74f9z(VS.80).aspx

warning C4996: 'strdup' 'stricmp' 'strcpy' 'strcat' が古い形式として宣言されました。

1.解決法
VisualC++2008/2005 の警告メッセージについてよりコードの先頭(stdfx.h)に
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
を加えてみる。
2.注意
ただし、これは、C++の関数オーバーロードの機能を用いているので、C言語では使えない。
それでも、strcpy()は標準関数だが、strcpy_s()は標準でないから、C言語の場合にソースを直接書き換える場合は注意が必要。今回はOpenCVのソースコードでるからリスクを考えると書き換えは不可能。
3.解決方法
OpenCV関連のヘッダーファイルをStdfx.hファイル内で#defineしたら警告が消えた。処理速度も速くなった。理由は不明。

'fscanf' が古い形式として宣言されました

1.warning C4996: 'fscanf' が古い形式として宣言されました。
2.原因
VC++からVisualStudio2005へ開発環境を変更したため。
3.解決策
fscanf( fp, "%lf %lf %lf %lf %lf", &gmmDate, &gmmDate1, &gmmDate2, &gmmDate3, &gmmDate4 );
fscanf_s( fp, "%lf %lf %lf %lf %lf", &gmmDate, &gmmDate1, &gmmDate2, &gmmDate3, &gmmDate4 );

'sprintf' が古い形式として宣言されました

1.warning C4996: 'sprintf' が古い形式として宣言されました。
2.症状
警告なので無視してもいいが、気になる。
3.原因
VC++からVisualStudio2005へ開発環境を変更したため。
4.解決策
sprintf( filename, "data.csv" );
sprintf_s( filename, "data.csv" );
に変更した。

error C2660: 'fopen_s' : 関数に 2 個の引数を指定できない

1.エラーメッセージ
error C2660: 'fopen_s' : 関数に 2 個の引数を指定できません。
3.原因
fopenは古い関数で安全ではないので新しく追加されたfopen_sを使う。ただし関数の引数と戻り値が異なる。ファイルポインタが戻り値とするのではなくfopen_sの引数になり、戻り値はエラー番号となる。
4.解決策
FILE * fp; 	//計測データ出力用ファイルポインタ
errno_t err; // 戻り値を格納するerrno_t型の変数
char filename[100];
sprintf_s( filename, "data.csv" )
if (( err = fopen_s( &fp , filename , "a" )) != NULL){
	printf("ファイルが開けません\n");
	return (-1);
   }

stdfx.hについて

VisualStudio2005においてwin32コンソールアプリケーションを新規作成するとstdfx.hとstdfx.cppが自動でついてくる。stdfx.hに<stdio.h>など変更のありえないヘッダーファイルを入れるとビルド速度が早くなった。便利。

stdfx.hが読み込めない2

0.エラーメッセージ
エラー 1 fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? c****.cpp 552
1.現象
背景差分による距離検出プログラムで使われていた雑音除去のnoise_remove.cppをPSFでも使おうと移植したところ上記のエラー発生。
2.原因
不明。いったいどこにstdAfx.hを使うように指示するコードがあるのだろうか。
3.解決法
[プロジェクトのプロパティ@ソリューションウィンドウ]→[構成プロパティ]→[C/C++]→[プリコンパイル済みヘッダーの作成/使用]において
プリコンパイル済みヘッダー ファイルを使用する (/Yu)
↓
プリコンパイル済みヘッダーを使用しない

stdfx.hが読み込めない

0.エラーメッセージ
エラー 1 fatal error C1093: API の呼び出し 'ImportFile' は '0x80070003' に失敗しました : ErrorMessage: 指定されたパスが見つかりません。 c:****.cpp 4

1.原因
 プログラムを移動させた
 そもそもstdfx.hの機能がよくわからん
2.勉強
 名前:プリコンパイル済みヘッダ
 機能:コンパイル時間の短縮
3.予想解決法
 (1)「#include "stdfx.h"」を消す
→エラー 1 fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? c:\****cpp 563
 (2)[プロジェクトのプロパティ@ソリューションウィンドウ]→[構成プロパティ]→[C/C++]→[プリコンパイル済みヘッダーの作成/使用]
において
プリコンパイル済みヘッダー ファイルを使用する (/Yu)
↓
プリコンパイル済みヘッダーを使用しない or プリコンパイル済みヘッダーを作成する (/Yc)
へ変更
4.まとめ
 (2)の手法で解決。ただし再び「プリコンパイル済みヘッダー ファイルを使用する 」に戻すとエラーが出る。結局stdfx.hファイルは使用できているのか謎は残った。
5.Link
http://d.hatena.ne.jp/takel/searchdiary?word=*%5BMicrosoft%5D
http://www.plustarnet.com/aspil/Programming/2d12.htm

CStringについて

始めからMFCプログラムとして作成しないと使用できない模様。CStirng.hが読み込めない

CSVファイルにデータが書き込めない

1.現象
for文による連続処理を行うプログラムで、大量の数値データをCSVファイルに記録しようとしてもファイルサイズが4.21Kbを超えると記録されなくなる。
2.原因
ファイルのクローズド忘れ。
fprintf関数のみではメモリに格納しただけでファイルには書き込んでいない。フラッシュと呼ばれる操作が必要。
3.解決法
fprintf( fp );
fflash( fp );
と書き込みごとにフラッシュを起こした。
その他にもメモリサイズが4.21Kbを超えたらフラッシュを起こす構文もあるかもしれない。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。