有休予定だった今日,金曜朝までに片づけたい急な仕事よりも急ぎの仕事に,夕方完了を目標に着手しました.内容は,Bitmap画像に自前の前処理を加えつつJPEGを生成するプログラムの処理速度の調査です.前処理は非常に簡単なものですし,JPEG化は別案件で使っているコードのインターフェイスをちょっと変えるだけです.
期待したJPEGが生成されません.いやー,見事に深みに填まりましたね.JPEG化関数の入力を検証しようにも,Bitmapデータ列ですしデバイス組込アプリですしで,だいぶ大変でした.で,入力には問題なかったと.そうなると,ややブラックボックス感あるJPEG化関数内に問題か.これまでちゃんと動いていたのになと.随所にログを仕込んだりして,原因を究明していきました.
結論.原因はループの制御変数がchar型だったことでした.変数が0未満かどうかを判別する条件文がありました.もしやと思い,変数宣言を「char」から「signed char」に替えたら,期待した結果になりました.ググって納得.C言語のchar型の符号の有無はコンパイラ依存なのね.int型は「signed int=int≠unsigned int」ですが,「signed char≠char≠unsigned char」ということ.
本件も以前書いたのと同じく,同じC言語のコードを共用し,複数プラットフォーム用のライブラリを作るものです.Android用はAndroid Studio,iOS用はXcode,Windows用はVisual Studioでコンパイルしています.明示的にオプション指定しない場合,char型がAndroid Studioでは符号なし,XcodeとVisual Studioは符号ありになるみたい.Androidアプリの開発言語はJavaが主流なので,JavaのByte型(符号あり8bits整数型)にC言語のchar型(同)を合わせたということかしら.
そんなこんなで,目標を大幅に過ぎた21時頃に完了しました.金曜朝までに片づけたい急な仕事,そこから着手.案の定,納得いくところまでたどり着かないまま,終電ダッシュ.土曜出社するしかないのか.