[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]

    {    ...Here is a demo Program that will read-in up to 15,000 Records
        onto the HEAP memory pool.
    }

    {$A+,B-,D+,E-,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V-,X-,Y-}
    {$M 4096,0,655360}

    Program Large_Array_Structure_Demo;

    Type
                  (* Type definitions.                                    *)
      st_8    = String[8];
      inar_4  = Array[0..4] of Integer;

      rc_zlog = Record
                  date      : String[8];
                  userbaud  : inar_4;
                  active    : Integer;
                  calls     : Integer;
                  newusers  : Integer;
                  pubpost   : Integer;
                  privpost  : Integer;
                  netpost   : Integer;
                  criterr   : Integer;
                  uploads   : Integer;
                  downloads : Integer;
                  uk        : LongInt;
                  dk        : LongInt
                end;

    Const
                  (* Maximum number of Records to read-in.                *)
      co_rcMax   = 15000;
                  (* Byte size of 1 Record.                               *)
      co_rcSize  = sizeof(rc_zlog);

    Type
                  (* Pointer of zlog Record Type.                         *)
      porc_zlog  = ^rc_zlog;
                  (* Array of 15,000 of zlog-Record Pointers.             *)
      poar_15K   = Array[1..co_rcMax] of porc_zlog;

    Var
                  (* Use to store "ioresult" value.                       *)
      by_Error          : Byte;
                  (* Loop control Variable.                               *)
      wo_Index,
                  (* Total number of Records in the data File.            *)
      wo_RecTotal,
                  (* Number of Bytes read using "BlockRead" routine.      *)
      wo_BytesRead      : Word;
                  (* Pointer to mark the bottom of the HEAP.              *)
      po_HeapBottom     : Pointer;
                  (* Array of 15,000 zlog-Record Pointers.                *)
      poar_RcBuffer     : poar_15K;
                  (* File Variable to be assigned to the data File.       *)
      fi_Data           : File;

    begin
                  (* Try to open the data File.                           *)
      assign(fi_Data, 'ZLOG.DAT');
      {$I-}
      reset(fi_Data, 1);
      {$I+}
                  (* Check For File errors.                               *)
      by_Error := ioresult;
      if (by_Error <> 0) then
      begin
        Writeln('Error ', by_Error, ' opening ZLOG.DAT File');
        halt
      end;

                  (* Calculate the number of Records in data File.        *)
      wo_RecTotal := (Filesize(fi_Data) div co_rcSize);
                  (* Initialize loop control Variable.                    *)
      wo_Index := 1;
                  (* Record the address of the HEAP "bottom".             *)
      mark(po_HeapBottom);
                  (* While free memory is greater than size of 1 Record   *)
      While (maxavail > co_rcSize)
                  (* And, not all Records have been read in...            *)
      and   (wo_Index < wo_RecTotal)
                  (* And, less than maximum number of Records to read-in. *)
      and   (wo_Index < co_rcMax) do
      begin
                (* Allocate room For 1 Record on the HEAP.              *)
        new(poar_RcBuffer[wo_Index]);
                (* Read 1 Record from data File into new HEAP Variable. *)
        blockread(fi_Data, poar_RcBuffer[wo_Index]^, co_rcSize, wo_BytesRead);
                (* Check For "BlockRead" error.                         *)
        if (wo_BytesRead <> co_rcSize) then
        begin
          Writeln('BLOCKREAD error!');
          halt
        end;
                (* Advance loop control Variable by 1.                  *)
        inc(wo_Index)
      end;
                  (* Close the data File.                                 *)
      close(fi_Data);
                  (* Display the amount of free HEAP memory left.         *)
      Writeln('Free HEAP memory = ', maxavail, ' Bytes');
                  (* Display the number of Records read onto the HEAP.    *)
      Writeln('Records placed on the HEAP = ', wo_Index);
                  (* Release all the HEAP memory used to store Records.   *)
      release(po_HeapBottom);
                  (* Display the amount of free HEAP memory left, again.  *)
      Writeln('Free HEAP memory = ', maxavail, ' Bytes');

    end.

[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]