请各位帮忙解释这段delphi程序 ( 积分: 100 )

  • 主题发起人 主题发起人 记忆0109
  • 开始时间 开始时间

记忆0109

Unregistered / Unconfirmed
GUEST, unregistred user!
type
recvrecord = record
status: array[0..1] of char
//data status
alarm: array[0..7] of char
//alarm
units: array[0..5] of char
//units
chanNo: array[0..2] of char
//chan
delimer: char
//,
value: array[0..5] of char
//data
exponet: array[0..1] of char
//data exponent
pointPoistion: char
//小数点位数
endd: array[0..1] of char
//cr,lf
end;

type
d = record
ch1: array[0..11] of char
//data
ch2: array[0..11] of char
//time
rr: array[0..239] of recvrecord;
end;

type
k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end;
 
type
recvrecord = record
status: array[0..1] of char
//data status
alarm: array[0..7] of char
//alarm
units: array[0..5] of char
//units
chanNo: array[0..2] of char
//chan
delimer: char
//,
value: array[0..5] of char
//data
exponet: array[0..1] of char
//data exponent
pointPoistion: char
//小数点位数
endd: array[0..1] of char
//cr,lf
end;

type
d = record
ch1: array[0..11] of char
//data
ch2: array[0..11] of char
//time
rr: array[0..239] of recvrecord;
end;

type
k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end;
 
楼主,这个本来就是DELPHI程序,你要翻译成什么啊!!!!!!!
只是定义了三个记录类型,
并且后面的引用了前一个记录类型啊!!!!
 
这应该是C++的程序。
我现在不明白,如果给 k5.recv[x] 付值,那
k5.k6.ch1
k5.k6.ch2
k5.k6.rr[x].status[0]
k5.k6.rr[x].status[1]
k5.k6.rr[x].value[0]
k5.k6.rr[x].value[1]
k5.k6.rr[x].value[2]
k5.k6.rr[x].value[3]
k5.k6.rr[x].value[4]
k5.k6.rr[x].value[5]
是什么值???
 
k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end

这是一个可变纪录,相当于c中的union,k6和recv使用共同的内存位置
 
k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end
同意楼上的意见,这是一个可变纪录类型,在可变纪录中不同的数据块共同覆盖
同一内存,允许单独访问各项重叠的字段
 
Delphi精要上有讲到这个。。
 
是的,联合;
任何时候 k5 都占用15001个内存;

请楼上各位给讲讲:怎么调用啊? ,谢谢
 
闻所未闻
听课
c的我明白delphi还真没听说过

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3134940

to 迷糊

怎么用呀!?
 
你这样申明的还不是你想象的可变纪录类型,它占用的内存>15000;
应该申明为packed,才是15000, 不然,你是看不到你想要的结果的。
recvrecord = packed record
xxx
end;

d =packed record
xxx
end;

这样申明的

k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end

中的k6和recv才能正确共享。
 
这个变体记录类型,变体记录是存储在一个内存中,根据不同的访问方式存取内存中的数据,内存的大小等于变体数据结构中最大的哪个;
type
k5 = record
case byte of //这句不明白
0: (k6: d);
1: (recv: array[0..15000] of byte);
end

在访问记录里的数据的时候可以用如方法:
var
rK: k5;
begin
rK.k6.ch1 :=
// 编译器自动按Case byte = 0 调用
rK.recv := ;// 编译器自动按Case byte = 1 调用
end;
 
注意包含{$ALIGN OFF}后也会使记录边界不对齐的,不一定要packed record的
 
后退
顶部