[Lazarus] SIGSEGV on lclrescache.pas
Mattias Gaertner
nc-gaertnma at netcologne.de
Mon Jun 17 12:35:18 CEST 2013
On Mon, 17 Jun 2013 12:17:58 +0200
Dave Coventry <dgcoventry at gmail.com> wrote:
> I have a unit in which I'm parsing a large text file.
>
> I have around 50 (or more!) IF statements as below:
>
> if Pos(' Center Point',OdReadstrings.Strings[i])>0 then
> val+=',PT='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos(' Custom Scale',OdReadstrings.Strings[i])>0 then
> val+=',SC='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos(' Check',OdReadstrings.Strings[i])=1 then
> val+=',FZ='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos(' Min Extents',OdReadstrings.Strings[i])>0 then
> val+=',MN='+getParam(PChar(OdReadstrings.Strings[i]))
> else if Pos(' Max Extents',OdReadstrings.Strings[i])>0 then etc, etc.
>
> No error is generated from this code, per se, but on closing the programme
> there is an External SIGSEVV genterated in lclrescache.pas at line 186.
>
> The offending line:
>
> Cache.RemoveItem(Self);
I see no relationship to your code. Probably it is a side effect of a
destroyed heap.
Why do you think that the the above Ifs causes lclrescache to
crash?
> Can anyone see what's going on here? Alternatively, is there a better way
> of parsing a large text file for phrases?
Fetch the string only once:
s:=OdReadstrings.Strings[i]
if Pos(' Center Point',s)>0 then
...
Even faster:
Parse the line for tokens and use hash maps.
Mattias
More information about the Lazarus
mailing list