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

    {
     RJS> Just a quick question... In the variable declaration field, you define
     RJS> an array with array [0..9] of foo, But let's say I didn't know exactly
     RJS> how big the array was going to be... How would I declare an array with
     RJS> a variable endpoint?

    There are a couple of ways around this, and they employ the use of pointers,
    which in turn, require a little additional code to maintain. If you are useing
    Borlands Pascal 6 or 7, the tCollection objects work quite well, or else make
    use of linked lists. There is still the option of using a variable lengthed
    array too.

    As an example,
    }
    {$A+,B-,D-,E-,F+,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
    {$M 16384,0,655360}
    Program VariableArrayETC;
    uses objects;
    Type
       Data = Record
                name : string[80];
                age  : integer;
              end;

      VArray = array[0..0] of Data;   {variable sized array}
      VAPtr  = ^Varray;

      VLPtr = ^VList;                 {linked list}
      VList = Record
                rec : Data;
                next,
                prev: VLPtr;
              end;

      DataPtr = ^data;                {OOP types from the objects unit}
      VObj    = Object(tCollection)
                  procedure FreeItem(item:pointer); virtual;
                end;
      VObjPtr = ^VObj;
                  Procedure VObj.FreeItem(item:pointer);
                     begin
                       dispose(DataPtr(item));
                     end;

    procedure MakeTestFile;
       var i:integer;
           f:file of Data;
           d:data;
       Begin
         writeln;
         writeln('blank name will exit');
         assign(f,'test.dat');
         rewrite(f);
         fillchar(d,sizeof(d),0);
         repeat
           write('name : '); readln(d.name);
           if   d.name <> ''
           then begin
                  repeat
                    write('age : '); readln(d.age);
                  until ioresult = 0;
                  write(f,d);
                end;
         until d.name = '';
         close(f);
       End;

    Procedure VariableArrayExample; {turn Range Checking off...}
       var f:file;
           v:VAPtr;
           i,res:integer;
           d:data;
           m:longint;
       Begin
         writeln;
         Writeln('output of variable array ... ');
         m := memavail;
         assign(f,'test.dat');
         reset(f,sizeof(data));
         getmem(v,filesize(f)*SizeOf(Data));
         blockRead(f,v^,filesize(f),res);
         for i := 0 to res - 1 do
            begin
              writeln(v^[i].name);
              writeln(v^[i].age);
            end;
         freemem(v,filesize(f)*SizeOf(Data));
         close(f);
         if m <> memavail then writeln('heap ''a trouble...');
       End;

    Procedure LinkedListExample;
       var f:file of Data;
           curr,hold : VLPtr;
           m:longint;
       Begin
         curr := nil; hold := nil;
         writeln;
         writeln('Linked List example ... ');
         m := memavail;
         assign(f,'test.dat');
         reset(f);
         while not eof(f) do
            begin
              new(curr);
              curr^.prev := hold;
              read(f,curr^.rec);
              curr^.next := nil;
              if hold <> nil then hold^.next := curr;
              hold := curr;
            end;
        close(f);
        hold := curr;
        if   hold <> nil
        then begin
               while hold^.prev <> nil do hold := hold^.prev;
               while hold <> nil do
               begin
                 writeln(hold^.rec.name);
                 writeln(hold^.rec.age);
                 hold := hold^.next;
               end;
               hold := curr;
               while hold <> nil do
                 begin
                   hold := curr^.prev;
                   dispose(curr);
                   curr := hold;
                 end;
             end;
        if m <> memavail then writeln('heap ''a trouble...');
      End;

    Procedure tCollectionExample;  {requires the object unit}
       var p:VObjPtr;
           d:DataPtr;
           f:file of Data;
           m:longint;
       procedure WriteEm(dp:DataPtr); far;
          begin
            writeln(dp^.name);
            writeln(dp^.age);
          end;
       begin
         writeln;
         writeln('object tCollection example ... ');
         m := memavail;
         assign(f,'test.dat');
         new(p,init(5,2));
         reset(f);
         while not eof(f) do
            begin
              new(d);
              system.read(f,d^);
              p^.insert(d);
            end;
         close(f);
         p^.forEach(@WriteEm);
         dispose(p,done);
         if m <> memavail then writeln('heap ''a trouble...');
      end;

    Begin
      maketestfile;
      variablearrayexample;
      linkedListExample;
      tcollectionExample;
    End.

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