作成した画像処理プログラムをデバッガした後,異常がないと思われたので,
Releaseで動かしたところ,結果が異なるという状態になりました.
他のHP上で,「初期化しないとReleaseで動作異常を起こす」という記述があったので,
初期値をあらかじめ与えておく,deleteを行うといった部分はチェックしたのですが.
また,Releaseでビルドした時に
『LINK : warning LNK4089: 'OLEAUT32.dll' へのすべての参照は /OPT:REF によって廃
棄されます。』
というwarningが出ていたのですが,これが関連しているのでしょうか?
同様の状態になった方がおられましたら,お願いいたします.
作業環境はWindows XP,Visual C++.netです.
LNK4089 をMSDNで検索してみてください。これは関連していないと思われます。
警告の方はともかく、これだけの情報ではアドバイスは無理では?
どういう画像処理をしていてどういう風になることを期待していたのに
リリースモードで動かすとどういう状況になった。
この辺を詳しく書けば、経験者や識者のアドバイスが付きやすくなるでしょう。
何事もその状況をいかにうまく説明し、相手に理解してもらえるようにするかは
重要ですよ。
>MASATO さん
LNK4089を調べてみました.たぶん関連していないとは思いますが,
警告という形で出てくるのは気持ちが悪いようにも思えます.
>PATIO さん
画像を横方向に1次微分した結果を持つtempImgから,
微分値が0以外であるピクセル数とその場合の平均値を求めるというプログラムです.
number = 0;
dist = 0;
for(int i=0;i<height;i++)
for(int j=0;j<height;j++)
if(tempImg.GetPixel(j, i) != 0){
dist += tempImg.GetPixel(j, i);
number++;
}
dist = dist/number;
ReleaseとDebugで求められた1次微分の値は同じようなのですが,
最後のdistの値で違った値が出てきます.
画像を見ると,Releaseで出力された結果が期待している状態です.
もう少し,デバッガの方をがんばってみます.
LMK4089と/OPTの説明を読めば、内容は把握できると思います。
要するにIDEはどんなアプリでもある程度のライブラリをリンク対象にしているので
リンク対象になっているライブラリの中の関数を一つも使わなかった場合に
そのライブラリをリンクの対象から外すようにしていると言うだけだと思います。
意味がわかれば、なんと言うことはない話です。
端的に言えば、デフォルトでリンク対象になっているライブラリの中に
ライブラリ内の関数を一つも使っていない、ライブラリ内の変数を参照もしていない
ようなライブラリがあったから、リンク対象から外しましたということですね。
計算途中の値をコンソールかファイルに出力する処理を追加し、
DebugモードとReleaseモードで夫々出力してみて比べてみてはどうでしょうか。
>MASATOさん
その後ファイル出力を行った結果,
値の入っていない配列を参照していたことが分かりました.
tempImgはnewで確保された配列を持っているのですが,
確保された領域外までアクセスして
エラーを返さないことにびっくりしました.
皆様お騒がせしました.
>確保された領域外までアクセスして
>エラーを返さないことにびっくりしました.
C/C++の配列とはそういうものです。
Debug時にはASSERTマクロなどを使って配列の範囲をチェックしながら
開発すると効果的だと思います。