很久没来,希望认识的高手还在。Invalid pointer operation

何鲁青 2007-02-02 05:22:17
最近写了Component,专门用于读写.mif文件的,开始的时候条是没有什么问题,但是加到大程序里面用的时候,在关闭程序的时候总是会跳出异常提示:Invalid pointer operation,其实应用很简单,就是用TStringList将mif文件的每行读近来,然后对每行进行处理。
大体的应用是这样的
var
myStringList: TStrings;
begin
myStringList.create;
myStringList.LoadFormFile(filename);

//deal with the mif file
myStringList.Free;
end;

不知道是什么问题了,出错的时候也没有提示错误在那一行
我估计是VCL内部析构函数在回收内存的时候出现的问题。

高分求解................................................
...全文
499 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
何鲁青 2007-02-07
  • 打赏
  • 举报
回复
呵呵,我都不知道该哭还是该笑了...

就是david981(菜鸟001) 说的原因。
出这样的错误真是丢人啊,哈哈
200分送上

-------------------------------------
希望大家往后不要犯我这样的毛病
lijingzhan 2007-02-06
  • 打赏
  • 举报
回复
高手
何鲁青 2007-02-06
  • 打赏
  • 举报
回复
没完,问题依然存在。
china618 2007-02-06
  • 打赏
  • 举报
回复
来晚了
只接分不说话可以吗
何鲁青 2007-02-06
  • 打赏
  • 举报
回复
for j := Pos('=', myStringList[i]) to Length(myStringList[i]) do

肯定是这行引起的,不知道搂主这样写的用意是什么
--------------------------------------------------------------------
mif文件就是一个纯文本的文件,如果有搞过FPGA的朋友应该知道的。
它是用来初始化内存单元的。
我的这部分代码中间根本就没有什么容错机制,我知道是一段很烂的代码。
只是我们用的mif文件都是用Quartus直接产生的,不会有什么格式上的错误,
所以,我知道这一行肯定有'='在里面,所以我才这么写的。

不知道你为什么觉得我的错误一定是这里产生的哪?

ps:我选择了Use Debug DCUs之后,终于找到了错误的地方,就是system单元中的_FreeMem函数。

我觉得应该是编译器自动释放一些内存单元的时候发生的错误,但是为什么会是我调用了这个函数之后才会出错,而我不掉用这个寒暑,就不会有问题哪?

因为对_FreeMem的调用太多了,现在我都不知道是哪个地方调用了他,所以也跟踪不到出错的指针到底是哪一个。郁闷。
david981 2007-02-06
  • 打赏
  • 举报
回复
for i:=0 to length(wDatBuf) do
begin
wDatBuf[i] := 0;
end;
会不会越界?
调用这个函数就出错,很有可能是这个函数中错误修改了一些指针的内容,导致delphi自动释放的时候,访问了错误的内存。
建议楼主用一个比较短小的mif文件,在每次循环后,查看tempString的内容,看是否与预期的一致。
xikug 2007-02-05
  • 打赏
  • 举报
回复
建议楼主调试一下

---------------------------------------------
第八个男人欢迎你
http://www.debugman.com
lbywyj 2007-02-05
  • 打赏
  • 举报
回复
建议,你重新写算了,呵呵
仙侣步惊云 2007-02-05
  • 打赏
  • 举报
回复
在关闭时出错,我认为不一定是你的函数有问题.
hongqi162 2007-02-05
  • 打赏
  • 举报
回复
>>只是在关闭程序的时候才会出现错误


噩梦级的问题
oushengfen 2007-02-05
  • 打赏
  • 举报
回复
楼主是高手,不过这样的代码是不是有点太长了,建议进行函数模块化书写,这样是不是更加容易查错一些,呵呵,楼主是高手,不好意思加上这些评论了
skertone 2007-02-05
  • 打赏
  • 举报
回复
这个mif格式之文档是否为纯文本格式?

改成 TStream; 类来装载文件如何?


对于多线程冒似Delphi有个TThreadXXXXList之类东东。。。


"可惜VCL不能打断点调试,否则可能能离错误更近一些。" --- VCL可以调吧,你没源码?


如下代码可能是不安全的吧?
for j := 0 to Pos(':', myStringList[i]) do
begin
if TryStrToInt('$' + myStringList[i][j], tempInt) then
tempString := tempString + myStringList[i][j];
end;
iTempValue := myStrToInt(tempString, rAddressRadix);

如果Pos返回0 哪么 myStringList[i][0] 会出错呀。
woshihaoge 2007-02-05
  • 打赏
  • 举报
回复
myStringList:=TStringList.create;
trainbox 2007-02-05
  • 打赏
  • 举报
回复
for j := Pos('=', myStringList[i]) to Length(myStringList[i]) do

肯定是这行引起的,不知道搂主这样写的用意是什么

何鲁青 2007-02-04
  • 打赏
  • 举报
回复
关键的问题是现在出错的时候,并不提示是那行。
而且上面的代码执行的时候都是很好的,只是在关闭程序的时候才会出现错误。
而且没有出错行的指示。
郁闷....
david981 2007-02-04
  • 打赏
  • 举报
回复
如果是多线程引起的话,那么最有可能的地方是
if Assigned(FOnReadFinish) then
FOnReadFinish(wDatBuf, iDepth);
但是程序中有几个地方还是不明白,像
for j := Pos('=', myStringList[i]) to Length(myStringList[i]) do
当找不到‘=’时,j=0,这样也会进入循环,这个时候可能访问myStringList[i][0],而字符串的第0个字节一般保存长度的,不是实际的有效字符。

还有诸如
for j := 0 to Pos(':', myStringList[i]) do
总会进入循环的。
constantine 2007-02-03
  • 打赏
  • 举报
回复
myStringList := TStringList.Create;
呵呵,确实低级错误.
cncharles 2007-02-03
  • 打赏
  • 举报
回复
晕, 有这样写的. PF
lzg827 2007-02-03
  • 打赏
  • 举报
回复
这......
难得碰到高手犯错,
来晚了.

都不好意思随声附和了.
王集鹄 2007-02-03
  • 打赏
  • 举报
回复
这个属于低级错误....
纯属成蹭分

var
myStringList: TStrings;
begin
myStringList := TStringList.Create;
try
myStringList.LoadFormFile(filename);
finally
myStringList.Free;
end;
end;
加载更多回复(12)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧