ValueS:String[20];
AlarmTS:String[20];
AlarmIS:String[20];
他们占用的不是60,而是63,因为会自动在后面加上'\0'
AlarmTS:String[20];
AlarmIS:String[20];
他们占用的不是60,而是63,因为会自动在后面加上'\0'
解决方案 »
- 如何判断一个字符是不是汉字?
- 关于动态的给speedbutton按钮加图片的问题
- 用DDE技术能实现局域网中不同电脑间相互通信吗?
- 我想在SQL语句在发送到数据库前的对他进行校验,检查基本的语法是否正确!!
- 我使用insert into ,
- 如何把设置保存问一个文件,下次使用软件的时候再读入,变成上次关闭的样子
- 百分大放送,非牛莫入!
- 如何连接到oracle?
- 请问DELPHI中ExpressQuantumGrid的dxDBGrid控件怎样在动态增加表字段的同时动态创建dxDBGrid字段列!谢谢!
- 如何将Paradox表中的数据另存为文本文件(.txt)或Word文件(.doc)???
- !!!!!!!!挑战极限3---修改正在运行的可执行文件(PE)的数据并把他保存在该程序的文件中---!!!!!!!!!!!你能吗?!!!!
- 这问题有点麻烦..请高手回答
ValueS:array[1..20]of char;
AlarmTS:array[1..20]of char;
AlarmIS:array[1..20]of char;
TRealData=record
GateWayID:word; //2
DPUID:Byte; //1
CHID:Byte; //1
Alevel:Shortint; //1
Value:single; //4
ValueS:array[1..20]of char;
AlarmTS:array[1..20]of char;
AlarmIS:array[1..20]of char;
end;
TRealData=record
GateWayID:word; //2
CHID:Byte; //1
Alevel:Shortint; //1
Value:single; //4
ValueS:array[1..20]of char;
AlarmTS:array[1..20]of char;
AlarmIS:array[1..20]of char;
end;
这两个的sizeof,前一个是72,后一个是68,他们相比就差了一个byte。
看出问题了吗???
如果你学过汇编,应该知道机器内部的存储。
给你举个简单的例子:
Ta=record
a:Byte;
b:integer;
c:Byte;
end;
Tb=record
a:Byte;
c:Byte;
b:integer;
end;
a占12,b占8。现在应该明白了吧:)
在ta中,integer在机器中必须从可以被4整除的地址存储,所以基址为0,头一个byte占4个
在tb中,头两个byte理论是两个byte,但是后面是一个integer,所以要补两个,所以是8。
所以建议你的record应该这样定义
TRealData=record
tag:Byte; //1
CCUID:Byte; //1
DPUID:Byte; //1
CHID:Byte; //1
Alevel:word; //2
GateWayID:word; //2,此处定义成word,^_^
Value:single; //4
ValueS:array[1..20]of char; //20
AlarmTS:array[1..20]of char; //20
AlarmIS:array[1..20]of char; //20
end;
这是你的预期的效果。
Value:single;
放到最后
现在的情况是,这个系统是别人做好的,等于这个结构已不能改变了,我现在用VB跟它做一个接口,通过UDP接收它的这种结构的数据包,我怎样才能正确接收数据呢,并把它们赋值给一个相应结构的数据包
public type TRealData
tag as byte
GateWayID as integer
CCUID as byte
DPUID as byte
CHID as byte
Alevel as byte
Value as single
ValueS as String*20
AlarmTS as String*20
AlarmIS as String*20
end type
我又定义了一个结构
Value:Single;
ValueS:String[20];
AlarmTS:String[20];
AlarmIS:String[20];
为什么它的长度是68?前面的Value怎么会占五个字节呢?
v : single;
s1: string[20];
s2: string[20];
s3: string[20];
end;sizeof(test) = 67
原因如下:
Instances of a structured type hold more than one value. Structured types include sets, arrays, records, and files as well as class, class-reference, and interface types. Except for sets, which hold ordinal values only, structured types can contain other structured types; a type can have unlimited levels of structuring.
By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,type TNumbers = packed array[1..100] of Real;Using packed slows data access and, in the case of a character array, affects type compatibility. For more information, see Memory management.
前面:
: cszhz(丑小鸭) ( ) 信誉:100 2002-1-12 12:08:50 得分:0
ValueS:String[20];
AlarmTS:String[20];
AlarmIS:String[20];他们占用的不是60,而是63,因为会自动在后面加上'\0' 这样的解释是错误的!定义string[20],但用sizeof得到21,是因为:实际上该数组总共有21个元素
第0个是用来存放数组长度的,真正的数据是从元素1~20