先声明一个使用动态指针的纪录类型:
type
TTest = record
dw : DWORD;
ary : Array of DWORD;
end;
pTest = ^TTest;然后:
var
test : PTest;
p : PDWORD;
begin
test := AllocMem( sizeof(TTest) + sizeof(dword) * 2 );
setlength(test.ary,2);
test.dw :=12345;
test.ary[0] := 111;
test.ary[1] := 222; p := PDWORD(test);//强制转化指针类型
Inc(p);
p^ := 333; if P^ = test.ary[0] then ...//问题来了,此句引发异常,
//如果改为:
if P^ = PTset(test).ary[0] then...//再转化回来,也不行!
问题是:
1:delphi的强制指针转化是否可逆?
2:据说delphi动态指针是系统管理的,也就是说,我申请内存后,test.ary[0]在内存中的位置并不是紧接着test.dw, 上例中,改变了P^的值并不会改变test.ary[0],对吗?问题可能有点难,讨论一下吧!
type
TTest = record
dw : DWORD;
ary : Array of DWORD;
end;
pTest = ^TTest;然后:
var
test : PTest;
p : PDWORD;
begin
test := AllocMem( sizeof(TTest) + sizeof(dword) * 2 );
setlength(test.ary,2);
test.dw :=12345;
test.ary[0] := 111;
test.ary[1] := 222; p := PDWORD(test);//强制转化指针类型
Inc(p);
p^ := 333; if P^ = test.ary[0] then ...//问题来了,此句引发异常,
//如果改为:
if P^ = PTset(test).ary[0] then...//再转化回来,也不行!
问题是:
1:delphi的强制指针转化是否可逆?
2:据说delphi动态指针是系统管理的,也就是说,我申请内存后,test.ary[0]在内存中的位置并不是紧接着test.dw, 上例中,改变了P^的值并不会改变test.ary[0],对吗?问题可能有点难,讨论一下吧!
解决方案 »
- 哪错呢
- 這句錯在哪里????String(ActiveControl.ClassName())<>'TDBMemo'
- 大家来看看这个问题
- 为什么同样的代码,用BDE要比ADO快上几十倍?(100分)
- 那里有李维DELPHI7高效数据库的范例下载
- 请问:delphi怎样读xml文件?
- 一个主机两个显示器,如何用程序控制主副显示器的自由切换,跪求!
- delphi程序发布时,我如何自动加入odbc system DSN ??请大侠们帮忙!!!
- 请问怎样停止当前声音设备的播放(因为不知道用什么程序播放的,所以无法用强行停止外部程序的方法)
- 在DELPHI中DATABASE DEXKTOP中使用PARADOX表的一些问题?
- InstallShield打包,安装后程序名称在win98下是汉字,win2k或winxp下是乱码?
- 求助~
1.当然可以,很容易自己试出来,也很容易理解
2.记录中的数据当然连续,也很容易试出来,不是吗?
2:是紧跟着的.但上面是动态数据,只是存放的一个指向数组的指针,所以你改P^后,Test这个动态数组指针就不对了,所以出错.如果不是动态数组就不会出现这个问题.
PWORD(p^)^ := 333;
就是指向这个指针指向的数据
但是P^绝对不是 楼主的结果
Inc(p); //这里 p 的内容是指向 ary[0] 的指针值,而不是 ary[0] 本身
PWORD(p^)^:= 333; //再转换一次就行了,。
我不想因为把test强制转化为pdword后就不用它了,怎么再把它转化回来呢?或者Delphi中可不可以像C那样(PDWORD)Test 而不改变test的类型呢?
注意:
c可以这样:
(PDWORD)Test //得到了想要的但是并没有对test强制转化。
PDWORD(Test)//强制转化。附:如果强制转化了带有动态数组的指针而又没办法找回原来的数据,Delphi也太差了,我决定放弃她!