看板 C_and_CPP 關於我們 聯絡資訊
alignment 的問題 為了效率,compiler 有時候會把資料成員排在某些倍數(例如4)的位置 typedef struct _bmp_file_header { unsigned short bfType; 2 unsigned long bfSize; 4 unsigned short bfReserved1; 2 unsigned short bfReserved2; 2 unsigned long bfOffBits; 4 }BMPFILEHEADER; 應該是要配14個 但是如果這樣配 typedef struct _bmp_file_header { unsigned short bfType; 4 本來是 2 unsigned long bfSize; 4 unsigned short bfReserved1; 2 unsigned short bfReserved2; 2 unsigned long bfOffBits; 4 }BMPFILEHEADER; 總共配16個 效能會更好 結果就變成第二個欄位以後的位置全部跑掉 如果你是從檔案讀進來的話 第二個欄位以後的資料就全錯 XD 解決方法...... typedef struct _bmp_file_header { unsigned char foo[14] ; }BMPFILEHEADER; 這樣就 14 byte 想要存取資料的時候用很醜的轉型 像是 offset = *((unsigned long *)(foo+10)) ; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.129.180
GameDemon:WOW 感恩感恩.看來我程式要改很多了XD 謝謝 04/23 03:08
drkkimo:這篇把原因說的很清楚呀 不過我記得好像還有一種解決方 04/23 03:10
drkkimo:法是調整編譯器的設定 因為之前也遇過類似問題 也是讀BM 04/23 03:10
drkkimo:P碰到  04/23 03:11
GameDemon:調編譯器??有請d大講解 04/23 03:11
GameDemon:我就是讀檔有問題. 04/23 03:16
LPH66:二樓說的是用編譯器指令 04/23 03:23
GameDemon:請問應該如何用呢?謝謝 04/23 03:24
drkkimo:8185篇有講到喔 我找到了:) 04/23 03:25
LPH66:像VC用的好像是#pragma pack(push,1) 04/23 03:23
drkkimo:試試 #pragma pack(1) 放在宣告struct之前 04/23 03:26
drkkimo:那篇精華區竟然找不到 等一下收精華 04/23 03:27
LPH66:這裡有MSDN的說明: http://0rz.net/961g7 04/23 03:28
LPH66:push可不加 這是在後面配合pop來恢復原本設定用的 04/23 03:29
GameDemon:大感恩.問題完全解決了.謝謝兩位高手 04/23 03:30