teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

BITMAPFILEHEADER構造体のアラインメントに原因があることがわかり、修正。

2019/06/02 11:21

投稿

maic
maic

スコア8

title CHANGED
File without changes
body CHANGED
@@ -14,9 +14,11 @@
14
14
  BITMAPINFOHEADER bitmapInfoHeader;
15
15
  fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
16
16
  ```
17
- ですが、構造体のメモリアラインメントのせいで`BITMAPINFOHEADER構造体`のサイズがメンバーサイズの合算値にならないため、期待したサイズよりも多く読み込んでいるようです。
17
+ ですが、構造体のメモリアラインメントのせいで~~`BITMAPINFOHEADER構造体`~~ `BITMAPFILEHEADER構造体`のサイズがメンバーサイズの合算値にならないため、期待したサイズよりも多く読み込んでいるようです。
18
18
  この方法では読み込みだけでなく書き込みでも同様にパディング分ゴミが入ってしまいます。
19
19
 
20
+ 追記:実際にはBITMAPFILEHEADERが14byteから16byteにアラインメントされてしまったため、BITMAPINFOHEADERの読み込みがずれてしまっていたようです。
21
+
20
22
  上記の課題を避けるために`#progma pack`などでアラインメントの最適化をキャンセルすることができるとは思うのですが、いまいちこれがクリーンコーディングと言えるのか、大規模なOSS開発で是とされているのか、なにぶんC/C++での開発経験が乏しい私には判断がつきませんでした。
21
23
 
22
24
  ## 教えてほしいこと

1

ファイルI/O一般での疑問として質問するため、抜けていた記述を加筆。

2019/06/02 11:21

投稿

maic
maic

スコア8

title CHANGED
File without changes
body CHANGED
@@ -21,6 +21,6 @@
21
21
 
22
22
  ## 教えてほしいこと
23
23
  今回はC言語で書いていますが、モダンで大規模なOSSのC++プロジェクトだと前提を置いたとして
24
- ファイルの読み書きを行うときには多少冗長ながらも、最初に述べた「ヘッダーのメンバ毎に変数を定義して読み込む方法」が理想的(or よく使われる書き方)なのでしょうか?
24
+ BITMAPに限らず、ファイルの読み書きを行うときには多少冗長ながらも、最初に述べた「ヘッダーのメンバ毎に変数を定義して読み込む方法」が理想的(or よく使われる書き方)なのでしょうか?
25
25
 
26
26
  他にも、C/C++で開発をしている方で美しい書き方を知っていればぜひ教えてください。