TSpIterator = class (TObject)
  private
    NextIndexes, PrevIndexes: array of Integer;
  public
    property Count: Integer read FCount;
    property Current: Integer read FCurrent;

    constructor Create(InitCount: Integer);
    destructor Destroy; override;
    procedure Next;
    procedure Reset(NewInitCount: Integer); overload;
    procedure Reset; overload;
  end;

  TSpTransMatrix = class (TSparseMatrix)
  private
    procedure SolveDegeneration(ARow, ACol: Integer);
  public
    constructor Create(InitRows, InitCols: Integer; ANullValue: Variant); override;
    procedure BuildFBFSVogelsApprox( const Supplies: TSupplies;
                                     const Demands: TDemands;
                                     const Costs: TCostsMatrix);
  end;

// TSpIterator

  constructor TSpIterator.Create(InitCount: Integer);
  begin
    if ( InitCount > 0 )
      then try
        inherited Create;
        Reset(InitCount);
        except
          on E: EOutOfMemory do
            MessageDlg(E.Message, mtError, [mbOk], 0);
        end
      else Free;
  end;

  procedure TSpIterator.Reset(NewInitCount: Integer);
  begin
    FCount := NewInitCount;
    SetLength(NextIndexes, NewInitCount);
    SetLength(PrevIndexes, NewInitCount);
    Reset;
  end;

  procedure TSpIterator.Reset;
    var
      i: Integer;
  begin
    FCount := Length(NextIndexes);
    for i := 0 to (Count - 1) do begin
      NextIndexes[i] := i + 1;
      PrevIndexes[i] := i - 1;
    end;
    FirstIndex := 0;
    LastIndex := Length(NextIndexes) - 1;
  end;

  destructor TSpIterator.Destroy;
  begin
    Finalize(NextIndexes);
    Finalize(PrevIndexes);
    inherited Destroy;
  end;

// TSpTransMatrix

 procedure TSpTransMatrix.BuildFBFSVogelsApprox( const Supplies: TSupplies;
                                                  const Demands: TDemands;
                                                  const Costs: TCostsMatrix);
    var
      TempDemands: TDemands;
      TempSupplies: TSupplies;
      RmcIndex, CmcIndex: Integer;
      RowsLeft, ColsLeft: TSpIterator;
      MinCost, SecMinCost, TempCost, MaxPenalty: Double;
      SumCheck, Diff: Double;
      i, j, mxpIndex, mxpMinCostIndex: Integer;
      mxpIndexOf: (mxpioRow, mxpioCol, mxpioNone);
  begin
    if ( (Length(Supplies) <> Rows) or (Length(Demands) <> Cols) )
      then Exit;
    Clear;
    SumCheck := 0;
    SetLength(TempDemands, Cols);   // Cols=6
    SetLength(TempSupplies, Rows);  // Rows=5 in the test data.
    RowsLeft := TSpIterator.Create(Rows); // problem starts here
    ColsLeft := TSpIterator.Create(Cols);
    while ( SumCheck <> 0 ) do begin
        // none of the code here reserves or releases any memory inside or
        // outside the SpIterators.
        // should I show it too?
    end; // ( sumcheck <> 0 )
    Finalize(TempSupplies);
    Finalize(TempDemands);
    ColsLeft.Free;
    RowsLeft.Free;
  end;


On Mon, 13 Nov 2000, Juan Manuel Gomez Ramos wrote:
> Hi there:
> 
>   I'm having a strange situation. I create, in a class method, two instances of
> another class. At the end of the method code, I call the Free method for both
> of them and, the one that was created the second, raises an
> EInvalidPointer exception. The weird thing I see, is that after they are
> created, both class variables have the same memory address (@Variable, this
> is the horrible part). And, if I Free them right after creation, no exception
> is raised (this, is the incredible part). I traced through the Destroy method
> and every code line was executed correctly (some open arrays are Finalized),
> except for the last one (no matter the operation), where the exception is
> raised. If the problem occurs while accessing a pointer already disposed off,
> then the exception should be raised on the second Free call but, it happend on
> the class instance created the second, no matter if is freed the first. Every
> thing goes ok while using the instances and their values keep different. I
> wouldn't like to use the "bad practice" of letting them unreleased. Thanks in
> advance. 
> 
>   Best regards, JM.
> 
> -- 
>   Juan Manuel Gomez Ramos
>   Computer Science student at Havana University
>   Paraglider pilot and RadioHam (CM9BPG)
>   http://cubairsports.itgo.com = http://www.geocities.com/cubairsports
> 
>   email:<[EMAIL PROTECTED]>         eFax: +1-707-313-0329 (USA) 
>         <[EMAIL PROTECTED]>         +44-870-125-4936 (UK)
>         <[EMAIL PROTECTED]>
>   ICQ:  62091995
>   http://chronos.itgo.com
> 
> 
> ---------------------------------------------------------------------------
>     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED] 
> with body of "unsubscribe delphi"
-- 
  Juan Manuel Gomez Ramos
  Computer Science student at Havana University
  Paraglider pilot and RadioHam (CM9BPG)
  http://cubairsports.itgo.com = http://www.geocities.com/cubairsports

  email:<[EMAIL PROTECTED]>         eFax: +1-707-313-0329 (USA) 
        <[EMAIL PROTECTED]>         +44-870-125-4936 (UK)
        <[EMAIL PROTECTED]>
  ICQ:  62091995
  http://chronos.itgo.com


---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"

Reply via email to