Forum > General

[NOT Solved] specialize TFPGObjectList<T>

(1/5) > >>

BrunoK:
Lazarus 3.99 (rev Unknown) FPC 3.2.2 x86_64-win64-win32/win64

In the following program

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program Project1; {$mode ObjFPC}{$H+} uses  Classes,  SysUtils,  fgl; const  cSymInvalid = low(integer); type   { TSymbolItem }   TSymbolItem = class(TObject)  private    fSym: integer; {~bk}  public    procedure Clear;    property Sym: integer read fSym write fSym; {file position of symbol}  end; {TSymbolItem}   { TSymbolBufferList - circular buffer list }   TSymbolBufferList = class(specialize TFPGObjectList<TSymbolItem>)  private  const    cCap = 16;  private    FHead,              // Index offset of the oldest Symbol    FCurr,              //   "     "    of CurrentSymbol    FTail: integer;    // Index offset of the newest Symbol     function LL0Get: TSymbolItem;    function LLGet(k: Integer): TSymbolItem;  protected  public    constructor Create;    procedure Clear;    property LL[k: Integer]: TSymbolItem read LLGet;    property LL0: TSymbolItem read LL0Get;  end;   { TSymbolItem }   procedure TSymbolItem.Clear;  begin    fSym := cSymInvalid;  end; { Clear }   { TSymbolBufferList }   constructor TSymbolBufferList.Create;  var    i: integer;    lNewSymPos: TSymbolItem;  begin    inherited;    // WriteLn(HexStr(List)); // Checked : .List has a valid pointer    for i := 0 to cCap - 1 do begin      lNewSymPos := TSymbolItem.Create;      lNewSymPos.Clear;      Add(lNewSymPos); // <<<<<<<<------------- ERROR HERE    end;  end;   procedure TSymbolBufferList.Clear;  begin    FHead := 0;    FCurr := 0;    FTail := 0;  end;   function TSymbolBufferList.LL0Get: TSymbolItem;  begin    if FTail = FCurr then      Exit(nil)    else      Exit(Items[FCurr]);  end;   { Returns nil if no valid SymbolPosition for k }  function TSymbolBufferList.LLGet(k: Integer): TSymbolItem;  begin    { ... Code ... }  end; var  vSymbolBufferList: TSymbolBufferList;begin  vSymbolBufferList := TSymbolBufferList.Create;  vSymbolBufferList.Free;  ReadLn;end.
I get :


--- Quote ---Project project1 raised exception class 'External: ACCESS VIOLATION' with message:
Access violation writing to address $0000000000000000.

 In file 'fgl.pp' at line 1067
--- End quote ---

What is wrong in this little test program.

BrunoK:
This program compiles !

BrunoK:
Kind of bug in FPC, both 3.2.2 and trunk preparing a  PATCH.

BrunoK:
Solved, patch submitted to fpc GIT.

BrunoK:
Sadly patch gives trouble due to compiler having difficulties knowing what constructor to call ....

Navigation

[0] Message Index

[#] Next page

Go to full version