C语言结构转pascal结构问题 ( 积分: 100 )

  • 主题发起人 主题发起人 play123456
  • 开始时间 开始时间
P

play123456

Unregistered / Unconfirmed
GUEST, unregistred user!
typedef struct _POSDATE_STRUCT
{
unsigned int Year:12;
unsigned int Month:4;
unsigned int Day:5;
unsigned int Hour:5;
unsigned int Min:6;

} pPOSDATE;该结构在Delphi中如何定义? 注意C这样的写法实际上把一个32位的整型数据分作5个不同长度的部分来组成。
 
typedef struct _POSDATE_STRUCT
{
unsigned int Year:12;
unsigned int Month:4;
unsigned int Day:5;
unsigned int Hour:5;
unsigned int Min:6;

} pPOSDATE;该结构在Delphi中如何定义? 注意C这样的写法实际上把一个32位的整型数据分作5个不同长度的部分来组成。
 
Delphi不支持位域,所以只有采用变通的办法来实现了,定义一些函数处理吧
 
Delphi中没有位结构的定义方法吗?
 
有,delphi定义结构很简单
type
MyRec=record
I: Integer;
s: string;
b: Boolean;
end;

但是定义不出你上面那样的,虽然Delphi定义格式可以用case of 来设定不同字节的格式,但是,必须是标志格式,比如,一个Cardinal可以被解析成两个Word,好像没看到可以像你的c结构那样做。
 
一定要压缩在32位长度吗?
如果是,那么可以先定义为DWORD,然后用“逻辑与”方法存取各部分的值。
 
这种结构在网络通讯协议中经常遇到.
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数

数据类型 变量名: 整型常数

} 位结构变量

其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8
/*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1
/*blink占用高字节的第7位*/
}ch

位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8]

int age

struct addr address

float pay

unsigned state: 1

unsigned pay: 1

}workers;'
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
 
位结构是用时间换空间,呵呵,现在来看完全可以用空间换时间
 
type
p=record
case Integer of
0:(a:Byte;b:Byte;c:Byte;d:Byte)//共32bit
end;
仅供参考
 
我也有同样的遭遇:
typedef struct
{
char Node[9]
// IPX:网段号
TCP:填写字符串"TCP&quot

char Address[13]
// IPX:网卡地址
TCP:IP地址
unsigned int Socket

}NETWORKADD;

本人在Delphi中定义:

NETWORKADD =record
node : Array[1..9] of Char
address:Array[1..13] of Char

socket: Longword

end;

附值:
addr:NETWORKADD;
with addr do
begin
node:='TCP '+#0;
address:='192168000010'+#0;
socket:=28946;
end


但没用,作为dll函数的调用参数根本得不到正确结果;
 

Similar threads

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