D4和D5的兼容问题,急!!(100分)

  • 主题发起人 主题发起人 左轻侯
  • 开始时间 开始时间

左轻侯

Unregistered / Unconfirmed
GUEST, unregistred user!
D4和D5的兼容问题,急!!
我的程序中有几个Record结构:
TVersion=record
High:integer;
Low:integer;
end;

TCountInfo=record
Count:integer;
Time:Tdatetime;
Flow:single;
PhoneFee:currency;
NetFee:currency;
TotalFee:currency;
end;

TNIDFileHeader=record
ID:string[5];
Ver:Tversion;
Count:integer;
LastDay:Tdate;
Today:TCountInfo;
ToMouth:TcountInfo;
Total:TcountInfo;
end;

var
header:TNIDFIleHeader;
然后用TFileStream读写文件:
NIFStream.Write(header,sizeof(TNIDFileHeader));
NIFStream.Read(header,sizeof(TNIDFileHeader));
运行成功。
原程序未做任何改变,在D5下编译以后,读取数据出错,经检查,
在D5下生成的文件居然比D4下要大,也就是同样的代码,得出来
的TNIDFileHeader的长度居然不一样!D4下是148,D5下是176。
由于Win2000下只能跑D5,我必须升到D5,又要和以前的数据文件
兼容。但这个问题根本不知道从哪里下手?如有大虾能够解决,
我另外再给分,两三百分的不在话下。谢了谢了!
 
win2000下D4也可以
 
有可能不是 d5 的问题,或许是 win2k 的问题,
sizeof 有可能会出现大小不一样的错误。
 
win2K和sizeof能有什么关系?
原来在Delphi4下编译的程序在win2K下运行也正常,
size还是148。
我想应该是编译器的问题吧?是不是要设置什么选项?
qiu_peking:
win2K下不能装D4,参见问题
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=187314
再说,我不能老用D4呀。
 
你改三个地方实验一下:
1.TCountInfo改为packed record
2.TNIDFileHeader改为packed record
3.ID改为string[7](就这个我不敢保险,但大部分结果应该是对的)
无论成功/失败,请通知我。
 
搞定!!!
ID改为string[7]
size变成148,读取数据正常
我查了D5的help:
By default, the values in a structured type are aligned on word ordo
uble-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage.
packed这个东东在D4中好象没有,是D5新加入的?
不过ID改为string[7]是为什么呢,难道string也有两个字符作为boundaries?
温柔大虾,这里80分给你,我另开一个问题,再送120分。
多谢多谢!
 
D5中是Dword Alignment,因此小于8byte的类型都会自动被
扩充为8byte对齐,因此才会出现你遇到的问题。
关键奇怪的是D4中也口口声声说是Dword Alignment,
但是实际出来的结果却是Word Alignment,导致
integer,single等类型按照4byte存储,因此在D5中就不兼容了。
而我也没有找到任何其他编译选项和help对此有更详细的说明。
 
温柔兄,谢谢指点,那边120分已经给你了。
那个string[5]改为string[7]是怎么回事?
看不出它是按什么Alignment的啊?
 
任何类型都要按dword align,因此string[5]也要存储为
8byte。但是一旦pack,就把string[5]按实际长度存储了,
因此要手工补上align后的长度,才与D4中Align过的长度相等。
但要注意string有一个byte的“头信息”,因此要补成7而不是8。
 
多谢指点!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
644
import
I
后退
顶部