请问delphi 怎么定义如C语言里面的联合体Union ( 积分: 20 )

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
C语言里面定义的联合体:
union
{
char x;
struct
{
unsigned s7:1;
unsigned s6:1;
unsigned s5:1;
unsigned s4:1;
unsigned s3:1;
unsigned s2:1;
unsigned s1:1;
unsigned s0:1;
}y;
};
怎样用delphi实现以上代码?
 
taaa=record
s:array[0..5]of char;
end;

tbbb = packed record
len: integer;
case byte of
0: (bs0: array[0..1]of char);
1: (bs1: integer); //概况
2: (bs2: taaa); //统计
99: (mem: char);
end;

类似...
 
To luqiao:

谢谢你的回复,不够我想确确知道

{
char ch;
struct
{
unsigned m7:1;
unsigned m6:1;
unsigned m5:1;
unsigned m4:1;
unsigned m3:1;
unsigned m2:1;
unsigned m1:1;
unsigned m0:1;
}bit;
}un;
在delphi怎么实现?

我在delphi里面这么写:

TBitUnion = record
case integer of
0: (ch:char);
1: (m7:word;
m6:word;
m5:word;
m4:word;
m3:word;
m2:word;
m1:word;
m0:word;
);
end;
然后申明一个变量un:TBitUnion;然后给m7...m0赋值如下:
un.m7:=1;
un.m6:=1;
...
...
...
un.m0:=1;

但是我的一段用到这个联合体的程序的运行结果,跟用C语言实现的程序的运行结果,两个结果不一样。

C语言代码
代码:
int CRC_creat(buf,len)  
 char *buf;
 int len;
{
      long int temp;
      char code[CRC_LEN+1];
      int byte,count,cou;

      temp=(unsigned char )buf[0]*256+(unsigned char )buf[1];

  cou=1;
  while (temp<$10000)
  {
          un.ch=buf[byte+1];

          printf('**** m7:%d',un.bit.m7);

	switch (cou)
	{
		case 1:
			temp=temp*2+un.bit.m7; 
		break;
		case 2:
			temp=temp*2+un.bit.m6; 
		break;
		case 3:
			temp=temp*2+un.bit.m5; 
		break;
		case 4:
			temp=temp*2+un.bit.m4; 
		break;
		case 5:
			temp=temp*2+un.bit.m3; 
		break;
		case 6:
			temp=temp*2+un.bit.m2; 
		break;
		case 7:
			temp=temp*2+un.bit.m1; 
		break;
		case 8:
			temp=temp*2+un.bit.m0; 
		break;
	}


			cou++;
  } /* while <<<<  */

}

delhi代码实现如下:
代码:
function crc_create(var buf:string;len:integer):integer;
var
    temp:LongInt;
    code:string[CRC_LEN];
    byte,count,cou:integer;
    un: TBitUnion;
begin
      un.m7:=1;
      un.m6:=1;
      un.m5:=1;
      un.m4:=1;
      un.m3:=1;
      un.m2:=1;
      un.m1:=1;
      un.m0:=1;

      temp:=(ord(buf[1]))*256+ord(buf[2]);  //注意delphi的string的下标是从1开始
      
      while (temp<$10000) do
         begin 
               un.ch:=buf[byte+1+1]; //注意delphi的string的下表是从1开始的
             
               form1.memo1.lines.add('**** m7: '+inttostr(un.m7));

               case cou of
                    1:temp:=temp*2+un.m7;   
                    2:temp:=temp*2+un.m6;
                    3:temp:=temp*2+un.m5;
                    4:temp:=temp*2+un.m4;
                    5:temp:=temp*2+un.m3;
                    6:temp:=temp*2+un.m2;
                    7:temp:=temp*2+un.m1;
                    8:temp:=temp*2+un.m0;
                end;
            inc(cou);
         end;
end;

假设两个buf都是fuck ****这么一个字符串;

大家看C语言实现的代码里面的printf和delhi实现的form1.memo1.lines.add日志显示,在while里面的第一次循环的时候就开始不一样了,C实现是1,而delphi实现的变成是99了。

请问这是为什么啊??

难道是用delphi实现的联合体定义有问题吗??
 
后退
顶部