较难,高手请进,关于数组、记录的一个问题,在线等。。。(100分)

  • 主题发起人 主题发起人 hq1228
  • 开始时间 开始时间
H

hq1228

Unregistered / Unconfirmed
GUEST, unregistred user!
消息过程传递中定义了几个record,其中一个是桢头,其他几个是桢内容:
桢头: pR1 =^R1;
R1 = record
x1,x2..... : integer;//有很多
data : array[1..512] of char;
end;
桢内容: 大概有五六个record吧。
R2 = record
y1,y2....: integer ; //有很多
end ;
R3 = record
y1,y2....: integer ; //有很多
end ;
在桢头record中,定义data(array[1..512] of char)的目的是分配一块连续的内存区,桢内容作为记录类型(record)实际上也是一块连续的内存区,桢头中的数组和桢内容中的类型如何相互转换?尝试了几种方法:
1。类型强制转换是不行的。
2。data数组变通:定义为指针类型,不可以。因为需要与Unix端C程序通讯,接收消息时无法指向地址。
3。多定义几个桢头,data分别定义为桢内容,可以。好傻!
4。内存拷贝,c里面数组名即为该数组首地址,Delphi中如何获得数组的地址并使它指向已由程序生成的桢内容地址?内存拷贝可嵌套汇编:
asm
mov EAX, pR2
mov pData, EAX
end;
Delphi有无相应的内存拷贝函数?
请高手指点,主要针对第4种方法,或者还有什么招,不吝赐教。。。


 
我来学习,帮你提一下!
 
copyMemory()

Delphi帮助:
he CopyMemory function copies a block of memory from one location to another.

VOID CopyMemory (

PVOID Destination, // address of copy destination
CONST VOID *Source, // address of block to copy
DWORD Length // size, in bytes, of block to copy
);


Parameters

Destination

Points to the starting address of the copied block's destination.

Source

Points to the starting address of the block of memory to copy.

Length

Specifies the size, in bytes, of the block of memory to copy.



Return Values

This function has no return value.

Remarks

If the source and destination blocks overlap, the results are undefined. For overlapped blocks, use the MoveMemory function.

See Also

FillMemory, MoveMemory, ZeroMemory
 
CopyMemory函数的三个参数头两个都是指针,关键是如何获取数组的地址:
@pR1^.data ?
我试过了,程序可以通过,但读出的数据不对。
 
而且拷贝内存并不是一个好的办法,最好是将数组的指针指向那个地址就可以了。
有没有大侠帮帮忙啊。。。
 
在记录里多定义一个指向本记录地址的指针看看行不行
 
type
PR2=^R2;
PR3=^R3;
PR4=^R4;
...
使用以下方式访问:
PR2(@R1.Data)
PR3(@R1.Data)
PR4(@R1.Data)
...
 
不會吧!!我測試怎麼是對的....
type
pR1 =^R1;
R1 = record
x1,x2: integer;
data : array[1..512] of char;
end;
============================================
procedure TForm1.Button1Click(Sender: TObject);
var
gg:pR1;
P:PChar;
begin
GG.data[1]:='g';
P:=@GG.data;
P:=@GG.data[1];
Edit1.Text:=String(p^);
end;
數組的地址就是@GG.Data 它跟第一個@GG.data[1]是相同的
 
我已经找到答案了,谢谢!
 
后退
顶部