小问题(50分)

  • 主题发起人 主题发起人 dyf
  • 开始时间 开始时间
D

dyf

Unregistered / Unconfirmed
GUEST, unregistred user!
已知: Tmyrec=Record
a : single;
b : Array[0..12];
c : Array[0..12];
end;

问: 1. SizeOf(TmyRec)= ?
2. 为什么?



 
这个问题与你的数组类型有关。
如为integer(4bytes)则
SizeOf(TmyRec)为4(single)+13*4(integer)+13*4(integer)=108
关于其它类型的长度,你可以参阅有关帮助。
string:4
shortint:2
......
 
更正!
已知:
Tmyrec=Record
a : single;

b : Array[0..12] of char;
c : Array[0..12] of char;

end;
 
哎,来迟,没赶上趟
 
别着急,没迟,我还没看见答案那
 
答:
1、32
2、因为single的尺寸是4字节,帮助文件有说:
Type Range Significant digits Size in bytes
----------------------------------------------------------
Single 1.5 x 10^ 5 .. 3.4 x 10^38 7 4
很清楚吧?然后中Char,每一个Char占用1个Byte,故两个数组应该是
2*13*1=26
26+4=30? 另外的2呢?这是因为每一个数组须用一些字节作为结构和大小的说明
部分,故两个数组用了2个。这样说应该没有问题吧?
而且这些用于说明结构和大小的字节大小是不确定的,它随数组的复杂程度而使
用不同的字节数。但是记录并没有使用内存来记录它的结构因为它里面的单元对
它来说只是不同的内存偏移量而已。
 
procedure TForm1.Button1Click(Sender: TObject);
var
aaaa: tmyrec;
begin
showmessage(inttostr(sizeof(aaaa)));
end;

答案:32
 
3h大侠完全正确!
事情是这样:
有一个tc2写的记录文件,struct=float+char[13]+char[13]
共30byte.我用上述记录读,老出错,才发现delphi的记录长度
并不等于各域长度和.那咋办?
顺便说:用了 porxy=202.10.11.2:80 速度快多多了
 
struct=float+char[13]+char[13] 30byte???
 
难道不是吗?
我是在文件里数的
 
in tc2
struct myrec{
float a;
char b[13],c[13];
};
in delphi
Tmyrec=Record
a : single;

b,c : Array[0..12] of char;
end;

如何写出同样的记录文件?
 
In that case you can use packed record instead:
TMyRec = Packed Record
a: single;
b: array [0..12] of char;
c: array [0..12] of char;
end;
 
会长果然高见!谢谢! (以前我怎摸不知道 packed ?)
3h答对了,但会长解决了我的问题
 
问题的关键是这样:
Delphi的编译器为了提高数据结构的读写速度,是以四个字节(sizeof(word))
的整数倍来存储结构,
所以你的结构定义成:
TMyRec=record
...
end;
其结构大小总是4的倍数,若你要使结构保持他的原始大小,可以这样定义:
TMyRec=packed record
...
end;
其结构大小就会是其原始大小!但这会影响结构的存取速度。
所以实际上:
record 是以空间换时间。
packed record 是以时间换空间。
 
总之用之前判断一下sizeof就没有这问题了。
 
后退
顶部