同一个结构体在不同的cpp文件中大小不同

u014307256 2017-06-30 09:52:05
如下所示,在CDlgConvert定义结构体DATA_INFO,在CPP文件中使用时查看其大小为sizeof(DATA_INFO)=392,在MainFram类中cpp文件调用CDlgConvert.h头文件,然后某一函数中定义CDlgConvert dialog;,我发现sizeof(CDlgConvert)不等于sizeof(dialog),其原因是CDlgConvert类中添加了一个DATA_INFO变量,很奇怪,在MainFram.cpp中sizeof(DATA_INFO)=384,与其在CDlgConvert.cpp文件中不同,392-384=8,刚好sizeof(CDlgConvert)-sizeof(dialog)=8,如果在CDlgConvert类中添加了2个DATA_INFO变量,则sizeof(CDlgConvert)-sizeof(dialog)=16,很奇怪为什么会发生这种事情,求大神解答。
(sizeof(CDlgConvert)不等于sizeof(dialog)的结果就是程序崩溃。
在DATA_INFO中各变量大小加起来刚刚好是384。

#pragma once

#include "afxwin.h"
#include "SphereTile.h"
#include "gdal.h"
// CDlgConvert dialog

typedef struct tagDATA_INFO {
// DEM/DOM
int nType;

double lfXO;
double lfYO;
double lfXE;
double lfYE;
double lfDx;
double lfDy;
int nRows;
int nCols;
int nBand;

char chFileName[MAX_PATH];

// read
void *hDataset;//GDALDatasetH hDataset;
RECT rcBuf;
RECT rcUse;//For Block
LPBYTE lpBuf;
int nSize;
int nDataSize;
int nDataType;

// match level
int nLevel;

// for sample progress
int iIndex;

void Default()
{
lfXO = 0;
lfYO = 0;
lfXE = 0;
lfYE = 0;
lfDx = 0;
lfDy = 0;
nRows = 0;
nCols = 0;
nType = 0;
nBand = 1;

hDataset = NULL;
lpBuf = NULL;
nSize = 0;

nDataSize = 1;
nDataType = 0;

rcBuf.left = 0;
rcBuf.right = 0;
rcBuf.top = 0;
rcBuf.bottom = 0;

nLevel = 0;
iIndex = 0;

chFileName[0] = 0;
}
bool Alloc()
{
if( DATA_DOM==nType || DATA_DEM==nType || DATA_DRG==nType )
{
nSize = (rcBuf.right-rcBuf.left)*(rcBuf.bottom-rcBuf.top);
}

if( 0<nSize && 1024*1024*128>nSize )
{
lpBuf = new BYTE [nSize*nBand*nDataSize];
return true;
}
return false;
}
void Free()
{
if( NULL!=lpBuf )
{
delete [] lpBuf;
lpBuf = NULL;
}
nSize = 0;
}
void Close()
{
Free();
if( NULL!=hDataset )
{
GDALClose(hDataset);
}
Default();
}

bool operator == (const tagDATA_INFO &di)
{
return 0==_stricmp(chFileName,di.chFileName);
}
bool IsValid()
{
return (DATA_DEM==nType||DATA_DOM==nType||DATA_VEC==nType||DATA_DRG==nType);
}

bool GetDataInfo(const char* lpszFileName);
}DATA_INFO;



typedef std::list<DATA_INFO> LIST_DATA;

class CDlgConvert : public CDialogEx
{
DECLARE_DYNAMIC(CDlgConvert)

public:
CDlgConvert(CWnd* pParent = NULL); // standard constructor
virtual ~CDlgConvert();

virtual void OnFinalRelease();

// Dialog Data
enum { IDD = IDD_DLG_CONVERT };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
void PumpMessage();
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
public:
CProgressCtrl m_wndProgress;
int m_NumOfData;
CString m_Pro_Msg;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();

protected:
LIST_DATA m_listData;

LPBYTE m_lpBuf;
int m_nTileBufSize;

int m_nBand;
int m_nDEMWidth;
int m_nDOMWidth;
//int m_nMinLevel;
//int m_nMaxLevel;

bool m_bGoing;
bool m_bCancel;
unsigned int m_uMark;
//DATA_INFO diBaseDOM;
//DATA_INFO diBaseDEM;
//DATA_INFO* m_pDI;
int *m_pLevelOffset;
CSphereData *m_pData;

int GetLevel(double lat);
bool Process();
bool BuildTree(DATA_INFO di,CGeoTileQueue& listTiles);

bool SampleDOMFromDataEx(CGeoTile* pTile,LPBYTE lpBufBase,DATA_INFO &di,int nType=DATA_DOM);
bool SampleDOMFromChildren(CGeoTile *pTile,LPBYTE lpBufBase,int nType);
bool SampleDOMFromParent(CGeoTile *pTile,LPBYTE lpBufBase,int nType,bool bBaseParent=false);

bool SampleDEMFromDataEx(CGeoTile* pTile,LPBYTE lpBufBase,DATA_INFO &di);
bool SampleDEMFromChildren(CGeoTile *pTile,LPBYTE lpBufBase);
bool SampleDEMFromParent(CGeoTile *pTile,LPBYTE lpBufBase,bool bBaseParent=false);
void CalcTileZ(CGeoTile *pTile,LPBYTE lpBufBase);

void SetRange(int nRange);
bool StepIt();
void ShowMsg(const char* Msg);

public:
bool AddData(const char* lpszFileName);
int GetDataCount()
{
return m_NumOfData;
};
};

...全文
662 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-07-01
  • 打赏
  • 举报
回复
引用 10 楼 u014307256 的回复:
[quote=引用 8 楼 hdt 的回复:] 你的DATA_INFO定义在CDlgConvert的h文件中,你的mainfram#include CDlgconvert的头文件,怎么会看不到???
额,是可以看到的,但是在俩个类中字节数不同,应该是和结构体字节对其有关,具体的我还没搞明白。[/quote] 对齐问题只有在不同设置下,才会出现。 不是我没有理解你的问题,就是你述说的有问题 还有建议简化你的代码,把与之无关的代码注释掉,看看问题到底是什么???
u014307256 2017-07-01
  • 打赏
  • 举报
回复
引用 8 楼 hdt 的回复:
你的DATA_INFO定义在CDlgConvert的h文件中,你的mainfram#include CDlgconvert的头文件,怎么会看不到???
额,是可以看到的,但是在俩个类中字节数不同,应该是和结构体字节对其有关,具体的我还没搞明白。
真相重于对错 2017-07-01
  • 打赏
  • 举报
回复
不合逻辑,必有妖
真相重于对错 2017-07-01
  • 打赏
  • 举报
回复
你的DATA_INFO定义在CDlgConvert的h文件中,你的mainfram#include CDlgconvert的头文件,怎么会看不到???
u014307256 2017-07-01
  • 打赏
  • 举报
回复
引用 6 楼 hdt 的回复:
[quote=引用 5 楼 u014307256 的回复:] [quote=引用 3 楼 hdt 的回复:] [quote=引用 2 楼 u014307256 的回复:] [quote=引用 1 楼 rrrfff 的回复:] 你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看
你好,内对其我知道一些,但是你说的意思我是不明白[/quote] 说实话,你的描述,我也看不明白。能否再仔细描述一下。 !、你的这几个类是否在一个工程下? 2、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”,这句话什么意思,难道同一个c++类可以在不同的文件可以不一样???? [/quote] 俩个类是在同一个工程下,、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”的意思是在CDlgConvert.h中添加一个DATA_INFO类型的属性,代码中有这部分容,DATA_INFO是一个结构体,在CDlgConvert.h的开头部分定义,然后在MainFram.Cpp文件中添加CDlgConvert.h头文件然后就可以引用到CDlgConvert.h中的内容了[/quote] 你的意思是同一个类型在同一个工程的不同cpp下,sizeof的结果不一样?? 还有你在CDlgConvert类里面加一个DATA_INFO的变量,难道在另外的一个cpp里面的CDlgConvert类里面就没有那个DATA_INFO??? [/quote] DATA_INFO是我定义的一个结构体,上文代码中有。在CDlgConvert类里面加的一个DATA_INFO的变量是protected类型的,所以在mainfram类中是不可见的,但是在MainFram类中可以看到DATA_INFO这个类型,DATA_INFO在MainFram类中sizeof和在CDlgConvert类中sizeof是不一样的,是这个结构体类型大小不一样,而不是说定义的变量大小不一样
真相重于对错 2017-07-01
  • 打赏
  • 举报
回复
引用 5 楼 u014307256 的回复:
[quote=引用 3 楼 hdt 的回复:] [quote=引用 2 楼 u014307256 的回复:] [quote=引用 1 楼 rrrfff 的回复:] 你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看
你好,内对其我知道一些,但是你说的意思我是不明白[/quote] 说实话,你的描述,我也看不明白。能否再仔细描述一下。 !、你的这几个类是否在一个工程下? 2、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”,这句话什么意思,难道同一个c++类可以在不同的文件可以不一样???? [/quote] 俩个类是在同一个工程下,、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”的意思是在CDlgConvert.h中添加一个DATA_INFO类型的属性,代码中有这部分容,DATA_INFO是一个结构体,在CDlgConvert.h的开头部分定义,然后在MainFram.Cpp文件中添加CDlgConvert.h头文件然后就可以引用到CDlgConvert.h中的内容了[/quote] 你的意思是同一个类型在同一个工程的不同cpp下,sizeof的结果不一样?? 还有你在CDlgConvert类里面加一个DATA_INFO的变量,难道在另外的一个cpp里面的CDlgConvert类里面就没有那个DATA_INFO???
u014307256 2017-07-01
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
[quote=引用 2 楼 u014307256 的回复:] [quote=引用 1 楼 rrrfff 的回复:] 你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看
你好,内对其我知道一些,但是你说的意思我是不明白[/quote] 说实话,你的描述,我也看不明白。能否再仔细描述一下。 !、你的这几个类是否在一个工程下? 2、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”,这句话什么意思,难道同一个c++类可以在不同的文件可以不一样???? [/quote] 俩个类是在同一个工程下,、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”的意思是在CDlgConvert.h中添加一个DATA_INFO类型的属性,代码中有这部分容,DATA_INFO是一个结构体,在CDlgConvert.h的开头部分定义,然后在MainFram.Cpp文件中添加CDlgConvert.h头文件然后就可以引用到CDlgConvert.h中的内容了
zgl7903 2017-07-01
  • 打赏
  • 举报
回复
#pragma pack 定义字节对齐长度 #pragma pack(push, 8) typedef struct tagDATA_INFO { …… }DATA_INFO; #pragma pack(pop)
真相重于对错 2017-07-01
  • 打赏
  • 举报
回复
引用 2 楼 u014307256 的回复:
[quote=引用 1 楼 rrrfff 的回复:] 你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看
你好,内对其我知道一些,但是你说的意思我是不明白[/quote] 说实话,你的描述,我也看不明白。能否再仔细描述一下。 !、你的这几个类是否在一个工程下? 2、“其原因是CDlgConvert类中添加了一个DATA_INFO变量”,这句话什么意思,难道同一个c++类可以在不同的文件可以不一样????
u014307256 2017-07-01
  • 打赏
  • 举报
回复
已搞定,确实是字节对齐的问题
u014307256 2017-06-30
  • 打赏
  • 举报
回复
引用 1 楼 rrrfff 的回复:
你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看
你好,内对其我知道一些,但是你说的意思我是不明白
RLib 2017-06-30
  • 打赏
  • 举报
回复
你应该知道编译器存在内存对齐, 你可以#pragma pack(show)来查看

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧