ReleaseとDebugの動作結果の相違について – プログラミング – Home

ReleaseとDebugの動作結果の...
 
通知
すべてクリア

[解決済] ReleaseとDebugの動作結果の相違について


sismoon
 sismoon
(@sismoon)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

作成した画像処理プログラムをデバッガした後,異常がないと思われたので,
Releaseで動かしたところ,結果が異なるという状態になりました.
他のHP上で,「初期化しないとReleaseで動作異常を起こす」という記述があったので,
初期値をあらかじめ与えておく,deleteを行うといった部分はチェックしたのですが.

また,Releaseでビルドした時に
『LINK : warning LNK4089: 'OLEAUT32.dll' へのすべての参照は /OPT:REF によって廃
棄されます。』
というwarningが出ていたのですが,これが関連しているのでしょうか?
同様の状態になった方がおられましたら,お願いいたします.

作業環境はWindows XP,Visual C++.netです.


引用未解決
トピックタグ
MASATO
 MASATO
(@MASATO)
ゲスト
結合: 23年前
投稿: 53
 

LNK4089 をMSDNで検索してみてください。これは関連していないと思われます。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

警告の方はともかく、これだけの情報ではアドバイスは無理では?

どういう画像処理をしていてどういう風になることを期待していたのに
リリースモードで動かすとどういう状況になった。

この辺を詳しく書けば、経験者や識者のアドバイスが付きやすくなるでしょう。
何事もその状況をいかにうまく説明し、相手に理解してもらえるようにするかは
重要ですよ。


返信引用
sismoon
 sismoon
(@sismoon)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

>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で出力された結果が期待している状態です.

もう少し,デバッガの方をがんばってみます.


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

LMK4089と/OPTの説明を読めば、内容は把握できると思います。
要するにIDEはどんなアプリでもある程度のライブラリをリンク対象にしているので
リンク対象になっているライブラリの中の関数を一つも使わなかった場合に
そのライブラリをリンクの対象から外すようにしていると言うだけだと思います。
意味がわかれば、なんと言うことはない話です。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

端的に言えば、デフォルトでリンク対象になっているライブラリの中に
ライブラリ内の関数を一つも使っていない、ライブラリ内の変数を参照もしていない
ようなライブラリがあったから、リンク対象から外しましたということですね。


返信引用
MASATO
 MASATO
(@MASATO)
ゲスト
結合: 23年前
投稿: 53
 

計算途中の値をコンソールかファイルに出力する処理を追加し、
DebugモードとReleaseモードで夫々出力してみて比べてみてはどうでしょうか。


返信引用
sismoon
 sismoon
(@sismoon)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

>MASATOさん

その後ファイル出力を行った結果,
値の入っていない配列を参照していたことが分かりました.
tempImgはnewで確保された配列を持っているのですが,
確保された領域外までアクセスして
エラーを返さないことにびっくりしました.

皆様お騒がせしました.


返信引用
a
 a
(@a)
ゲスト
結合: 23年前
投稿: 59
 

>確保された領域外までアクセスして
>エラーを返さないことにびっくりしました.
C/C++の配列とはそういうものです。
Debug時にはASSERTマクロなどを使って配列の範囲をチェックしながら
開発すると効果的だと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました