Cálculo de array da série de Fibonacci criado em tempo de execução

      
      { Calulo da serie de Fibonacci com array definido em tempo de execucao}
      { Joao Paulo Schwarz Schuler }
      { http://www.schulers.com/jpss }
      
      {$X+} {extended syntax}
      const csError = -1;
      const csMaxArray = 16000;
      
      type TIntArr= array[0..csMaxArray] of longint;
      type TIntArrPtr= ^TIntArr;
      type TIntArray  = object  { array dinamico de numeros inteiros }
                        private
                        Max:longint; {Maior indice permitido}
                        ArrInt:TIntArrPtr;
                        AllocatedMem:longint;
                        public
                        constructor Init(PMax:longint);
                        {aloca array}
                        function Get(N:longint):longint;
                        {devolve valor de indice N}
                        function GetMax:longint;
                        {devolve maior indice permitido no array}
                        procedure Seta(Pos,Data:longint);
                        {atribui valor Data na posicao Pos}
                        destructor Done;
                        {desaloca memoria}
                        end;
      
      type TFibonacci = object (TIntArray)    { classe para calculo da serie de Fibonacci}
                        public
                        constructor Init(PMax:longint);
                        {calcula valores da serie de fibonacci ate indice Max}
                        end;
      
      constructor TFibonacci.Init(PMax:longint);
      {aloca e calcula serie}
      var I:longint;
      begin
      inherited Init(PMax);
      ArrInt^[0]:=0;
      ArrInt^[1]:=1;
      for I:=2 to PMax do
          ArrInt^[I]:=ArrInt^[I-1]+ArrInt^[I-2];
      end;
      
      constructor TIntArray.Init(PMax:longint);
      {aloca memoria}
      begin
      Max:=PMax;
      AllocatedMem:=(Max+1)*SizeOf(longint);
      GetMem(ArrInt,AllocatedMem);
      end;
      
      function TIntArray.Get(N:longint):longint;
      {devolve valor de indice N}
      begin
      if (N<=Max)
         then Get:=ArrInt^[N]
         else Get:=csError;
      end;
      
      function TIntArray.GetMax:longint;
      {devolve maior indice permitido no array}
      begin
      GetMax:=Max;
      end;
      
      procedure TIntArray.Seta(Pos,Data:longint);
      {atribui valor Data na posicao Pos}
      begin
      if (Pos<=Max)
         then ArrInt^[Pos]:=Data
         else {erro};
      end;
      
      
      destructor TIntArray.Done;
      {desaloca memoria}
      begin
      FreeMem(ArrInt,AllocatedMem);
      end;
      
      
      const csMaxFib = 46;
      { mostra os 47 primeiros numeros da serie de Fibonacci }
      var Fib:TFibonacci;
          I:longint;
      begin
      Fib.Init(csMaxFib);
      for I:=0 to csMaxFib
          do Writeln(I:5,Fib.Get(I):20);
      Fib.Done;
      end.