同一个结构体在不同的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;
};
};

...全文
533 12 打赏 收藏 转发到动态 举报
写回复
用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)来查看
xiao0 1.c //纵向乘法表 2.c //标准乘法表 3.c //冒泡排序 4.c //验证算式正确 5.c //判断几位数 6.c //实现求二维数组的最大值 7.c //实现猜数 8.c //实现各位相加 9.c //实现求字符个数 10.c //求单词个数 xiao1 11.c //实现密码验证 12.c //实现str算法 13.c //折半法找数 14.c //递归汉诺 15.c //选择法排序 16.c //局部变量的生存期 17.c //全局变量的作用域 18.c //神奇的 i++ 19.c //预编译处理 20.c //神奇的指针 xiao.txt //刷题思路 xiao2 21.c //数组指针 22.c //出题验证系统 23.c //二维数组指针 24.c //秀秀指针 25.c //多级指针的应用 26.c //位运算 27.c //结构体变量 28.c //结构体指针 29.c //静态链表 30.c //动态链表 xiao3 31.c //共用体 32.c //文件的打开与关闭 33.c //文件的读和写 34.c //文件的块读 35.c //逆序输出 36.c //用指针的数值传递 37.c //if(0.5);if的局部变量 38.c //指针交换地址不改原值 39.c //指针实现逆序输出 40.c //结构体传值 xiao4 41.c //结构体传数组值 42.c //结构体的各种赋值 43.c //结构体函数 44.c //结构体二维数组 45.c //学生信息管理系统 46.c //结构体函数 47.c //二维数组转一维 48.c //if(1?i>j:icpp //hello world 2.cpp //goto跳转 3.cpp //可变参数 4.cpp //重载函数 5.cpp //面向对象 6.cpp //std 7.cpp //一元二次方程求根 8.cpp //求利润 9.cpp //求圆周率pi的近似值 10.cpp //Fibonacci数列 xiao1 11.cpp //分数序列求和 12.cpp //有序插入 13.cpp //数组元素逆置 14.cpp //杨辉三角 15.cpp //解密 16.cpp //比较两个字符串大小 17.cpp //冒泡排序 18.cpp //矩阵转置 19.cpp //字符串求最大值 20.cpp //复制字符串的元音字母 xiao2 21.cpp //计算若干整数的和 22.cpp //神奇的c++stl库函数 23.cpp //最大最小数 24.cpp //全排列 25.cpp //数组逆置输出 26.cpp //set(集合) 27.cpp //vector(不定长数组) 28.cpp //map(映射) 29.cpp //结构体swap 30.cpp //结构体sort xiao3 31.cpp //计算两日期间隔 32.cpp //加密4个数 33.cpp //计算日期星期 34.cpp //queue(队列) 35.cpp //stack(栈) 36.cpp //sort 37.cpp //结构体sort 38.cpp //奶牛日光浴 39.cpp //lower_bound 40.cpp //贪心看电视 xiao4 41.cpp //两边同时减 42.cpp //贪心安排会场 43.cpp //iterator 44.cpp //背包问题 45.cpp //取数排列 46.cpp //全排列 47.cpp //节点 48.cpp //节点 49.cpp //村庄修公路 50.cpp //差分数组 xiao5 51.cpp //最大子段和 52.cpp //map应用 53.cpp //ASCII码排序 54.cpp //我的排序 55.cpp //隐藏的时间 56.cpp //好年份 57.cpp //最大最小值 58.cpp //由两天推日期 59.cpp //目标和 60.cpp //统计字符 xiao6 61.cpp //计算天数 62.cpp //统计单词
计算机操作系统课程设计 班级:计091-1 : 学号: 使用语言:C++ 指导老师: 学院: 系统要求 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的部功能及部实现。 2、实验容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 二、系统分析 1、设计思想 本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用 户的功能,各个用户之间的文件系统互不干扰。 本文件系统采用两级目录,其第一级对应于用户账号,第二级对应于用户下的文件 。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等 特殊容。 系统采用结构体来存储用户、文件目录、文件数据容: 0 48*5 48*5+44*50 48*5+44*50+264*200 每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。 整个系统的编码构成主要分为: Allstruct.h 定义了每个分区的结构体; Mysys.h 声明了对系统操作的各种方法; Myuserfile.h 声明了对文件操作的各种方法; Mymain.cpp 整个系统的主函数,操作入口; Mysys.cpp 包含了mysys.h,实现了操作系统的各种方法; Myuserfile.cpp 包含了myuserfile.h,实现了操作文件的各种方法; 2、主要数据结构 Allstruct.h文件的容: struct s_user //用户区结构体 { long isuse; //是否使用 char name[20]; //用户名 char psd[20]; //密码 long address; //目录地址 }; struct s_list //目录结构体 { long isuse; //是否使用 char name[20]; //文件名字 long myaddress; //本条目录地址 long pointaddress; //指向的文件的地址 long isfile; //是否锁定 long pointsize; //目标文件大小 long nextaddress; //下条目录的地址 }; struct s_file //文件结构体 { long isuse; //是否使用 char content[256]; //文件容 long next; //下个文件块地址 }; 系统执行 1. 如果首次进入系统,还没有文件系统,则会提示格式化文件系统,创建分区,并初始化 分区: 2、刚初始化后,没有用户,提示创建用户: 3、用户创建成功后出现对系统操作的菜单 4、注册用户功能: 5、用户登录,登录成功后显示当前用户下的所有文件及其详细信息,同时显示对文件操 作的菜单: 6、新注册的用户默认为没有文件,选择创建文件,并且每次对文件操作后显示当前用户 的所有文件和操作菜单: 7、此次新建的文件为锁定状态,不能被删除: 8、对文件查看,默认创建的时候用0填充文件容: 9、修改文件容: 10、对文件的锁定进行装换: 11、删除文件: 12、注销登录退出系统: 功能实现 Mysys.h #include #include "myuserfile.h" class MSysterm { //封装了管理系统的方法 //成员变量 private: FILE *myfile; MUser myuser; //成员函数 public: MSysterm(){} void outName(); //打印登陆后的用户名 int cheack(); //检查虚拟文件系统跟是否存在 int myformat(); //初始化虚拟磁盘 int createuser(); //创建用户 int login(); //用户登录 void mymain(); //主控制程序 int logout(); //用户注销 }; Myuserfile.h #include class MUser //封装了管理文件的方法 { //成员变量 public: FILE *myfile; char name[20]; //用户名 char psd[20]; //密码 long listaddress; //目录地址 long myaddress; //此用户的地址 private: long lastaddress; //最后一个目录的地址 /
计算机操作系统课程设计 班级:计091-1 姓名: 学号: 使用语言:C++ 指导老师: 学院: 系统要求 1、实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、实验内容 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条); login 用户登陆 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 二、系统分析 1、设计思想 本文件为二级文件系统,即要实现对文件的增删改查,同时又具备登陆系统、注册用 户的功能,各个用户之间的文件系统互不干扰。 本文件系统采用两级目录,其第一级对应于用户账号,第二级对应于用户帐号下的 文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文 件等特殊内容。 系统采用结构体来存储用户、文件目录、文件数据内容: 0 48*5 48*5+44*50 48*5+44*50+264*200 每个分区都是由结构体组成,每个个去的结构体的个数由格式化系统是决定。 整个系统的编码构成主要分为: Allstruct.h 定义了每个分区的结构体; Mysys.h 声明了对系统操作的各种方法; Myuserfile.h 声明了对文件操作的各种方法; Mymain.cpp 整个系统的主函数,操作入口; Mysys.cpp 包含了mysys.h,实现了操作系统的各种方法; Myuserfile.cpp 包含了myuserfile.h,实现了操作文件的各种方法; 2、主要数据结构 Allstruct.h文件的内容: struct s_user //用户区结构体 { long isuse; //是否使用 char name[20]; //用户名 char psd[20]; //密码 long address; //目录地址 }; struct s_list //目录结构体 { long isuse; //是否使用 char name[20]; //文件名字 long myaddress; //本条目录地址 long pointaddress; //指向的文件的地址 long isfile; //是否锁定 long pointsize; //目标文件大小 long nextaddress; //下条目录的地址 }; struct s_file //文件结构体 { long isuse; //是否使用 char content[256]; //文件内容 long next; //下个文件块地址 }; 系统执行 1. 如果首次进入系统,还没有文件系统,则会提示格式化文件系统,创建分区,并初始化 分区: 2、刚初始化后,没有用户,提示创建用户: 3、用户创建成功后出现对系统操作的菜单 4、注册用户功能: 5、用户登录,登录成功后显示当前用户下的所有文件及其详细信息,同时显示对文件操 作的菜单: 6、新注册的用户默认为没有文件,选择创建文件,并且每次对文件操作后显示当前用户 的所有文件和操作菜单: 7、此次新建的文件为锁定状态,不能被删除: 8、对文件查看,默认创建的时候用0填充文件内容: 9、修改文件内容: 10、对文件的锁定进行装换: 11、删除文件: 12、注销登录退出系统: 功能实现 Mysys.h #include #include "myuserfile.h" class MSysterm { //封装了管理系统的方法 //成员变量 private: FILE *myfile; MUser myuser; //成员函数 public: MSysterm(){} void outName(); //打印登陆后的用户名 int cheack(); //检查虚拟文件系统跟是否存在 int myformat(); //初始化虚拟磁盘 int createuser(); //创建用户 int login(); //用户登录 void mymain(); //主控制程序 int logout(); //用户注销 }; Myuserfile.h #include class MUser //封装了管理文件的方法 { //成员变量 public: FILE *myfile; char name[20]; //用户名 char psd[20]; //密码 long listaddress; //目录地址 long myaddress; //此用户的地址 private: long lastaddress;

19,468

社区成员

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

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