急救!!!Delphi的枚举类型占用内存问题!!!

syalan 2009-10-16 10:35:05
delphi调用VC的DLL遇到个问题,

发现Delphi的枚举类型和C是不等价。C的枚举类型的size总是4个字节,而Delphi是1个字节,请问如何在Delphi里让他占用4个字节??因为要调用DLL,指针地址传过去后结果总是不对!!急救
...全文
368 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
owlet_leo 2009-10-18
  • 打赏
  • 举报
回复
5楼的解释是可取的,
将{$Z4}
插入到要和C交互的枚举类型的声明中。
type
{$Z4}// 4字节

TMyEnum = (ENUM1,ENUM2,...);

{$Z1} // 还原1字节
对齐的意义在这里不大,靠边界对齐反而会使得数据的解释错误。
因为Intel的数据是小端对齐的,按边界对齐解读反而正好把数据读反了。
关键还是修改数据存储类型。
阿发伯 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maozefa 的回复:]
Delphi记录缺省就是4字节对齐
[/Quote]
不正确,缺省是少于4字节按字节对齐,否则按4字节对齐
阿发伯 2009-10-16
  • 打赏
  • 举报
回复
Delphi记录缺省就是4字节对齐
阿发伯 2009-10-16
  • 打赏
  • 举报
回复
type
{$Z+}// 4字节

TMyEnum = (.....);

{$Z-} // 还原1字节

{$A4} // 4字节对其

TMyRecord = record
.....
end;

{$A-} //还原
syalan 2009-10-16
  • 打赏
  • 举报
回复
{$A4} 按4字节对齐
{$MINENUMSIZE 4} 4个字节枚举

请问这个在哪里定义?谢谢
阿发伯 2009-10-16
  • 打赏
  • 举报
回复
或者 {$Z4} 4个字节枚举
阿发伯 2009-10-16
  • 打赏
  • 举报
回复
{$A4} 按4字节对齐
{$MINENUMSIZE 4} 4个字节枚举
syalan 2009-10-16
  • 打赏
  • 举报
回复
哦,忘记说了,在结构体中如何要求按4字节对齐???
zhanshen0215488 2009-10-16
  • 打赏
  • 举报
回复
添加一个Timer控件,然后双击Timer,写入以下代码:

if Win32Platform = VER_PLATFORM_WIN32_NT then
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
application.ProcessMessages
僵哥 2009-10-16
  • 打赏
  • 举报
回复
type
TEnumType = (etElement_0,etElement_1,...);//正常的定义


默认为一个字节,但是枚举类的成员的值是可以显式定义的,所以可以通过显式定义一个形式成员,用于撑大占位

两字节占位
type
TEnumType = (etElement_0,etElement_1,...,etElementReserved=$7fff);//正常的定义


四字节占位
type
TEnumType = (etElement_0,etElement_1,...,etElementReserved=$7fffffff);//正常的定义
mdejtod 2009-10-16
  • 打赏
  • 举报
回复
C和DELPHI里都定义为压缩型的,就可以了吧?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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