网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月15日漏签0天
delphi吧 关注:17,476贴子:81,696
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 3回复贴,共1页
<<返回delphi吧
>0< 加载中...

【求助】关于Getmem与blockread的问题

  • 只看楼主
  • 收藏

  • 回复
  • npcfish
  • 初级粉丝
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近编的一个程序遇到一个问题,请各位高手相助~我用的是Delphi7.0,用Getmem得到了一个动态数组,可以正常访问,在watch中可以正确显示数值;但对其使用Blockread(正常通过)后,再访问就会报一个类似"access violation at xxxxxxxx"的错误,此时在watch中也看到该数组的元素都被标上了"inaccessible value",这是怎么回事?代码大致如下:
var
dat:array of byte;
f:file of byte;
...
begin
...//文件操作等
getmem(dat,filesize);
dat[0]:=0;//这里可以正常访问
blockread(f,dat,100,numread);//正常通过,且通过后numread=100
dat[0]:=0;//这里就出错了
...
end;
事后我把dat换成静态数组就没有这个问题了。我想请教我要怎么在这里使用动态数组?



  • npcfish
  • 初级粉丝
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己顶,求教育


2025-08-15 05:16:11
广告
不感兴趣
开通SVIP免广告
  • xiyusoft
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
procedure GetMem(var P: Pointer; Size: Integer);
Creates a dynamic variable and a pointer to the address of the block.
getmem(dat,filesize);
dat[0]:=0;//这里可以正常访问
这个正确,分配了内存
blockread(f,dat,100,numread);//正常通过,且通过后numread=100
应该是把dat放入了stack(栈中),程序员不能直接访问。
需要把他从栈中取出。


  • xiyusoft
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
blockread(f,dat,100,numread);//正常通过,且通过后numread=100
-----------------------------
错了。
blockread(f,dat,100,numread);//正常通过,且通过后numread=100
这个没有找到相应的源码,和函数说明。
下面是静态成员的汇编
Unit1.pas.66: blockread(f, dat, 100, numread);//正常通过,且通过后numread=100
0044E84C 8D45FC lea eax,[ebp-$04]
0044E84F 50 push eax
0044E850 8D954CFEFFFF lea edx,[ebp-$000001b4]
0044E856 B964000000 mov ecx,$00000064
0044E85B 8D85B0FEFFFF lea eax,[ebp-$00000150]
0044E861 E85648FBFF call @BlockRead
0044E866 E88943FBFF call @_IOTest
Unit1.pas.67: if read > 0 then
0044E86B 85DB test ebx,ebx
0044E86D 7E07 jle +$07
Unit1.pas.68: dat[0]:=0;//这里就出错了
0044E86F C6854CFEFFFF00 mov byte ptr [ebp-$000001b4],$00
0044E876 33C0 xor eax,eax
0044E878 5A pop edx
0044E879 59 pop ecx
0044E87A 59 pop ecx
0044E87B 648910 mov fs:[eax],edx
0044E87E 689BE84400 push $0044e89b
二动态成员的汇编
0044E89C E81B48FBFF call @BlockRead
0044E8A1 E84E43FBFF call @_IOTest
Unit1.pas.68: dat[0]:=0;//这里就出错了
0044E8A6 8B45FC mov eax,[ebp-$04]
0044E8A9 C60000 mov byte ptr [eax],$00
0044E8AC 33C0 xor eax,eax
0044E8AE 5A pop edx
0044E8AF 59 pop ecx
0044E8B0 59 pop ecx
0044E8B1 648910 mov fs:[eax],edx
0044E8B4 68D1E84400 push $0044e8d1
Unit1.pas.78: CloseFile(F);
0044E8B9 8D85ACFEFFFF lea eax,[ebp-$00000154]
0044E8BF E81848FBFF call @Close
0044E8C4 E82B43FBFF call @_IOTest
0044E8C9 C3 ret
0044E8CA E91D58FBFF jmp @HandleFinally
0044E8CF EBE8 jmp -$18
0044E8D1 33C0 xor eax,eax
0044E8D3 5A pop edx
0044E8D4 59 pop ecx
0044E8D5 59 pop ecx


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回delphi吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示