问一个计算结构体大小的问题

pkeel 2007-01-25 10:54:01


typedef struct tagMBLIMAGEHEADER
{
DWORD FileSize;
DWORD SrcSizeInPixel;
long SrcWidthInPixel;
long SrcHeightInPixel;
ImgRect ImgArea; //这也是结构体,定义见上面
WORD MidTierNum;
WORD BitCount;
WORD RgbTableSize;
TierHeaStruList TierHeaList; //CList链表定义见上面
}MBLIMAGEHEADER;


以下是ImgRect和TierHeaStruList的定义:


typedef struct tagImgRect{
POINT LefDowCoordinate;
POINT RigTopCoordinate;
}ImgRect;

typedef struct tagTierHeadStru{
DWORD TierOffset;
DWORD Resolution;
}TierHeaStru;

typedef CList<TierHeaStru, TierHeaStru&> TierHeaStruList;
...全文
651 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_heart 2007-01-25
  • 打赏
  • 举报
回复
typedef struct tagMBLIMAGEHEADER
{
DWORD FileSize;
DWORD SrcSizeInPixel;
long SrcWidthInPixel;
long SrcHeightInPixel;
ImgRect ImgArea; //这也是结构体,定义见上面
WORD MidTierNum;
WORD BitCount;
WORD RgbTableSize;
TierHeaStruList TierHeaList; //CList链表定义见上面
}MBLIMAGEHEADER;


以下是ImgRect和TierHeaStruList的定义:


typedef struct tagImgRect{
POINT LefDowCoordinate;
POINT RigTopCoordinate;
}ImgRect;

typedef struct tagTierHeadStru{
DWORD TierOffset;
DWORD Resolution;
}TierHeaStru;

typedef CList<TierHeaStru, TierHeaStru&> TierHeaStruList;

----------------------------------------------------------------------------

sizeof是编译的时候确定大小,与CList中容纳了多少个节点数量无关。

sizeof( MBLIMAGEHEADER ) 我不明白你这样的sizeof究竟能用来干什么?

要copymemory复制数据吗?
TaiJi1985 2007-01-25
  • 打赏
  • 举报
回复
重新映射到内存后,应该不会把它填充进去。指针变了。填进去也没意思。
写个序列化,和反序列化的函数。自己处理比较好,而且升空间。
chehw 2007-01-25
  • 打赏
  • 举报
回复
如果你认为磁盘文件的末尾有无效数据,占用了额外的磁盘空间,可在CloseHandler(hMapFile)后,用SetFilePointer移到指定位置,再用SetEndOfFile结束就可以了。
pkeel 2007-01-25
  • 打赏
  • 举报
回复

我想了一下,就算系统写到磁盘的时候,把填充的字节去掉了

重新映射到内存后,应该也还是会又把它填充进去吧?
pkeel 2007-01-25
  • 打赏
  • 举报
回复
chehw(chehw)大哥,您有来给小弟捧场啦,谢谢啦!!

我也感觉应该像你这样计算,但是就是不敢确定,感觉心里没底!!

我还想问一下就是,内存映射文件把数据写到磁盘上后,系统在内存中填充的无效字节,会去掉吗?

chehw 2007-01-25
  • 打赏
  • 举报
回复
sizeof(MBLIMAGEHEADER)+sizeof(TierHeaStru)*TierHeaStruList.GetCount()- sizeof(TierHeaStruList)
pkeel 2007-01-25
  • 打赏
  • 举报
回复
那意思就是在磁盘上也会填充无效的字节咯?


我是用的内存映射文件写数据,所以我直接用的是memcpy写数据

因为在TierHeaStruList里的数据在内存里肯定不是连续的,所有我把这个结构体里包含的数据,包括CList里面的,都重新拷到一段连续的内存里面。然后用这段内存的地址作为memcpy的源地址,内存映射返回的地址作为目标地址,就是这个大小,不知道该怎么计算??
syy64 2007-01-25
  • 打赏
  • 举报
回复
写哪些数据就累加哪些数据,类和结构用sizeof判断其大小。
pkeel 2007-01-25
  • 打赏
  • 举报
回复
就是整个结构体包含的内容,包括链表里面的,都要写到磁盘上

写到磁盘上也是按对其原则的吗?

也就是我计算磁盘上文件大小的时候,也是用sizeof去计算吗?
syy64 2007-01-25
  • 打赏
  • 举报
回复
看你怎么写的?要写哪些数据。如果是只写TierHeaStruList的话那大小就是
sizeof(TierHeaStruList),但它的成员变量所指向的内存块的数据都未写到文件里。
pkeel 2007-01-25
  • 打赏
  • 举报
回复
因为那个对其原则蛮麻烦的,

除了每个元素的开始偏移必须为自己大小的整数倍以外,整个结构体的大小还必须是里面最大元素的整数倍。

我里面包含ImgRect这个结构体,他的大小是16个字节,那是不是MBLIMAGEHEADER的大小必须是ImgRect的整数倍阿。

pkeel 2007-01-25
  • 打赏
  • 举报
回复
sizeof(MBLIMAGEHEADER)+sizeof(TierHeaStruList)吗?

写到磁盘上就是这么大吗?
syy64 2007-01-25
  • 打赏
  • 举报
回复
类占用内存和它的成员变量指向的内存块是两码事,不能混在一起。
pkeel 2007-01-25
  • 打赏
  • 举报
回复
这个TierHeaStruList里的元素个数, 在定义的时候不知道,但是在写数据之前是可以知道的。

因为我要计算整个文件大小,还有计算写数据时候的偏移量
syy64 2007-01-25
  • 打赏
  • 举报
回复
sizeof(TierHeaStruList)
pkeel 2007-01-25
  • 打赏
  • 举报
回复
但是我里面有链表阿,这个能用sizeof吗?

我要把这样的结构体存到磁盘上,然后要知道写完后,写下面数据时的偏移量是多少。

我是不是要用sizeof(MBLIMAGEHEADER)+链表里面元素个数*大小??

所以有点搞不清楚请教下大家。谢谢了
  • 打赏
  • 举报
回复
如果是MBLIMAGEHEADER则不好说因为TierHeaStruList这个大小未知,得看CList的实现
pkeel 2007-01-25
  • 打赏
  • 举报
回复
TierHeaStruList里元素的个数可以计算出来。

请问大家上面的结果体如何计算他的大小阿?
syy64 2007-01-25
  • 打赏
  • 举报
回复
sizeof(MBLIMAGEHEADER)?
pkeel 2007-01-25
  • 打赏
  • 举报
回复
呵呵,看过了,但是不太懂,我先学习下序列化方法。

谢谢大家对我的指教!!!

有其他问题再请教大家了。
加载更多回复(10)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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