首页  编辑  

发现可以翻译VC里面中位域的方法

Tags: /超级猛料/Language.Object Pascal/数组、集合和记录、枚举类型/   Date Created:

发现可以翻译VC里面中位域的方法。

From Copy_Paste: http://www.eping.net/fourm/dispbbs.asp?boardID=15&replyID=3553&ID=720&skin=1

相信大家都在VC里面见过这种结构体吧。

typedef struct

{

union

{

 struct

 {

  BYTE u1:1;

  BYTE u2:1;

  BYTE u3:1;

  BYTE u4:1;

  BYTE u5:1;

  BYTE u6:1;

  BYTE u7:1;

  BYTE u8:1;

 };

 BYTE Flags;

};

} TData;

像这种怎么对应起Delphi的结构了,以前实在没法的时候,只好写两个函数,相互转换,以为D不能对一个字节位操作。

呵,昨天睡觉,突然迷迷糊糊的想到集合这东西好像是可以做成,一试,果然如此。

按上面的写法,应该是这样译:

type

 TFlags = set of (u1, u2, u3, u4, u5, u6, u7, u8);

 TData = record

   case Byte of

     0: (Flags: Byte);

     1: (u: TFlags);

 end;

VC的测试代码:

void Ctest4Dlg::OnBnClickedOk()

{

int s = sizeof(TData);

char buf[10];

itoa(s, buf, 10);

MessageBox(buf);

TData d;

d.u1 = TRUE;

               d.u2 = TRUE;

d.u3 = TRUE;

d.u4 = TRUE;

d.u5 = TRUE;

d.u6 = TRUE;

d.u7 = TRUE;

d.u8 = TRUE;  

s = (int)d.Flags;

itoa(s, buf, 10);

MessageBox(buf);

}

D的:

procedure TForm1.Button1Click(Sender: TObject);

var

 D: TData;

begin

 ShowMessage(IntToStr(Sizeof(TData)));

 Include(D.u, u1);

 Include(D.u, u2);

 Include(D.u, u3);

 Include(D.u, u4);

 Include(D.u, u5);

 Include(D.u, u6);

 Include(D.u, u7);

 Include(D.u, u8);

 ShowMessage(IntToStr(D.Flags));

end;