« DTファンジンNo.24 w/ DTIFC DVD 2005 | メイン | The Darknessが! »

謎の水平グラデバグを解明 [ ソフト技術, 教育 ]

本日のアドプロで発生した謎の水平グラデバグ.
言葉で説明するのは難しいので,画像を見ていただきたい.
before_ga.png
これは期待通りの出力ではありません.
左側が黒,右側が白の水平グラデーションが出力されるはずでした.
この画像は256*256のpngになってますが,
実際は2048*2048のbmpです.
その辺は都合ですので,適当に解釈してください.本質じゃない.

学校ではツール類が充実してないので,細かい検証ができなかったので,
自宅に帰ってから,バイナリエディタで調査してみた.
それがこれ.
before_bi.png
もうね.明らかにおかしいでしょ.
水平256ピクセルだから,同じ数値が3つ並ぶはずなのに,
0D0A 0D0A 0D0A
って・・・

これを見た瞬間.理解しました.
0AはLF(改行)で,0DはCR(復帰)です.
つまり,0Aを出力しようとしたので,ご丁寧にもCRLFにしてくれたんです.

もうわかりますね.
出力モードがバイナリではなく,アスキーになってるんです.

原因箇所は以下の1文.
if(0 == (fp=fopen(file_name,"w")))
これをバイナリモードに変更します.
if(0 == (fp=fopen(file_name,"wb")))

バイナリエディタで確認.
after_bi.png
確かに,0Aが0D0Aに変換されていません.

ビュワで確認.
after_ga.png
ktkr!


結論:
freadやfwriteを使うときは,バイナリモードに注意しよう!