整型指针为什么取不到? ( 积分: 100 )

  • 主题发起人 主题发起人 kill99
  • 开始时间 开始时间
K

kill99

Unregistered / Unconfirmed
GUEST, unregistred user!
函数定义<br>function&nbsp;&nbsp;GetTitleNum&nbsp;&nbsp;(var&nbsp;num:&nbsp;Pointer;&nbsp;cvtcontext:&nbsp;Pointer):&nbsp;Integer&nbsp;cdecl&nbsp;&nbsp;{$IFDEF&nbsp;WIN32}&nbsp;stdcall&nbsp;{$ENDIF};<br><br>使用是,给cvtcontext则会返回num的指针。<br>我的代码:<br>titleNum&nbsp;:&nbsp;Integer;<br>PtitleNum:&nbsp;Poniter;<br>//------------------------------<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result:=&nbsp;AV_GetTitleNum(PtitleNum,&nbsp;m_pCvtContext);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;result=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(GetTitleNum&nbsp;error,&nbsp;exit!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titleNum&nbsp;:=&nbsp;&nbsp;Integer(PtitleNum^);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('titleNum='&nbsp;+&nbsp;inttostr(titleNum));<br><br>//----------------------<br><br>运行到&nbsp;titleNum&nbsp;:=&nbsp;&nbsp;Integer(PtitleNum^);&nbsp;总是出错。<br>请高手帮忙!
 
debug的时候看到PtitleNum是有值的&nbsp;=$8<br>但是我不明白为什么取不出来。
 
在线等待中
 
在线等待中
 
先&nbsp;type&nbsp;PInt&nbsp;=&nbsp;^Integer;<br><br>再把titleNum&nbsp;:=&nbsp;&nbsp;Integer(PtitleNum^);<br>改成<br>titleNum&nbsp;:=&nbsp;&nbsp;PInt(PtitleNum)^;<br><br>应该就没问题了
 
具体这个函数,我没法试验,不知道对不对,请见谅。
 
非常感谢mxymxy,可是错误依旧<br>出现的是一个内存错误。<br>还有一点我不明白,<br>PtitleNum=$8<br>为什么不是PtitleNum=8呢?<br>我试过,我直接把PtitleNum=$8,然后又取出来是对的。<br><br><br>不明白,传给你titlenum之后为什么错误了。<br>真是不明白阿
 
没看到明白你要做什么<br>不过可以告诉你<br>取地址用@<br>var&nbsp;<br>&nbsp;&nbsp;pr:pointer;<br>&nbsp;&nbsp;a,b;Integer;<br>begin<br>&nbsp;&nbsp;a:=45;<br>&nbsp;&nbsp;pr:=@a;<br>&nbsp;&nbsp;b:=pr^;<br>&nbsp;&nbsp;showmessage(inttostr(b));<br>end;<br>你可以试试这个代码
 
to&nbsp;Mike1234567890,<br>我是得到了pointer,想回取值的时候出错。<br><br>你的代码是错的,<br>必须这样<br>var<br>&nbsp;&nbsp;pr:pointer;<br>&nbsp;&nbsp;a,b:Integer;<br>begin<br>&nbsp;&nbsp;a:=45;<br>&nbsp;&nbsp;pr:=@a;<br>&nbsp;&nbsp;b:=Integer(pr^);<br>&nbsp;&nbsp;showmessage(inttostr(b));<br>end;
 
$8是16进制的,8是10进制的
 
对Poniter无类型指针取值非法(无类型指针不可用^)(delphi3编程指南上篇153页)
 
var<br>&nbsp;&nbsp;pr:pointer;<br>&nbsp;&nbsp;a,b:Integer;<br>begin<br>&nbsp;&nbsp;a:=45;<br>&nbsp;&nbsp;pr:=@a;<br>&nbsp;&nbsp;b:=Integer(pr^);<br>&nbsp;&nbsp;showmessage(inttostr(b));<br>end;<br>可以这样吗?
 
var<br>&nbsp;&nbsp;pr:pointer;<br>&nbsp;&nbsp;a,b:Integer;<br>begin<br>&nbsp;&nbsp;a:=45;<br>&nbsp;&nbsp;pr:=@a;<br>&nbsp;&nbsp;b:=Integer(pr^);<br>&nbsp;&nbsp;showmessage(inttostr(b));<br>end;<br><br>这样是可以的。<br>我的函数得到的值为PtitleNum=&nbsp;$8<br>而上面的pr是为$2389类似的一个地址<br><br>是不是应该我的函数出了问题?PtitleNum应该是一个地址,而PtitleNum^才应该是8?
 
我怎麽回復不了。。。
 
To&nbsp;kill99<br>PtitleNum是一个地址<br>$00000000到$0000FFFF地址是不可访问的,<br>对这一段地区写入会引起非法操作(称为“内存访问错误”或“一般保护错误”)<br>(《参透Delphi/Kylix》738页)
 
$00010000到$7FFEFFFF是进程空间,<br>其中$7FFE0000到$7FFE0FFF只读。<br>$7FFF0000到$7FFFFFFF和$00000000到$0000FFFF用于跟踪应用程序错误(前者不可被分配,后者不可写入)<br>$80000000到$FFFFFFFF为系统使用(禁止任何对此区域的操作)
 
AV_GetTitleNum(PtitleNum,&nbsp;m_pCvtContext);<br>有问题
 
........<br>PtitleNum:&nbsp;Poniter;<br>.......<br>只申请了一个无类型指针,没有通过GetMem初始化。。。。。。
 
我说吗,我还当AV_GetTitleNum(PtitleNum,&nbsp;m_pCvtContext);错误地初始化了这个指针呢!
 
后退
顶部