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

{
SEPP MAYER

> Unfortunately I can't cut down on the size of my variables...(well,
> ok, one  of them I did, but it drastically reduces the usefulness of
> the program  itself).  So now I got rid of it, but one of my variables
> is of Array  [1..1000] Of String[12].  I'd like to have the array go to
> 2500.   Unfortunately, when I do this, it gives me the error.  Is there
> some way to  get around that??

At the Time your Array uses 13000 Byte of Memory in the Data-Segment
(12 Byte for the 12 characters in the string + 1 Byte for the Length).

The Only Thing You have to do, is to put your Array to the Heap, so you
can have an Array[1..3250] of your String with the same Use of Memory in
your Data-Segment.
}

program BigArray;

type
  PStr12 = ^TStr12;
  tStr12 = String[12];

var
  TheTab : Array[1..3250] of PStr12;
  i      : Integer;

function AddTabEle(i : Integer; s : String) : Boolean;
begin
  if i < 1 then
  begin
    WriteLn('You Used an Index lower than 1');
    AddTabEle := false;
    Exit;
  end;
  if i > 3250 then
  begin
    WriteLn('You Used an Index higher then 3250');
    AddTabEle := false;
    Exit;
  end;
  if TheTab[i] <> nil then
  begin
    WriteLn('TAB Element is already in Use');
    AddTabEle := false;
    Exit;
  end;
  if MemAvail < 13 then
  begin
    WriteLn('Not Enough Heap Memory');
    AddTabEle := false;
    Exit;
  end;
  New[TheTab[i]);
  TheTab[i]^ := Copy(s,1,12); {Limit to 12 Characters}
  AddTabEle  := true;
end;

function ChangeTabEle(i : integer; s : string) : Boolean;
begin
  if TheTab[i] = nil then
  begin
    WriteLn('You Tried to Modify an non-existing TAB Element, Use AddTabEle');
    ChangeTabEle := false;
    Exit;
  end;
  TheTab[i]^   := Copy(s, 1, 12);
  ChangeTabEle := true;
end;

function GetTabEle(i : integer) : string;
begin
  if TheTab[i] = nil then
  begin
    GetTabEle := 'TAB Ele not found'; {No error occurs}
    Exit;
  end;
  s := TheTab[i]^;
end;
function FreeTabEle(i : integer) : Boolean;
begin
  if TheTab[i] = nil then
  begin
    WriteLn('TAB Element is not used';
    FreeTabEle := false;
    Exit;
  end;
  Dispose(TheTab[i]);
  TheTab[i]  := nil;
  FreeTabEle := true;
end;

procedure FreeTab;
begin
  for i := 1 to 3250 do
  begin
    if TheTab[i] <> nil then
      if NOT FreeTabEle(i) then
        WriteLn('Error releasing Tab element');
  end;
end;

begin
  for i := 1 to 3250 do       {Initialize Pointers with nil, to test       }
    TheTab[i] := nil;         {if Element is Used, compare pointer with nil}
  {.......}                   {Your Program}
  if NOT AddTabEle(1, 'Max 12 Chars') then  {Add an Ele}
    WriteLn('Error creating TAB element');  {evtl. use FreeMem + Halt(1)}
                                            {to terminate Programm}
  WriteLn(GetTabEle(1));                    {Write an Tab Ele}
  if NOT ChangeTabEle(1, '12 Chars Max') then {Change an Ele}
    WriteLn('Error changing TAB element');  {evtl. use FreeMem + Halt(1)}
                                            {to terminate Programm}
  WriteLn(GetTabEle(1));                    {Write an Tab Ele}
  if NOT FreeTabEle(1) then                 {Delete(Free) an Ele}
    WriteLn('Error releasing Tab element'); {evtl. use FreeMem + Halt(1)}
                                            {to terminate Programm}
  {.......}                   {Your Program}
  FreeTab;                    {At The End of Your Program free all TAB Ele}
end.


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