新手问题一堆,指针,数组和函数传递(20分)

  • 主题发起人 主题发起人 gardenwood
  • 开始时间 开始时间
G

gardenwood

Unregistered / Unconfirmed
GUEST, unregistred user!
type
PByte=^Byte;
PWord=^Word;
PArrayByte=array of Byte;

Envelop=record
ProtocolSap: Byte;
Reserved: Byte;
MessageLength: Word;
end;

SscopStruct=record
Head: Envelop;
pBuf: PByte;
end;


问题1:delphi里有没有字节对齐一说? 在c里是没有的,所以我必须加保留字对齐结构。
问题2:由于数据量很大,而且是无间断的发送,所以我不希望程序内部copy数据。所以,我把放数据的Buf定义为PByte.
在Atm送来的数据通过UDP接受到以后,是一个Byte Content[MAX_DATA_NUM], 数据的长度又我Enevlop里的消息长度计算出来,
我直接把pBuf:=Content,这样可以吗?以后的操作就直接移动pBuf的指针,只要不越界就OK.另外,delphi里是不是也是
认为数组的地址就是它的名字? 即Content就是Content数组的地址? 要不我是否该pBuf:=@Content?
问题3,Atm来的数据是按照上面的SscopStruct结构填写的,Udp得到后,放在Byte DadaFromAtm[MAX_DATA_NUM]里,我能否象C里
一样,这样把数据放入结构:
pSscopStruct= ^SscopStruct;
psscopdata: pSscopStruct;

psscopdata:=pSscopStruct(Content);
然后,psscopdata.Head.ProtocolSap得到ProtocolSap值?可我这样得不到啊。
问题4,另外,是不是在delphi里任何一个指针都要new 一下? 在c里,int *p,可以直接用,不需要malloc或者new,但
在delphi里,integer ^p;是不是一定要new?可我不new也好象可以用。

——————————————————————
现在,我已经把数据放在Data[MAX_DATA_NUM]里了,我想传入函数里,通过地址传递

ParaseAtmData(Data,100);

ParaseAtmData(pData:PByte;Len:Iteger)
var
pwData: PWord;
begin
pwData:=PWord(pData);
end;
可这样得到pwData^值是错误的,为什么啊?
 
1. 有 定义时用packed record
2. 可以。 是. content是content数组首个元素的地址(静态数组)或者是个指针(动态数组)。
3.可以。 有时要强制类型转换一下比如PSScopStruct(Integer(Content)). 应该用psscopdata^.header.ProtocolSap
4. 不是。 delphi将所有指针定义初始化为0(nil). 所以你要单独使用时, 需要new一下。 c中也一样。

 
直接声明 record 才是对齐吧?packed record 好像才是不对齐哦?
(不会是我记错了吧?)
 
beta, 直接声明record是align的, 但是是word align或者dword align的。
packed record是按定义指定类型的大小顺序排列(当中不插入对齐字节)。 不要告诉我说你的电脑存放数据的最小单位不是字节哦。
 
to Pearl
Byte Content[20]
在delphi里好象不是Content就是Content的地址

Content!=@Content=@Content[0]
好象delphi里Content这个是没有意义的。

另外,就是一个小问题,为什么我查看指针p的地址空间的时候,delpi显示的地址是从大到小排列的?
搞的我看的时候,比较郁闷。呵呵
 
算了,还是给分把
 
接受答案了.
 
后退
顶部