ひどいミス
そっち系のひどいミスをここに書いていこうかと思います。
if( ) + セミコロン
if(m_rcSrc.Height <= 0); m_rcSrc.Height = 1;
もし高さが0以下なら、それを1にする予定でした。
しかしちゃんとインデントもされているのに、ifのカッコの終わりにセミコロンがついています。
このせいで2行目が必ず実行されるようになっていまいます。
何が一番の原因かって、doubleからfloatへの代入の警告に埋もれていた以下の警告を無視してしまったことでしょうね。
でも本当の理由はassert(条件式);のassertをifに置き換え、条件を逆にした際、セミコロンを取り忘れた事。
エラー処理しようとしてエラーを起こしてしまったわけでしょうか。
ちなみに以下が警告文。VC++2008EEより。
warning C4390: ';' : 制御が空の文が見つかりました。意図した記述でしょうか?
assertマクロ Release版にしたら変になった
assertの性質と本来の使い方、もっといえばassertという名前の意味さえも無視した使い方をしていました。以下を。
bool func(); // なにか重要な機能 int main() { assert( func()); // funcでエラーが出た場合、停止する }
assertというのは「断言」とか「主張」です。珠玉のプログラミング的にいえば「不変な表明」でしたっけ。
これをRelease版にしたら、Debug版とは違い、assertが、その引数もろとも消えてしまいます。
だからfuncが実行されなかったんです。だからウィンドウの中身が空っぽだったんですよ。
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
- 作者: ジョンベントリー,Jon Bentley,小林健一郎
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2000/10
- メディア: 単行本
- 購入: 30人 クリック: 551回
- この商品を含むブログ (162件) を見る